Хинты

Хинты - это одноразовые подсказки для сервиса распознавания речи, помогающие правильно понять речь пользователя в определённый момент времени. Например, когда приложение ожидает от пользователя конкретный ответ, этот ответ заранее придёт в сервис в виде хинтов.

Подсказка работает только для следующего ответа пользователя. После использования хинтов процесс распознавания речи пользователя возвращается к её обработке без подсказок.

Хинты можно подключать двумя способами:

Виды хинтов

Хинты могут быть не только списком слов или фраз. Существуют следующие виды хинтов:

  • words — позволяет использовать список слов или фраз, распознавание которых мы хотим усилить. Здесь можно перечислить слова, которые с высокой вероятностью будет произносить пользователь, отвечая ассистенту в приложении.
  • enable_letters — позволяет включить модель коротких фраз, тем самым улучшить распознавание отдельных букв и коротких слов.
  • nospeechtimeout - меняет интервал ожидания речи пользователя. Возможные значения от 2 до 20 секунд. По умолчанию стоит 7 секунд.
  • eou - меняет настройку системы распознавания конца фразы (End of Utterance - eou). Система закончит распознавать речь, как только от конца фразы, определённого ею, пройдет столько секунд, сколько установлено в этом параметре. Возможные значения от 0.5 до 5 секунд. По умолчанию распознавание конца фразы срабатывает после 1 секунды.
  • eou_phrase_match — использует регулярные выражения при распознавании конца фразы. Данный хинт позволяет не прерывать речь пользователя, пока он говорит ожидаемую от него фразу, а также быстро закончить распознавание после окончания фразы пользователя.

Как работают хинты

Хинты срабатывают однократно и отправляются в сервис распознавания речи, чтобы следующая фраза пользователя была правильно распознана и передана приложению. Хинты необходимо включать в код приложения каждый раз, когда нужно их отправить в сервис распознавания речи. Пример работы хинтов:

  1. Пользователь открывает приложение с игрой и говорит: "Начинай игру".
  2. Ассистент отвечает: "Скажи, кто ходит первый. Ты или я?". Приложение в этот момент передаёт хинты enable_letters.
  3. Далее пользователь отвечает: "Я". Фраза "Я" использует хинты и успешно распознаётся.

Хинты срабатывают один раз для следующего запроса пользователя из шага 3 после их передачи на шаге 2. По умолчанию ассистент ожидает ответа пользователя 7 секунд, и далее хинты уже не будут работать. Одновременно с шагом 2 вы можете использовать флаг auto_listening для следующих действий:

  • если "auto_listening": false, пользователь сам инициирует запрос (кнопкой или споттер-словом), который выполняется на шаге 3.
  • если "auto_listening": true, ассистент ожидает ответа от пользователя 7 секунд. Ответ пользователя в этом промежутке будет запросом, выполняемым на шаге 3.

Примеры вставки хинтов в код приложения

Для разработки приложений в SmartApp Code используются языки программирования SmartApp DSL и JavaScript. Ниже приведены примеры вставки хинтов на языке SmartApp DSL. При использовании JavaScript вы можете вынести приведённый в примерах скрипт в отдельную функцию и вызвать её по своему усмотрению из любого места кода.

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

Вставка хинтов в SmartApp 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"
  })

Хинты с использованием nospeechtimeout

script:
  $response.replies = $response.replies || [];
  $response.replies.push({
      "type":"raw",
      "body":{
          "asr_hints": {
              "nospeechtimeout": 12
          },
      },
      "messageName":"ANSWER_TO_USER"
  })

Хинты с использованием eou

