Speech-to-text (Распознавание речи)

В Staffcop Enterprise начиная с версии 5.X - была добавлена функция - Speech To Text (преобразование записанного звука в текст).

Описание модуля

  • Модуль распознавания звука в текст работает через Tinkoff Speech Kit.

  • Модуль распознавания звука в текст требует доступа в интернет по адресу - voicekit.tinkoff.ru и api.tinkoff.ai (Адреса находятся в России).

  • Модуль распознавания голоса от tinkoff разработан компанией Tinkoff (наработки не используют зарубежные технологии и не передают данные дальше дата-центра по обработке голоса Tinkoff).

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

  • Оплата за облачный модуль распознавания речи в текст - осуществляется через личный кабинет на сайте - voicekit.tinkoff.ru

  • Стартовый ознакомительный баланс на счету от Tinkoff Speech Kit - составляет - 1000р., что позволяет распознать порядка 92.5 часов голосовых записей.

Включение модуля

Для активации модуля распознавания звука в текст, нужно проделать несколько действий:

  • Пройти регистрацию на сайте - Tinkoff Speech Kit, кликнув в верхнем правом углу - «Войти» и заполнить форму e-mail и телефон.

../_images/speech_1.png
  • Сгенерировать «API-key» и «Secret-key», скопировать их.

../_images/speech_2.png ../_images/speech_3.png
  • Открыть веб-интерфейс Staffcop и перейти на страницу «Панель управления - Параметра сервера - Распознавание голоса». Поставить галочку «Разрешить конфигурацию по-умолчанию», внести параметры и выбрать движок - «Tinkoff VoiceKit», после сохранить изменения в параметрах сервера.

../_images/speech_4.png

Работа модуля

Для распознавания речи в текст служат два механизма:

  • Распознавание под записями звука, в виде кнопки «Распознавание речи»

../_images/speech_5.png
  • Распознавание через политику - «Распознавание речи»

../_images/speech_7.png

Первый способ распознавания: через иконку под записями звука.

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

Второй способ распознавания: через политику «распознавание речи» - более общий.

Позволяет распознавать голос в текст на общем основании и накапливать текстовую базу преобразования голоса в текст и анализировать данные с помощью встроенных политик распознавания по словарям, регулярным выражениям и встроенным политикам безопасности, т.е. после отработки политики «Распознавание речи», будут отработаны стандартные политики обработки текста в Staffcop. Добавить политику можно нажав в web-интерфейсе «Создать -> Распознавание речи». В подменю политики «Распознавание речи» будет доступна отладочная информация и статистика по анализу речи за всё время работы политики.

  • Речь записанная модулем «записи и микрофона и колонок» - может определяться как «диалог», т.е. распознанная речь теперь имеет двух собеседников.

Пример такой работы:

../_images/speech_6.png

Особенности работы и примечания

Модуль Speech To Text спроектирован для будущего развития и возможности подключить встроенный в Staffcop - модуль распознавания на основе моделей определения голоса и для подключения других сторонних технологий распознавания.

  • Файлы конвертируются в моно mp3, размер при этом изменяется не существенно.

  • Наибольшая замеченная скорость распознавания равна x15 (время распознавания равно 1/15 от продолжительности записи), например, за сутки записано 470 часов, тогда 470/15=31 час, т.е. требуется 31 час, чтобы распознать записи сделанные за 24 часа (значит распознавание, в данном примере, всегда будет отставать от записи, придётся настраивать фильтрацию, например, по устройствам или по пользователям).

  • Для примера выше - 470 часов записей, по самому низкому тарифу Tinkoff-а, обойдутся в 5076р.

  • «Обычно» количество «мусора» колеблется от очень много до очень-очень много. Под «мусором» подразумеваются записанные системные звуки, работающий телевизор, разговоры в комнате (удалёнка) и пр.

  • В процессе работы собирается статистическая информация, например, продолжительность аудио и время его обработки (конвертирование + распознавание).

  • Временные файлы хранятся в /var/lib/staffcop/upload/speech_recognition/…

  • Все результаты работы подсистемы сохраняются в дополнительных таблицах speechrecognition_result (модель speech_processing.models.SpeechRecognitionResult) и speechrecognition_failure (модель speech_processing.models.SpeechRecognitionFailure) и на данный момент их чистка не предусмотрена.

  • Наличие таблицы «speechrecognition_result» облегчает повторные проходы, например, если результаты работы успешные, то обрабатываться будут только записи с ошибками, пропущенные или не обработанные ранее.

  • Количество попыток распознания ограничено, оно сейчас никак не конфигурируется (см. speech_processing.config:Config.attempts_limit) и равно 5.

  • При большом количестве ошибок (например, неправильный ключ доступа к сервису распознавания, ошибка сети и т.д.), политика будет отключена.

  • После удачного распознавания нормализованные аудио удаляются, в противном случае - нет. Чистка ФС от нормализованных аудио не реализована.

  • Cуществует «костыль» от коротких файлов в виде предварительной проверки размера файла, файл не должен быть меньше 30kB (ориентировочная продолжительность такой записи до 2 сек).

  • Существует «костыль» и для защиты от больших файлов (сделано из-за Tinkoff, см. выше, но применяется ко всем «движкам»), файл не должен быть больше 30MB.

  • Распознавание on-demand (руками) и через политики происходит разными методами: ручной вариант имеет больший приоритет и стоит дороже (по текущему тарифу, этот механизм называется - «Онлайн-обработка файла» и стоит 0.48руб/мин) для политик применяется более дешёвый механизм - «Отложенная обработка» (по текущему тарифу это стоит 0.18руб/мин).

  • Файлы размером более 32MB должны загружаться через собственный API S3 и такой функционал в данной подсистеме не реализован (для ориентира: 10 минут записи весит около 5MB).

