Разметка синтеза речи SSML


SSML (Speech Synthesis Markup Language) — язык разметки синтеза речи. SSML базируется на спецификации от W3C. Также дополнительным слоем поддерживается разметка Яндекса для облегчения портирования приложений сторонних разработчиков.

Общий список поддерживаемых тегов:

  1. <break time="VALUEx" strength="STR"/> - пауза
  2. <say-as interpret-as="date"></say-as> - синтез даты
  3. <sub alias="text">replaced_text</sub> - синтезирует "текст" вместо "заменяемый текст"
  4. <audio text=“value”>value1</audio> - синтезирует указанный в теге текст
  5. <say-as interpret-as="cardinal"></say-as> количественное числительное
  6. <say-as interpret-as="ordinal"></say-as> - порядковое числительное
  7. <say-as interpret-as="spell-out"></say-as> - произношение аббревиатур через вокализации
  8. <say-as interpret-as="telephone"></say-as> - синтез мобильного номера
  9. <say-as interpret-as="money"></say-as> - синтез денежной суммы

Описание поддерживаемых тегов

тег <break>:

<break time="VALUE" strength="STR" /> , где:

  • VALUE - число:

    • может быть decimal
    • в начале может быть '+'
  • x - единица измерения:

    • ms - миллисекунды
    • s - секунды
  • STR - может принимать значения:

    • x-weak
    • weak
    • medium
    • strong
    • x-strong (совпадает со strong)
  • Если не указать никаких атрибутов <break /> - сработает как strength="medium".
  • time имеет приоритет перед strength.

Пример:

    Тестовый пример.
    <break time="200ms" />
    Второй пример.
    <break strength="weak" />

тег <sub>:

тег для замены звучания слов на более привычные. Например, мы говорим "щета", а не "счета".

<sub alias="TEXT">REPLACED_TEXT</sub> , где:

  • TEXT - текст, который будет отправлен на генерацию
  • REPLACED_TEXT - заменяемый текст

Пример:

    <sub alias="щета">счета</sub>

тег <audio>:

Есть несколько вариантов использования тега audio - синтез текста с междометием:

<audio text=“value1” /> value2, где:

  • value1 - междометие, которое будет добавлено к основному тексту для оживления фразы
  • value2 - основной текст, который будет синтезирован диктором

или замена междометия каким-либо другим корректным звуком:

<audio text=“value1”>value2</audio>, где:

  • value1 - междометие, звука которого нет у диктора
  • value2 - текст, который будет синтезирован как замена междометия

Пример:

    <speak><audio text="м?"/> Что?</speak>
    <speak><audio text="угу"> да</audio></speak>

У каждого ассистента есть свой набор междометий в нескольких вариантах произношения. Самые распространённые и популярные междометия имеют более 10 вариантов произношения. Каждый раз при использовании таких междометий и восклицаний вариант произношения выбирается случайным образом. Такой способ делает речь ассистента более живой и эмоциональной.

Пример:

    <speak><audio text="кхм-кхм"/> Какая сегодня погода?</speak>
    <speak><audio text="ааааа!"/> Что узнать?</speak>
    <speak><audio text="кхм-кхм"/> Про погоду хочу послушать</speak>
    <speak><audio text="ааааа!"/> Сегодня солнышко</speak>

В этом примере одинаковые междометия будут звучать с разной эмоциональной окраской. Список поддерживаемых символов вы можете найти тут. Полная информация междометий для каждого ассистента представлена в разделах:


тег <say-as>

Тег <say-as> включает в себя атрибут interpret-as.

Значение Описание Примеры
cardinal количественное числительное Описание ниже
ordinal порядковое числительное Описание ниже
spell-out произношение аббревиатур через вокализации <say-as interpret-as="spell-out">МКК</say-as>
date синтез даты Описание ниже
telephone синтез телефонного номера Описание ниже
money синтез произношения валют Описание ниже

Описание "cardinal" и "ordinal"

