Распознавание телефонных звонков с помощью речевых технологий Yandex SpeechKit (новая версия Yandex SpeechKit Cloud)

Публикация № 721095

Оборудование - Телефония, SIP

обработка SpRecord SOX Yandex SpeechKit Cloud wav OggOpus *.ogg opusenc curl

50
Обработка позволяет преобразовывать телефонный звонки формата wav в текст с помощью речевых технологий Яндекса. Дополнительно в обработке реализована нарезка телефонного звонка на кусочки по 1 Мб с помощью SOX. Загрузка дополнительных данных по звонку из программы SpRecord. Использовал на нетиповой конфигурации Управление торговлей 10.3.

Постановка задачи

Необходимо телефонные переговоры менеджеров преобразовать в текст и подгрузить в 1С в карточку клиента. Настроить поиск по ключевым словам. Создать отчет для сбора статистики работы менеджера (количества звонков, длительность).

Реализация

  • SpRecord

Телефонные звонки записываются с аналоговых линий с помощью системы регистрации и записи телефонных разговоров SpRecord (https://sprecord.ru/). В среднем в день получается около 500 Мбайт информации. Телефонные аппараты - самые простые Panasonic TS2350
 

SpRecord можно устанавливать в файловом или в серверном режиме. В серверном удобнее вытаскивать дополнительную информацию из SQL сервера по данным звонка. Таблица dbo_Records содержит все необходимые данные:

  • Номер линии
  • Дата звонка
  • Имя файла звонка
  • Телефон кому звоним
  • Внутренний номер
  • Входящий/Исходящий

Прямым запросом к SQL получаем эти данные и заполняем справочник Звонки в 1С.

  • SOX

Для распознавания файлы отправляются по 1 Мб - получается 500 запросов в день. Чтобы нарезать файл на кусочки используется утилита для работы с аудиофайлами SoX (http://sox.sourceforge.net/). Кроссплатформенная утилита для работы через командную строку. Утилита имеет огромные возможности для работы со звуком. Я использовал только:

- Получить длительность файла

sox --i -d  1.wav  > res.txt

- Получить частоту дискретизации файла

sox --i -r 1.wav  > res.txt

- Нарезка файла по 45 секунд 

sox " + ПутьКФайлу + " """ + ПутьКSox + "converted\" + ТекСек + ".wav"" trim " +  ТекСек*45 + " 45

  • Распознавание звуковых файлов в текст Yandex SpeechKit Cloud.

Необходимо зарегистрироваться и получить ключ (https://developer.tech.yandex.ru). Первый месяц бесплатно. Можно получить несколько ключей и когда заканчиваются количество обращений на одном, то переходить на другой ключ. Я у себя использую 3 ключа, пока хватает объема. Скорее всего Яндекс обучает свою систему распознавания и ему необходимо больше звуковых файлов для анализа. Поэтому дают бесплатные ключи.

Качество распознавания очень зависит от телефонной гарнитуры и произношения менеджера. Дикторскую речь, которая записана на приветствии в АТС преобразовывает 100% правильно. Речь менеджера, который жует или пьет чай может преобразовывать с ошибками.

Для примера вот в таком виде вы получите текст разговора:

«але але добрый день добрый да половину оплатили оплатили так что сегодня увидите директор закончил говорить нет но вы сейчас на месте просто директор хотел поговорить а у него занято ну да скорее всего да ладно»

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

  • Доработки в 1С

В 1С создаем справочник Звонки. В нем храним ссылку на *.wav файл разговора, дату, номера кому звонили и с какого внутреннего телефона, а также текст расшифровки звонка. К карточке звонка я подключил проигрывание телефонных разговоров. (//1cstart.kz/public/518955/)

В обработке Yandex speech реализована обработка ожидания. Каждые 2,5 часа запускает пакет заданий. Он содержит проверку новых звуковых *.wav файлов в каталоге SpRecord , загрузка их в 1С, далее получение доп. информации о длительности и номерах из SpRecord и далее нарезка файлов по 1 МБ и распознавание их в Yandex SpeechKit Cloud.

  • Скорость работы. Анализ накопленной информации. Проблемы при разработке

- Самое большое время тратится на отправку файла размером 1 Мб в Yandex SpeechKit Cloud и ожидание ответа(несколько секунд на каждый файл). Нарезка программой SOX занимает много меньше секунды. Загрузка дополнительных данных с SpRecord еще меньше. В дальнейшем распаралелить работу с SOX на одном сервере будет проблематично. Будут подвисать файлы. Лучше использовать несколько серверов или виртуальных машин.

- Обнаружил, что в SpRecord  файлы писались с частотой дискретизации 44100 Гц, при этом файл занимает довольно много места. Сейчас пишутся с частотой 11025Гц. На распознавание это никак не влияет. В первом случае в 1 Мб помещается 11 секунд разговора, а во втором 45 секунд. Лучше экономить место на диске. В начале каждого файла до 30 секунд занимает дозвон. Можно отрезать его у всех файлов. Пока не придумал, как программно понять, что начался разговор и нужно начинать преобразовывать.

- Поиграл с настройками языковой модели. Лучший вариант получился у «queries».

  •  Queries (Короткие запросы(queries) — фразы (3—5 слов) на различные темы, в том числе запросы в поисковых системах (на сайтах).)

  •  Maps (Адреса (maps) — адреса, названия организаций и географических объектов.)

  •  Dates (Даты(dates) — названия месяцев, порядковые и количественные числительные.)

  •  Names (Имена(names) — имена и фамилии, просьбы соединить по телефону.)

  •  Numbers(Числа(numbers) — количественные числительные от 1 до 999 и разделители — точка, запятая, тире. Модель подходит для диктовки номеров телефонов, счетов, документов.)

  •  Music (Музыка(music) — названия музыкальных произведений и исполнителей. Модель не предназначена для распознавания музыкальных фрагментов. Подходит только для распознавания названий, имен авторов и исполнителей песен.)

  •  Buying (Заказы(buying) — фразы, связанные с оформлением заказов в интернет-магазинах (подтверждение заказа и форма доставки).)

- Иногда на сервере подвисала работа с файлами с утилитой SQX. Утилита консольная и все общение с 1С происходит через файлы. То есть запустил SOX и результат читаешь из файла. Бывает, что файл блокируется. В случае плохого результата этот файл будет пропущен и распознается при следующей итерации.

На данный момент накоплено 125 Гб телефонных переговоров. За 3 месяца работы распознано и загружено в 1С 28400 звонков – это около 298 часов переговоров.

После Нового года Яндекс заблокировал один ключ, который я зарегистрировал в ноябре и написал "Необходимо заключить лицензионный договор. Пожалуйста, обратитесь на почту voice@support.yandex.ru." Скорее всего скоро придется платить за пользование сервисом.

Если нужна доп. информация - пишите в комментариях. Отвечу на вопросы.

 

Обновление 21.03.2019

 

В феврале 2019 прислали письмо, что SpeechKit переехал в Яндекс.Облако, поэтому мы рекомендуем зарегистрироваться там для использования технологии.
Вам нужно перейти по ссылке https://cloud.yandex.ru, нажать "Подключиться" и авторизоваться через корректный аккаунт @yandex.ru.

Внимательно читаем документацию: https://cloud.yandex.ru/docs/speechkit

Изменилась авторизация, а также формат передаваемого аудио.

Начнем с авторизации:

 - регистрируемся в облаке https://cloud.yandex.ru

- Создаем каталог и берем идентификатор каталога

https://console.cloud.yandex.ru/folders/b5gfc3ntettogerelqed7p

b5gfc3ntettogerelqed7p — это идентификатор каталога.

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

- Получите OAuth-токен в сервисе Яндекс.OAuth. Для этого перейдите по https://cloud.yandex.ru/docs/iam/concepts/authorization/oauth-token

- Обменяйте OAuth-токен на IAM-токен:

Я перестал использовать HTTPЗапрос, который доступны в 1С 8.3. (у меня версия платформы 8.3.8.2197). Функция 1С ОтправитьДляОбработки менее стабильно и быстро работает чем cURL. Возможно это моё субъективное мнение. Скачать cURL можно здесь

 

Я использовал запуск cURL, которую запускал из bat файла. Далее анализирую ответ полученный в файле результата.

|curl -X POST -d ""{\""yandexPassportOauthToken\"": \""" + OAuth + "\""}""  -H \'Content-Type: application/json\' https://iam.api.cloud.yandex.net/iam/v1/tokens > " + ФайлРезультата;

Каждый 12 часов нужно получать новый IAM-токен, это можно определить по возвращаемой ошибке в распознавании "Not enough rights" или "FORBIDDEN"

 

Формат передаваемого аудио

Теперь необходимо передавать аудио в формате аудиокодека OPUS в контейнере OGG (OggOpus) или  формате LPCM без WAV-заголовка

Я использую формат OGG.

Для подготовки wav файл нарезаю по 55 секунд и далее преобразую в *.ogg

Количество секунд вывел методом проб и ошибок. Для частоты файла 11025 Гц этот размер точно проходит распознавание без ошибок. Если файл будет превышать, то вместо текста в ответ придет INTERNAL_SERVER_ERROR. Причем эта ошибка возвращается не сразу, а спустя пару минут, при этом обмен подвисает в ожидании.

|sox " + ПутьКФайлу + " """ + ПутьКSox + "converted\" + ТекСек + ".wav"" trim " +  ТекСек*55 + " 55
|opusenc " + ПутьКSox + "converted\" + ТекСек + ".wav " + ПутьКSox + "converted\" + ТекСек + ".ogg  

opusenc это команда для преобразования wav в ogg. В sox нет возможности преобразовывать wav в ogg.

 

Распознавание в yandex облаке

|curl -X POST -H ""Authorization: Bearer " + token + """ --data-binary ""@" + ПутьКФайлу +  """ ""https://stt.api.cloud.yandex.net/speech/v1/stt:recognize/?topic=general&folderId=" + folderId + " > " + ФайлРезультата;

Получаем в Файл результата JSON, который преобразуем в текст и записываем в базу данных.

 

Служба поддержки SpeechKit Cloud написала, что можно одновременно отправлять 20 потоков распознавания. Я у себя реализовал это через несколько запусков curl, каждый поток обрабатывает свой звуковой файл. Мне хватило 4х потоков.

SpeechKit Cloud теперь платная, некоммерческих тарифов в Облаке нет.

Стоимость использования SpeechKit API для распознавания речи рассчитывается, исходя из длительности аудиофайлов, которые были успешно обработаны сервисом за Отчетный период. Длительность каждого аудиофайла измеряется в отрезках по 15 секунд с округлением в большую сторону.

Тарифы: https://cloud.yandex.ru/docs/speechkit/pricing

 

Достоинства

Во вложении обработка Yandex speech в которой реализована функция проверки новых звуковых wav файлов в каталоге SpRecord , подгрузка их в 1С, далее получение доп. информации о длительности и номерах из SpRecord и далее нарезка файлов по 55 секунд и распознавание их в Yandex SpeechKit Cloud.

В обработке нужно:

- заполнить идентификатор каталога Yandex SpeechKit Cloud

- заполнить идентификатор OAuth

- путь к каталогу SOX.

- в каталог  SOX установить дополнительно opusenc и cURL 

- В функции ПолучитьМенеджера необходимо задать соответствие номера линии SpRecord и номера телефона менеджера.

- КаталогСФайлами путь к звуковым файлам разговоров программы SpRecord.

- СтрокаСоединения задать свои параметры подключения к SQl серверу

 

50

Скачать файлы

Наименование Файл Версия Размер
В обработке устарела авторизация. Обмен с сервисом реализован через 1C HTTPЗапроc. Распознавание телефонных звонков с помощью речевых технологии yandex SpeechKit:
.epf 11,78Kb
21.03.19
12
.epf 1.1 11,78Kb 12 Скачать
Распознавание телефонных звонков с помощью Yandex SpeechKit Cloud:
.epf 14,01Kb
21.03.19
0
.epf 14,01Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. eskor 84 24.01.18 04:10 Сейчас в теме
Интересная идея. Плюсую.
2. krylovim 24.01.18 11:12 Сейчас в теме
Интересно! Сам тоже собирался реализовать подобную функциональность, но пока не дошли руки)
Не рассматривали варианты других движков по распознаванию речи?
Google Cloud Speech API и MS SAPI в частности?
3. zzhiraf_ 50 24.01.18 11:28 Сейчас в теме
Я тестировал вручную несколько файлов http://www.speechpro.ru/ (Voco.Professional). Там качество хуже получилось чем у яндекса. Google тестировал с android приложением. Там качество хорошее, но они матные слова отсекают. А у мне как раз хотелось в приложении наговорить текст и чтобы он в бегущей строке отобразился.
5. gubanoff 47 06.09.18 16:43 Сейчас в теме
(0) спасибо, работает. Взяли себе.
Оставьте свое сообщение