Python speech to text russian offline

Распознавание речи на python с помощью pocketsphinx или как я пытался сделать голосового ассистента

Это туториал по использованию библиотеки pocketsphinx на Python. Надеюсь он поможет вам
побыстрее разобраться с этой библиотекой и не наступать на мои грабли.

Началось все с того, что захотел я сделать себе голосового ассистента на python. Изначально для распознавания решено было использовать библиотеку speech_recognition. Как оказалось, я не один такой. Для распознавания я использовал Google Speech Recognition, так как он единственный не требовал никаких ключей, паролей и т.д. Для синтеза речи был взят gTTS. В общем получился почти клон этого ассистента, из-за чего я не мог успокоиться.

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

Первым усовершенствованием был синтез речи при помощи yandex speechkit cloud:

URL = 'https://tts.voicetech.yandex.net/generate?text='+text+'&format=wav&lang=ru-RU&speaker=ermil&key='+key+'&speed=1&emotion=good' response=requests.get(URL) if response.status_code==200: with open(speech_file_name,'wb') as file: file.write(response.content)

Затем настала очередь распознавания. Меня сразу заинтересовала надпись «CMU Sphinx (works offline)» на странице библиотеки. Я не буду рассказывать об основных понятиях pocketsphinx, т.к. до меня это сделал chubakur(за что ему большое спасибо) в этом посте.

Установка Pocketsphinx

Сразу скажу, так просто pocketsphinx установить не получится(по крайней мере у меня не получилось), поэтому pip install pocketsphinx не сработает, упадет с ошибкой, будет ругаться на wheel. Установка через pip будет работать только если у вас стоит swig. В противном случае чтобы установить pocketsphinx нужно перейти вот сюда и скачать установщик(msi). Обратите внимание: установщик есть только для версии 3.5!

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

Pocketsphinx может распознавать речь как с микрофона, так и из файла. Также он может искать горячие фразы(у меня не очень получилось, почему-то код, который должен выполняться когда находится горячее слово выполняется несколько раз, хотя произносил его я только один). От облачных решений pocketsphinx отличается тем, что работает оффлайн и может работать по ограниченному словарю, вследствие чего повышается точность. Если интересно, на странице библиотеки есть примеры. Обратите внимание на пункт «Default config».

Русская языковая и акустическая модель

Изначально pocketsphinx идет с английской языковой и акустической моделями и словарем. Скачать русские можно по этой ссылке. Архив нужно распаковать. Затем надо папку /zero_ru_cont_8k_v3/zero_ru.cd_cont_4000 переместить в папку C:/Users/tutam/AppData/Local/Programs/Python/Python35-32/Lib/site-packages/pocketsphinx/model , где это папка в которую вы распаковали архив. Перемещенная папка — это акустическая модель. Такую же процедуру надо проделать с файлами ru.lm и ru.dic из папки /zero_ru_cont_8k_v3/ . Файл ru.lm это языковая модель, а ru.dic это словарь. Если вы все сделали правильно, то следующий код должен работать.

import os from pocketsphinx import LiveSpeech, get_model_path model_path = get_model_path() speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zero_ru.cd_cont_4000'), lm=os.path.join(model_path, 'ru.lm'), dic=os.path.join(model_path, 'ru.dic') ) print("Say something!") for phrase in speech: print(phrase)

Предварительно проверьте чтобы микрофон был подключен и работал. Если долго не появляется надпись Say something! — это нормально. Большую часть этого времени занимает создание экземпляра LiveSpeech , который создается так долго потому, что русская языковая модель весит более 500(!) мб. У меня экземпляр LiveSpeech создается около 2 минут.

Этот код должен распознавать почти любые произнесенные вами фразы. Согласитесь, точность отвратительная. Но это можно исправить. И увеличить скорость создания LiveSpeech тоже можно.

Читайте также:  Javascript createelement script with content

JSGF

