Распознавание и анализ речи с помощью библиотеки Speech Recognition, Pyaudio и Librosa
В основе систем распознавания речи стоит скрытая марковская модель, суть модели заключается в том, что при рассмотрении сигнала в промежутке небольшой длительности (от пяти до 10 миллисекунд), возможна его аппроксимация как при стационарном процессе.
11K открытий
Если простыми словами, скрытую марковскую модель можно объяснить на примере.
Допустим, есть два человека, которые каждый вечер созваниваются и обсуждают свои действия в течение дня. Выбор одного из друзей: ходил за покупками; гулял в парке; занимался домашними делами. При выборе активности, он полагался лишь на погоду. Второй же знал о погоде, которая была на тот момент в месте первого и, основываясь на выборе первого, мог догадаться, какая погода была в какой-то момент.
То есть, допустим, мы делим сигнал на фрагменты скажем в 10 миллисекунд и выделяем кепстральные коэффициенты, которые, по сути, являются графиком зависимости мощности от частоты сигнала отображающегося на векторе действительных чисел. Результатом скрытой марковской модели является последовательность этих векторов.
В последствии мы сопоставляем фонемы и эти векторы, а так как звук фонемы изменяется от источника к источнику, то процесс сопоставления требует обучения.
Для python существует несколько пакетов которые используются в данной сфере речи, такие как apiai, assemblyai и другие, но Speech Recognition выделяется среди них довольно высокой простотой использования.
Библиотека Speech Recognition — это, инструмент для передачи речевых API от компаний (google, microsoft, sound hound, ibm, а также pocketsphinx), который в отличие от остальных имеет возможность работы офлайн.
Для демонстрации работы в данной статье я буду использовать дефолтный Google Speech API.
Также для работы с инструментами потребуется библиотека pyAudio.
Установим библиотеку для распознавания речи:
pip install SpeechRecognition
Для работы с инструментами звукозаписи
pip install pyAudio
Бываю некие сложности с установкой pyaudio через pip, поэтому альтернативный вариант — установка pipwin или conda
Для анализа звуковых данных
pip install librosa
Для работы с wave файлами
pip install wave
и импортируем в код
import speech_recognition as speech_r import pyaudio import wave
Для начала нужно выставить параметры записи звука:
CHUNK = 1024 # определяет форму ауди сигнала FRT = pyaudio.paInt16 # шестнадцатибитный формат задает значение амплитуды CHAN = 1 # канал записи звука RT = 44100 # частота REC_SEC = 5 #длина записи OUTPUT = «output.wav»
Далее нужно создать объект для обращения к устройству звукозаписи:
p = pyaudio.PyAudio()
и открыть поток для записи звука:
stream = p.open(format=FRT,channels=CHAN,rate=RT,input=True,frames_per_buffer=CHUNK) # открываем поток для записи print(«rec») frames = [] # формируем выборку данных фреймов for i in range(0, int(RT / CHUNK * REC_SEC)): data = stream.read(CHUNK) frames.append(data) print(«done») и закрываем поток stream.stop_stream() # останавливаем и закрываем поток stream.close() p.terminate()
Дальше нам нужно записать оцифрованную звуковую дорожку в файл.
Для этого нам и пригодится библиотека wave:
w = wave.open(OUTPUT, ‘wb’) w.setnchannels(CHAN) w.setsampwidth(p.get_sample_size(FRT)) w.setframerate(RT) w.writeframes(b».join(frames)) w.close()
В итоге мы получаем готовую звуковую дорожку записанную с микрофона устройства и готовую к распознаванию для этого нам потребуется библиотека Speech Recognition:
sample = speech_r.WavFile(‘C:\\Users\\User\\Desktop\\1\\pythonProject\\output.wav’)
Непосредственно для распознавания текста нам потребуется класс Recognizer он имеет множество функций, а также определяет каким API мы будем пользоваться:
r = speech_r.Recognizer()
Открываем записанный файл.
Для расшифровки сигнала мы будем использовать метод recognize_google().
Для использования данного метода необходим объект AudioData и для дальнейшей работы требуется преобразовать сигнал в объект модуля Speech_recognition для этого существует метод record():
with sample as audio: content = r.record(audio)
но, перед тем как передать сигнал на расшифровку, нужно очистить его от шумов. У библиотеки speech_recognition есть для этого метод adjust_for_ambient_noise()
with sample as audio: content = r.record(audio) r.adjust_for_ambient_noise(audio)
Так как выбранный нами Api поддерживает русский язык мы можем им воспользоваться:
print(r.recognize_google(audio, language=»ru-RU»))
Распознаватель возвращает: «Привет»
Таким образом у нас получается небольшой распознаватель речи буквально в пару строк кода. В момент, когда речь прекращается он автоматически переводит ее в текст.
Далее можно приступить к получению аналитических данных с помощью библиотеки librosa. Для начала загружаем наш файл:
A_Data = ‘C:\\Users\\User\\Desktop\\1\\pythonProject\\output.wav’ y , sf = librosa.load(A_Data)
в данном случае мы получаем значения временного ряда звука в качестве массива с частотой дискретизации.
Далее мы можем вернуть график массива нашей звуковой дорожки. Для работы с графиком импортируем pyplot из библиотеки matplotlib и используем librosa.display.waveplot() для построения графика массива:
import matplotlib.pyplot as plt import librosa.display plt.figure(figsize=(14, 5)) librosa.display.waveplot(y, sr=sf)
В самом начале я упоминал про кепстральные коэффициенты, они обычно используются для определения тембральных аспектов музыкального инструмента или голоса и мы можем построить их тепловую карту и хроматограмму.
fcc = librosa.feature.mfcc(y=y, sr=sf, hop_length=8192, n_mfcc=12) import seaborn as sns from matplotlib import pyplot as plt fcc_delta = librosa.feature.delta(fcc) sns.heatmap(fcc_delta) plt.show()
Распознавание и анализ речи с помощью библиотеки SPEECH RECOGNITION, PYAUDIO и LIBROSA
В основе систем распознавания речи стоит скрытая марковская модель, суть модели заключается в том, что при рассмотрении сигнала в промежутке небольшой длительности (от пяти до 10 миллисекунд), возможна его аппроксимация как при стационарном процессе.
Если простыми словами скрытую марковскую модель можно объяснить на примере.
Допустим, есть два человека, которые каждый вечер созваниваются и обсуждают свои действия в течение дня. Выбор одного из друзей: ходил за покупками; гулял в парке; занимался домашними делами. При выборе активности, он полагался лишь на погоду. Второй же знал о погоде, которая была на тот момент в месте первого и, основываясь на выборе первого, мог догадаться, какая погода была в какой-то момент.
То есть, допустим, мы делим сигнал на фрагменты скажем в 10 миллисекунд и выделяем кепстральные коэффициенты, которые, по сути, являются графиком зависимости мощности от частоты сигнала отображающегося на векторе действительных чисел. Результатом скрытой марковской модели является последовательность этих векторов.
В последствии мы сопоставляем фонемы и эти векторы, а так как звук фонемы изменяется от источника к источнику, то процесс сопоставления требует обучения.
Для python существует несколько пакетов которые используются в данной сфере речи, такие как apiai, assemblyai и другие, но Speech Recognition выделяется среди них довольно высокой простотой использования.
Библиотека Speech Recognition — это, инструмент для передачи речевых API от компаний (google, microsoft, sound hound, ibm, а также pocketsphinx), который в отличие от остальных имеет возможность работы офлайн.
Для демонстрации работы в данной статье я буду использовать дефолтный Google Speech API.
Также для работы с инструментами потребуется библиотека pyAudio.
Установим библиотеку для распознавания речи:
pip install SpeechRecognition
Для работы с инструментами звукозаписи
pip install pyAudio
Бываю некие сложности с установкой pyaudio через pip, поэтому альтернативный вариант — установка pipwin или conda
Для анализа звуковых данных
pip install librosa
Для работы с wave файлами
pip install wave
и импортируем в код
import speech_recognition as speech_r import pyaudio import wave
Для начала нужно выставить параметры записи звука:
CHUNK = 1024 # определяет форму ауди сигнала FRT = pyaudio.paInt16 # шестнадцатибитный формат задает значение амплитуды CHAN = 1 # канал записи звука RT = 44100 # частота REC_SEC = 5 #длина записи OUTPUT = "output.wav"
Далее нужно создать объект для обращения к устройству звукозаписи:
p = pyaudio.PyAudio()
и открыть поток для записи звука:
stream = p.open(format=FRT,channels=CHAN,rate=RT,input=True,frames_per_buffer=CHUNK) # открываем поток для записи print("rec") frames = [] # формируем выборку данных фреймов for i in range(0, int(RT / CHUNK * REC_SEC)): data = stream.read(CHUNK) frames.append(data) print("done") и закрываем поток stream.stop_stream() # останавливаем и закрываем поток stream.close() p.terminate()
Дальше нам нужно записать оцифрованную звуковую дорожку в файл.
Для этого нам и пригодится библиотека wave:
w = wave.open(OUTPUT, 'wb') w.setnchannels(CHAN) w.setsampwidth(p.get_sample_size(FRT)) w.setframerate(RT) w.writeframes(b''.join(frames)) w.close()
В итоге мы получаем готовую звуковую дорожку записанную с микрофона устройства и готовую к распознаванию для этого нам потребуется библиотека Speech Recognition:
sample = speech_r.WavFile('C:\\Users\\User\\Desktop\\1\\pythonProject\\output.wav')
Непосредственно для распознавания текста нам потребуется класс Recognizer он имеет множество функций, а также определяет каким API мы будем пользоваться:
r = speech_r.Recognizer()
Открываем записанный файл.
Для расшифровки сигнала мы будем использовать метод recognize_google().
Для использования данного метода необходим объект AudioData и для дальнейшей работы требуется преобразовать сигнал в объект модуля Speech_recognition для этого существует метод record():
with sample as audio: content = r.record(audio)
но, перед тем как передать сигнал на расшифровку, нужно очистить его от шумов. У библиотеки speech_recognition есть для этого метод adjust_for_ambient_noise()
with sample as audio: content = r.record(audio) r.adjust_for_ambient_noise(audio)
Так как выбранный нами Api поддерживает русский язык мы можем им воспользоваться:
print(r.recognize_google(audio, language="ru-RU"))
Распознаватель возвращает: «Привет»
Таким образом у нас получается небольшой распознаватель речи буквально в пару строк кода. В момент, когда речь прекращается он автоматически переводит ее в текст.
Далее можно приступить к получению аналитических данных с помощью библиотеки librosa. Для начала загружаем наш файл:
A_Data = 'C:\\Users\\User\\Desktop\\1\\pythonProject\\output.wav' y , sf = librosa.load(A_Data)
в данном случае мы получаем значения временного ряда звука в качестве массива с частотой дискретизации.
Далее мы можем вернуть график массива нашей звуковой дорожки. Для работы с графиком импортируем pyplot из библиотеки matplotlib и используем librosa.display.waveplot() для построения графика массива:
import matplotlib.pyplot as plt import librosa.display plt.figure(figsize=(14, 5)) librosa.display.waveplot(y, sr=sf)

