Pull to refresh

Asterisk + UniMRCP + VoiceNavigator. Синтез и распознавание речи в Asterisk. Часть 2

Reading time 7 min
Views 8.3K
Часть 1
Часть 3
Часть 4

В предыдущей статье была описана общая схема работы, установлен UniMRCP, Asterisk подключен к VoiceNavigator и создано простое голосовое приложение.
Остановимся подробнее на возможностях синтеза и распознавания. Первая часть статьи будет посвящена языку разметки SSML, вторая — построению грамматик.

Использование языка разметки SSML


Управление синтезом речи на лингвистическом и акустическом уровне, происходит с помощью управляющих тегов в формате SSML.
С помощью тегов можно определить произношение, управлять интонацией, скоростью и громкостью звучания и т.д.
Опишу только наиболее используемые теги.
Подробную информацию по всем тегам можно получит в описании стандарта .

Тег voice

Позволяет менять голос.
На сегодня VoiceNavigator имеет 5 голосов: Мария, Анна, Лидия, Александр, Владимир.
Пример:
<voice name=\"Мария8000\">Меня зовут Мария.</voice>

Тег say-as

Определяет способ чтения заключенного в тег выражения.
<say-as информационная часть тега> текст </say-as>

Информационная часть тега представляет собой список вида:
Атрибут тега = «Значение атрибута»
На одном слове может быть не более одного тега. Вложенность тегов say-as запрещена.

Арибут stress

Задаёт номер гласной, на которой на слово ставится основное ударение.
Нумерация считается по гласным слова, начиная с 1.
Формат:
<say-as stress="номер гласной"> Исходное слово</say-as>

В случае несоответствия значения атрибута количеству гласных в слове атрибут будет
проигнорирован.
Пример:
<say-as stress="2"> Компас </say-as>

Вместо слова «ко<мпас», будет обрабатываться слово «компа<с».

Арибут interpret-as

Значение «date»
Устанавливает значение даты в грегорианском стиле. Текст внутри тега задается в виде числовых полей с разделителями. Разделителем может быть точка, дефис, двоеточие или слеш. При этом необходимо наличие атрибута format, значением которого является одна из следующих строк:
«mdy» – месяц, день, год «ym» – год, месяц
«dmy» – день, месяц, год «my» – месяц, год
«ymd» – год, месяц день «m» – месяц"
«md» – месяц, день «d» – день
«dm» – день, месяц «y» – год
Примеры:
<say-as interpret-as="date" format=\"dy\"> 3/02 </say-as>
— «март две тысячи второго года»
<say-as interpret-as="date" format=\"mdy\"> 3/6/02 </say-as>
— «шестого марта две тысячи второго года»

Значение «time»
Устанавливает значение времени. Текст внутри тега задается в виде числовых полей с разделителями или без них, в последовательности: часы, минуты, секунды. Разделителем может быть точка, дефис, двоеточие или слеш.
Примеры:
после <say-as interpret-as=\"time\">2230</say-as>
— «после двадцати двух»
сейчас <say-as interpret-as=\"time\"> 9:21:30
</say-as>
— «сейчас девять часов двадцать одна минута тридцать секунд»

Значение «telephone»
Задает чтение данного слова или группы слов как номеров или номера телефонов. Слово номер телефона может содержать знак «+» и круглые скобки. Номер читается как количественное числительное в именительном падеже. При этом происходит разбиение номера на двух- и трехзначные числа. Нечисловые слова, попавшие в область действия тега, при этом обрабатываются обычным способом.
Пример:
<say-as interpret-as=\"telephone\"> +7 (812) 1234567 добавочный 2345</say-as>

Значение «characters»
Задает чтение данного слова или группы слов по буквам. При этом буквы читаются как алфавитные, числительные по цифрам, как количественные в именительном падеже, специальные символы и знаки препинания заменяются соответствующими словами. Прописные и строчные буквы при этом не различаются.
Пример:
<say-as interpret-as=\”characters\”> Б2a24-B!Zх?#7X </say-as>
— «бэ два а два четыре дефис би восклицательный знак зэт икс вопросительный знак решетка семь икс»

Тег break

Добавление паузы заданной длительности или типа.
Атрибуты:
strength — «выразительность» паузы. Допустимые значения «none», «x-weak», «weak», «medium» (по умолчанию), «strong», «x-strong».
time – длительность паузы в миллисекундах.
Атрибуты strength и time могут быть указаны одновременно, при этом strength влияет только на интонацию, а time на длительность паузы.
Пример задания паузы длинной 3.6 секунды:
Я отойду на минутку. <break time=\"3600\"/> Вы еще здесь?

Тег prosody

Позволяет контролировать тон, скорость и громкость речи.
Атрибуты (все необязательные)
pitch — среднее значение тона.
Допустимые значения: от 0.5 до 2.
rate — скорость речи. Допустимые значения: относительное изменение или одно из значений «x-slow», «slow», «medium», «fast», «x-fast», «default».
volume — громкость. Допустимые значения: относительное изменение или одно из значений «silent», «x-soft», «soft», «medium», «loud», «x-loud», «default».
Пример:
<prosody volume=\"25\" rate=\"x-slow\"> Доброе утро!</prosody>

Тег phoneme

Тег обеспечивает фонемную транскрипцию
Атрибуты:
ph – транскрипция, обязательный атрибут;
alphabet – алфавит, который используется для задания фонем. VoiceNavigator поддерживает алфавит IPA.
Пример:
<phoneme alphabet="ipa" ph="Транскрипция на алфавите IPA (символы алфавита не отображаются Хабром)">


Построение SRGS-грамматик


