DevGang
Авторизоваться

Введение в распознавание речи с Python 

Распознавание речи, как следует из названия, относится к автоматическому распознаванию человеческой речи. Распознавание речи является одной из важнейших задач в области взаимодействия человека с компьютером. Если вы когда-либо общались с Alexa или когда-либо приказывали Сири выполнить задание, вы уже испытали силу распознавания речи.

Распознавание речи имеет различные приложения - от автоматической транскрипции речевых данных (например, голосовой почты) до взаимодействия с роботами посредством речи.

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

В Python было разработано несколько библиотек распознавания речи. Однако мы будем использовать библиотеку SpeechRecognition, которая является самой простой из всех библиотек.

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

Выполните следующую команду для установки библиотеки:

pip install SpeechRecognition

Распознавание речи из аудио файлов

В этом разделе вы увидите, как мы можем переводить речь из аудиофайла в текст. Аудиофайл, который мы будем использовать в качестве входных данных, можно скачать по этой ссылке. Загрузите файл в вашу локальную файловую систему.

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

import speech_recognition as speech_recog

Для преобразования речи в текст нам нужен единственный класс - это класс Recognizer из модуля speech_recognition. В зависимости от базового API, используемого для преобразования речи в текст, класс Recognizer имеет следующие методы:

  1. recognize_bing(): Использует Microsoft Bing Speech API
  2. recognize_google(): Использует Google Speech API
  3. recognize_google_cloud(): Использует Google Cloud Speech API
  4. recognize_houndify(): Использует Houndify API от SoundHound
  5. recognize_ibm(): Использует IBM Speech to Text API
  6. recognize_sphinx(): Использует PocketSphinx API

Среди всех вышеперечисленных способов метод recognize_sphinx() можно использовать в автономном режиме для перевода речи в текст.

Чтобы распознать речь из аудиофайла, мы должны создать объект класса AudioFile модуля speech_recognition. Путь аудиофайла, который вы хотите перевести в текст, передается в конструктор класса AudioFile. Выполните следующий скрипт:

sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')

В приведенном выше коде обновите путь к аудиофайлу, который вы хотите расшифровать.

Мы будем использовать метод recognize_google() для расшифровки наших аудио файлов. Тем не менее, метод recognize_google() требует объект AudioData модуля speech_recognition в качестве параметра. Чтобы преобразовать наш аудиофайл в объект AudioData, мы можем использовать метод record() класса Recognizer. Нам нужно передать объект AudioFile методу record(), как показано ниже:

with sample_audio as audio_file:
    audio_content = recog.record(audio_file)

Теперь, если вы проверите тип переменной audio_content, вы увидите, что она имеет тип speech_recognition.AudioData.

type(audio_content)

Результат:

speech_recognition.AudioData

Теперь мы можем просто передать объект audio_content методу recognize_google() объекта класса Recognizer(), и аудиофайл будет преобразован в текст. Выполните следующий скрипт:

recog.recognize_google(audio_content)

Результат:

'Bristol O2 left shoulder take the winding path to reach the lake no closely the size of the gas tank degrees office 30 face before you go out the race was badly strained and hung them the stray cat gave birth to kittens the young girl gave no clear response the meal was called before the bells ring what weather is in living'

Приведенный выше результат показывает текст аудиофайла. Вы можете видеть, что файл не был на 100% правильно транскрибирован, но точность довольно разумная.

Установка длительности и значений смещения

Вместо того, чтобы транскрибировать полную речь, вы также можете транскрибировать определенный сегмент аудиофайла. Например, если вы хотите транскрибировать только первые 10 секунд аудиофайла, вам нужно передать 10 в качестве значения параметра duration метода record(). Посмотрите на следующий скрипт:

sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')
with sample_audio as audio_file:
    audio_content = recog.record(audio_file, duration=10)

recog.recognize_google(audio_content)

Результат:

'Bristol O2 left shoulder take the winding path to reach the lake no closely the size of the gas'

Таким же образом вы можете пропустить некоторую часть аудиофайла с самого начала, используя параметр offset. Например, если вы не хотите транскрибировать первые 4 секунды звука, передайте 4 в качестве значения для атрибута offset. Например, следующий скрипт пропускает первые 4 секунды аудиофайла, а затем транскрибирует аудиофайл в течение 10 секунд.

sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')
with sample_audio as audio_file:
    audio_content = recog.record(audio_file, offset=4, duration=10)

recog.recognize_google(audio_content)

Результат:

'take the winding path to reach the lake no closely the size of the gas tank web degrees office dirty face'

Обработка шума

Аудио файл может содержать шум по разным причинам. Шум действительно может повлиять на качество перевода речи в текст. Чтобы уменьшить шум, класс Recognizer содержит метод adjust_for_ambient_noise(), который принимает объект AudioData в качестве параметра. Следующий скрипт показывает, как можно улучшить качество транскрипции, удалив шум из аудиофайла:

sample_audio = speech_recog.AudioFile('E:/Datasets/my_audio.wav')
with sample_audio as audio_file:
    recog.adjust_for_ambient_noise(audio_file)
    audio_content = recog.record(audio_file)

recog.recognize_google(audio_content)

Результат:

'Bristol O2 left shoulder take the winding path to reach the lake no closely the size of the gas tank web degrees office 30 face before you go out the race was badly strained and hung them the stray cat gave birth to kittens the younger again no clear response the mail was called before the bells ring what weather is in living'

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

