Введение
Современные голосовые помощники, системы транскрипции и голосового управления работают благодаря технологиям распознавания речи. Python предоставляет простой способ интеграции этих технологий через библиотеку SpeechRecognition — гибкий и мощный инструмент для преобразования аудиосигналов в текст.
Библиотека поддерживает как работу с аудиофайлами, так и захват звука с микрофона, а также взаимодействует с различными распознавателями — от локальных решений до облачных API, включая Google, IBM, Sphinx и другие. Эта библиотека стала стандартом для задач распознавания речи в Python благодаря своей простоте использования и универсальности.
Что такое библиотека SpeechRecognition
SpeechRecognition — это популярная Python-библиотека с открытым исходным кодом, разработанная для упрощения интеграции технологий распознавания речи в приложения. Созданная Anthony Zhang, она предоставляет единый интерфейс для работы с множественными движками распознавания речи, что делает её идеальным выбором для разработчиков любого уровня.
Ключевые особенности библиотеки
Библиотека SpeechRecognition выделяется следующими возможностями:
- Кроссплатформенность: работает на Windows, macOS и Linux
- Поддержка множественных API: интеграция с более чем 7 различными сервисами распознавания
- Простота использования: минимальный код для базовых задач
- Гибкость настроек: широкие возможности конфигурации для специфических потребностей
- Активное сообщество: регулярные обновления и поддержка
Архитектура библиотеки
SpeechRecognition построена по модульному принципу, где основные компоненты включают:
- Recognizer — центральный класс для управления распознаванием
- AudioSource — абстракция для источников аудио (файлы, микрофон)
- AudioData — контейнер для аудиоданных
- Engines — адаптеры для различных сервисов распознавания
Установка и настройка зависимостей
Базовая установка
pip install SpeechRecognition
Дополнительные зависимости
Для полноценной работы с различными источниками аудио потребуются дополнительные пакеты:
Для работы с микрофоном:
pip install pyaudio
Для поддержки дополнительных аудиоформатов:
pip install pydub
Для работы с Google Cloud Speech API:
pip install google-cloud-speech
Особенности установки на разных платформах
Windows
На Windows установка pyaudio может вызвать проблемы. Рекомендуется использование предварительно скомпилированных wheel-файлов:
pip install pipwin
pipwin install pyaudio
macOS
brew install portaudio
pip install pyaudio
Linux (Ubuntu/Debian)
sudo apt-get install python3-pyaudio
Импорт и основные компоненты
import speech_recognition as sr
Основные классы и их назначение
- Recognizer() — основной класс для работы с распознаванием речи
- AudioFile() — класс для работы с аудиофайлами
- Microphone() — класс для работы с микрофоном
Работа с аудиофайлами
Поддерживаемые форматы
SpeechRecognition поддерживает следующие аудиоформаты:
- WAV — рекомендуемый формат для лучшего качества
- AIFF — альтернатива WAV
- FLAC — формат без потерь
Базовое распознавание из файла
import speech_recognition as sr
r = sr.Recognizer()
with sr.AudioFile("speech.wav") as source:
audio = r.record(source)
try:
text = r.recognize_google(audio, language="ru-RU")
print("Распознанный текст:", text)
except sr.UnknownValueError:
print("Аудио не удалось распознать")
except sr.RequestError as e:
print(f"Ошибка сервиса: {e}")
Работа с длинными аудиофайлами
Для обработки длинных записей рекомендуется разбивать их на сегменты:
r = sr.Recognizer()
with sr.AudioFile("long_speech.wav") as source:
# Обрабатываем первые 30 секунд
audio1 = r.record(source, duration=30)
# Обрабатываем следующие 30 секунд
audio2 = r.record(source, duration=30, offset=30)
Конвертация MP3 в поддерживаемый формат
from pydub import AudioSegment
# Конвертация MP3 в WAV
audio = AudioSegment.from_mp3("audio.mp3")
audio.export("audio.wav", format="wav")
Работа с микрофоном
Базовое распознавание с микрофона
import speech_recognition as sr
r = sr.Recognizer()
mic = sr.Microphone()
with mic as source:
r.adjust_for_ambient_noise(source)
print("Скажите что-нибудь:")
audio = r.listen(source)
try:
text = r.recognize_google(audio, language="ru-RU")
print("Вы сказали:", text)
except sr.UnknownValueError:
print("Речь не распознана")
except sr.RequestError as e:
print(f"Ошибка сервиса: {e}")
Выбор конкретного микрофона
# Получение списка доступных микрофонов
print(sr.Microphone.list_microphone_names())
# Использование конкретного микрофона
mic = sr.Microphone(device_index=1)
Непрерывное распознавание
import speech_recognition as sr
r = sr.Recognizer()
m = sr.Microphone()
def callback(recognizer, audio):
try:
text = recognizer.recognize_google(audio, language="ru-RU")
print(f"Распознано: {text}")
except sr.UnknownValueError:
pass
# Запуск фонового прослушивания
stop_listening = r.listen_in_background(m, callback)
# Остановка через 30 секунд
import time
time.sleep(30)
stop_listening(wait_for_stop=False)
Обзор поддерживаемых распознавателей
Облачные сервисы
| Распознаватель | Требует интернет | Бесплатный | Точность | Примечание |
|---|---|---|---|---|
| Google Web Speech | Да | Да (с ограничениями) | Высокая | Рекомендуется для начинающих |
| Google Cloud Speech | Да | Нет (есть триал) | Очень высокая | Профессиональное решение |
| IBM Watson | Да | Нет (есть триал) | Высокая | Хорошая поддержка языков |
| Microsoft Azure | Да | Нет (есть триал) | Высокая | Интеграция с экосистемой Microsoft |
| Amazon Transcribe | Да | Нет | Высокая | Часть AWS |
Локальные решения
| Распознаватель | Требует интернет | Бесплатный | Точность | Примечание |
|---|---|---|---|---|
| CMU Sphinx | Нет | Да | Средняя | Полностью автономный |
| Vosk | Нет | Да | Высокая | Современная альтернатива Sphinx |
Специализированные сервисы
| Распознаватель | Требует интернет | Бесплатный | Точность | Примечание |
|---|---|---|---|---|
| Wit.ai | Да | Да | Средняя | Для разработки чат-ботов |
| Houndify | Да | Да (ограниченно) | Высокая | Быстрая обработка команд |
| Assembly.AI | Да | Нет | Высокая | Специализация на транскрипции |
Полная таблица методов и функций
Основные методы класса Recognizer
| Метод | Описание | Параметры | Возвращаемое значение |
|---|---|---|---|
record(source, duration=None, offset=0) |
Записывает аудио из источника | source (AudioSource), duration (float), offset (float) | AudioData |
listen(source, timeout=None, phrase_time_limit=None) |
Прослушивает микрофон до обнаружения речи | source (AudioSource), timeout (float), phrase_time_limit (float) | AudioData |
listen_in_background(source, callback) |
Непрерывное прослушивание в фоновом режиме | source (AudioSource), callback (function) | function (stop_listening) |
adjust_for_ambient_noise(source, duration=1) |
Калибровка под окружающий шум | source (AudioSource), duration (float) | None |
Методы распознавания речи
| Метод | Описание | Основные параметры | Требует API-ключ |
|---|---|---|---|
recognize_google(audio, key=None, language='en-US') |
Google Web Speech API | audio, language, show_all | Нет |
recognize_google_cloud(audio, credentials_json=None) |
Google Cloud Speech API | audio, language, preferred_phrases | Да |
recognize_sphinx(audio, language='en-US') |
CMU Sphinx (локально) | audio, language, keyword_entries | Нет |
recognize_ibm(audio, username, password) |
IBM Watson Speech to Text | audio, language, customization_id | Да |
recognize_bing(audio, key, language='en-US') |
Microsoft Bing Voice Recognition | audio, language, show_all | Да |
recognize_azure(audio, key, region, language='en-US') |
Microsoft Azure Speech | audio, language, endpoint | Да |
recognize_wit(audio, key, show_all=False) |
Wit.ai Speech Recognition | audio, show_all | Да |
recognize_houndify(audio, client_id, client_key) |
Houndify Speech Recognition | audio, show_all | Да |
Свойства класса Recognizer
| Свойство | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
energy_threshold |
Порог энергии для определения речи | int | 300 |
dynamic_energy_threshold |
Автоматическая подстройка порога | bool | True |
dynamic_energy_adjustment_damping |
Коэффициент сглаживания | float | 0.15 |
dynamic_energy_ratio |
Отношение энергии речи к шуму | float | 1.5 |
pause_threshold |
Время паузы для окончания фразы | float | 0.8 |
operation_timeout |
Таймаут операции (секунды) | float | None |
phrase_threshold |
Минимальная длина фразы | float | 0.3 |
non_speaking_duration |
Длительность молчания | float | 0.5 |
Методы класса AudioFile
| Метод | Описание | Параметры |
|---|---|---|
__init__(filename_or_fileobject) |
Инициализация с файлом | filename_or_fileobject (str или file-like object) |
__enter__() |
Вход в контекст | - |
__exit__(exc_type, exc_value, traceback) |
Выход из контекста | - |
Методы класса Microphone
| Метод | Описание | Параметры |
|---|---|---|
__init__(device_index=None, sample_rate=16000, chunk_size=1024) |
Инициализация микрофона | device_index (int), sample_rate (int), chunk_size (int) |
list_microphone_names() |
Список доступных микрофонов (статический) | - |
list_working_microphones() |
Список работающих микрофонов (статический) | - |
Обработка ошибок и исключений
Типы исключений
import speech_recognition as sr
try:
# Код распознавания
text = r.recognize_google(audio)
except sr.UnknownValueError:
print("Речь не была распознана")
except sr.RequestError as e:
print(f"Ошибка сервиса распознавания: {e}")
except sr.WaitTimeoutError:
print("Превышено время ожидания")
except OSError as e:
print(f"Ошибка операционной системы: {e}")
Подробное описание исключений
| Исключение | Описание | Причины |
|---|---|---|
UnknownValueError |
Речь не распознана | Плохое качество аудио, шум, неразборчивая речь |
RequestError |
Ошибка API-запроса | Проблемы с интернетом, неверный API-ключ, превышен лимит |
WaitTimeoutError |
Превышен таймаут ожидания | Долгое молчание при прослушивании микрофона |
OSError |
Системная ошибка | Проблемы с микрофоном, недоступные файлы |
Настройка параметров для улучшения качества
Оптимизация параметров микрофона
r = sr.Recognizer()
# Настройка чувствительности
r.energy_threshold = 4000 # Увеличить для шумных сред
r.dynamic_energy_threshold = True
r.pause_threshold = 1.0 # Длина паузы для завершения фразы
# Настройка таймаутов
r.operation_timeout = 5 # Таймаут операции
r.phrase_threshold = 0.3 # Минимальная длина фразы
Рекомендации по качеству аудио
Для достижения лучших результатов распознавания:
- Частота дискретизации: 16000 Гц или выше
- Разрядность: 16 бит
- Количество каналов: моно (1 канал)
- Формат: WAV без сжатия
- Уровень шума: минимальный фоновый шум
- Расстояние до микрофона: 15-30 см
Предобработка аудио
# Калибровка под окружающий шум
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source, duration=2)
print("Калибровка завершена")
audio = r.listen(source, timeout=1, phrase_time_limit=5)
Работа с различными языками
Поддерживаемые языки
SpeechRecognition поддерживает десятки языков. Основные коды языков:
ru-RU— русскийen-US— английский (США)en-GB— английский (Великобритания)de-DE— немецкийfr-FR— французскийes-ES— испанскийzh-CN— китайский (упрощенный)ja-JP— японский
Многоязычное распознавание
# Попытка распознавания на разных языках
languages = ['ru-RU', 'en-US', 'de-DE']
for lang in languages:
try:
text = r.recognize_google(audio, language=lang)
print(f"Распознано на {lang}: {text}")
break
except sr.UnknownValueError:
continue
Практические примеры применения
Создание голосового помощника
import speech_recognition as sr
import pyttsx3
# Инициализация
r = sr.Recognizer()
mic = sr.Microphone()
tts = pyttsx3.init()
def speak(text):
tts.say(text)
tts.runAndWait()
def listen():
with mic as source:
r.adjust_for_ambient_noise(source)
audio = r.listen(source)
try:
command = r.recognize_google(audio, language="ru-RU")
return command.lower()
except sr.UnknownValueError:
return None
# Основной цикл
while True:
command = listen()
if command:
if "время" in command:
import datetime
now = datetime.datetime.now()
speak(f"Сейчас {now.hour} часов {now.minute} минут")
elif "выход" in command:
speak("До свидания!")
break
Транскрипция аудиозаписей
import speech_recognition as sr
import os
def transcribe_audio_file(file_path):
r = sr.Recognizer()
with sr.AudioFile(file_path) as source:
audio = r.record(source)
try:
text = r.recognize_google(audio, language="ru-RU")
return text
except sr.UnknownValueError:
return "Не удалось распознать речь"
except sr.RequestError as e:
return f"Ошибка сервиса: {e}"
# Массовая транскрипция файлов
audio_dir = "audio_files"
for filename in os.listdir(audio_dir):
if filename.endswith(".wav"):
file_path = os.path.join(audio_dir, filename)
text = transcribe_audio_file(file_path)
# Сохранение результата
output_file = filename.replace(".wav", ".txt")
with open(output_file, "w", encoding="utf-8") as f:
f.write(text)
Система голосовых команд
import speech_recognition as sr
import subprocess
class VoiceCommandSystem:
def __init__(self):
self.r = sr.Recognizer()
self.mic = sr.Microphone()
self.commands = {
"открыть браузер": self.open_browser,
"открыть калькулятор": self.open_calculator,
"выключить компьютер": self.shutdown_computer,
}
def listen_for_command(self):
with self.mic as source:
self.r.adjust_for_ambient_noise(source)
print("Слушаю команду...")
audio = self.r.listen(source, timeout=5)
try:
command = self.r.recognize_google(audio, language="ru-RU").lower()
print(f"Распознана команда: {command}")
return command
except sr.UnknownValueError:
print("Команда не распознана")
return None
def execute_command(self, command):
for key, func in self.commands.items():
if key in command:
func()
return True
return False
def open_browser(self):
subprocess.run(["start", "chrome"], shell=True)
def open_calculator(self):
subprocess.run(["calc"], shell=True)
def shutdown_computer(self):
subprocess.run(["shutdown", "/s", "/t", "10"], shell=True)
# Использование
system = VoiceCommandSystem()
command = system.listen_for_command()
if command and system.execute_command(command):
print("Команда выполнена")
else:
print("Команда не найдена")
Оптимизация производительности
Асинхронная обработка
import asyncio
import speech_recognition as sr
from concurrent.futures import ThreadPoolExecutor
async def async_recognize(audio_data, language="ru-RU"):
loop = asyncio.get_event_loop()
r = sr.Recognizer()
with ThreadPoolExecutor() as executor:
text = await loop.run_in_executor(
executor,
r.recognize_google,
audio_data,
None,
language
)
return text
# Пример использования
async def main():
r = sr.Recognizer()
with sr.AudioFile("speech.wav") as source:
audio = r.record(source)
text = await async_recognize(audio)
print(text)
asyncio.run(main())
Кэширование результатов
import hashlib
import pickle
import speech_recognition as sr
class CachedRecognizer:
def __init__(self):
self.r = sr.Recognizer()
self.cache = {}
def _get_audio_hash(self, audio_data):
return hashlib.md5(audio_data.get_raw_data()).hexdigest()
def recognize_cached(self, audio_data, language="ru-RU"):
audio_hash = self._get_audio_hash(audio_data)
if audio_hash in self.cache:
return self.cache[audio_hash]
try:
text = self.r.recognize_google(audio_data, language=language)
self.cache[audio_hash] = text
return text
except sr.UnknownValueError:
return None
Часто задаваемые вопросы
Почему не работает распознавание с микрофона?
Основные причины и решения:
- Проверьте установку pyaudio:
pip install pyaudio - Убедитесь, что микрофон не используется другим приложением
- Проверьте разрешения на доступ к микрофону в системе
- Попробуйте указать конкретный device_index для микрофона
Как улучшить точность распознавания?
Рекомендации для повышения точности:
- Используйте качественный микрофон
- Говорите четко и не слишком быстро
- Минимизируйте фоновый шум
- Используйте adjust_for_ambient_noise() перед записью
- Выберите подходящий движок распознавания для вашего языка
Можно ли работать без интернета?
Да, для автономной работы используйте:
- CMU Sphinx:
recognize_sphinx() - Vosk (требует дополнительной установки)
- Whisper от OpenAI (отдельная библиотека)
Как обрабатывать длинные аудиозаписи?
Для длинных записей:
- Разбивайте аудио на сегменты по 30-60 секунд
- Используйте параметр
offsetдля последовательной обработки - Рассмотрите возможность использования специализированных сервисов для длинных записей
Какой движок выбрать для коммерческого проекта?
Рекомендации по выбору:
- Google Cloud Speech: лучшая точность, масштабируемость
- Microsoft Azure: хорошая интеграция с экосистемой Microsoft
- IBM Watson: сильные возможности настройки
- Amazon Transcribe: для проектов в AWS
Как работать с шумными аудиозаписями?
Методы улучшения качества:
- Используйте предобработку аудио (фильтры шума)
- Настройте параметры
energy_threshold - Применяйте библиотеки для подавления шума (noisereduce)
- Экспериментируйте с разными движками распознавания
Альтернативы и дополнительные инструменты
Современные альтернативы
- OpenAI Whisper: современная нейросеть для распознавания речи
- Wav2Vec2: модель от Facebook для распознавания речи
- DeepSpeech: открытая альтернатива от Mozilla
- Vosk: легковесная библиотека для офлайн-распознавания
Интеграция с другими библиотеками
# Интеграция с pydub для обработки аудио
from pydub import AudioSegment
from pydub.silence import split_on_silence
def transcribe_long_audio(file_path):
# Загрузка и разбивка аудио
audio = AudioSegment.from_wav(file_path)
chunks = split_on_silence(audio, min_silence_len=1000, silence_thresh=-40)
# Распознавание каждого сегмента
full_text = ""
for i, chunk in enumerate(chunks):
chunk.export(f"temp_chunk_{i}.wav", format="wav")
with sr.AudioFile(f"temp_chunk_{i}.wav") as source:
audio_data = sr.Recognizer().record(source)
text = sr.Recognizer().recognize_google(audio_data, language="ru-RU")
full_text += text + " "
return full_text.strip()
Заключение
SpeechRecognition остается одной из самых популярных и удобных библиотек для работы с распознаванием речи в Python. Её главные преимущества — простота использования, широкая поддержка различных движков распознавания и активное сообщество разработчиков.
Библиотека подходит как для быстрого прототипирования, так и для создания серьезных коммерческих приложений. Разнообразие поддерживаемых API позволяет выбрать оптимальное решение для любых требований — от бесплатных сервисов для личных проектов до высокоточных платных решений для enterprise-приложений.
Для начала работы достаточно нескольких строк кода, но при необходимости библиотека предоставляет глубокие возможности настройки и оптимизации. В сочетании с современными подходами к обработке аудио и машинному обучению, SpeechRecognition может стать основой для создания сложных систем голосового взаимодействия.
Настоящее и будущее развития ИИ: классической математики уже недостаточно
Эксперты предупредили о рисках фейковой благотворительности с помощью ИИ
В России разработали универсального ИИ-агента для роботов и индустриальных процессов