Использовать речевые технологии можно отдельно от инструментария Studio. Подробнее об этом в разделе SaluteSpeech.
Хинты - это одноразовые подсказки для сервиса распознавания речи, помогающие правильно понять речь пользователя в определенный момент времени. Например, когда приложение ожидает от пользователя конкретный ответ, этот ответ заранее придет в сервис в виде хинтов.
Подсказка работает только для следующего ответа пользователя. После использования хинтов процесс распознавания речи пользователя возвращается к ее обработке без подсказок.
Хинты можно подключать двумя способами:
- Через Code
- Через SmartApp API
Виды хинтов
Хинты могут быть не только списком слов или фраз. Существуют следующие виды хинтов:
words
— позволяет использовать список слов или фраз, распознавание которых мы хотим усилить. Здесь можно перечислить слова, которые с высокой вероятностью будет произносить пользователь, отвечая ассистенту в приложении.enable_letters
— позволяет включить модель коротких фраз, тем самым улучшить распознавание отдельных букв и коротких слов.eou_timeout
- меняет настройку системы распознавания конца фразы (End of Utterance - eou). Система закончит распознавать речь, как только от конца фразы, определенного ею, пройдет столько секунд, сколько установлено в этом параметре. Возможные значения от 0.5 до 5 секунд. По умолчанию распознавание конца фразы срабатывает после 1 секунды.eou_phrase_match
— использует регулярные выражения при распознавании конца фразы. Данный хинт позволяет не прерывать речь пользователя, пока он говорит ожидаемую от него фразу, а также быстро закончить распознавание после окончания фразы пользователя.
Подробнее об использовании хинтов читайте в разделе Примеры работы хинтов в разных приложениях.
Как работают хинты
Хинты срабатывают однократно и отправляются в сервис распознавания речи, чтобы следующая фраза пользователя была правильно распознана и передана приложению. Хинты необходимо включать в код приложения каждый раз, когда нужно их отправить в сервис распознавания речи. Пример работы хинтов:
- Пользователь открывает приложение с игрой и говорит: «Начинай игру».
- Ассистент отвечает: «Скажи, кто ходит первый. Ты или я?». Приложение в этот момент передает хинты
enable_letters
. - Далее пользователь отвечает: «Я». Фраза «Я» использует хинты и успешно распознается.
Хинты срабатывают один раз для следующего запроса пользователя из шага 3 после их передачи на шаге 2. По умолчанию ассистент ожидает ответа пользователя 7 секунд, и далее хинты уже не будут работать. Одновременно с шагом 2 вы можете использовать флаг auto_listening
для следующих действий:
- если
"auto_listening": false
, пользователь сам инициирует запрос (кнопкой или споттер-словом), который выполняется на шаге 3. - если
"auto_listening": true
, ассистент ожидает ответа от пользователя 7 секунд. Ответ пользователя в этом промежутке будет запросом, выполняемым на шаге 3.
Примеры вставки хинтов в код приложения
Для разработки приложений в Code используются языки программирования SmartApp DSL и JavaScript. Ниже приведены примеры вставки хинтов на языке SmartApp DSL. При использовании JavaScript вы можете вынести приведенный в примерах скрипт в отдельную функцию и вызвать ее по своему усмотрению из любого места кода.
Обратите внимание, если вы добавляете ответ, как указано в примере, то следующий пользовательский запрос передаст хинты однократно! Вызывать функцию с хинтами необходимо каждый раз, когда нужно их передать в сервис синтеза речи.
Вставка хинтов в Code
Хинты с использованием words
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type":"raw",
"body":{
"asr_hints": {
"words": ["Гуакомоле", "Зуппа ди пеше"]
},
},
"messageName":"ANSWER_TO_USER"
})
Хинты с использованием enable_letters
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type":"raw",
"body":{
"asr_hints": {
"enable_letters": true
},
},
"messageName":"ANSWER_TO_USER"
})
Хинты с использованием eou_timeout
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type":"raw",
"body":{
"asr_hints": {
"eou_timeout": 5
},
},
"messageName":"ANSWER_TO_USER"
})
Хинты с использованием eou_phrase_match
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type":"raw",
"body":{
"asr_hints": {
"eou_phrase_match": {
"regex" : "да|нет|алло"
}
},
},
"messageName":"ANSWER_TO_USER"
})
Вставка хинтов в SmartApp API
Если вы используете SmartApp API, то хинты добавляются в поле payload
ответа пользователю с типом ANSWER_TO_USER
. Примеры:
Хинты с использованием words
"payload": {
"asr_hints": {
"words": ["лайк", "дизлайк"]
}
}
Хинты с использованием enable_letters
"payload": {
"asr_hints": {
"enable_letters": true
}
}
Хинты с использованием eou_timeout
"payload": {
"asr_hints": {
"eou": 5
}
}
Хинты с использованием eou_phrase_match
"payload": {
"asr_hints": {
"eou_phrase_match": {"regex" : "да|нет|алло"}
}
}
Примеры работы хинтов в разных приложениях
Использование words
words
позволяет использовать список слов, распознавание которых мы хотим усилить. Хинтами могут быть слова на кириллице и латинице.
Рекомендуемое количество хинтов words
– не более 100. Используйте хинты только для имен собственных, редких и плохо распознаваемых слов. Не стоит добавлять все предполагаемые слова пользователя, это не улучшит качество распознавания.
Чтобы проверить, что хинты работают, попробуйте добавить в список несуществующее или малопопулярное слово, которое не работает без хинтов, например, слово «волерогус», и проверьте, что оно распознается при следующем запросе.
Пример: приложение с игрой «Кто хочет стать миллионером».
- Пользователь запускает игру.
- Ассистент задает вопрос и ожидает ответ от пользователя. В этот момент в сервис распознавания отправляются хинты с правильным вариантом ответа на вопрос.
- Пользователь отвечает на вопрос правильно (в данном случае срабатывают хинты, и ответ пользователя использует хинты) или неправильно (в данном случае речь пользователя распознается штатно).
Использование enable_letters
enable_letters
позволяет включить модель коротких фраз, тем самым улучшить распознавание отдельных букв и коротких слов. Пример: игра «Поле чудес».
- Пользователь запускает игру.
- Ассистент задает вопрос о слове, которое нужно угадать, произнося отдельные буквы. В этот момент в сервис распознавания отправляется включенная опция
enable_letters
, и приложение ожидает от пользователя произнесение отдельных букв. - Пользователь произносит букву, и приложение правильно ее распознает.
Использование eou_timeout
Параметр eou_timeout
определяет, как долго ассистент ждет окончания фразы пользователя. Возможные значения от 0.5 до 5 секунд. Если ожидается, что пользователь может закончить фразу после небольшой паузы, стоит увеличить значение eou_timeout
.
- Пользователь запускает приложение и хочет перевести деньги на номер телефона.
- Ассистент спрашивает номер телефона, на который надо перевести деньги. Пользователь начинает произносить номер телефона не быстро и с некоторыми паузами.
- Со значением
eou_timeout
, равным 5 секунд, распознавание речи не прерывается на середине фразы, а продолжается далее, пока номер полностью не распознается.
Использование eou_phrase_match
Параметр eou_phrase_match
позволяет использовать регулярные выражения для распознавания окончания речи пользователя. Вы можете использовать eou_phrase_match
следующим образом:
- задавать паттерн фразы, которую мы ожидаем от пользователя. Таким образом, мы не прерываем пользователя, пока он говорит ожидаемую от него фразу;
- быстро заканчивать распознавание после того, как пользователь произнес ожидаемую фразу.
eou_phrase_match
использует два параметра:
regex
— строка (string
) с паттерном для фразы, ожидаемой от пользователя.timeout
— число с плавающей запятой (float
), устанавливающее таймаут, на который откладывается завершение распознавания, если пользователь говорит длинную фразу изregex
. Этот параметр лучше использовать, если вы устанавливаете длинные паттерны вregex
. Если не задано, используются обычные настройки.
Значение таймаута eou_phrase_match
имеет приоритет перед значением параметра eou_timeout
при распознавании конца фразы.
Параметр regex
В этом параметре необходимо задать фразу, которая ожидается от пользователя. Для написания значений параметра используется стандартный синтаксис регулярных выражений. Можно задавать цифры, буквы и смешанные комбинации разной длины. Если в регулярном выражении вы используете символ \
, то в json-файле необходимо использовать двойной символ \\
.
Результаты распознавания представляются в нижнем регистре с пробелами между словами и числами. Для распознавания чисел пробелы можно использовать как разделитель между цифрами. Например, если пользователь скажет «один ноль», то в результате распознавания будет 1 0
. Если пользователь скажет «десять», то результат будет 10
.
Пользователь произносит фразу, она проверяется на совпадение с префиксом regex
, затем распознавание прекращается с задержкой в таймаут, если он задан. Если таймаут не задан, то распознавание прекращается с обычными настройками.
Параметр timeout
В этом параметре необходимо задать таймаут ожидания, на который откладывается завершение распознавания, пока пользователь произносит фразу из regex
. Если таймаут указан, то прекращение распознавание посреди фразы будет происходит с задержкой в таймаут. Если таймаут не указан, используются настройки по умолчанию.
Разберем работу eou_phrase_match
на примере приложения-будильника и таймаута в три секунды.
- Пользователь запускает приложение-будильник и хочет установить время срабатывания сигнала.
- После распознавания ассистент спрашивает, на какое время необходимо установить будильник. Пользователь произносит фразу «поставь будильник на 7 часов 30 минут». Далее происходит проверка совпадения префикса
regex
с произнесенной фразой. Пользователь может сделать паузу до трех секунд, и распознавание не прервется. Распознавание закончится, только если пауза будет больше или равна трем секундам. - Хинт сработает на выражении
будильник 7 часов 30 минут
, если значениеregex
равно регулярному выражению:
.*(будильник|напоминание|звонилка).*(на)*(\\d ?) часов.*(\\d ?) минут
Таким образом полное значение хинта будет следующим:
"asr_hints": {
"eou_phrase_match": {
"regex" : ".*(будильник|напоминание|звонилка).*(на)*(\\d ?) часов.*(\\d ?) минут",
"timeout": 3.0
}
},
Примеры
Комбинация букв и цифр для биометрии по голосу. Пользователь произносит слово «код» и любые шесть цифр подряд. В таком случае регулярное выражение будет следующим:
"asr_hints": {
"eou_phrase_match": {
"regex" : "(код)?(\\d ?){6}",
"timeout": 5.0
}
},
Комбинация букв и цифр для быстрого ввода денежных сумм. Пользователь произносит слово "сумма" и число. В таком случае регулярное выражение будет следующим:
"asr_hints": {
"eou_phrase_match": {
"regex" : ".*(сумма)*(\\d ?)*рубл(ей|я)",
"timeout": 2.0
}
},