🗣️ Решаем задачу перевода русской речи в текст с помощью Python и библиотеки Vosk
В статье научимся конвертировать русскую речь в текст (транскрибация) с помощью Python и библиотеки Vosk с её ML-моделями.
Продолжаем серию статей по практическому применению Python. Попробуем решить задачу транскрибации записи речи из аудио в текст. Это не rocket science :) Такие задачи уже решаются продуктами на рынке и довольно неплохо (Сбер, Yandex). Моя цель – не конкурировать, а показать, что такие серьезные задачи можно начать решать с минимальным порогом входа: достаточно базовых знаний в программировании на Python.
Направление естественного анализа речи – целая область в NLP (Natural Language Processing). Дело в том, что компьютер очень быстро считает, но вот с пониманием смысла у него проблемы. Программа может быстро подсчитать количество слов в произведении «Война и мир», но с анализом смысла будут проблемы. А вот NLP пытается докопаться до смыслов.
Прежде чем анализировать речь, ее необходимо перевести в текст, а уже его подвергать анализу. Напрямую анализировать аудио – такого я не встречал (поправьте, если есть реализации, очень интересно посмотреть). В этой статье мы как раз займемся расшифровкой аудио в текст.
Для работы нам понадобится Python 3.8+, библиотека для распознавания речи – Vosk. Немного про библиотеку Vosk:
- Поддерживает 20+ языков и диалектов.
- Работает без доступа к сети даже на мобильных устройствах – Raspberry Pi, Android, iOS.
- Устанавливается с помощью простой команды pip3 install vosk без дополнительных шагов.
- Сделана для потоковой обработки звука, что позволяет реализовать мгновенную реакцию на команды.
- Поддерживает несколько популярных языков программирования – Java, C#, Javascript, Python.
- Позволяет быстро настраивать словарь распознавания для улучшения точности распознавания.
- Позволяет идентифицировать говорящего.
- Библиотека активно контрибьютится и поддерживается.
Перевод аудио в текст
Чтобы реализовать транскрибацию из аудио в текст, нам необходимо решить следующие задачи:
- Вытащить части речи из аудио.
- Расставить пробелы на паузах между частями речи.
- Добавить пунктуацию в текст.
Все действия буду делать на машине с Ubuntu 20 (Python 3.8) со следующей конфигурацией:
- CPU 2vCPU.
- RAM 12GB.
- HDD 20GB.
Причина использования такого количества RAM в том, что мы делаем распознавание на универсальной модели, то есть модели размером 50 Мб, которая требует в разы меньше оперативной памяти в работе, чем полноценная модель. Правда, качество распознавания в этом случае уменьшится.
Создаем директорию speech
:
mkdir speech cd speech
Далее необходимо поставить зависимости для Python:
apt install python3-pip pip3 install ffmpeg pip3 install pydub pip3 install vosk pip3 install torch pip3 install transformers
Также скачиваем и распаковываем модель для распознавания русской речи, выполнив команды:
curl -o ./model.zip https://alphacephei.com/vosk/models/vosk-model-ru-0.22.zip unzip model.zip mv vosk-model-ru-0.22/ model rm -rf model.zip
В результате этих действий мы скопировали к себе модель, разархивировали ее и переименовали директорию. Также удалили скачанный архив. Всё-таки он весит 1.5 Гб. Для расстановки пунктуации делаем похожие действия: скачиваем еще одну модель весом 1.5 Гб.
curl -o recasepunc.zip https://alphacephei.com/vosk/models/vosk-recasepunc-ru-0.22.zip unzip recasepunc.zip mv vosk-recasepunc-ru-0.22/ recasepunc rm -rf recasepunc.zip
Код файла app.py
, который выполняет перевод аудио в текст.
from vosk import Model, KaldiRecognizer, SetLogLevel from pydub import AudioSegment import subprocess import json import os SetLogLevel(0) # Проверяем наличие модели if not os.path.exists("model"): print ("Please download the model from https://alphacephei.com/vosk/models and unpack as 'model' in the current folder.") exit (1) # Устанавливаем Frame Rate FRAME_RATE = 16000 CHANNELS=1 model = Model("model") rec = KaldiRecognizer(model, FRAME_RATE) rec.SetWords(True) # Используя библиотеку pydub делаем предобработку аудио mp3 = AudioSegment.from_mp3('Song.mp3') mp3 = mp3.set_channels(CHANNELS) mp3 = mp3.set_frame_rate(FRAME_RATE) # Преобразуем вывод в json rec.AcceptWaveform(mp3.raw_data) result = rec.Result() text = json.loads(result)["text"] # Добавляем пунктуацию cased = subprocess.check_output('python3 recasepunc/recasepunc.py predict recasepunc/checkpoint', shell=True, text=True, input=text) # Записываем результат в файл "data.txt" with open('data.txt', 'w') as f: json.dump(cased, f, ensure_ascii=False, indent=4)
Последний штрих – разместить файл Song.mp3
в нашей директории с исполняемым файлом app.py
. Затем запускаем app.py
. В результате наша программа обработает файл .mp3
и на основе натренированных моделей из библиотеки Vosk сделает транскрибацию аудио в текст с сохранением результата в файл data.txt
.
Наша реализация решает поставленные задачи в начале статьи. Но это скорее MVP, чем продуманное решение для продакшена. Если мы начнем углубляться, то перед нами встанут задачи обработки больших аудио (от часа и более), организации многопоточности, балансировки и горизонтального масштабирования и много чего интересного. Библиотека VOSK позволяет со всем этим справиться. Но это уже другая история :)