Улучшенный алгоритм распознавания с помощью Yandex SpeechKit Cloud — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
м (Реализация сценария)
 
(не показано 5 промежуточных версии этого же участника)
Строка 16: Строка 16:
 
Идея улучшения анализа заключается в применении сервиса выделения смысла. Сервис разбивает фразу на отдельные слова (леммы), преобразовывая существительные в именительный падеж, а глаголы в инфинитив. После этого сценарий в цикле просматривает каждую лемму и ищет совпадение с ключевым словом. В каком бы падеже не стояло искомое слово, если оно есть во фразе, алгоритм найдет его. Как только совпадение сработает  происходит переключение на требуемый отдел.  
 
Идея улучшения анализа заключается в применении сервиса выделения смысла. Сервис разбивает фразу на отдельные слова (леммы), преобразовывая существительные в именительный падеж, а глаголы в инфинитив. После этого сценарий в цикле просматривает каждую лемму и ищет совпадение с ключевым словом. В каком бы падеже не стояло искомое слово, если оно есть во фразе, алгоритм найдет его. Как только совпадение сработает  происходит переключение на требуемый отдел.  
  
'''Скачать файл:''' [http://wiki.oktell.ru/images/2/2f/Yandex_SpeechKit_Cloud_%D1%83%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC.oscr Yandex_SpeechKit_Cloud_улучшенный_алгоритм.oscr] (собрано на версии 2.11.2.141230)
+
'''Скачать файл:''' [[Media:Yandex_SpeechKit_Cloud_%D1%83%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC.oscr|Yandex_SpeechKit_Cloud_улучшенный_алгоритм.oscr]] (собрано на версии 2.11.2.141230)
 
+
  
 
==Реализация сценария==
 
==Реализация сценария==
Строка 30: Строка 29:
 
Компонент "'''API ключ'''". Определяет ключ для использования сервиса выделения смысла в web-запросе.  
 
Компонент "'''API ключ'''". Определяет ключ для использования сервиса выделения смысла в web-запросе.  
 
* переменной '''key''' (строковая) присвойте строку с вашим API-ключом.  
 
* переменной '''key''' (строковая) присвойте строку с вашим API-ключом.  
 +
  
 
Компонент "'''Приветствие'''". Воспроизводит приветствие и задает вопрос абоненту, с кем его соединить. Используется синтез речи Yandex.
 
Компонент "'''Приветствие'''". Воспроизводит приветствие и задает вопрос абоненту, с кем его соединить. Используется синтез речи Yandex.
Строка 37: Строка 37:
 
* Эмоция - по умолчанию
 
* Эмоция - по умолчанию
 
* Кэш - использовать
 
* Кэш - использовать
 +
  
 
Компонент "'''ding'''". Воспроизводит короткий сигнал для абонента, соответствующий началу записи.
 
Компонент "'''ding'''". Воспроизводит короткий сигнал для абонента, соответствующий началу записи.
Строка 43: Строка 44:
  
 
<span style="color:red">ВНИМАНИЕ: Вместо компонентов "Приветствие" и "ding" вы можете использовать свой звуковой файл с записанной информацией. Синтез речи приведен в сценарии для примера.</span>
 
<span style="color:red">ВНИМАНИЕ: Вместо компонентов "Приветствие" и "ding" вы можете использовать свой звуковой файл с записанной информацией. Синтез речи приведен в сценарии для примера.</span>
 +
 +
 +
[[Файл:Алгоритм распознавания - 002.png|center|800px]]
 +
  
 
Компонент "'''Распознавание речи'''". Записывает и распознает речь абонента. После 1 секунды тишины воспроизводит ding.wav и переходит к следующему компоненту.
 
Компонент "'''Распознавание речи'''". Записывает и распознает речь абонента. После 1 секунды тишины воспроизводит ding.wav и переходит к следующему компоненту.
Строка 54: Строка 59:
 
* Тема - queries
 
* Тема - queries
 
* Текст в переменную - переменная '''parse_bestText''' (строковая)  
 
* Текст в переменную - переменная '''parse_bestText''' (строковая)  
 +
  
 
Компонент "'''Запрос на выделение смысла'''". Отправляет распознанный текст на сервис Yandex и получает размеченную JSON-структуру.
 
Компонент "'''Запрос на выделение смысла'''". Отправляет распознанный текст на сервис Yandex и получает размеченную JSON-структуру.
 
* URL - выражение  
 
* URL - выражение  
  'https://vins-markup.voicetech.yandex.net/markup/0.x/?text='+[parse_bestText]+'&layers=Fio,Morph,GeoAddr&key='+[key]
+
  <nowiki>'https://vins-markup.voicetech.yandex.net/markup/0.x/?text='+[parse_bestText]+'&layers=Fio,Morph,GeoAddr&key='+[key]</nowiki>
 
* Метод - GET
 
* Метод - GET
 
* Режим работы - Обрыв по таймауту  
 
* Режим работы - Обрыв по таймауту  
Строка 64: Строка 70:
  
 
<span style="color:red">ВНИМАНИЕ: Если по истечению таймаута сервис Yandex не ответит на запрос произойдет обрыв связи. Вам нужно самостоятельно обработать этот момент.</span
 
<span style="color:red">ВНИМАНИЕ: Если по истечению таймаута сервис Yandex не ответит на запрос произойдет обрыв связи. Вам нужно самостоятельно обработать этот момент.</span
 +
  
 
Компонент "'''Ув1'''". Отладочное уведомление с выводом полученной JSON структуры.  
 
Компонент "'''Ув1'''". Отладочное уведомление с выводом полученной JSON структуры.  
Строка 70: Строка 77:
 
  'Текст '+[parse_bestText]+endline+'Смысл '+[response]
 
  'Текст '+[parse_bestText]+endline+'Смысл '+[response]
 
*Адресат - выберите вашего пользователя
 
*Адресат - выберите вашего пользователя
 +
  
 
Компонент "'''id_morph=0'''". Задает начальное значение для счетчика морфем.
 
Компонент "'''id_morph=0'''". Задает начальное значение для счетчика морфем.
 
* переменой id_morph (строковая) присваивается число 0
 
* переменой id_morph (строковая) присваивается число 0
 +
 +
 +
[[Файл:Алгоритм распознавания - 003.png|center|800px]]
 +
  
 
Компонент "'''count_morph'''". Определяет число морфем в полученной JSON-структуре.  
 
Компонент "'''count_morph'''". Определяет число морфем в полученной JSON-структуре.  
Строка 80: Строка 92:
 
* Функция - Количество элементов
 
* Функция - Количество элементов
 
* Результат в переменную - переменная '''count_morph''' (строковая)  
 
* Результат в переменную - переменная '''count_morph''' (строковая)  
 +
  
 
Компонент "'''morph'''". Определяет рассмотрены ли все морфемы и заканчивает основной цикл.
 
Компонент "'''morph'''". Определяет рассмотрены ли все морфемы и заканчивает основной цикл.
Строка 88: Строка 101:
 
* Переход, если ложь - компонент "'''morph'''"
 
* Переход, если ложь - компонент "'''morph'''"
  
Компонент "'''count_lemmas'''". Определяет число лемм для данной морфемы.  
+
 
 +
Компонент "'''count_lemmas'''". Определяет число лемм для выбранной морфемы. Это связано с тем, что сервис может прислать несколько лемм для одной морфемы, часто такая ситуация встречается с глаголами. Существительные, как показывает практика, имеют одну лемму. Теоретически, цикл по леммам можно убрать и брать самую первую, но это решение мы оставляем за администратором вашей системы. 
 
* Документ - переменная '''response'''
 
* Документ - переменная '''response'''
 
* Алгоритм - Парсер JSON
 
* Алгоритм - Парсер JSON
 
* Поисковый запрос - выражение ''<nowiki>'"Morph"/'+[id_morph]+'/"Lemmas"'</nowiki>''
 
* Поисковый запрос - выражение ''<nowiki>'"Morph"/'+[id_morph]+'/"Lemmas"'</nowiki>''
 
* Функция - Количество элементов
 
* Функция - Количество элементов
* Результат в переменную - переменная '''count_morph''' (строковая)  
+
* Результат в переменную - переменная '''count_lemmas''' (строковая)  
 +
 
 +
 
 +
[[Файл:Алгоритм распознавания - 004.png|center|800px]]
 +
 
  
 
Компонент "'''id_lemmas=0'''". Задает начальное значение для счетчика лемм.
 
Компонент "'''id_lemmas=0'''". Задает начальное значение для счетчика лемм.
 
* переменой id_lemmas (строковая) присваивается число 0
 
* переменой id_lemmas (строковая) присваивается число 0
  
Компонент "'''count_lemmas'''"
 
  
Компонент "'''id_lemmas=0'''"
+
Компонент "'''lemmas'''". Проверяет пересмотрены ли все леммы и заканчивает второй цикл.
 +
* Аргумент 1 - переменная '''id_lemmas'''
 +
* Аргумент 2 - переменная '''count_lemmas'''
 +
* Тип сравнения - >=  
 +
* Переход, если правда - компонент "'''->'''"
 +
* Переход, если ложь - компонент "'''text'''"
  
Компонент "'''lemmas'''"
 
  
Компонент "'''text'''"
+
Компонент "'''text'''". Определяет и сохраняет лемму в переменную для дальнейшего анализа.
 +
* Документ - переменная '''response'''
 +
* Алгоритм - Парсер JSON
 +
* Поисковый запрос - выражение ''<nowiki>'"Morph"/'+[id_morph]+'/"Lemmas"/'+[id_lemmas]+'/"Text"'</nowiki>''
 +
* Функция - Восстановленное содержимое
 +
* Результат в переменную - переменная '''text''' (строковая)
 +
 
 +
 
 +
[[Файл:Алгоритм распознавания - 005.png|center|800px]]
 +
 
  
 
Компонент "'''Ув2'''". Отладочное уведомление администратору с выводом текущей леммы.  
 
Компонент "'''Ув2'''". Отладочное уведомление администратору с выводом текущей леммы.  
Строка 111: Строка 141:
 
*Адресат - выберите вашего пользователя
 
*Адресат - выберите вашего пользователя
  
Компонент "'''Выбор варианта'''"
 
  
Компонент "'''id_lemmas++'''"
+
Компонент "'''Выбор варианта'''". Проверяет является ли слово одним из ключевых. В случае совпадения выходит из цикла и направляет на нужную ветку.
 +
* Аргумент - переменная '''text'''
 +
* Значения - соотнесите ключевые слова с компонентами, на которые следует отправить сценарий. Например, по словам "секретарь", "директор" происходит переход на компонент "Секретарь"
 +
<span style="color:red">ВНИМАНИЕ: Ключевые слова пишите с маленькой буквы.
 +
 
 +
 
 +
Компонент "'''id_lemmas++'''". Если текущая лемма не является ключевым словом, то переходит к следующей лемме.
 +
* переменной id_lemmas присваивается значение выражения ''num([id_lemmas])+1''
 +
 
  
 
Компонент "'''Секретарь'''". Отладочное уведомление администратору с выводом выбранного направления.  
 
Компонент "'''Секретарь'''". Отладочное уведомление администратору с выводом выбранного направления.  
Строка 119: Строка 156:
 
*Текст -  строка '''Секретарь'''
 
*Текст -  строка '''Секретарь'''
 
*Адресат - выберите вашего пользователя
 
*Адресат - выберите вашего пользователя
 +
  
 
Компонент "'''Сообщение 1'''". Воспроизводит абоненту, что соединяет его с секретарем.  
 
Компонент "'''Сообщение 1'''". Воспроизводит абоненту, что соединяет его с секретарем.  
Строка 126: Строка 164:
 
* Эмоция - по умолчанию
 
* Эмоция - по умолчанию
 
* Кэш - использовать
 
* Кэш - использовать
 +
  
 
Компонент "'''на секретаря'''". Переключает на требуемого сотрудника.  
 
Компонент "'''на секретаря'''". Переключает на требуемого сотрудника.  
Строка 131: Строка 170:
 
* Номер - 601
 
* Номер - 601
 
* Тип вызова - Обычный
 
* Тип вызова - Обычный
 +
 +
 +
[[Файл:Алгоритм распознавания - 006.png|center|800px]]
 +
  
 
Компоненты "'''Техподдержка'''", "'''Сообщение 2'''", "'''на техподдержку'''" настраиваются аналогично ветке "'''Секретарь'''" - "'''на секретаря'''".  
 
Компоненты "'''Техподдержка'''", "'''Сообщение 2'''", "'''на техподдержку'''" настраиваются аналогично ветке "'''Секретарь'''" - "'''на секретаря'''".  
  
Компонент "'''->'''"
 
  
Компонент "'''id_morph++'''"
+
Компонент "'''->'''". Визуальный элемент, служит для удобного восприятия сценария.
 +
*Время задержки, мс - 0
 +
 
 +
 
 +
Компонент "'''id_morph++'''". После того как текущая морфема проанализирована, переходит к следующей.
 +
 
  
 
Компонент "'''Ув3'''". Отладочное уведомление администратору о том, что сервис не нашел ключевых слов во фразе.  
 
Компонент "'''Ув3'''". Отладочное уведомление администратору о том, что сервис не нашел ключевых слов во фразе.  
Строка 142: Строка 189:
 
*Текст -  строка ''Не определил''
 
*Текст -  строка ''Не определил''
 
*Адресат - выберите вашего пользователя
 
*Адресат - выберите вашего пользователя
 +
  
 
Компонент "'''Неизвестная фраза'''". Воспроизводит абоненту сообщение, что не смог разобрать его фразу.  
 
Компонент "'''Неизвестная фраза'''". Воспроизводит абоненту сообщение, что не смог разобрать его фразу.  
Строка 150: Строка 198:
 
* Кэш - использовать
 
* Кэш - использовать
  
Компонент "'''ding2'''"
 
  
 +
[[Файл:Алгоритм распознавания - 007.png|center|800px]]
  
  
 +
Компонент "'''ding2'''". Воспроизводит короткий сигнал для абонента, соответствующий началу записи.
 +
* Режим - Файл полностью
 +
* Файл - ding.wav
  
 +
<span style="color:red">ВНИМАНИЕ: Чтобы не зацикливать распознавание и тратить время клиента, вместо компонентов "Неизвестная фраза" и "ding2" рекомендуется переключить на секретаря. Как вариант, установить счетчик и по истечению двух-трех неудачных попыток распознавания переключать на ответственного оператора.
  
  
'''Скачать файл:''' [http://wiki.oktell.ru/images/2/2f/Yandex_SpeechKit_Cloud_%D1%83%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC.oscr Yandex_SpeechKit_Cloud_улучшенный_алгоритм.oscr] (собрано на версии 2.11.2.141230)
+
'''Скачать файл:''' [[Media:Yandex_SpeechKit_Cloud_%D1%83%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC.oscr|Yandex_SpeechKit_Cloud_улучшенный_алгоритм.oscr]] (собрано на версии 2.11.2.141230)

Текущая версия на 12:04, 31 марта 2023

Наверх


Введение

В данной статье показывается пример улучшения анализа распознанной речи с помощью сервиса выделения смысла.

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

  • Соедините меня с отделом технической поддержки
  • Переключите меня на инженеров
  • Мне срочно нужны ваши программисты

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

Идея улучшения анализа заключается в применении сервиса выделения смысла. Сервис разбивает фразу на отдельные слова (леммы), преобразовывая существительные в именительный падеж, а глаголы в инфинитив. После этого сценарий в цикле просматривает каждую лемму и ищет совпадение с ключевым словом. В каком бы падеже не стояло искомое слово, если оно есть во фразе, алгоритм найдет его. Как только совпадение сработает происходит переключение на требуемый отдел.

Скачать файл: Yandex_SpeechKit_Cloud_улучшенный_алгоритм.oscr (собрано на версии 2.11.2.141230)

Реализация сценария

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

Сценарий выглядит следующим образом:

Алгоритм распознавания - 001.png


Компонент "API ключ". Определяет ключ для использования сервиса выделения смысла в web-запросе.

  • переменной key (строковая) присвойте строку с вашим API-ключом.


Компонент "Приветствие". Воспроизводит приветствие и задает вопрос абоненту, с кем его соединить. Используется синтез речи Yandex.

  • Режим - Воспроизвести
  • Текст - Здравствуйте. С кем вас соединить
  • Голос - Zahar
  • Эмоция - по умолчанию
  • Кэш - использовать


Компонент "ding". Воспроизводит короткий сигнал для абонента, соответствующий началу записи.

  • Режим - Файл полностью
  • Файл - ding.wav

ВНИМАНИЕ: Вместо компонентов "Приветствие" и "ding" вы можете использовать свой звуковой файл с записанной информацией. Синтез речи приведен в сценарии для примера.


Алгоритм распознавания - 002.png


Компонент "Распознавание речи". Записывает и распознает речь абонента. После 1 секунды тишины воспроизводит ding.wav и переходит к следующему компоненту.

  • Режим - Записать
  • Символы прерывания - *
  • Прервать при обнаружении тишины - Включить
  • Интервал тишины, с - 1
  • Настройки голосового детектора - по умолчанию
  • Сигнал окончания записи - ding.wav
  • Сохранение файла записи - Не сохранять
  • Тема - queries
  • Текст в переменную - переменная parse_bestText (строковая)


Компонент "Запрос на выделение смысла". Отправляет распознанный текст на сервис Yandex и получает размеченную JSON-структуру.

  • URL - выражение
'https://vins-markup.voicetech.yandex.net/markup/0.x/?text='+[parse_bestText]+'&layers=Fio,Morph,GeoAddr&key='+[key]
  • Метод - GET
  • Режим работы - Обрыв по таймауту
  • Таймаут, сек - 30
  • Ответ в переменную - переменная response (строковая)

ВНИМАНИЕ: Если по истечению таймаута сервис Yandex не ответит на запрос произойдет обрыв связи. Вам нужно самостоятельно обработать этот момент.=

  • Переход, если правда - компонент "Ув3"
  • Переход, если ложь - компонент "morph"


Компонент "count_lemmas". Определяет число лемм для выбранной морфемы. Это связано с тем, что сервис может прислать несколько лемм для одной морфемы, часто такая ситуация встречается с глаголами. Существительные, как показывает практика, имеют одну лемму. Теоретически, цикл по леммам можно убрать и брать самую первую, но это решение мы оставляем за администратором вашей системы.

  • Документ - переменная response
  • Алгоритм - Парсер JSON
  • Поисковый запрос - выражение '"Morph"/'+[id_morph]+'/"Lemmas"'
  • Функция - Количество элементов
  • Результат в переменную - переменная count_lemmas (строковая)


Алгоритм распознавания - 004.png


Компонент "id_lemmas=0". Задает начальное значение для счетчика лемм.

  • переменой id_lemmas (строковая) присваивается число 0


Компонент "lemmas". Проверяет пересмотрены ли все леммы и заканчивает второй цикл.

  • Аргумент 1 - переменная id_lemmas
  • Аргумент 2 - переменная count_lemmas
  • Тип сравнения - >=
  • Переход, если правда - компонент "->"
  • Переход, если ложь - компонент "text"


Компонент "text". Определяет и сохраняет лемму в переменную для дальнейшего анализа.

  • Документ - переменная response
  • Алгоритм - Парсер JSON
  • Поисковый запрос - выражение '"Morph"/'+[id_morph]+'/"Lemmas"/'+[id_lemmas]+'/"Text"'
  • Функция - Восстановленное содержимое
  • Результат в переменную - переменная text (строковая)


Алгоритм распознавания - 005.png


Компонент "Ув2". Отладочное уведомление администратору с выводом текущей леммы.

  • Отладочный режим - Да
  • Текст - переменная text
  • Адресат - выберите вашего пользователя


Компонент "Выбор варианта". Проверяет является ли слово одним из ключевых. В случае совпадения выходит из цикла и направляет на нужную ветку.

  • Аргумент - переменная text
  • Значения - соотнесите ключевые слова с компонентами, на которые следует отправить сценарий. Например, по словам "секретарь", "директор" происходит переход на компонент "Секретарь"

ВНИМАНИЕ: Ключевые слова пишите с маленькой буквы.


Компонент "id_lemmas++". Если текущая лемма не является ключевым словом, то переходит к следующей лемме.

  • переменной id_lemmas присваивается значение выражения num([id_lemmas])+1


Компонент "Секретарь". Отладочное уведомление администратору с выводом выбранного направления.

  • Отладочный режим - Да
  • Текст - строка Секретарь
  • Адресат - выберите вашего пользователя


Компонент "Сообщение 1". Воспроизводит абоненту, что соединяет его с секретарем.

  • Режим - Воспроизвести
  • Текст - Секретарь. Соединяю.
  • Голос - Zahar
  • Эмоция - по умолчанию
  • Кэш - использовать


Компонент "на секретаря". Переключает на требуемого сотрудника.

  • Назначение - Внутрь
  • Номер - 601
  • Тип вызова - Обычный


Алгоритм распознавания - 006.png


Компоненты "Техподдержка", "Сообщение 2", "на техподдержку" настраиваются аналогично ветке "Секретарь" - "на секретаря".


Компонент "->". Визуальный элемент, служит для удобного восприятия сценария.

  • Время задержки, мс - 0


Компонент "id_morph++". После того как текущая морфема проанализирована, переходит к следующей.


Компонент "Ув3". Отладочное уведомление администратору о том, что сервис не нашел ключевых слов во фразе.

  • Отладочный режим - Да
  • Текст - строка Не определил
  • Адресат - выберите вашего пользователя


Компонент "Неизвестная фраза". Воспроизводит абоненту сообщение, что не смог разобрать его фразу.

  • Режим - Воспроизвести
  • Текст - Я вас не понял, повторите еще раз пожалуйста
  • Голос - Zahar
  • Эмоция - по умолчанию
  • Кэш - использовать


Алгоритм распознавания - 007.png


Компонент "ding2". Воспроизводит короткий сигнал для абонента, соответствующий началу записи.

  • Режим - Файл полностью
  • Файл - ding.wav

ВНИМАНИЕ: Чтобы не зацикливать распознавание и тратить время клиента, вместо компонентов "Неизвестная фраза" и "ding2" рекомендуется переключить на секретаря. Как вариант, установить счетчик и по истечению двух-трех неудачных попыток распознавания переключать на ответственного оператора.


Скачать файл: Yandex_SpeechKit_Cloud_улучшенный_алгоритм.oscr (собрано на версии 2.11.2.141230)