README.md

Система автоматического анализа звукозаписей интервью (система автоматической расшифровки и обработки интервью)

Цель и задачи проекта

Цель проекта состоит в разработке открытой системы автоматической расшифровки и обработки интервью, способной автоматизировать подготовку текста в жанре интервью за счёт преобразования диктофонной звукозаписи интервью или результата звонка в формате mono или stereo в русскоязычный текст и глубокого семантического анализа этого текста.

Для создания такой системы были созданы программные компоненты, решающие следующие задачи:

  1. разделение общей звукозаписи интервью на разные звуковые дорожки, соответствующие отдельным участникам интервью в mono- или stereo-аудиозаписи;
  2. выделение речи диктора на каждой речевой дорожке от сложных нестационарных шумов, характерных для различных акустических условий;
  3. преобразование русскоязычной речи в текст, с возможностью работы как с лексикой общего назначения, так и со специальной лексикой: профессиональным сленгом и аббревиатурами, свойственными для интервьюируемых представителей различных профессий;
  4. тематическая сегментация больших русскоязычных текстов на моно-тематические фрагменты;
  5. автоматическая суммаризация и упрощение текстов на русском языке;
  6. выделение именованных сущностей (организаций, персоналий, геолокаций, событий) из текстов на русском языке;
  7. анализ тональности высказываний в текстах на русском языке.

Минимальные и рекомендуемые системные требования

Минимальные требования:

  1. Процессор: 4 ядра, частота не менее 2.5 ГГц;
  2. ОЗУ: не менее 16 ГБ;
  3. ОС: Linux или Windows;
  4. СХД: от 64 Гб.

Рекомендуемые требования:

  1. Процессор: 8 ядер, частота не менее 3.5 ГГц;
  2. ОЗУ: не менее 32 ГБ;
  3. ОС: Linux или Windows;
  4. СХД: от 64 Гб.

Установка демонстрационного контейнера

Сборка докер-образа с демо производится командой:

docker build -t demo:1.0 .

Контейнер запускается командой:

docker run -d -p 8890:8888 --name demo demo:1.0 --LabApp.token='token'

Возможна ошибка сборки на этапе установки зависимостей (ffmpeg), в этом случае рекомендуется попробовать повторить сборку с включенным VPN или добавить в Dockerfile сборку необходимых утилит в другом виде.

После успешной сборки и создания контейнера, необходимо перейти по адресу http://127.0.0.1:8890/lab и в поле для аутентификации ввести token. Теперь у вас есть рабочая система с установленными зависимостями для запуска различных компонентов сервиса или всего пайплайна целиком.