<say-as interpret-as="VALUE" format="GENDER_CASE"></say-as>

  • VALUE - строка:

    • cardinal - порядковое числительное
    • ordinal - количественное числительное
  • GENDER - строка:

    • masculine - мужской род
    • feminine - женский род
    • neuter - средний род
    • plural - множественное число
  • CASE - строка:

    • nominative - именительный
    • genitive - родительный
    • dative - дательный
    • accusative - винительный для одушевленных
    • accusative_dead - винительный для неодушевленых
    • ablative - творительный
    • prepositional - предложный
  • по умолчанию GENDER = masculine, CASE = nominative
  • атрибут format можно указывать в формате CASE_GENDER или GENDER_CASE
  • поддерживаются отрицательные числа
  • поддерживаются нули в начале числа
  • Для cardinal - порядковых числительных.
    Поддерживаются числа не выше миллиардов.
    Если указать число больше, в ответе будет количество миллиардов.
    Например: 1 000 000 000 000 - "тысяча миллиардов".
  • Для ordinal - количественных числительных.
    Поддерживаются числа не выше миллиардов.
    Если указать число больше, будет ошибка.

Пример:

    <speak><say-as interpret-as="cardinal" format="feminine_genitive">1</say-as></speak>

В данном примере будет женский род, родительный падеж числа 1: "одной".


Описание "date"

<say-as interpret-as="date" format="CASE" detail="TEMPLATE">VALUE</say-as>

  • VALUE - числа, разделенные одним из разделителей: ., - или /.
    Порядок и наличие числа, месяца и года должен соответствовать TEMPLATE.
  • Если TEMPLATE не указан, используется по умолчанию формат даты: d.m.y
  • День и месяц можно указывать одной или двумя цифрами.
    Год можно указывать 1-4 цифрами.
  • TEMPLATE - задаёт порядок, в котором указаны число, месяц и год.
    Можно указать только два или только одну часть, например число и месяц без года или только год.
    Допускаются только символы, указанные ниже, которые должны быть разделены
    одним из разделителей: ., - или /. _ d - шаблон для числа месяца _ m - шаблон для месяца _ y - шаблон для года _ yw (вместо y) - в этом случае будет опущено слово год
    ("двух тысячный" вместо "двух тысячный год")
  • CASE - строка:

    • nominative - именительный
    • genitive - родительный
    • dative - дательный
    • accusative - винительный для одушевленных
    • accusative_dead - винительный для неодушевленых
    • ablative - творительный
    • prepositional - предложный

Примеры:

    <speak><say-as interpret-as="date" detail="d.m.y">25.01.2000</say-as></speak>

Результат: Двадцать пятое января двухтысячного года.

    <speak><say-as interpret-as="date" detail="m.yw">01.2000</say-as></speak>

Результат: Январь двухтысячного.

    <speak><say-as interpret-as="date" format="accusative" detail="y">2000</say-as></speak>

Результат: Двухтысячный год.


Описание "telephone"

Пример:

	<say-as interpret-as="telephone" detail="VAL_VAL">+7 (909) 2282424</say-as>

Режим БЕЗ использования разделителя - в номере, например: 495 1214545:

  • можно использовать пробелы
  • код страны: +7, 7 или 8 (указывать необязательно)
  • код оператора или города можно указать в круглых скобках

    • В этом случае поддерживаются следующие форматы кода города
      (номер --- как произносится по группам цифр):

      • (123) --- XXX
      • (1234) --- XX-XX
      • (12345) --- XXX-XX
      • (123456) --- XX-XX-XX
      • (1234567) --- XXX-XX-XX
    • И следующие форматы номера:

      • 1234567 --- XXX-XX-XX
      • 123456 --- XX-XX-XX
      • 12345 --- X-XX-XX
      • 1234 --- XX-XX
      • 123 --- X-XX
  • Код города можно вообще не указывать, будет обработан только номер
  • Если код оператора или города указан без скобок, поддерживаются следующие форматы (можно использовать пробелы):

    • +79651873118 --- XX-XXX-XXX-XX-XX
    • 89651873118 --- X-XXX-XXX-XX-XX
    • 9651873118 --- XXX-XXX-XX-XX