SRGS (speech recognition grammar specification) – W3C стандарт, который описывает структуру грамматики, используемой в распознавании речи. SRGS позволяет задавать слова или словосочетания, которые могут быть распознаны речевым движком.

Базовая структура SGRS-грамматики приведена ниже:
<?xml version="1.0" encoding="UTF-8"?>
<grammar version="1.0"
xmlns="http://www.w3.org/2001/06/grammar"
mode="voice"
xml:lang="ru-RU"
root="velo">
<rule id="velo">
велосипед
</rule>
</grammar>

Весь SGRS-документ описывается в теге grammar.
Грамматика содержит правила распознавания речи, описываемые в теге rule и каждое правило имеет уникальное имя в пределах грамматики задаваемое атрибутом id. Правило, с которого начинается распознавание в грамматике, задается атрибутом root в теге grammar.

Альтернативные варианты произношения

Альтернативные варианты позволяют распознать одно слово из заданного множества.
Альтернативные варианты задаются тегами one-of и item.
Например:
<?xml version="1.0" encoding="UTF-8"?>
<grammar version="1.0"
xmlns="http://www.w3.org/2001/06/grammar"
mode="voice"
xml:lang="ru-RU"
root="velo">
<rule id="velo">
<one-of>
<item>красный</item>
<item>зеленый</item>
<item>синий</item>
</one-of>
велосипед
</rule>
</grammar>

Такая «расширенная» грамматика позволяет распознать произнесения: «красный велосипед», «зеленый велосипед» или «синий велосипед».
Элемент item может содержать любой тег, который описывает правило SGRS-грамматики, включая последовательности слов или элемент one-of.
Более полная версия грамматики может содержать вес в каждой альтернативной ветви
распознавания. Вес задается с помощью тега weight элемента item.

Подправила

Правила могут содержать в себе ссылки на другие правила. Ссылки на другие правила задаются элементом ruleref и служат для использования одного и того же правила в разных местах грамматики.
В следующем примере выделим цвет велосипеда в отдельное подправило:
<?xml version="1.0" encoding="UTF-8"?>
<grammar version="1.0"
xmlns="http://www.w3.org/2001/06/grammar"
mode="voice"
xml:lang="ru-RU"
root="velo">

<rule id="velo">
<ruleref uri=”#color”/> велосипед
</rule>

<rule id="color">
<one-of>
<item weight="50”>красный</item>
<item>зеленый</item>
<item>синий</item>
</one-of>
</rule>

</grammar>

Специальные правила

SGRS-грамматика имеет специальные правила, за которыми зарезервированы имена: NULL и GARBAGE.
Специальные правила задаются атрибутом special элемента ruleref.
Правило NULL срабатывает автоматически, если пользователь ничего не произнес.
Правило GARBAGE (использующее модель «средней речи») позволяет создавать так называемые «открытые грамматики». т.е. различать слова из грамматики и «мусор».
Например:
<?xml version="1.0" encoding="UTF-8"?>
<grammar version="1.0"
xmlns="http://www.w3.org/2001/06/grammar"
mode="voice"
xml:lang="ru-RU"
root="velo">
<rule id="velo">
<ruleref special =”GARBAGE”/> горный <ruleref special =”GARBAGE”/> велосипед
</rule>
</grammar>

Вы можете сказать «Я хочу горный красный велосипед» и система вернет в качестве результата распознавания «горный велосипед».

Анализатор грамматик VoiceNavigator также поддерживает собственное правило !SYLLABLES, реализующее подключение «слоговой модели» речи.
Использование слоговой модели во многих случаях позволяет уменьшить вероятность ложных срабатываний и получить выигрыш в надежности отсечения не предусмотренных грамматикой произнесений, «мусора».

Семантическая интерпретация

Семантическая интерпретация представляет собой механизм, который позволяет задать значение для распознанного слова, которое потом можно использовать в логике голосового приложения.
Например: можно произнести «да», «хорошо» или «согласен», но семантический результат этих слов одинаков.
В SGRS-грамматики семантика задается элементом tag. Тип содержимого этого элемента задается атрибутом tag-format элемента grammar. Спецификация Semantic Interpretation for Speech Recognition определяет стандартные значения для атрибута tag-format: semantics/1.0-literals и semantics/1.0.
Синтаксис элемента tag типа semantics/1.0-literals представляет собой простую строку.
Тип semantics/1.0 представляет собой более мощное средство в виде скриптового языка. В этом случае элемент tag содержит код языка ECMAScript.
Пример:
<?xml version="1.0" encoding="utf-8"?>
<!-- Да/Нет -->
<grammar xml:lang="ru-RU" root="da-net" mode="voice" version="1.0" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0-literals">
<rule id="da-net">
  <one-of>
          <item>да<tag>yes</tag></item>
          <item>верно<tag>yes</tag></item>
          <item>правильно<tag>yes</tag></item>
          <item>хочу<tag>yes</tag></item>
          <item>ага<tag>yes</tag></item>
          <item>нет<tag>no</tag></item>
          <item>неправильно<tag>no</tag></item>
          <item>неверно<tag>no</tag></item>
          <item>не хочу<tag>no</tag></item>
          <item>назад<tag>back</tag></item>
  </one-of>
</rule>
</grammar>


На этом основная теоретическая часть закончена. Надеюсь, что получилось не очень нудно. В следующей части рассмотрю какой-нибудь практический кейс и покажу как синтез и распознавание облегчают жизни при построении голосовых меню.
Tags:
Hubs:
+20
Comments 8
Comments Comments 8

Articles

Information

Website
speechpro.ru
Registered
Founded
1990
Employees
201–500 employees
Location
Россия