Распознавание речи с живого микрофона

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

Существует несколько способов обработки аудиовхода, полученного через микрофон, и для этого были разработаны различные библиотеки. Одной из таких библиотек является PyAudio. Выполните следующий скрипт для установки библиотеки PyAudio:

pip install PyAudio

Теперь источником транскрибируемого звука является микрофон. Чтобы захватить звук с микрофона, нам нужно сначала создать объект класса Microphone модуля Speach_Recogniton, как показано ниже:

mic = speech_recog.Microphone()

Чтобы увидеть список всех микрофонов в вашей системе, вы можете использовать метод list_microphone_names():

speech_recog.Microphone.list_microphone_names()

Результат:

['Microsoft Sound Mapper - Input',
 'Microphone (Realtek High Defini',
 'Microsoft Sound Mapper - Output',
 'Speakers (Realtek High Definiti',
 'Microphone Array (Realtek HD Audio Mic input)',
 'Speakers (Realtek HD Audio output)',
 'Stereo Mix (Realtek HD Audio Stereo input)']

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

Следующим шагом является захват звука с микрофона. Для этого вам нужно вызвать метод listen() класса Recognizer(). Как и метод record(), метод listen() также возвращает объект speech_recognition.AudioData, который затем может быть передан методу recognize_google().

Следующий скрипт предлагает пользователю что-то сказать в микрофон, а затем печатает все, что сказал пользователь:

with mic as audio_file:
    print("Speak Please")

    recog.adjust_for_ambient_noise(audio_file)
    audio = recog.listen(audio_file)

    print("Converting Speech to Text...")
    print("You said: " + recog.recognize_google(audio))

Как только вы выполните приведенный выше скрипт, вы увидите следующее сообщение:

Please say something

В этот момент произнесите все, что хотите, и сделайте паузу. Как только вы сделали паузу, вы увидите транскрипцию всего, что вы сказали. Вот результат, который я получил:

Converting Speech to Text...
You said: hello this is normally from stack abuse abuse this is an article on speech recognition I hope you will like it and this is just a test speech and when I will stop speaking are you in today thank you for Reading

Важно отметить, что если метод recognize_google() не может сопоставить слова, которые вы говорите, с любым из слов в своем хранилище, выдается исключение. Вы можете проверить это, сказав несколько непонятных слов. Вы должны увидеть следующее исключение:

Speak Please
Converting Speech to Text...
---------------------------------------------------------------------------
UnknownValueError                         Traceback (most recent call last)
 in 
      8     print("Converting Speech to Text...")
      9
---> 10     print("You said: " + recog.recognize_google(audio))
     11
     12

~\Anaconda3\lib\site-packages\speech_recognition\__init__.py in recognize_google(self, audio_data, key, language, show_all)
    856         # return results
    857         if show_all: return actual_result
--> 858         if not isinstance(actual_result, dict) or len(actual_result.get("alternative", [])) == 0: raise UnknownValueError()
    859
    860         if "confidence" in actual_result["alternative"]:

UnknownValueError:

Лучшим подходом является использование блока try при вызове метода recognize_google(), как показано ниже:

with mic as audio_file:
    print("Speak Please")

    recog.adjust_for_ambient_noise(audio_file)
    audio = recog.listen(audio_file)

    print("Converting Speech to Text...")

    try:
        print("You said: " + recog.recognize_google(audio))
    except Exception as e:
        print("Error: " + str(e))

Вывод

Распознавание речи имеет различные полезные приложения в области взаимодействия человека с компьютером и автоматической транскрипции речи. В этой статье кратко объясняется процесс транскрипции речи в Python через библиотеку speech_recognition и объясняется, как переводить речь в текст, когда источником звука является аудиофайл или живой микрофон.

Источник:

#Python
Комментарии 7
Сергей Середкин 18.02.2020 в 13:52

Спасибо автору за "объект AudioData" много пересмотрел но увидел объяснение только у Вас ! С его позволения в примеры кода для тех кто только начал изучать распознавание речи я бы добавил: recog = speech_recog.Recognizer() мелочь но приятная..

LegGnom 18.02.2020 в 20:48

Спасибо, мы стараемся)

Anri 24.02.2020 в 12:48

Что такое recog.record()? Необходимо создать экземпляр класса Recognizer: recog=speech_recog.Recognizer(), а в тексте этого нет.

Vladimir Vorobyev 31.12.2020 в 15:39

Из коробки работает только с английским текстом? Для русского языка надо что-то ещё?

Anri 14.07.2021 в 17:24

Чтобы был русский текст нужно: r = sr.Recognizer() r.recognize_google(audio, language = 'ru-RU').lower() (Это блок в with) В общем плане всё должно выглядить так: r = sr.Recognizer() with sr.Microphone(device_index = 2) as source: r.adjust_for_ambient_noise(source, duration=0.5) audio = r.listen(source) try: query = r.recognize_google(audio, language = 'ru-RU').lower() return query except: return None

Ксения Бойцова 20.03.2022 в 23:13

Можно пожалйста посмотреть на весь код рабочей программы, а не частями. Вроде всё нормально писла, но не работает :< Так же "recog" не распознаёт Мне для школьного проекта, заранее спасибо :>

Максим Евтишкин 21.05.2022 в 09:43

PyAudio не установился

Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу