Полное руководство по распознаванию речи Python

Python алгоритм Google искусственный интеллект
Полное руководство по распознаванию речи Python
Переводчик | недорого
Изменить | очевидно
Произведено | Базовый лагерь технологий искусственного интеллекта (публичный идентификатор: rgznai100)


Огромный успех Alexa от Amazon доказал, что в недалеком будущем достижение определенного уровня голосовой поддержки станет основным требованием для повседневных технологий. Программы Python, включающие распознавание речи, обеспечивают интерактивность и доступность, не имеющие себе равных в других технологиях. Лучше всего то, что реализовать распознавание речи в программе Python очень просто. Прочитайте это руководство, и вы узнаете. Ты выучишь:

  • Как работает распознавание речи;
  • какие пакеты поддерживает PyPI;
  • Как установить и использовать пакет SpeechRecognition — полнофункциональную и простую в использовании библиотеку распознавания речи Python.

▌Обзор того, как работает распознавание языка

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

Первая часть распознавания речи — это, конечно же, речь. С помощью микрофона речь преобразуется из физического звука в электрические сигналы, которые затем преобразуются в данные с помощью аналого-цифрового преобразователя. После оцифровки можно применить несколько моделей для преобразования аудио в текст.

Большинство современных систем распознавания речи основаны на скрытых марковских моделях (HMM). Он работает по тому принципу, что речевой сигнал можно аппроксимировать как стационарный процесс в очень коротких масштабах времени (скажем, 10 мс), то есть процесс, статистические свойства которого не меняются со временем.

Многие современные системы распознавания речи используют нейронные сети для упрощения речевых сигналов с помощью методов преобразования признаков и уменьшения размерности перед распознаванием HMM. Детекторы голосовой активности (VAD) также можно использовать для уменьшения звукового сигнала до частей, которые могут содержать только речь.

К счастью для пользователей Python, некоторые сервисы распознавания речи доступны онлайн через API, и большинство из них также предоставляют Python SDK.

▌Выберите пакет распознавания речи Python

PyPI中有一些现成的语音识别软件包。 К ним относятся:

  • apiai
  • google-cloud-speech
  • pocketsphinx
  • SpeechRcognition
  • watson-developer-cloud
  • wit

Некоторые пакеты, такие как WIT и APIAI, обеспечивают некоторые встроенные функции, которые превышают базовое распознавание речи, такие как функция обработки естественного языка, которая идентифицирует намерение докладчика. Другие пакеты, такие как Google Yun, сосредоточиться на речи к преобразованию текста.

Среди них SpeechRecognition выделяется простотой использования.

Для распознавания речи требуется ввод звука, а получение ввода звука в SpeechRecognition достаточно просто для автоматического извлечения и запуска за считанные минуты без создания сценариев для доступа к микрофону и обработки аудиофайлов с нуля.

Библиотека SpeechRecognition обслуживает несколько основных речевых API, поэтому она чрезвычайно гибкая. Google Web Speech API поддерживает ключи API по умолчанию, которые жестко закодированы в библиотеке SpeechRecognition и могут использоваться без регистрации. SpeechRecognition — лучший выбор для написания программ на Python из-за его гибкости и простоты использования.

▌Установить Распознавание речи

SpeechRecognition совместим с Python 2.6, 2.7 и 3.3+, но для его использования в Python 2 требуются дополнительные действия по установке. Все версии разработки в этом руководстве по умолчанию относятся к Python 3.3+.

Читатели могут установить SpeechRecognition из терминала с помощью команды pip:

$ pip install SpeechRecognition

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

>>> import speech_recognition as sr
>>> sr.__version__
'3.8.1'

ПРИМЕЧАНИЕ. Не закрывайте этот сеанс, вы будете использовать его в следующих нескольких шагах.

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

▌Класс идентификатора

Ядром SpeechRecognition является класс распознавателя.

Основное назначение Recognizer API — распознавание речи.Каждый API имеет различные настройки и функции для распознавания речи аудиоисточника, а именно:

  • recognize_bing(): Microsoft Bing Speech

  • recognize_google(): Google Web Speech API

  • recognize_google_cloud(): Google Cloud Speech - requires installation of the google-cloud-speech package

  • recognize_houndify(): Houndify by SoundHound

  • recognize_ibm(): IBM Speech to Text

  • recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx

  • recognize_wit(): Wit.ai

Из этих семи только распознавание_сфинкс () с движком CMU Sphinx работает в автономном режиме, остальным шести потребуется подключение к Интернету.