Вместо языковой модели можно заставить pocketsphinx работать по упрощенной грамматике. Для этого используется jsgf файл. Его использование ускоряет создание экземпляра LiveSpeech . О том как создавать файлы граматики написано здесь. Если языковая модель есть, то jsgf файл будет игнорироваться, поэтому если вы хотите использовать собственный файл грамматики, то нужно писать так:

speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zero_ru.cd_cont_4000'), lm=False, jsgf=os.path.join(model_path, 'grammar.jsgf'), dic=os.path.join(model_path, 'ru.dic') )

Естественно файл с грамматикой надо создать в папке C:/Users/tutam/AppData/Local/Programs/Python/Python35-32/Lib/site-packages/pocketsphinx/model . И еще: при использовании jsgf придется четче говорить и разделять слова.

Создаем свой словарь

Словарь — это набор слов и их транскрипций, чем он меньше, тем выше точность распознавания. Для создания словаря с русскими словами нужно воспользоваться проектом ru4sphinx. Качаем, распаковываем. Затем открываем блокнот и пишем слова, которые должны быть в словаре, каждое с новой строки, затем сохраняем файл как my_dictionary.txt в папке text2dict , в кодировке UTF-8. Затем открываем консоль и пишем: C:\Users\tutam\Downloads\ru4sphinx-master\ru4sphinx-master\text2dict> perl dict2transcript.pl my_dictionary.txt my_dictionary_out.txt . Открываем my_dictionary_out.txt , копируем содержимое. Открываем блокнот, вставляем скопированный текст и сохраняем файл как my_dict.dic (вместо «текстовый файл» выберите «все файлы»), в кодировке UTF-8.

speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zero_ru.cd_cont_4000'), lm=os.path.join(model_path, 'ru.lm'), dic=os.path.join(model_path, 'my_dict.dic') )

Некоторые транскрипции может быть нужно подправить.

Использование pocketsphinx через speech_recognition

Использовать pocketsphinx через speech_recognition имеет смысл только если вы распознаете английскую речь. В speech_recognition нельзя указать пустую языковую модель и использовать jsgf, а следовательно для распознавания каждого фрагмента придется ждать 2 минуты. Проверенно.

Итог

Угробив несколько вечеров я понял, что потратил время впустую. В словаре из двух слов(да и нет) сфинкс умудряется ошибаться, причем часто. Отъедает 30-40% celeron’а, а с языковой моделью еще и жирный кусок памяти. А Яндекс почти любую речь распознает безошибочно, при том не ест память и процессор. Так что думайте сами, стоит ли за это браться вообще.

Читайте также:  Python input default value

P.S.: это мой первый пост, так что жду советы по оформлению и содержанию статьи.

Источник

Офлайн распознавание речи. Библиотека Vosk

Преобразование аудио в текст — популярная и повсеместно используемая технология. В этой статье мы расскажем, как распознать речь из аудиофайла на своем ПК без использования онлайн сервисов.

Недавно нам была поставлена задача конвертировать аудиозаписи в текст для дальнейшего анализа. Обязательные условия: офлайн обработка, невысокая требовательность к системным ресурсам, и возможность автоматизации процесса. Мы выбрали Python и библиотеку vosk-api.

Vosk – это автономный инструмент для распознавания речи с открытым исходным кодом. Он позволяет использовать модели для 17 языков и диалектов (на момент написания статьи). Модели Vosk малы (50Мб) и позволяют преобразовывать речь в текст «на лету». Существуют и более точные модели. Их размер достигает 2Гб.

Существует реализация библиотеки на Python, Java, NodeJS, C#, C++ и др.

Возможен запуск на ОС Windows, Linux, Android.

Нам понадобится: python 3.8, библиотеки PyAudio == 0.2.11, vosk == 0.3.1.2

Следующим шагом загружаем модель распознавания. На данный момент для русского доступны две модели:

Большая модель распознает чуть-чуть лучше, а занимает в 40 раз больше места.

После распаковки в каталог модели будет содержать каталоги am, conf, graph и другие.

При появлении ошибки вида:

RuntimeError: Cannot open config file: Z:\Python\Trifonov\vosk\vosk-model-ru-0.10/mfcc.conf