Чит-коды и работа из консоли сервера

В linux-консоли севера Staffcop - существуют несколько команд служащих для оценки количества данных и для запуска политики распознавания вручную.

Команда «sr_estimate»

Предназначена для оценки объёмов записей (количество и размер файлов, продолжительность аудио).

Для работы команды требуется, что бы предварительно была создана политика SpeechRecognitionPolicy (см. sr_mule ниже). Задать политику нельзя, будет выбрана одна из доступных произвольным образом.

Пример использования:

$ time staffcop sr_estimate --force --from-event=2021-12-01
Thread pool size: 3
2021-12-01: (745+41/786) duration:8.2h size:227m
2021-12-02: (0+49/49) duration:0m size:0m
2021-12-03: (0+37/37) duration:0m size:0m
2021-12-04: (0+1/1) duration:0m size:0m
2021-12-06: (0+24/24) duration:0m size:0m
2021-12-07: (0+23/23) duration:0m size:0m
2021-12-08: (0+17/17) duration:0m size:0m
2021-12-09: (0+74/74) duration:0m size:0m
2021-12-10: (53+0/53) duration:3m size:1m

real    1m4.300s
user    0m43.485s
sys     0m16.063s

Параметры:

  • –force – обрабатывать все события политики включая те, которые были успешно «распакованы» ранее, например при использовании команды sr_mule

  • –threads – число потоков

  • –from-event – идентификатор или дата (в формате YYYY-MM-DD) события, начиная с которого будет происходить обработка

  • –to-event – идентификатор или дата события, до которого (но не включая его) будет происходить обработка

Команда «sr_mule»

Предназначена для запуска mule в консольном режиме с предварительной настройкой некоторых параметров.

При первом запуске будет создана политика SpeechRecognitionPolicy, если в базе нет ни одной такой политики. Если политик несколько, по аналогии с sr_estimate, будет выбрана произвольная.

Пример первого запуска для создания политики:

$ staffcop sr_mule --to-event=0
Process #13448 has unsafe gevent patches, try to reexec
[Errno 9] fd:11
Server exit after 0.1s of work

Параметры:

  • –debug – вывод отладочной информации (без этого ключа будет очень скучно, рекомендую к использованию всегда)

  • –force – обрабатывать все события политики включая те, которые были успешно «распакованы» ранее, например при использовании команды sr_mule

  • –simulate – не отправляет аудио на сервер Tinkoff-а, вместо этого в результаты подставляется случайный текст (используется для отладки)

  • –keep-normal-audio – сохраняет перекодированное аудио после распознавания, оно будет использовано при повторных запусках (опять же, нужно в первую для отладки), это аудио так же сохраняется в случае ошибок в процессе распознавания

  • –threads – число потоков, которые будут использоваться для кодирования и отправки аудио на внешний сервер (по-умолчанию 10)

  • –watch-threads – число потоков, которые будут использоваться для получения результатов (по-умолчанию 3)

  • –bucket-size – размер пакета (число событий) для параллельной обработки (по-умолчанию 50)

  • –from-event – идентификатор или дата (в формате YYYY-MM-DD) события, начиная с которого будет происходить обработка

  • –to-event – идентификатор или дата события, до которого (но не включая его) будет происходить обработка