Исполнение всего пайплайна:

  • Добавить файл для распознавания в корень проекта (например, test.wav)
    • Вариант 1 - в стартовом окне jupyter lab (http://127.0.0.1:8890/lab) перетянуть файл в корень проекта (открыт по умолчанию) или воспользоваться функцией “Upload file” с панели управления
    • Вариант 2 - в основном терминале выполнить команду docker cp test.wav demo:/app/ (нужно указать корректный путь до файла)
  • Создать коммандную строку и выполнить команду ./run.sh test.wav final_res.json (final_res.json - имя выходного файла)
    • Вариант 1 - в стартовом окне jupyter lab необходимо выбрать из подраздела Other элемент Terminal и выполнить команду
    • Вариант 2 - в основном терминале использовать команду docker exec -it demo bash и выполнить команду внутри открывшегося терминала
  • Скачать или просмотреть файл с результатом (final_res.json)
    • Вариант 1 - в стартовом окне jupyter lab кликнуть пиктограмму перезагрузки (refresh the file browser) на верхней панели, затем выбрать нужный файл слева, кликнуть на него правой кнопкой мыши и нажать “Download”
    • Вариант 2 - в основном терминале выполнить команду docker cp demo:/app/final_res.json ./

Описание компонентов системы, их установка и независимый запуск

Диаризация

Разделяет речь двух различных спикеров, формируя два аудиофайла из исходного.

В качестве модели для диаризации используется SepFormer от SpeechBrain (https://huggingface.co/speechbrain/sepformer-wsj02mix). Также, для voice activity detection используется предобученная модель для русского языка wav2vec2-base-superb-sv (https://huggingface.co/anton-l/wav2vec2-base-superb-sv). Данная архитектура позволяет эффективно определять наложения речи дикторов, так называемые “перебивания”.

Сборка докер-образа происходит аналогично сборке основного образа:

docker build -t demo:1.0 .

Контейнер запускается командой:

docker run -d -p 8890:8888 --name demo demo:1.0 --LabApp.token='token'

Для получения результатов необходимо воспользоваться скриптом sepatare_speakers.py внутри контейнера:

python separate_speakers.py -i test.wav -o1 /tmp/speaker_1.wav -o2 /tmp/speaker_2.wav

Последовательность шагов:

  1. Переместить входную аудиозапись в корень проекта в контейнере (по аналогии с полным пайплайном)
  2. Запустить скрипт в контейнере (по аналогии с полным пайплайном)
  3. Скачать/переместить результаты (по аналогии с полным пайплайном)

Распознавание речи

Распознает речь во входном аудиофайле, возвращая транскрибцию в формате JSON.s

Для ускорения работы системы и повышения точности распознавания было проведено несколько экспериментов по модернизации базовой wav2vec2-large-ru-golos (https://huggingface.co/bond005/wav2vec2-large-ru-golos):

  1. Использовалась структура набора инструментов распознавания речи Wav2Vec2, которая включала в себя модуль извлечения признаков (Wav2Vec2FeatureExtractor), токенайзер (Wav2Vec2CTCTokenizer) и декодировщик с поддержкой языковой модели. Такая структура получила название Wav2Vec2-Large-Ru-Golos-With-LM(https://huggingface.co/bond005/wav2vec2-large-ru-golos-with-lm), новая языковая модель для нее была обучена на русскоязычных текстовых корпусах:

    • 10% случайных наборов текстов из корпуса Taiga;
    • русскоязычные статьи Википедии;
    • русскоязычные Викиновости.
  2. Для корректировки финальной тестовой транскрипции, полученной с помощью языковой модели в составе Wav2Vec2-Large-Ru-Golos-With-LM, было решено добавить еще одну языковую модель в общую систему — трансформер типа T5 для задачи text-to-text. Включение этого компонента позволяет исправлять ошибки в конечной транскрипции в соответствии с нормами русского литературного языка, минимизируя тем самым вероятность получения “нечитабельного” текста или набора букв. Базовая ru-T5base, созданная специалистами из SberDevices, была дообучена на корпусе SberDevices Golos, получившаяся модель ruT5-ASR использовалась в решении задачи транскрибирования речевых аудиозаписей, включавшей в себя разнообразную лексику, в т.ч. и научную. Итоговая программа получила название “Писец” (https://github.com/bond005/pisets), ее использование возможно также в виде специально написанного для нее веб-сервиса.

  3. Система распознавания речи должна сохранять в конечной транскрипции общую семантику той фразы, которая содержится в обрабатываемой системой аудиозаписи, поэтому может допускаться, что конечная транскрипция может быть не просто “стенограммой” входной аудиозаписи, а ее парафразом с аналогичным смыслом. Такая идея была положена в основу еще одного эксперимента, результатом которого стала модель Wav2Vec2-mBART-50-Ru (https://huggingface.co/bond005/wav2vec2-mbart50-ru): для исправления ошибок системы распознавания речи использовался предобученный декодировщик из мультиязычного автокодировщика mBART-50, изначально созданного для восстановления оригинального текста из исходного “зашумленного”.

По итогам тестовых экспериментов было выбрано решение “Писец”, т.к. оно показывает наилучшие результаты на различных типах аудиозаписей, при этом получившиеся значения WER значительно превосходят базовое решение и являются сопоставимыми с популярными моделями типа Whisper.

Для отдельного запуска модуля необходимо собрать основной образ (или использовать существующий):

docker build -t demo:1.0 .

Контейнер запускается командой:

docker run -d -p 8890:8888 --name demo demo:1.0 --LabApp.token='token'

Для получения результатов необходимо воспользоваться скриптом speech_to_text.py внутри контейнера:

python speech_to_text.py -i /tmp/speaker_1.wav -i2 /tmp/speaker_2.wav -o /tmp/res_asr.json

Последовательность шагов:

  1. Переместить входную/входные аудиозаписи в контейнер (по аналогии с полным пайплайном). Можно воспользоваться файлами с предыдущего шага (сепарация). Второй входной файл - опционален.
  2. Запустить скрипт в контейнере (по аналогии с полным пайплайном)
  3. Скачать/переместить результаты (по аналогии с полным пайплайном)

Обеспечение устойчивости к шумам

Часть этапа распознавания речи (не является отдельным шагом).

Для повышения устойчивости модели распознавания речи к шумам был использован зашумленный речевой корпус. Для того, чтобы создать такой корпус, была разработана специальная Python-библиотека аугментации аудиозаписей audio_augmentator (https://github.com/dangrebenkin/audio_augmentator). Аугментатор способен создавать зашумленные аудиозаписи с эффектом реверберации или с фоновым шумом (доступны 4 вида шумов), при этом шумовые аудиозаписи могут быть подмешаны в различных сочетаниях, с настраиваемым значением соотношения сигнал-шум (в децибелах). При использовании шумовой аудиозаписи длинной более 3 секунд из такого сигнала выделяется фрагмент с шумом:

  1. Для речеподобных шумов используется Silero Voice Active Detection;
  2. Для остальных типов шумов используется следующий алгоритм: находится самый большой по значению локальный максимум функции энергии аудиосигнала, в его окрестностях ищутся локальные минимумы, которые и определяют границы конечного аудиофрагмента.

Установка библиотеки:

sudo apt-get install sox
git clone https://github.com/dangrebenkin/audio_augmentator
cd audio_augmentator
python setup.py install

В ходе установки корпус шумов и модель Silero VAD скачаются автоматически.

Выделение именнованных сущностей

Для решения задачи NER был предложен CoNER – сопоставительный распознаватель именованных сущностей (https://www.dialog-21.ru/media/5751/bondarenkoi113.pdf). Он основан на специальной двухэтапной тонкой настройке предварительно обученной наилучшей языковой модели:

  1. Первый этап – это тонкая настройка предварительно обученной BERT как сиамской нейронной сети для сопоставления семантики различных сущностей в текстовых парах. В результате на последнем скрытом слое модели BERT строится такое семантическое пространство, в котором слова, относящиеся к сущностям одинаковых классов, максимально сближены, а слова, относящиеся к сущностям разных классов, максимально отдалены друг от друга;
  2. Второй этап – это точная настройка результирующей нейронной сети в качестве стандартного NER (т.е. классификатора последовательностей) со схемой тегирования BILOU.

Сравнительные тестовые серии экспериментов обозначили ряд преимуществ такого подхода:

  1. ConER лучше стандартного NER, а включение сопоставительного обучения в схему тонкой настройки улучшает способность к обобщению любого NER в любой постановке задачи;
  2. Это преимущество CoNER более очевидно для задач с несколькими выстрелами;
  3. Использование предварительно обученной модели без учета регистра, аналогичной всем моделям SberDevices, снижает качество NER для основной задачи. Однако он, вероятно, более эффективен при краткой формулировке проблемы из-за подавления переобучения в очень несбалансированных наборах текстовых данных.

Также был рассмотрен случай, когда данные “грязные” и вместе с распознаванием сущностей нужна их нормализация - в таком случае классический NER на базе энкодерного типа BERT не подходит. Наш опыт показал, что на тех текстах, которые размечены хорошо и не нуждаются в нормализации, классический NER очень “хорош”, практически идеален. Однако, хотя таких “хороших” текстов и больше половины, текстов с плохой разметкой достаточно много. Для решения этой задачи была дообучена seq2seq модель типа T5 или FRED-T5 на задачу извлечения и нормализации сущностей: FRED-T5-large-ods-ner-2023 (https://huggingface.co/bond005/FRED-T5-large-ods-ner-2023).

Предобученные модели можно скачать по ссылке (https://disk.yandex.ru/d/7CQPhR2SAu6mxw) в виде zip-архива и распаковать в подкаталог models, но лучше это не делать вручную, поскольку сервис скачивает нужную модель автоматически при сборке.

Для отдельного запуска модуля необходимо собрать основной образ (или использовать существующий):

docker build -t demo:1.0 .

Контейнер запускается командой:

docker run -d -p 8890:8888 --name demo demo:1.0 --LabApp.token='token'

Для получения результатов необходимо воспользоваться скриптом recognize_named_entities.py внутри контейнера:

python recognizer_named_entities.py -i /tmp/res_asr.json -o /tmp/res_ner.json

Последовательность шагов:

  1. Переместить входную/входные аудиозаписи в контейнер (по аналогии с полным пайплайном). Можно воспользоваться файлами с предыдущего шага (сепарация). Второй входной файл - опционален.
  2. Запустить скрипт в контейнере (по аналогии с полным пайплайном)
  3. Скачать/переместить результаты (по аналогии с полным пайплайном)

Тематическая сегментация текстов

HierBERTSegmentator - разработанная основная модель для семантической сегментации русских новостных текстов. Она состоит из двух частей:

  1. Sentence embedder - sentence_ru_cased_L-12_H-768_A-12_pt от DeepPavlov (1 этап), sbert_large_nlu_ru от ai-forever (2 этап);
  2. BertForTextSegmentation - checkpoint-4000, обученная модель для сегментации текстов на основе эмбеддингов от sentence_ru_cased_L-12_H-768_A-12_pt (1 этап), RuTextSegModel (2 этап).

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

Предобученные модели с 1 этапа можно скачать по ссылке: https://disk.yandex.ru/d/p7FcSEmJFHh9zA.

Предобученные модели со 2-го этапа можно скачать по ссылкам: https://huggingface.co/mlenjoyneer/RuTextSegModel,
https://huggingface.co/ai-forever/sbert_large_nlu_ru.

Для отдельного запуска модуля необходимо собрать основной образ (или использовать существующий):

docker build -t demo:1.0 .

Контейнер запускается командой:

docker run -d -p 8890:8888 --name demo demo:1.0 --LabApp.token='token'

Для получения результатов необходимо воспользоваться скриптом segmentate_text.py внутри контейнера:

python segmentate_text.py -i /tmp/res_ner.json -o /tmp/res_seg.json

Последовательность шагов:

  1. Переместить входную/входные аудиозаписи в контейнер (по аналогии с полным пайплайном). Можно воспользоваться файлами с предыдущего шага (сепарация). Второй входной файл - опционален.
  2. Запустить скрипт в контейнере (по аналогии с полным пайплайном)
  3. Скачать/переместить результаты (по аналогии с полным пайплайном)

Автоматическая суммаризация и упрощение текстов

Модуль предназначен для генерации краткой информативной версии текста.

Предобученные модели с 1 этапа можно скачать по ссылке: https://disk.yandex.ru/d/ELYZECp-FHMyAQ.

Предобученные модели со 2-го этапа можно скачать по ссылкам: https://huggingface.co/mlenjoyneer/rut5_large_sum_gazeta.

Для отдельного запуска модуля необходимо собрать основной образ (или использовать существующий):

docker build -t demo:1.0 .

Контейнер запускается командой:

docker run -d -p 8890:8888 --name demo demo:1.0 --LabApp.token='token'

Для получения результатов необходимо воспользоваться скриптом summarize_segments.py внутри контейнера:

python summarize_segments.py -i /tmp/res_seg.json -o /tmp/res_sum.json

Последовательность шагов:

  1. Переместить входную/входные аудиозаписи в контейнер (по аналогии с полным пайплайном). Можно воспользоваться файлами с предыдущего шага (сепарация). Второй входной файл - опционален.
  2. Запустить скрипт в контейнере (по аналогии с полным пайплайном)
  3. Скачать/переместить результаты (по аналогии с полным пайплайном)

Анализ тональностей высказываний

Для решения задачи анализа тональности разработан математический фреймворк на базе байесовских нейронных сетей, который применим для для классификации любых текстов, а именно: классификация по тональности, классификация по тематикам, классификация по интентов (пользовательских намерений) и прочие задачи классификации. На основе метода байесовских нейронных сетей были разработаны алгоритм и компьютерная модель классификатора интентов в текстах на естественном языке. Алгоритм состоит из предварительно обученной глубокой нейронной сети типа BERT в качестве генератора признаков для текста и байесовской нейронной сети (свёрточной нейронной сети со стохастическими весами) в качестве финального классификатора. Компьютерная модель была реализована на языке программирования Python с использованием библиотеки Tensorflow 1.4. В результате серии специальных экспериментов было показано, что байесовская свёрточная нейронная сеть является эффективным алгоритмом классификации интентов в текстах на естественном языке. Ключевыми преимуществами нейронных сетей такого типа являются:

  1. Способность более эффективно моделировать неопределённость в данных, что обеспечивает реализацию отказа от распознавания по порогу максимальной уверенности нейронной сети в ответе;
  2. Большая устойчивость к переобучению, что позволяет обучать большие байесовские нейронные сети на выборках меньшего объёма.

Разработанная компьютерная модель и описание хода экспериментов доступны в открытом репозитории GitHub: https://github.com/bond005/impartial_text_cls.

Для отдельного запуска модуля необходимо собрать основной образ (или использовать существующий):

docker build -t demo:1.0 .

Контейнер запускается командой:

docker run -d -p 8890:8888 --name demo demo:1.0 --LabApp.token='token'

Для получения результатов необходимо воспользоваться скриптом detect_sentiment.py внутри контейнера:

python detect_sentiment.py -i /tmp/res_sum.json -o /tmp/res_sent.json

Последовательность шагов:

  1. Переместить входную/входные аудиозаписи в контейнер (по аналогии с полным пайплайном). Можно воспользоваться файлами с предыдущего шага (сепарация). Второй входной файл - опционален.
  2. Запустить скрипт в контейнере (по аналогии с полным пайплайном)
  3. Скачать/переместить результаты (по аналогии с полным пайплайном)

Возможные направления прикладного использования кода библиотеки

  1. Программные средства обработки и распознавания аудио- видео- и графической информации;
  2. Искусственный интеллект. Нейрокомпьютерные технологии и эволюционные алгоритмы;
  3. Системы автоматизации деятельности предприятий и организаций в различных отраслях и сферах деятельности;
  4. Он-лайн сервисы;
  5. Программное обеспечение как услуга (SaaS).

Примеры реализованных вариантов использования кода библиотеки:

  • Сервис “Писец” для помощи формирования стенограмм при защите диссертации. Т.к. согласно требованиям ВАК, во время защиты необходимо вести аудиофиксацию всего процесса, а затем долго и мучительно расшифровывать аудио и записывать его в виде текста стенограмм, мы решили помочь своим друзьям и коллегам, разработав для них «Писец» — сервис, который преобразует речь из аудиофайла (или звуковой дорожки видеофайла) в нормальный текст с таймингами, представленный в человекочитаемом формате субтитров SubRip. На основе таких субтитров составлять стенограмму звукозаписи гораздо быстрее.
  • На основе всех модулей системы реализован сервис речевой аналитики переговоров в контакт-центрах Диалогер https://dialoger.tech/.
  • На базе наших доработок компания ООО «Предприятие «ЭЛТЕКС» заказали в нашем университете (НГУ) разработку голосового помощника, статья про нас (решение для голосового управления базируется на нашей модели).
  • Нашими открытыми библиотеками пользуются в ряде крупных компаний, таких как Центр Финансовых Технологий, выступление от компании ЦФТ о том, как они делали речевую аналитику с помощью наших библиотек.
  • Компания AIRI в своей статье на научно-популярном портале Habr в части 5 “Распознавание голосовых команд” разместили ссылки на наши модели, которые сравнивали с Whisper и оказалось, что наши лучше подходят для этой задачи.
  • Коллеги из СПбГУ использовали нашу систему для подготовки датасета для обучения нейросети для распознавания эмоций: https://tass.ru/obschestvo/19822749 , https://www.nsu.ru/n/media/news/nauka/razrabotannuyu-professorom-ngu-model-raspoznavaniya-rechi-nauchili-razlichat-emotsii/

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

Описание

Система для автоматизации обработки звукозаписей интервью, включая разбиение по собеседникам, преобразование их речи в текст и дальнейший семантический анализ этого текста

Конвейеры
0 успешных
0 с ошибкой