необходимо найти файл в одной из папок модели и переместить в корневой каталог модели. В нашем случае в файл mfcc.conf можно обнаружить в папку conf и переместить его на уровень наверх. С подобной ошибкой я сталкивался на ОС Windows. Для запуска мне пришлось переместить все содержимое папок am, conf, graph, ivector, rmmlm в корень модели.

Важным параметром является частота дискретизации. Большая модель поддерживает частоту 8000, следовательно, и читать данные с микрофона нужно с такой же частотой

Распознавание «на лету» с микрофона:

from vosk import Model, KaldiRecognizer import os import pyaudio model = Model(r»/home/user/vosk-model-ru-0.10″) # полный путь к модели rec = KaldiRecognizer(model, 8000) p = pyaudio.PyAudio() stream = p.open( format=pyaudio.paInt16, channels=1, rate=8000, input=True, frames_per_buffer=8000 ) stream.start_stream() while True: data = stream.read(4000) if len(data) == 0: break print(rec.Result() if rec.AcceptWaveform(data) else rec.PartialResult()) print(rec.FinalResult())

Для распознавания аудио из файлов необходимо конвертировать в формат WAV с частотой дискретизации, поддерживаемый выбранной моделью, в моем случае 8000 Гц.

Читайте также:  Html img valign top

Листинг кода распознавания аудио файла:

from vosk import Model, KaldiRecognizer import sys import json import os import time import wave model = Model(r»/home/user/vosk-model-ru-0.10″) wf = wave.open(r’test.wav’, «rb») rec = KaldiRecognizer(model, 8000) result = » last_n = False while True: data = wf.readframes(8000) if len(data) == 0: break if rec.AcceptWaveform(data): res = json.loads(rec.Result()) if res[‘text’] != »: result += f» » last_n = False elif not last_n: result += ‘\n’ last_n = True res = json.loads(rec.FinalResult()) result += f» » print(result)

Для примера я распознал новогоднюю речь президента РФ за 2021 год используя большую модель:

уважаемые граждане россии дорогие друзья всего через несколько минут две тысячи двадцатый заканчивает встречая его ровно год назад мы с вами как и люди во всем мире конечно же думали мечтали о добрых перемен и тогда никто не мог представить через какие испытания всем нам придётся пройти и сейчас кажется что уходящий год вместил в себя груз нескольких лет он был трудным для каждого из нас с тревогами и большими материальными сложностей с переживаниями а для кого то горькими утратами близких любимых людей но безусловно уходящий год был связан и с надеждами на преодолении невзгод с гордостью за тех кто проявил свои лучшие человеческие и профессиональные качества с осознанием того как много значат надёжный искренне настоящие отношения между людьми дружбы и доверия между нами

Качество распознавания очень сильно зависит от шумов в исходном файле. Менее удачный пример распознавания той же моделью (минута из видео c YouTube):

сенсор встречается уже поздний базы багажа его нужно то сам что вот я тебе все скажу ну да точнее его машина сломалась у меня монастыря и нежелательно не знаешь нужно надо пройти сначала думаю да а уж потом переходить через вроде как следствие тени это уже это уже изменить эту нишу а когда вот у нас все равно два быть дотронуться прости очень много всего нужно фанат и пройдя очень много кружков и очень многое даже власть имущих неважно как сбор отдавать бывший министр что заяц сэр очень такой хороший дядька мне посоветовал и незамедлительно он выдаёт рады нас видеть смита трейдеры лазеров что у нас перед зрителями

Также стоит отметить, что данная библиотека распознавания речи не обучена определять жаргонизмы и ненормативную лексику, но позволяет проводить дообучение моделей на пользователькой выборке. Описание данной функции можно найти в документации: https://alphacephei.com/vosk/adaptation.

Библиотека vosk показала хороший результат при обработке аудио в «тепличных условиях», но при появлении шумов качество распознавания значительно снижается.

На слабом офисном ПК мне удалось обработать запись длиной 4 часа за 20 минут.

Источник

Оцените статью