Ещё один пример:

$ staffcop sr_mule --force --debug --simulate --keep-normal-audio --from-event=2021-12-10
Process #14011 has unsafe gevent patches, try to reexec
[Errno 9] fd:11
Starting <TinkoffRecognitionEngine at 0x7fa12880ddd0>...
Loop step (tasks:0 threads:0+0)
Recognize speech for #3602820
Recognize speech for #3603717
Recognize simulation #3602820 (0.8s)
[...]
Loop step (tasks:1 threads:1+0 RECOGNITION:1)
Recognition result #3606172: (6.0s) "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."
Save result for #3606172 (74.4s)
Loop step (tasks:0 threads:0+0)
Loop step (tasks:0 threads:0+0)
Loop step (tasks:0 threads:0+0)
Loop step (tasks:0 threads:0+0)
Loop step (tasks:0 threads:0+0)
Loop step (tasks:0 threads:0+0)
Loop step (tasks:0 threads:0+0)
Server exit after 7.6s of work
Shutdown <TinkoffRecognitionEngine at 0x7fa12880ddd0>...

Конфигурирование модуля из файла конфигурации сервера

В локальной конфигурации сервера /etc/staffcop/config - возможно задать ключи для работы сервера распознавания Tinkoff вручную:

  • TINKOFF_API_KEY = „…“ - ключи полученные из Tinkoff SpeechKit.

  • TINKOFF_SECRET_KEY = „…“ - ключи полученные из Tinkoff SpeechKit.

  • SPEECH_RECOGNITION_DEBUG - добавляет отладочной информации в логи.

  • SPEECH_RECOGNITION_AUDIO_DURATION_MIN - нижний порог продолжительности исходного аудио в сек. (по-умолчанию 3), записи меньшей продолжительностью будут пропущены с ошибкой [AudioDurationError].

  • TINKOFF_JWT_EXPIRATION - время устаревания JWT-токена используемого в API Tinkoff в сек. (по-умолчанию 600).

  • SPEECH_RECOGNITION_ATTEMPTS_LIMIT - максимальное количество попыток распознавания (по-умолчанию 5).

  • SPEECH_RECOGNITION_NORMAL_CMDLINE (по умолчанию - «ffmpeg -y -v 16 -i $source_file -map_metadata -1 -map 0:a:0 -ac 1 -aq 3 $normal_file») - Запись с одного устройства - одна дорожка в исходном аудио. В результате конвертации будет моно.

  • SPEECH_RECOGNITION_NORMAL2_CMDLINE (по умолчанию - «ffmpeg -y -v 16 -i $source_file -map_metadata -1 -filter_complex «[0:a]amerge=inputs=2,pan=stereo|FL<c0+c1|FR<c2+c3» -aq 3 $normal_file») - Запись с двух устройств - две дорожки в исходном аудио. В результате конвертации будет стерео, а результат распознавания будет интерпретироваться как диалог.

Обработка ошибок

  • После обработки группы событий из выборки размерностью POLICY_BATCH (см. settings.py, по-умолчанию 10000, выборка происходит по Event.id, так что считать нужно все события, а не только отфильтрованные «звуковые», это стандартный механизм мулов) в данных политики сохраняется информация о необходимости выполнить повторную обработку (см. SpeechRecognition.data_dict[„restore_attempts“], _schedule_restore_attempts и _restore_attempt)

  • Эта повторная обработка выполняется перед следующей итерацией политики, т.е. при обработке следующей выборки размерностью POLICY_BATCH,

  • Важное замечание: если этой итерации нет (все события обработались на предыдущем шаге и новых событий в БД нет), то и попытки восстановления не будет (до тех пор, пока не появятся новые данные)

  • При выборе в настройках политики «Apply to all events (can take long time)» (применить ко всем событиям), «restore_attempts» - сбрасывается.

  • При большом количестве ошибок (~ >= 66% на 150 отфильтрованных событий) - политика будет отключена, но что бы увидеть это в интерфейсе, веб-страницу придётся обновить, если она была открыта ранее (речь об основном одностраничном интерфейсе).