Улучшенный алгоритм распознавания с помощью Yandex SpeechKit Cloud — различия между версиями
м (→Реализация сценария) |
|||
(не показано 5 промежуточных версии этого же участника) | |||
Строка 16: | Строка 16: | ||
Идея улучшения анализа заключается в применении сервиса выделения смысла. Сервис разбивает фразу на отдельные слова (леммы), преобразовывая существительные в именительный падеж, а глаголы в инфинитив. После этого сценарий в цикле просматривает каждую лемму и ищет совпадение с ключевым словом. В каком бы падеже не стояло искомое слово, если оно есть во фразе, алгоритм найдет его. Как только совпадение сработает происходит переключение на требуемый отдел. | Идея улучшения анализа заключается в применении сервиса выделения смысла. Сервис разбивает фразу на отдельные слова (леммы), преобразовывая существительные в именительный падеж, а глаголы в инфинитив. После этого сценарий в цикле просматривает каждую лемму и ищет совпадение с ключевым словом. В каком бы падеже не стояло искомое слово, если оно есть во фразе, алгоритм найдет его. Как только совпадение сработает происходит переключение на требуемый отдел. | ||
− | '''Скачать файл:''' [ | + | '''Скачать файл:''' [[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_lemmas''' (строковая) |
+ | |||
+ | |||
+ | [[Файл:Алгоритм распознавания - 004.png|center|800px]] | ||
+ | |||
Компонент "'''id_lemmas=0'''". Задает начальное значение для счетчика лемм. | Компонент "'''id_lemmas=0'''". Задает начальное значение для счетчика лемм. | ||
* переменой id_lemmas (строковая) присваивается число 0 | * переменой id_lemmas (строковая) присваивается число 0 | ||
− | |||
− | Компонент "'''id_lemmas= | + | Компонент "'''lemmas'''". Проверяет пересмотрены ли все леммы и заканчивает второй цикл. |
+ | * Аргумент 1 - переменная '''id_lemmas''' | ||
+ | * Аргумент 2 - переменная '''count_lemmas''' | ||
+ | * Тип сравнения - >= | ||
+ | * Переход, если правда - компонент "'''->'''" | ||
+ | * Переход, если ложь - компонент "'''text'''" | ||
− | |||
− | Компонент "'''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: | ||
* Кэш - использовать | * Кэш - использовать | ||
− | |||
+ | [[Файл:Алгоритм распознавания - 007.png|center|800px]] | ||
+ | Компонент "'''ding2'''". Воспроизводит короткий сигнал для абонента, соответствующий началу записи. | ||
+ | * Режим - Файл полностью | ||
+ | * Файл - ding.wav | ||
+ | <span style="color:red">ВНИМАНИЕ: Чтобы не зацикливать распознавание и тратить время клиента, вместо компонентов "Неизвестная фраза" и "ding2" рекомендуется переключить на секретаря. Как вариант, установить счетчик и по истечению двух-трех неудачных попыток распознавания переключать на ответственного оператора. | ||
− | '''Скачать файл:''' [ | + | '''Скачать файл:''' [[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)
Реализация сценария
Рассмотрим алгоритм на примере сценария входящей маршрутизации. Позвонив в компанию, система спрашивает абонента с кем он хочет соединиться. Ответ клиента распознается, а дальше анализируется согласно вышеописанному алгоритму.
Сценарий выглядит следующим образом:
Компонент "API ключ". Определяет ключ для использования сервиса выделения смысла в web-запросе.
- переменной key (строковая) присвойте строку с вашим API-ключом.
Компонент "Приветствие". Воспроизводит приветствие и задает вопрос абоненту, с кем его соединить. Используется синтез речи Yandex.
- Режим - Воспроизвести
- Текст - Здравствуйте. С кем вас соединить
- Голос - Zahar
- Эмоция - по умолчанию
- Кэш - использовать
Компонент "ding". Воспроизводит короткий сигнал для абонента, соответствующий началу записи.
- Режим - Файл полностью
- Файл - ding.wav
ВНИМАНИЕ: Вместо компонентов "Приветствие" и "ding" вы можете использовать свой звуковой файл с записанной информацией. Синтез речи приведен в сценарии для примера.
Компонент "Распознавание речи". Записывает и распознает речь абонента. После 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 (строковая)
Компонент "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 (строковая)
Компонент "Ув2". Отладочное уведомление администратору с выводом текущей леммы.
- Отладочный режим - Да
- Текст - переменная text
- Адресат - выберите вашего пользователя
Компонент "Выбор варианта". Проверяет является ли слово одним из ключевых. В случае совпадения выходит из цикла и направляет на нужную ветку.
- Аргумент - переменная text
- Значения - соотнесите ключевые слова с компонентами, на которые следует отправить сценарий. Например, по словам "секретарь", "директор" происходит переход на компонент "Секретарь"
ВНИМАНИЕ: Ключевые слова пишите с маленькой буквы.
Компонент "id_lemmas++". Если текущая лемма не является ключевым словом, то переходит к следующей лемме.
- переменной id_lemmas присваивается значение выражения num([id_lemmas])+1
Компонент "Секретарь". Отладочное уведомление администратору с выводом выбранного направления.
- Отладочный режим - Да
- Текст - строка Секретарь
- Адресат - выберите вашего пользователя
Компонент "Сообщение 1". Воспроизводит абоненту, что соединяет его с секретарем.
- Режим - Воспроизвести
- Текст - Секретарь. Соединяю.
- Голос - Zahar
- Эмоция - по умолчанию
- Кэш - использовать
Компонент "на секретаря". Переключает на требуемого сотрудника.
- Назначение - Внутрь
- Номер - 601
- Тип вызова - Обычный
Компоненты "Техподдержка", "Сообщение 2", "на техподдержку" настраиваются аналогично ветке "Секретарь" - "на секретаря".
Компонент "->". Визуальный элемент, служит для удобного восприятия сценария.
- Время задержки, мс - 0
Компонент "id_morph++". После того как текущая морфема проанализирована, переходит к следующей.
Компонент "Ув3". Отладочное уведомление администратору о том, что сервис не нашел ключевых слов во фразе.
- Отладочный режим - Да
- Текст - строка Не определил
- Адресат - выберите вашего пользователя
Компонент "Неизвестная фраза". Воспроизводит абоненту сообщение, что не смог разобрать его фразу.
- Режим - Воспроизвести
- Текст - Я вас не понял, повторите еще раз пожалуйста
- Голос - Zahar
- Эмоция - по умолчанию
- Кэш - использовать
Компонент "ding2". Воспроизводит короткий сигнал для абонента, соответствующий началу записи.
- Режим - Файл полностью
- Файл - ding.wav
ВНИМАНИЕ: Чтобы не зацикливать распознавание и тратить время клиента, вместо компонентов "Неизвестная фраза" и "ding2" рекомендуется переключить на секретаря. Как вариант, установить счетчик и по истечению двух-трех неудачных попыток распознавания переключать на ответственного оператора.
Скачать файл: Yandex_SpeechKit_Cloud_улучшенный_алгоритм.oscr (собрано на версии 2.11.2.141230)