В самом начале я упоминал про кепстральные коэффициенты, они обычно используются для определения тембральных аспектов музыкального инструмента или голоса и мы можем построить их тепловую карту и хроматограмму.
fcc = librosa.feature.mfcc(y=y, sr=sf, hop_length=8192, n_mfcc=12) import seaborn as sns from matplotlib import pyplot as plt fcc_delta = librosa.feature.delta(fcc) sns.heatmap(fcc_delta) plt.show()

chromo = librosa.feature.chroma_cqt(y=y, sr=sf) sns.heatmap(chromo) plt.show()

Надеюсь, что данный материал будет полезен при решении задач по распознаванию речи.
SpeechRecognition
Экспериментальная возможность: Это экспериментальная технология
Так как спецификация этой технологии ещё не стабилизировалась, смотрите таблицу совместимости по поводу использования в различных браузерах. Также заметьте, что синтаксис и поведение экспериментальной технологии может измениться в будущих версиях браузеров, вслед за изменениями спецификации.
Интерфейс Распознавание голоса Web Speech API является интерфейсом контроллера для сервиса распознавания; который так же перехватывает событие SpeechRecognitionEvent (en-US), отправленное сервисом распознавания.
Конструктор
Создаёт новый объект SpeechRecognition .
Свойства
SpeechRecognition наследует свойства от своего родительского интерфейса, EventTarget .
Возвращает и устанавливает коллекцию объектов SpeechGrammar грамматики которые будут понятны текущему SpeechRecognition .
Задаёт и возвращает язык текущего SpeechRecognition . Если данное свойство не указано по умолчанию, то используется из HTML кода значение атрибута lang , или настройки языка агента текущего пользователя.
Проверяет возвращается ли непрерывные результаты или вернулся только один. По умолчанию для одиночного значение ( false .)
Контроллирует, следует ли возвращать промежуточные результаты ( true ) или нет ( false .) Промежуточные результаты это результаты которые ещё не завершены ( например SpeechRecognitionResult.isFinal (en-US) свойство ложно.)
Устанавливает максимальное количество предоставленных результатов SpeechRecognitionAlternative (en-US). По умолчанию значение 1.
Определяет местоположение службы распознавания речи, используемой текущим SpeechRecognition, для обработки фактического распознавания. По умолчанию используется речевая служба агента пользователя.
Обработчики событий
Вызывается когда пользовательский агент начал захват аудио.
Вызывается когда пользовательский агент закончил захват аудио.
Вызывается когда служба распознавания речи отключилась.
Вызывается когда произошла ошибка распознавания речи.
Вызывается, когда служба распознавания речи возвращает окончательный результат без существенного распознавания. Это может включать определённую степень признания confidence (en-US) которая не соответствует пороговому значению или превышает его.
Вызывается когда возвращает результат — слово или фраза были распознаны положительно, и это было передано обратно в приложение.
Вызывается при обнаружении любого звука — не важно, распознана речь или нет.
Вызывается когда любой звук — распознаваемая речь или нет — перестала распознаваться.
Вызывается, когда обнаружен звук, распознаваемый службой распознавания речи как речевой сигнал.
Вызывается, когда прекращается обнаружение речи, распознанной службой распознавания речи.
Вызывается, когда служба распознавания речи начинает обрабатывать входящий звук с намерением распознать грамматики, связанные с текущим распознаванием речи.
Методы
Распознавание речи также наследует методы от своего родительского интерфейса, EventTarget .
Останавливает обработку входящего аудио службой распознавания речи и не пытается вернуть SpeechRecognitionResult (en-US).
Запускает службу распознавания речи, прослушивая входящее аудио с целью распознавания грамматик, связанных с текущим распознаванием речи.
Останавливает обработку входящего аудио службой распознавания речи и пытается вернуть SpeechRecognitionResult (en-US) Используя уже записанный звук.
Примеры
В нашем простом примере Speech color changer , мы создаём новый объект экземпляра SpeechRecognition используя этот конструктор SpeechRecognition() (en-US) , создание нового SpeechGrammarList (en-US), И установить его в качестве грамматики, которая будет распознаваться экземпляром распознавание речи с использованием свойства SpeechRecognition.grammars (en-US).
После определения некоторых других значений мы затем устанавливаем их так, чтобы служба распознавания началась когда произошло событие по клику ( SpeechRecognition.start() (en-US).) Когда результат был успешно распознан, the SpeechRecognition.onresult (en-US) обработчик извлекаем цвет, который был произнесён из события, а затем меняем цвет фона на данный цвет .
var grammar = "#JSGF V1.0; grammar colors; public = aqua | azure | beige | bisque | black | blue | brown | chocolate | coral | crimson | cyan | fuchsia | ghostwhite | gold | goldenrod | gray | green | indigo | ivory | khaki | lavender | lime | linen | magenta | maroon | moccasin | navy | olive | orange | orchid | peru | pink | plum | purple | red | salmon | sienna | silver | snow | tan | teal | thistle | tomato | turquoise | violet | white | yellow ;"; var recognition = new SpeechRecognition(); var speechRecognitionList = new SpeechGrammarList(); speechRecognitionList.addFromString(grammar, 1); recognition.grammars = speechRecognitionList; //recognition.continuous = false; recognition.lang = "en-US"; recognition.interimResults = false; recognition.maxAlternatives = 1; var diagnostic = document.querySelector(".output"); var bg = document.querySelector("html"); document.body.onclick = function () recognition.start(); console.log("Ready to receive a color command."); >; recognition.onresult = function (event) var color = event.results[0][0].transcript; diagnostic.textContent = "Result received: " + color; bg.style.backgroundColor = color; >;
Спецификации
| Specification |
|---|
| Web Speech API # speechreco-section |
Совместимость с браузерами
BCD tables only load in the browser
Как работает распознавание речи

Технология распознавания речи помогает улучшить пользовательский опыт: например, вместо введения адреса в навигатор можно просто произнести его.
В статье рассмотрим, как бизнес использует распознавание в своих продуктах и сервисах, и разберём, как вообще устроена технология на основе искусственного интеллекта.
Попробуйте распознавание и синтез речи в личном кабинете Цифровой витрины
Зарегистрируйтесь, пройдите модерацию и используйте SaluteSpeech для своего проекта
Попробовать
Что такое распознавание речи
Технология Speech-to-Text отвечает за перевод голоса в текст с помощью нейросети. В основе лежит многоуровневый процесс обработки и анализа аудиосодержимого. Речь с помощью искусственного интеллекта преобразуется в буквы, слова, фразы и предложения, и на выходе получается текстовая версия аудио.
Вы имеете дело с технологией распознавания речи каждый раз, когда используете голосовой поиск, вводите маршрут в навигатор голосом, взаимодействуете с голосовыми помощниками. В этих случаях реакция на голосовую команду нужна сразу же — и обработка речи занимает меньше секунды.
Есть и другие кейсы применения технологии распознавания с использованием искусственного интеллекта — мы рассмотрим их далее в статье.
Как работает Speech-to-Text
В основе работы технологии STT — нейросети, которые обрабатывают речь и возвращают распознанный текст. Рассмотрим подробнее, что происходит в процессе.
Речь состоит из звуков, а текст состоит из букв. Основная задача нейросети — распознать, какой букве соответствовует рисунок на спектрограмме аудиозаписи, затем преобразовать отдельные буквы в слова, а слова — в полноценные предложения.
Чтобы научиться распознавать среди звуков буквы, инженеры обучают нейросеть на подготовленном датасете. Датасет состоит из аудиозаписей с голосом, которые сопровождаются размеченным текстом. Таким образом, на вход нейросети подаётся пара аудио-текст, из которой она должна найти соответствие «рисунку» аудиодорожки определенных букв и слов.

В процессе обучения искусственный интеллект разбивает запись с голосом на короткие отрезки и пытается предсказать по спектрограмме каждой из них, что это за буква. При этом в процессе предсказания нейросеть не выдаёт однозначный результат: она определяет, с какой вероятностью перед ней та или иная буква.
Когда вероятности по каждой букве в записи голоса вычислены, искусственный интеллект пытается понять, какое это слово. Для этого есть контекст — или, проще говоря, словарь, — с которым нейросеть проводит сравнение вероятных букв. В результате получается набор распознанных слов.
Слова, в свою очередь, искусственный интеллект складывает в предложения. Финальный этап — это смысловая обработка. Кроме непосредственно распознавания, важно, чтобы текст на выходе был связным, осмысленным и правильно оформленным (был поделён на предложения, имел знаки препинания).
Связность и осмысленность в технологии распознавания речи обеспечивается, в том числе, объёмом текстов, которые нейросеть обработала на этапе обучения. Например, если в момент распознавания близки вероятности слов «еду» и «иду», то при построении полной фразы «я еду на машине» нейросеть выберет верный вариант, потому что слова «еду» и «машина» ближе по контексту, чем «иду» и «машина».
От чего зависит качество распознавания речи
В первую очередь — от качества данных для обучения нейросети. Чем больше записей голоса обработает искусственный интеллект — с разными интонациями и эмоциями, дикторами, смысловым наполнением (сказки и новости сильно различаются по контексту и тональности), — тем качественнее будет предсказание.
Интересно, что пол и возраст диктора не влияет на качество обучения, а вот разница в произношении слов или артикуляционные особенности могут научить нейросеть справляться с разными кейсами.
Как нейросеть справляется с разными языками
Если нейросеть обучалась на одном языке, она не сможет распознать речь на другом. Дело в том, что у неё в основе будет лежать другой алфавит и контекст.
Точнее, она распознаёт речь, но на выходе, скорее всего, получится бессмысленный набор слов, которые нейросеть попытается подобрать по словарю. Если искусственный интеллект переобучить на датасете с другим языком, с новым алфавитом и словарём, то он сможет работать корректно.

Как распознавание речи используется в бизнесе
Выше мы приводили примеры с использованием голосового поиска в навигаторе. Однако это лишь один из множества возможных способов применения технологии распознавания голоса. Рассмотрим, как технологии расшифровки голоса могут быть задействованы в телефонном общении с клиентами.
- Голосовые меню (IVR). Это когда вы звоните в компанию, но не сразу соединяетесь с оператором, а сначала проходите по голосовому меню выбора. Чтобы определить, какой вопрос у клиента, робот может просто последовательно перечислить пункты и ожидать, пока клиент нажмёт нужную цифру. Но с технологией распознавания речи IVR может работать с запросом от клиента голосом. Например, робот задаёт клиенту вопрос «Что вас интересует?», затем фиксирует ответ клиента, распознаёт его и ищет в базе, по ключевым словам, максимально подходящий ответ. Если ответ найти не удалось, робот может попросить сформулировать запрос иначе или переключить на оператора.
- Проведение опросов и исследований. Когда нужно собрать ответы через телефонные звонки, каждому человеку задаются одни и те же вопросы. С помощью распознавания голоса можно проводить обзвон автоматически: робот задаст вопросы, запишет ответы без участия живого человека.
- Анализ телефонных разговоров с клиентами. Есть отдельная специальность — супервизор. Это специалист, который проверяет, насколько качественно операторы общаются по телефону с клиентами. Он работает с перечнем обязательных пунктов — приветствие, представление, цель звонка, в некоторых случаях — проведение допродажи. Здесь нейросеть с помощью распознавания может автоматически обработать текст и определить, прошёл ли оператор все пункты или нет. Также текстовые данные о звонках могут быть источником информации о точках роста для скриптов продаж.
- Автоматизация работы с CRM. В процессе общения с клиентом оператор или робот могут собирать его данные — имя, телефон, адрес. Если использовать технологию распознавания речи, то она может заносить данные в CRM автоматически.
- Персонализация предложений. Например, если компания проводит автоматические обзвоны, она может использовать идентификацию голоса клиента при ответе на звонок, чтобы определить пол и в зависимости от этого рассказать о том или ином предложении.
Если говорить про сервисы, то технологии распознавания голоса STT используются так или иначе каждый день:

- для использования функции голосового поиска в сервисах — картах, такси, навигаторе;
- для общения с виртуальными голосовыми помощниками. Например, в Сбербанк Онлайн используются виртуальные ассистенты «Салют», которые помогают найти информацию, узнать данные о счёте, быстро сделать перевод. С их помощью можно выполнить команды «Пополни мой мобильный на 150 рублей», «Переведи маме тысячу» или узнать ответ на вопрос «Сколько у меня денег?»;
- для управления системой «Умный дом». Для управления Умным домом Sber, например, задействуются голосовые ассистенты «Салют» — с их помощью можно управлять светом, техникой;
- для голосового ввода в заметках, мессенджерах и так далее: системы становятся все более умными, могут писать текст со знаками препинания и разделять его на предложения.
Кроме этого, распознавание голоса может быть полезно для текстового сопровождения аудиоматериалов. В этом случае распознавание может происходить по сохранённым файлам, которые будут обрабатываться в фоновом режиме.
- подготовка субтитров к видео;
- создание текстовой версии записи курса;
- распознавание интервью (вот тут есть пример, как целая статья была написана с помощью технологии);
- генерация текстовых материалов по результатам конференций.
Иногда такие тексты требуют дополнительной обработки — проверки на ошибки, форматирования. С этим справится редактор, а вот функции транскрибатора на себя полностью возьмёт автоматическая технология.
