Speech recognition python russian language

Распознаем речь на Python c помощью PocketSphinx

На сегодняшний день существует много различных систем распознавания речи, например, такие системы как: Amazon Alexa, Yandex, Google и Siri. Большинство этих систем имеют открытые API и свободны для использования. Такие системы очень хорошо справляются с задачей распознавания текста, однако они работают через интернет.

Существуют и открытые системы распознавания речи, такие как: PocketSphinx, Kaldi, Mozilla DeepSpeech. Рассмотрим систему PocketSphinx. Для того чтобы она работала с русским языком нужно предварительно скачать акустическую модель, которая основана на скрытых Марковских моделях.

Для распознавания будем использовать PocketSphinx из библиотеки speech_recognition языка Python. Скачанную модель русского языка необходимо загрузить в директорию site-packages/speech_recognition/pocketsphinx-data. После этого можно приступать к распознаванию. Ниже, продемонстрирован пример распознавания аудиозаписи в текст.

Из рисунка видно, что PocketSphinx отлично справилась с распознаванием аудио. Однако распознавание 7 секунд записи заняло около 50 секунд. Теперь перед нами дан уже текст, и мы можем превратить его в список слов с помощью библиотеки NLTK. После этого мы можем сверить слова со списком недопустимых слов и выявить нарушение. Пример показан на рисунке ниже.

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

Читайте также:  Php конкатенация элементов массива

Источник

Распознавание речи на 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 тоже можно.

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’а, а с языковой моделью еще и жирный кусок памяти. А Яндекс почти любую речь распознает безошибочно, при том не ест память и процессор. Так что думайте сами, стоит ли за это браться вообще.

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

Источник

Speech AI с Python & Google API

Совсем недавно пришла в голову идея сделать «говорилку» на русском языке. В голове была простенькая схема наподобие:

1) Распознать речь с микрофона
2) Придумать более — менее разумный ответ.
В этом пункте можно сделать много интересного.
Например реализовать управление чем — нибудь физическим и не очень.
3) Преобразовать этот самый ответ в речь и воспроизвести.

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

В итоге получилась связка, практически не зависящая от выбранного в качестве разговорного языка.

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

SpeechRecognition

Эта библиотека представляет из себя обвертку над многими популярными сервисами / библиотеками распознавания речи.
Т.к. из всех представленных в списке библиотеки сервисов первым заработал Google Speech Recognition, им я и воспользовался в дальнейшем.

Обработка речи

ChatterBot

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

Процесс обучения в библиотеке chatterbot

В качестве источников данных для обучения могут выступать файлы такого простого формата
По сути они представляют из себя набор диалогов в виде:

Для английского языка там есть хороший набор обучающих классов, один из которых берет диалоги из Ubuntu Dialog Corpus, а другой из Twitter’a.

К сожалению, для русского языка я не нашел альтернатив Ubuntu Dialog Corpus (такого же объема). Хотя тот же TwitterTrainer должен работать.

В порядке эксперимента я попробовал использовать при обучении диалоги из первого тома Воины и Мира.

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

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

Еще библиотека chatterbot предоставляет набор «Логических модулей» (LogicAdapter). При помощи которых можно например фильтровать ответ, научить бота считать или говорить текущее время.

Библиотека довольно гибкая, позволяет писать свои классы для обучения и логические модули.

Синтезирование и воспроизведение речи

Google Text to Speech

Эта библиотека умеет преобразовывать строку в mp3 файл с речью. Т.к. за этой библиотекой стоит Google, то на выбор имеется много языков, включая русский.

Источник

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