Режим разделителя - в номере, например: 495 121-45-45:

  • проговариваться номер будет по группам цифр между разделителями
  • нельзя делать группы более трех цифр, иначе выдаст ошибку
  • при использовании разделителя можно указывать номер любого формата
  • можно, но необязательно использовать '()' в номере
  • можно, но необязательно использовать '+' в начале номера

Настройка паузы между группами цифр:

С помощью атрибута detail="phone_pause:VALUEms" можно настроить паузу между группами цифр.
VALUE - число в формате integer, указывает паузу в миллисекундах.

Пример:

<?xml version="1.0" ?>
    <speak><say-as interpret-as="telephone" detail="phone_pause:400ms">+7 (999) 123-45-67</say-as></speak>

В этом примере пауза будет равна 400ms расставлена следующим образом:
+7 pause 999 pause 123 pause 45 pause 67

Произношение слова "ровно" в случае круглого числа:

С помощью атрибута detail="use-round-word" можно заставить ассистента произносить слово "ровно", если в номере
круглое трехзначное число в шаблоне XXX-XX-XX

Пример:

<?xml version="1.0" ?>
    <speak><say-as interpret-as="telephone" detail="use-round-word">+7 (800) 500-45-60</say-as></speak>

Результат: плюс семь восемьсот пятьсот ровно сорок пять шестьдесят

В аттрибуте detail можно одновременно указывать паузу и использование слова "ровно", через знак _

Пример:

<?xml version="1.0" ?>
    <speak><say-as interpret-as="telephone" detail="use-round-word_phone_pause:400ms">+7 (800) 500-45-60</say-as></speak>

Описание "money"

<say-as interpret-as="money" format="CASE" detail="CURRENCY_short-form_say-null-cents">VALUE</say-as>

  • CASE - строка, указание падежа:

    • nominative - именительный
    • genitive - родительный
    • dative - дательный
    • accusative - винительный
    • ablative - творительный
    • prepositional - предложный

Параметры в аттрибуте detail надо указывать через знак _

  • CURRENCY - строка, указывает валюту (по умолчанию используется рубль):

    • RUB - рубль
    • USD - доллар США
    • EUR - евро
    • GBP - фунт стерлинг
    • CAD - канадский доллар
    • CHF - швейцарский франк
    • SEK - шведская крона
    • DKK - датская крона
    • NOK - норвежская крона
    • JPY - японская йена
    • CNY - китайский юань
    • PLN - польский злотый
  • short-form - если указать этот параметр, будут использоваться короткие формы названий валют.
    Например, "доллар" вместо "американский доллар".
  • say-null-cents - если указать этот параметр, "центы" будут произнесены в любом случае, даже если их ноль.
    Например, "десять долларов, ноль центов".

Примеры:

    <speak><say-as interpret-as="money" format="genitive" detail="say-null-cents">10</say-as></speak>

Результат: десяти рублей, ноля копеек.

    <speak><say-as interpret-as="money" detail="USD">21</say-as></speak>

Результат: Двадцать один доллар США.

    <speak><say-as interpret-as="money" detail="USD_short-form">21,15</say-as></speak>

Результат: Двадцать один доллар, пятнадцать центов.

Выделение слова

Чтобы с помощью интонации выделить конкретное слово в речи ассистента, используйте символ *. Звездочка ставится вплотную к слову.

Пример с выделением слова "большая":

    <speak>Сахара – самая *большая пустыня</speak>

Пример без выделения всех слов:

    <speak>Сахара – самая большая пустыня</speak>

Обработка букв е и ё

По умолчанию речь ассистента синтезируется с учётом контекста. Слова с буквой "ё" ассистент произносит правильно независимо от того, как они написаны. Например, слово "елка" будет звучать правильно, даже если буква "ё" не указана.

Для принудительного использования "ё" просто пишите ее там, где она нужна. Если в слове буква "е" произносится ошибочно как "ё", тогда поставьте ударение в слове на ударный слог с буквой "е", используя символ '. Обратите внимание, что апостроф ставится после ударной буквы.

Пример с ударением:

<speak>бере'т</speak>

Пример без ударения:

<speak>берет</speak>

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней