В ответах Google Ассистенту можно использовать подмножество языка разметки синтеза речи (SSML). С помощью SSML можно сделать ответы в диалоге более похожими на естественную речь. Ниже приведен пример разметки SSML и того, как она читается Google Ассистентом.
function saySSML(conv) { const ssml = '<speak>' + 'Here are <say-as interpret-as="characters">SSML</say-as> samples. ' + 'I can pause <break time="3" />. ' + 'I can play a sound <audio src="https://www.example.com/MY_WAVE_FILE.wav">your wave file</audio>. ' + 'I can speak in cardinals. Your position is <say-as interpret-as="cardinal">10</say-as> in line. ' + 'Or I can speak in ordinals. You are <say-as interpret-as="ordinal">10</say-as> in line. ' + 'Or I can even speak in digits. Your position in line is <say-as interpret-as="digits">10</say-as>. ' + 'I can also substitute phrases, like the <sub alias="World Wide Web Consortium">W3C</sub>. ' + 'Finally, I can speak a paragraph with two sentences. ' + '<p><s>This is sentence one.</s><s>This is sentence two.</s></p>' + '</speak>'; conv.ask(ssml); }
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.TEXT" } ], "inputPrompt": { "richInitialPrompt": { "items": [ { "simpleResponse": { "textToSpeech": "<speak>Here are <say-as interpret-as=\"characters\">SSML</say-as> samples. I can pause <break time=\"3\" />. I can play a sound <audio src=\"https://www.example.com/MY_WAVE_FILE.wav\">your wave file</audio>. I can speak in cardinals. Your position is <say-as interpret-as=\"cardinal\">10</say-as> in line. Or I can speak in ordinals. You are <say-as interpret-as=\"ordinal\">10</say-as> in line. Or I can even speak in digits. Your position in line is <say-as interpret-as=\"digits\">10</say-as>. I can also substitute phrases, like the <sub alias=\"World Wide Web Consortium\">W3C</sub>. Finally, I can speak a paragraph with two sentences. <p><s>This is sentence one.</s><s>This is sentence two.</s></p></speak>" } } ] } } } ] }
Аудио
SSML поддерживается в симуляторе Actions, но не в симуляторе Dialogflow.
URL в SSML
Если ответ SSML содержит только URL, амперсанды в нем могут вызвать проблемы из-за форматирования XML. Чтобы URL был указан правильно, замените все экземпляры & на &.
Даже если ваш ответ SSML содержит только URL, Actions on Google требует отображаемый текст для ответа. Поскольку текст внутри тега <audio> не будет озвучиваться Ассистентом, вы можете вставить в тег <audio> текст-заполнитель или краткое описание, чтобы выполнить это требование. Текст внутри тега <audio> не будет озвучен Ассистентом после воспроизведения аудио. Он соответствует требованиям Actions on Google к текстовой версии SSML.
Вот пример проблемного ответа SSML:
<speak>
<audio src="https://firebasestorage.googleapis.com/v0/b/project-name.appspot.com/o/audio-file-name.ogg?alt=media&token=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX">
</audio>
</speak>
В примере выше символ & не экранирован, поэтому XML-код недействителен.
Исправленная версия того же ответа SSML выглядит следующим образом:
<speak>
<audio src="https://firebasestorage.googleapis.com/v0/b/project-name.appspot.com/o/audio-file-name.ogg?alt=media&token=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX">
text
</audio>
</speak>
Поддержка элементов SSML
В следующих разделах описаны элементы и параметры SSML, которые можно использовать в действиях.
<speak>
Корневой элемент ответа SSML.
Подробнее об элементе speak рассказывается в спецификации W3.
Пример
<speak> my SSML content </speak>
<break>
Пустой элемент, который управляет паузами или другими просодическими границами между словами. Использовать <break> между парами токенов необязательно. Если этот элемент не указан между словами, перенос определяется автоматически на основе лингвистического контекста.
Подробнее об элементе break рассказывается в спецификации W3.
Атрибуты
| Атрибут | Описание |
|---|---|
time |
Задает продолжительность паузы в секундах или миллисекундах (например, "3s" или "250ms"). |
strength |
Задает относительную силу просодической паузы в выходных данных. Допустимые значения: x-weak, weak, medium, strong и x-strong. Значение none указывает, что просодическая пауза не нужна. Это позволяет предотвратить паузу, которая в противном случае была бы добавлена процессором. Другие значения указывают на монотонно неубывающую (концептуально возрастающую) силу разрыва между токенами. Более сильные границы обычно сопровождаются паузами. |
Пример
В примере ниже показано, как использовать элемент <break>, чтобы сделать паузу между шагами.
<speak> Step 1, take a deep breath. <break time="200ms"/> Step 2, exhale. Step 3, take a deep breath again. <break strength="weak"/> Step 4, exhale. </speak>
<say‑as>
Этот элемент позволяет указать информацию о типе текстовой конструкции, содержащейся в элементе. Кроме того, это свойство помогает определить уровень детализации для отрисовки содержащегося текста.
Элемент <say‑as> имеет обязательный атрибут interpret-as, который определяет, как произносится значение. Необязательные атрибуты format и detail могут использоваться в зависимости от значения атрибута interpret-as.
Примеры
Атрибут interpret-as поддерживает следующие значения:
-
currencyПример ниже произносится как "сорок два доллара и один цент". Если атрибут language не указан, используется текущий язык.
<speak> <say-as interpret-as='currency' language='en-US'>$42.01</say-as> </speak> -
telephoneОзнакомьтесь с описанием
interpret-as='telephone'в примечании рабочей группы W3C SSML 1.0 Значения атрибутов say-as.Например, номер 1-800-202-1212 будет произнесен как "один восемь ноль ноль два ноль два один два один два". Если атрибут google:style не указан, то ноль будет произноситься как буква О.
Атрибут google:style='zero-as-zero' в настоящее время работает только в англоязычных регионах.
<speak> <say-as interpret-as='telephone' google:style='zero-as-zero'>1800-202-1212</say-as> </speak> -
verbatimилиspell-outВ следующем примере слово произносится по буквам:
<speak> <say-as interpret-as="verbatim">abcdefg</say-as> </speak> -
dateАтрибут
formatпредставляет собой последовательность кодов символов поля даты. Поддерживаемые коды символов полей вformat: {y,m,d} для года, месяца и дня (месяца) соответственно. Если код поля появляется один раз для года, месяца или дня, то ожидаемое количество цифр – 4, 2 и 2 соответственно. Если код поля повторяется, то ожидаемое количество цифр равно количеству повторений кода. Поля в тексте даты могут быть разделены знаками препинания и/или пробелами.Атрибут
detailопределяет, как будет произноситься дата. Дляdetail='1'обязательны только поля дня и одно из полей месяца или года, хотя можно указать оба. Это значение по умолчанию, если указано менее трех полей. Произносится как "{ordinal day} of {month}, {year}".Например, дата 10 сентября 1960 года будет озвучена так:
<speak> <say-as interpret-as="date" format="yyyymmdd" detail="1"> 1960-09-10 </say-as> </speak>Например, следующий фрагмент будет озвучен как "десятое сентября":
<speak> <say-as interpret-as="date" format="dm">10-9</say-as> </speak>Для
detail='2'обязательны поля дня, месяца и года. Это значение по умолчанию, если указаны все три поля. Произносится как "{month} {ordinal day}, {year}".Например, дата в примере ниже будет озвучена как "десятое сентября тысяча девятьсот шестидесятого года":
<speak> <say-as interpret-as="date" format="dmy" detail="2"> 10-9-1960 </say-as> </speak> -
charactersВ следующем примере произносится "C A N":
<speak> <say-as interpret-as="characters">can</say-as> </speak> -
cardinalНапример, число 12345 будет прочитано как "Twelve thousand three hundred forty five" (для американского английского) или "Twelve thousand three hundred and forty five" (для британского английского).
<speak> <say-as interpret-as="cardinal">12345</say-as> </speak> -
ordinalНапример, в следующем случае будет озвучено "Первый":
<speak> <say-as interpret-as="ordinal">1</say-as> </speak> -
fractionПример ниже озвучивается как "пять с половиной":
<speak> <say-as interpret-as="fraction">5+1/2</say-as> </speak> -
expletiveилиbleepВ следующем примере вместо слова будет звуковой сигнал, как при цензуре:
<speak> <say-as interpret-as="expletive">censor this</say-as> </speak> -
unitПреобразует единицы измерения в единственное или множественное число в зависимости от количества. В следующем примере озвучивается "10 футов":
<speak> <say-as interpret-as="unit">10 foot</say-as> </speak> -
timeПример ниже озвучивается как "Два часа тридцать минут пополудни":
<speak> <say-as interpret-as="time" format="hms12">2:30pm</say-as> </speak>Атрибут
format– это последовательность кодов символов поля времени. Поддерживаемые коды символов полей вformat: {h,m,s,Z,12,24} для часа, минуты (часа), секунды (минуты), часового пояса, 12-часового формата времени и 24-часового формата времени соответственно. Если код поля указан один раз для часа, минуты или секунды, то ожидаемое количество цифр – 1, 2 и 2 соответственно. Если код поля повторяется, то ожидаемое количество цифр равно количеству повторений кода. Поля в тексте времени могут быть разделены знаками препинания и/или пробелами. Если в формате не указаны часы, минуты или секунды или нет соответствующих цифр, то поле обрабатывается как нулевое значение. Значение по умолчанию дляformat– hms12.Атрибут
detailопределяет, в каком формате будет озвучиваться время – 12-часовом или 24-часовом. Еслиdetail='1'илиdetailопущены, а время указано в 24-часовом формате, то и озвучиваться оно будет в 24-часовом формате. Еслиdetail='2'илиdetailне указаны, а время задано в 12-часовом формате, то и озвучиваться оно будет в 12-часовом формате.
Подробнее об элементе say-as рассказывается в спецификации W3.
<audio>
Поддерживает вставку записанных аудиофайлов и других аудиоформатов в сочетании с синтезированным речевым выводом.
Атрибуты
| Атрибут | Обязательно | По умолчанию | Значения |
|---|---|---|---|
src |
Да | – | URI, указывающий на источник аудиофайла. Поддерживаемый протокол: https. |
clipBegin |
Нет | 0 | TimeDesignation – смещение относительно начала аудиоисточника, с которого нужно начать воспроизведение. Если это значение больше или равно фактической продолжительности аудиоисточника, то аудио не вставляется. |
clipEnd |
Нет | бесконечность | TimeDesignation – смещение от начала аудиоисточника до конца воспроизведения. Если фактическая продолжительность аудиоисточника меньше этого значения, воспроизведение закончится раньше. Если clipBegin больше или равно clipEnd, аудио не вставляется. |
speed |
Нет | 100% | Отношение скорости воспроизведения выходного аудио к нормальной скорости входного аудио, выраженное в процентах. Формат: положительное действительное число, за которым следует знак %. В настоящее время поддерживается диапазон от 50 % (замедление в два раза) до 200 % (ускорение в два раза). Значения за пределами этого диапазона могут быть скорректированы. |
repeatCount |
Нет | 1 или 10, если задано значение repeatDur |
Действительное число, указывающее, сколько раз нужно вставить аудио (после обрезки, если она есть, с помощью clipBegin и/или clipEnd). Дробные повторения не поддерживаются, поэтому значение будет округлено до ближайшего целого числа. Ноль не является допустимым значением, поэтому он обрабатывается как неуказанное значение и в этом случае имеет значение по умолчанию. |
repeatDur |
Нет | бесконечность | TimeDesignation, который ограничивает продолжительность вставленного аудио после обработки источника для атрибутов clipBegin, clipEnd, repeatCount и speed (а не обычную продолжительность воспроизведения). Если продолжительность обработанного аудио меньше этого значения, воспроизведение завершается в этот момент. |
soundLevel |
Нет | +0 дБ | Изменить уровень громкости аудио на soundLevel децибел. Максимальный диапазон составляет +/-40 дБ, но фактический диапазон может быть меньше, а качество выходного сигнала может быть невысоким во всем диапазоне. |
В настоящее время поддерживаются следующие настройки аудио:
- Формат: MP3 (MPEG v2).
- 24 000 выборок в секунду
- 24–96 Кбит/с, фиксированная скорость
- Формат: Opus в Ogg.
- 24 000 выборок в секунду (сверхширокополосный)
- 24–96 кбит/с, фиксированная скорость
- Формат (поддержка прекращена): WAV (RIFF)
- PCM, 16-битный со знаком, прямой порядок байтов
- 24 000 выборок в секунду
- Для всех форматов:
- Предпочтительно использовать один канал, но допускается и стерео.
- Максимальная продолжительность – 240 секунд. Если вы хотите воспроизводить более длинные аудиофайлы, используйте медиаответы.
- Размер файла не должен превышать 5 МБ.
- URL источника должен использовать протокол HTTPS.
- При получении аудиофайла наш агент пользователя – Google-Speech-Actions.
Содержимое элемента <audio> необязательно и используется, если аудиофайл не удается воспроизвести или устройство вывода не поддерживает аудио. В контенте может быть элемент <desc>, и в этом случае для показа используется его текстовое содержимое. Дополнительную информацию можно найти в разделе "Записанное аудио" контрольного списка ответов.
URL src должен быть URL по HTTPS (аудиофайлы можно разместить в Google Cloud Storage).
Дополнительную информацию о медиаответах можно найти в разделе Медиаответы руководства по ответам.
Подробнее об элементе audio рассказывается в спецификации W3.
Пример
<speak> <audio src="cat_purr_close.ogg"> <desc>a cat purring</desc> PURR (sound didn't load) </audio> </speak>
<p>,<s>
Элементы предложений и абзацев.
Подробную информацию об элементах p и s можно найти в спецификации W3.
Пример
<p><s>This is sentence one.</s><s>This is sentence two.</s></p>
Рекомендации
- Используйте теги <s>...</s>, чтобы выделить полные предложения, особенно если они содержат элементы SSML, которые меняют просодию (например, <audio>, <break>, <emphasis>, <par>, <prosody>, <say-as>, <seq> и <sub>).
- Если пауза в речи должна быть достаточно длинной, чтобы ее можно было услышать, используйте теги <s>...</s> и поместите эту паузу между предложениями.
<sub>
Указывает, что текст в значении атрибута alias заменяет содержащийся текст для произношения.
Элемент sub также можно использовать, чтобы упростить произношение сложного слова. Последний пример ниже демонстрирует этот вариант использования на японском языке.
Подробнее об элементе sub рассказывается в спецификации W3.
Примеры
<sub alias="World Wide Web Consortium">W3C</sub>
<sub alias="にっぽんばし">日本橋</sub>
<mark>
Пустой элемент, который помещает маркер в текст или последовательность тегов. Его можно использовать для ссылки на определенное место в последовательности или для вставки маркера в выходной поток для асинхронного уведомления.
Подробнее об элементе mark рассказывается в спецификации W3.
Пример
<speak> Go from <mark name="here"/> here, to <mark name="there"/> there! </speak>
<prosody>
Используется для настройки высоты тона, скорости речи и громкости текста, содержащегося в элементе. В настоящее время поддерживаются атрибуты rate, pitch и volume.
Атрибуты rate и volume можно задать в соответствии со спецификациями W3. Указывать значения атрибута pitch можно тремя способами:
| Атрибут | Описание |
|---|---|
name |
Строковый идентификатор для каждой метки. |
| Option | Описание |
|---|---|
| Член семьи | Укажите относительное значение (например, "низкий", "средний", "высокий" и т.д.), где "средний" – это высота тона по умолчанию. |
| Полутона | Чтобы повысить или понизить высоту тона на N полутонов, используйте "+Nst" или "-Nst" соответственно. Обратите внимание, что знаки "+/-" и "st" обязательны. |
| В процентах | Чтобы увеличить или уменьшить высоту тона на N процентов, используйте +N % или -N % соответственно. Обратите внимание, что знак процента (%) обязателен, а знаки плюса (+) и минуса (-) – нет. |
Подробнее об элементе prosody рассказывается в спецификации W3.
Пример
В следующем примере элемент <prosody> используется для медленного воспроизведения речи на два полутона ниже обычного:
<prosody rate="slow" pitch="-2st">Can you hear me now?</prosody>
<emphasis>
Используется для выделения текста, содержащегося в элементе. Элемент <emphasis> изменяет речь так же, как и <prosody>, но без необходимости задавать отдельные атрибуты речи.
Этот элемент поддерживает необязательный атрибут level со следующими допустимыми значениями:
strongmoderatenonereduced
Подробнее об элементе emphasis рассказывается в спецификации W3.
Пример
В примере ниже элемент <emphasis> используется для объявления:
<emphasis level="moderate">This is an important announcement</emphasis>
<par>
Параллельный медиаконтейнер, позволяющий воспроизводить несколько медиаэлементов одновременно. Допустимый контент – набор из одного или нескольких элементов <par>, <seq> и <media>. Порядок элементов <media> не имеет значения.
Если для дочернего элемента не указано другое время начала, то неявное время начала для элемента совпадает с временем начала контейнера <par>. Если для дочернего элемента задано значение смещения в атрибуте begin или end, смещение элемента будет рассчитываться относительно времени начала контейнера <par>. Для корневого элемента <par> атрибут begin игнорируется, а время начала – это момент, когда процесс синтеза речи SSML начинает генерировать выходные данные для корневого элемента <par> (то есть фактически время "ноль").
Пример
<speak>
<par>
<media xml:id="question" begin="0.5s">
<speak>Who invented the Internet?</speak>
</media>
<media xml:id="answer" begin="question.end+2.0s">
<speak>The Internet was invented by cats.</speak>
</media>
<media begin="answer.end-0.2s" soundLevel="-6dB">
<audio
src="https://actions.google.com/.../cartoon_boing.ogg"/>
</media>
<media repeatCount="3" soundLevel="+2.28dB"
fadeInDur="2s" fadeOutDur="0.2s">
<audio
src="https://actions.google.com/.../cat_purr_close.ogg"/>
</media>
</par>
</speak><seq>
Последовательный медиаконтейнер, который позволяет воспроизводить медиаэлементы один за другим. Допустимый контент – набор из одного или нескольких элементов <seq>, <par> и <media>. Порядок элементов мультимедиа определяет порядок их обработки.
Атрибуты begin и end дочерних элементов могут быть заданы как значения смещения (см. раздел Указание времени ниже). Значения смещения дочерних элементов будут относиться к концу предыдущего элемента в последовательности или, в случае первого элемента в последовательности, к началу его контейнера <seq>.
Пример
<speak>
<seq>
<media begin="0.5s">
<speak>Who invented the Internet?</speak>
</media>
<media begin="2.0s">
<speak>The Internet was invented by cats.</speak>
</media>
<media soundLevel="-6dB">
<audio
src="https://actions.google.com/.../cartoon_boing.ogg"/>
</media>
<media repeatCount="3" soundLevel="+2.28dB"
fadeInDur="2s" fadeOutDur="0.2s">
<audio
src="https://actions.google.com/.../cat_purr_close.ogg"/>
</media>
</seq>
</speak><media>
Представляет медиаслой в элементе <par> или <seq>. Допустимое содержимое элемента <media> – это элемент SSML <speak> или <audio>. В таблице ниже описаны допустимые атрибуты для элемента <media>.
Атрибуты
| Атрибут | Обязательно | По умолчанию | Значения |
|---|---|---|---|
| xml:id | Нет | Значения нет | Уникальный XML-идентификатор этого элемента. Закодированные объекты не поддерживаются. Допустимые значения идентификаторов соответствуют регулярному выражению "([-_#]|\p{L}|\p{D})+". Подробнее об XML-ID… |
| begin | Нет | 0 | Время начала для этого медиаконтейнера. Игнорируется, если это корневой элемент медиаконтейнера (обрабатывается так же, как значение по умолчанию "0"). Допустимые значения строк приведены в разделе Указание времени ниже. |
| end | Нет | Значения нет | Спецификация времени окончания для этого медиаконтейнера. Допустимые значения строк приведены в разделе Указание времени ниже. |
| repeatCount | Нет | 1 | Действительное число, указывающее, сколько раз нужно вставить медиафайл. Дробные значения не поддерживаются, поэтому значение будет округлено до ближайшего целого числа. Ноль не является допустимым значением, поэтому он обрабатывается как неуказанное значение и в этом случае имеет значение по умолчанию. |
| repeatDur | Нет | Значения нет | TimeDesignation – ограничение на продолжительность вставляемого медиаконтента. Если продолжительность медиаконтента меньше этого значения, воспроизведение завершается в указанное время. |
| soundLevel | Нет | +0 дБ | Изменить уровень громкости аудио на soundLevel децибел. Максимальный диапазон составляет +/-40 дБ, но фактический диапазон может быть меньше, а качество выходного сигнала может быть невысоким во всем диапазоне. |
| fadeInDur | Нет | 0 сек. | TimeDesignation, в течение которого громкость медиаконтента будет увеличиваться от нуля до значения, указанного в параметре soundLevel. Если продолжительность медиаконтента меньше этого значения, то увеличение громкости прекратится в конце воспроизведения и уровень звука не достигнет заданного значения. |
| fadeOutDur | Нет | 0 сек. | TimeDesignation, в течение которого громкость медиаконтента будет снижаться от значения, указанного в soundLevel, до нуля. Если продолжительность медиаконтента меньше этого значения, уровень звука устанавливается на более низкое значение, чтобы в конце воспроизведения была тишина. |
Указание времени
Время, используемое для значения атрибутов `begin` и `end` элементов <media> и медиаконтейнеров (элементов <par> и <seq>), представляет собой либо значение смещения (например, +2.5s), либо значение syncbase (например, foo_id.end-250ms).
- Значение смещения. Значение смещения по времени – это значение Timecount-value в SMIL, которое допускает значения, соответствующие регулярному выражению:
"\s\*(+|-)?\s\*(\d+)(\.\d+)?(h|min|s|ms)?\s\*"Первая строка цифр – это целая часть десятичного числа, а вторая – дробная. По умолчанию используется знак "+". Значения единиц измерения соответствуют часам, минутам, секундам и миллисекундам. По умолчанию используются секунды (s).
- Значение syncbase-value. Значение syncbase-value в SMIL, которое допускает значения, соответствующие регулярному выражению:
"([-_#]|\p{L}|\p{D})+\.(begin|end)\s\*(+|-)\s\*(\d+)(\.\d+)?(h|min|s|ms)?\s\*"Цифры и единицы измерения интерпретируются так же, как и значение смещения.
Симулятор озвучивания текста
В консоли Actions есть симулятор TTS, который можно использовать для тестирования SSML с любым из перечисленных выше элементов. Симулятор TTS находится в консоли в разделе Simulator (Симулятор) > Audio (Аудио). Введите текст и SSML в симуляторе и нажмите Обновить и прослушать, чтобы услышать результат TTS.

Вы также можете нажать кнопку скачивания, чтобы сохранить файл .mp3 с озвученным текстом.