SpeechRecognition поставляется с ключом API по умолчанию для Google Web Speech API, который можно использовать напрямую. Для остальных шести API требуется аутентификация с использованием ключа API или комбинации имени пользователя и пароля, поэтому в этой статье используется API Web Speech.

Теперь, чтобы начать, вызовите функцию cognise_google() в сеансе интерпретатора.

>>> r.recognize_google()

На экране появится:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: recognize_google() missing 1 required positional argument: 'audio_data'

Поверьте, вы угадали результат, как можно идентифицировать данные из пустого файла?

Для всех семи классов распознавателяcognition_*() требуется входной параметр audio_data, и audio_data каждого распознавателя должен быть экземпляром класса AudioData SpeechRecognition.

Существует два пути создания экземпляров AudioData: аудиофайлы или звук, записанный микрофоном, начиная с аудиофайлов, которые проще использовать.

▌ использование аудиофайлов

Сначала вам нужно загрузить аудиофайлы (https://github.com/realpython/python-speech-recognition/tree/master/audio_files) и сохранить их в каталог, где находится сеанс интерпретатора Python.

Класс AudioFile может быть инициализирован путем указания пути к аудиофайлу и предоставляет интерфейс диспетчера контекста для чтения и управления содержимым файла.

Поддерживаемые типы файлов

В настоящее время SpeechRecognition поддерживает следующие типы файлов:

  • WAV: должен быть в формате PCM/LPCM

  • AIFF

  • AIFF-C

  • FLAC: должен быть исходный формат FLAC; формат OGG-FLAC недоступен

Если вы используете x-86 в системе Linux, macOS или Windows, вам необходимо поддерживать файлы FLAC. При работе в других системах необходимо установить кодировщик FLAC и обеспечить доступ к команде flac.

использоватьrecord() Получить данные из файла

Введите следующую команду в сеанс интерпретатора, чтобы обработать содержимое файла «harvard.wav»:

>>> harvard = sr.AudioFile('harvard.wav')
>>> with harvard as source:
...   audio = r.record(source)
...

Откройте файл через контекстный менеджер и прочитайте содержимое файла, сохраните данные в экземпляре AudioFile, затем запишите() все данные файла в экземпляр AudioData, что можно подтвердить, проверив тип аудио:

>>> type(audio)
<class 'speech_recognition.AudioData'>

Теперь можно вызвать Recognition_google(), чтобы попытаться распознать речь в аудио.

>>> r.recognize_google(audio)
'the stale smell of old beer lingers it takes heat
to bring out the odor a cold dip restores health and
zest a salt pickle taste fine with ham tacos al
Pastore are my favorite a zestful food is the hot
cross bun'

Вышеприведенное завершает запись первого аудиофайла.

Получить аудиоклип со смещением и продолжительностью

Что, если я хочу захватить в файл только часть речи? Команда record() имеет аргумент ключевого слова duration, который заставляет команду останавливать запись через указанное количество секунд.

Например, следующий код получает только первые четыре секунды речи в файле:

>>> with harvard as source:
...   audio = r.record(source, duration=4)
...
>>> r.recognize_google(audio)
'the stale smell of old beer lingers'

Когда команда record() вызывается в блоке with, файловый поток перемещается вперед. Это означает, что если вы запишете четыре секунды, затем четыре секунды, первые четыре секунды вернутся во вторые четыре секунды звука.

>>> with harvard as source:
...   audio1 = r.record(source, duration=4)
...   audio2 = r.record(source, duration=4)
...
>>> r.recognize_google(audio1)
'the stale smell of old beer lingers'
>>> r.recognize_google(audio2)
'it takes heat to bring out the odor a cold dip'

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

>>> with harvard as source:
...   audio = r.record(source, offset=4, duration=3)
...
>>> recognizer.recognize_google(audio)
'it takes heat to bring out the odor'

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

>>> with harvard as source:
...   audio = r.record(source, offset=4.7, duration=2.8)
...
>>> recognizer.recognize_google(audio)
'Mesquite to bring out the odor Aiko'

Эта программа начинает запись с 4,7-й секунды, так что фразы «ЭТО ТРЕБУЕТСЯ ТЕПЛО, ЧТОБЫ ВЫДЕЛИТЬ ЗАПАХ», «ЭТО Т» не записывается, а API выдает только ввод «акес тепла», и сопоставьте его. Результат "Мескит".

Точно так же API фиксирует «a co» только при извлечении фразы «холодное купание восстанавливает здоровье и бодрость» в конце записи, которая ошибочно соответствует «Айко».

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

Влияние шума на распознавание речи

Шум существует в реальном мире, все записи имеют некоторый уровень шума, а необработанный шум может снизить точность приложений распознавания речи.

Чтобы увидеть, как шум влияет на распознавание речи, загрузите файл «jackhammer.wav» (https://github.com/realpython/python-speech-recognition/tree/master/audio_files) и обязательно сохраните его в сеансе интерпретатора в рабочий каталог. В документе фраза «затхлый запах старого пива сохраняется» произносится на фоне громкого звука сверления стены.

Что происходит, когда вы пытаетесь расшифровать этот файл?

>>> jackhammer = sr.AudioFile('jackhammer.wav')
>>> with jackhammer as source:
...   audio = r.record(source)
...
>>> r.recognize_google(audio)
'the snail smell of old gear vendors'

Итак, как бороться с этой проблемой? Вы можете попробовать вызвать команду Adjust_for_ambient_noise() класса Recognizer.

>>> with jackhammer as source:
...   r.adjust_for_ambient_noise(source)
...   audio = r.record(source)
...
>>> r.recognize_google(audio)
'still smell of old beer vendors'

Это гораздо ближе к точному результату, но с точностью все равно есть проблемы, а "the" в начале фразы отсутствует, почему?

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

Диапазон временного анализа команды Adjust_for_ambient_noise() можно настроить с помощью параметра ключевого слова duration, который измеряется в секундах и по умолчанию равен 1. Теперь это значение уменьшено до 0,5.

>>> with jackhammer as source:
...   r.adjust_for_ambient_noise(source, duration=0.5)
...   audio = r.record(source)
...
>>> r.recognize_google(audio)
'the snail smell like old Beer Mongers'

Теперь у нас есть "the" в предложении, но теперь есть некоторые новые проблемы - иногда сигнал слишком громкий, чтобы нейтрализовать эффект шума.

Если эти проблемы возникают часто, требуется некоторая предварительная обработка звука. Эта предварительная обработка может быть выполнена с помощью программного обеспечения для редактирования аудио или в пакете Python, таком как SciPy, который применяет фильтры к файлу. При работе с зашумленными файлами вы можете повысить точность, посмотрев фактический ответ API. Большинство API-интерфейсов возвращают строку JSON, содержащую несколько возможных транскрипций, но если не требуется полный ответ, метод распознавания_google() всегда возвращает только наиболее вероятные символы транскрипции.

Дайте полный ответ, изменив параметр True в функции распознавания_google() на show_all.

>>> r.recognize_google(audio, show_all=True)
{'alternative': [
 {'transcript': 'the snail smell like old Beer Mongers'}, 
 {'transcript': 'the still smell of old beer vendors'}, 
 {'transcript': 'the snail smell like old beer vendors'},
 {'transcript': 'the stale smell of old beer vendors'}, 
 {'transcript': 'the snail smell like old beermongers'}, 
 {'transcript': 'destihl smell of old beer vendors'}, 
 {'transcript': 'the still smell like old beer vendors'}, 
 {'transcript': 'bastille smell of old beer vendors'}, 
 {'transcript': 'the still smell like old beermongers'}, 
 {'transcript': 'the still smell of old beer venders'}, 
 {'transcript': 'the still smelling old beer vendors'}, 
 {'transcript': 'musty smell of old beer vendors'}, 
 {'transcript': 'the still smell of old beer vendor'}
], 'final': True}

Как вы можете видеть, функция распознавания_google() возвращает список с ключевым словом «альтернатива», которое относится к списку всех возможных ответов. Эта структура списка ответов зависит от API и в основном используется для отладки результатов.

▌Использование микрофона

Для доступа к микрофону с помощью SpeechRecognizer необходимо установить пакет PyAudio, закрыть текущее окно интерпретатора и сделать следующее:

Установить ПиАудио

Процесс установки PyAudio зависит от операционной системы.

Debian Linux

Если вы используете Linux на основе Debian, такие как Ubuntu, вы можете установить Pyaudio, используя APT:

$ sudo apt-get install python-pyaudio python3-pyaudio

Он все еще может потребоваться включить PIP Установить Pyaudio после установки, особенно если работает виртуально.

macOS

Пользователям macOS сначала нужно использовать Homebrew для установки PortAudio, а затем вызвать команду pip для установки PyAudio.

$ brew install portaudio
$ pip install pyaudio

Windows

Пользователи Windows могут напрямую вызывать pip для установки PyAudio.

$ pip install pyaudio

установочный тест

После установки PyAudio вы можете протестировать установку из консоли.

$ python -m speech_recognition

Убедитесь, что микрофон по умолчанию включен и звук не отключен. Если установка работает, вы должны увидеть что-то вроде этого:

A moment of silence, please...
Set minimum energy threshold to 600.4452854381937
Say something!

Говорите в микрофон и смотрите, как SpeechRecognition расшифровывает вашу речь.

Класс микрофона

Откройте другой сеанс интерпретатора и создайте пример, распознающий класс идентификатора.

>>> import speech_recognition as sr
>>> r = sr.Recognizer()

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

>>> mic = sr.Microphone()

Если в вашей системе нет микрофона по умолчанию (например, на RaspberryPi) или вы хотите использовать микрофон не по умолчанию, вам нужно указать, какой микрофон использовать, указав индекс устройства. Читатели могут получить список имен микрофонов, вызвав функцию list_microphone_names() класса Microphone.

>>> sr.Microphone.list_microphone_names()
['HDA Intel PCH: ALC272 Analog (hw:0,0)',
 'HDA Intel PCH: HDMI 0 (hw:0,3)',
 'sysdefault',
 'front',
 'surround40',
 'surround51',
 'surround71',
 'hdmi',
 'pulse',
 'dmix', 
 'default']

Примечание. Ваш вывод может отличаться от приведенного выше примера.

list_microphone_names() возвращает индекс имен микрофонов в списке. В приведенном выше выводе, если вы хотите использовать микрофон с именем «front», который находится под индексом 3 в списке, вы можете создать экземпляр микрофона следующим образом:

>>> # This is just an example; do not run
>>> mic = sr.Microphone(device_index=3)

Но в большинстве случаев вам нужно использовать системный микрофон по умолчанию.

использоватьСлушать()Получить входные данные микрофона

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

Как и класс AudioFile, Microphone является менеджером контекста. Ввод с микрофона можно захватить с помощью метода listen() класса Recognizer в блоке with. Этот метод принимает источник звука в качестве первого аргумента и автоматически записывает ввод из источника до тех пор, пока он автоматически не остановится при обнаружении тишины.

>>> with mic as source:
...   audio = r.listen(source)
...

Попробуйте сказать «привет» в микрофон после выполнения блока with. Пожалуйста, подождите, пока интерпретатор снова не отобразит подсказку, как только появится подсказка «>>>», речь может быть распознана.

>>> r.recognize_google(audio)
'hello'

Если подсказка снова не появляется, вероятно, из-за того, что микрофон улавливает слишком много окружающего шума, прервите процесс, нажав Ctrl + C, чтобы интерпретатор снова отобразил подсказку.

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

>>> with mic as source:
...   r.adjust_for_ambient_noise(source)
...   audio = r.listen(source)
...

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

Помните, что Adjust_for_ambient_noise() по умолчанию анализирует звук продолжительностью 1 секунду из источника звука. Если читатель считает, что это время слишком велико, для настройки можно использовать параметр продолжительности.

Данные SpeechRecognition предполагают, что параметр продолжительности должен быть не менее 0,5 секунды. В некоторых случаях вы можете обнаружить, что длительность, превышающая значение по умолчанию в одну секунду, дает лучшие результаты. Минимальное необходимое вам значение зависит от окружающей среды, в которой находится микрофон, однако эта информация обычно неизвестна во время разработки. По моему опыту, длительности по умолчанию в одну секунду достаточно для большинства приложений.

Работа с трудно распознаваемой речью

Попробуйте ввести в интерпретатор предыдущий пример кода и какой-нибудь непонятный шум в микрофон. Вы должны получить что-то вроде этого:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/david/real_python/speech_recognition_primer/venv/lib/python3.5/site-packages/speech_recognition/__init__.py", line 858, in recognize_google
  if not isinstance(actual_result, dict) or len(actual_result.get("alternative", [])) == 0: raise UnknownValueError()
speech_recognition.UnknownValueError

Звук, который API не может сопоставить с текстом, вызывает исключение UnknownValueError, поэтому для решения таких проблем часто используются блоки try и exclude. API сделает все возможное, чтобы перевести любой звук в текст, например, короткое ворчание может быть распознано как «Как», кашель, аплодисменты и щелчки языком могут быть переведены в текст и вызывать аномалии.

Вывод:

В этом руководстве мы распознавали английскую речь, которая является языком по умолчанию для каждого метода распознавания_*() в пакете SpeechRecognition. Однако распознавание другой речи также абсолютно возможно и легко осуществимо. Чтобы распознавать речь на другом языке, задайте в качестве аргумента ключевого слова языка методов распознавания_*() строку, соответствующую нужному языку.

Автор: Дэвид Амос

Оригинальная ссылка: https://realpython.com/python-speech-recognition/