Использовать речевые технологии можно отдельно от инструментария 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
}
},