script:
  $response.replies = $response.replies || [];
  $response.replies.push({
      "type":"raw",
      "body":{
          "asr_hints": {
              "eou": 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
  }
}

Хинты с использованием nospeechtimeout

"payload": {
  "asr_hints": {
    "nospeechtimeout": 12
  }
}

Хинты с использованием eou

"payload": {
  "asr_hints": {
    "eou": 5
  }
}

Хинты с использованием eou_phrase_match

"payload": {
  "asr_hints": {
    "eou_phrase_match": {"regex" : "да|нет|алло"}
  }
}

Примеры работы хинтов в разных приложениях

Использование words

words позволяет использовать список слов или фраз, распознавание которых мы хотим усилить. Пример: приложение с игрой "Кто хочет стать миллионером".

  1. Пользователь запускает игру.
  2. Ассистент задаёт вопрос и ожидает ответ от пользователя. В этот момент в сервис распознавания отправляются хинты с правильным вариантом ответа на вопрос.
  3. Пользователь отвечает на вопрос правильно (в данном случае срабатывают хинты, и ответ пользователя использует хинты) или неправильно (в данном случае речь пользователя распознаётся штатно).

Использование enable_letters

enable_letters позволяет включить модель коротких фраз, тем самым улучшить распознавание отдельных букв и коротких слов. Пример: игра "Поле чудес".

  1. Пользователь запускает игру.
  2. Ассистент задаёт вопрос о слове, которое нужно угадать, произнося отдельные буквы. В этот момент в сервис распознавания отправляется включённая опция enable_letters, и приложение ожидает от пользователя произнесение отдельных букв.
  3. Пользователь произносит букву, и приложение правильно её распознаёт.

Использование nospeechtimeout

nospeechtimeout меняет интервал ожидания речи пользователя. Возможные значения от 2 до 20 секунд. По умолчанию стоит 7 секунд. Пример: игра "Что? Где? Когда?".

  1. Пользователь запускает игру.
  2. Ассистент задаёт вопрос. В этот момент в сервис распознавания отправляется включённая опция "nospeechtimeout": 20 с увеличенным интервалом ожидания ответа пользователя.
  3. Пользователь отвечает на вопрос в пределах выставленного интервала, и приложение правильно распознаёт ответ, связывая его с вопросом.

Использование eou

Параметр eou определяет, как долго ассистент ждёт окончания фразы пользователя. Возможные значения от 0.5 до 5 секунд. Если ожидается, что пользователь может закончить фразу после небольшой паузы, стоит увеличить значение eou.

  1. Пользователь запускает приложение и хочет перевести деньги на номер телефона.
  2. Ассистент спрашивает номер телефона, на который надо перевести деньги. Пользователь начинает произносить номер телефона не быстро и с некоторыми паузами.
  3. Со значением eou, равным 5 секунд, распознавание речи не прерывается на середине фразы, а продолжается далее, пока номер полностью не распознается.

Использование eou_phrase_match

Параметр eou_phrase_match позволяет использовать регулярные выражения для распознавания окончания речи пользователя. Вы можете использовать eou_phrase_match следующим образом:

  • задавать паттерн фразы, которую мы ожидаем от пользователя. Таким образом, мы не прерываем пользователя, пока он говорит ожидаемую от него фразу;
  • быстро заканчивать распознавание после того, как пользователь произнёс ожидаемую фразу.

eou_phrase_match использует два параметра:

  • regex — строка (string) с паттерном для фразы, ожидаемой от пользователя.
  • timeout — число с плавающей запятой (float), устанавливающее таймаут, на который откладывается завершение распознавания, если пользователь говорит длинную фразу из regex. Этот параметр лучше использовать, если вы устанавливаете длинные паттерны в regex. Если не задано, используются обычные настройки.

Значение таймаута eou_phrase_match имеет приоритет перед значением параметра eou при распознавании конца фразы.

Параметр regex

В этом параметре необходимо задать фразу, которая ожидается от пользователя. Для написания значений параметра используется стандартный синтаксис регулярных выражений. Можно задавать цифры, буквы и смешанные комбинации разной длины. Если в регулярном выражении вы используете символ \, то в json-файле необходимо использовать двойной символ \\.

Результаты распознавания представляются в нижнем регистре с пробелами между словами и числами. Для распознавания чисел пробелы можно использовать как разделитель между цифрами. Например, если пользователь скажет "один ноль", то в результате распознавания будет 1 0. Если пользователь скажет "десять", то результат будет 10.

Пользователь произносит фразу, она проверяется на совпадение с префиксом regex, затем распознавание прекращается с задержкой в таймаут, если он задан. Если таймаут не задан, то распознавание прекращается с обычными настройками.

Параметр timeout

В этом параметре необходимо задать таймаут ожидания, на который откладывается завершение распознавания, пока пользователь произносит фразу из regex. Если таймаут указан, то прекращение распознавание посреди фразы будет происходит с задержкой в таймаут. Если таймаут не указан, используются настройки по умолчанию.

Разберём работу eou_phrase_match на примере приложения-будильника и таймаута в три секунды.

  1. Пользователь запускает приложение-будильник и хочет установить время срабатывания сигнала.
  2. После распознавания ассистент спрашивает, на какое время необходимо установить будильник. Пользователь произносит фразу "поставь будильник на 7 часов 30 минут". Далее происходит проверка совпадения префикса regex с произнесенной фразой. Пользователь может сделать паузу до трех секунд, и распознавание не прервется. Распознавание закончится, только если пауза будет больше или равна трем секундам.
  3. Хинт сработает на выражении будильник 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
                 }
            },

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

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