Python PyAudio
PyAudio дает Python прямой доступ к микрофону и динамикам через кроссплатформенную библиотеку PortAudio. С ее помощью пишут диктофоны, голосовые помощники, индикаторы громкости и программы, которые передают звук в систему распознавания речи.
Здесь вы узнаете, что умеет библиотека и где ее границы, а в новом разделе получите полностью рабочий пример для Python 3.12 и 3.13: запись с микрофона в WAV-файл, воспроизведение, выбор устройства и разбор ошибок установки. Учтите главное: PyAudio работает с сырыми аудиоданными, а файлы читает и пишет стандартный модуль wave.

Содержание статьи
Python PyAudio - это библиотека, предоставляющая возможности для работы с аудио в языке программирования Python. Она позволяет осуществлять запись и воспроизведение звука, работать с аудиоданными в реальном времени, обрабатывать звуковые потоки и многое другое.
Основные возможности PyAudio
- Запись аудио: С помощью PyAudio можно легко записывать звук с микрофона или других аудиоисточников.
- Воспроизведение аудио: Библиотека позволяет воспроизводить аудиофайлы или звуковые потоки.
- Обработка звука: PyAudio поддерживает обработку звуковых данных, такую как фильтрация, изменение громкости, преобразование формата и другие операции.
- Работа в реальном времени: С возможностью работы с аудиопотоками в реальном времени, PyAudio подходит для создания звуковых приложений, анализаторов звука и других проектов, требующих обработки аудиоданных на лету.
1. Установка PyAudio
Для установки PyAudio можно воспользоваться менеджером пакетов pip. Просто выполните следующую команду в консоли:
pip install pyaudio
2. Совместимость
PyAudio совместима с различными операционными системами, включая Windows, macOS и Linux. Она использует PortAudio - кроссплатформенную библиотеку для работы с аудиоустройствами.
3. Форматы аудио
PyAudio работает с несжатыми данными PCM; WAV-файлы читаются и пишутся модулем wave, а MP3, OGG и FLAC нужно декодировать другими библиотеками. Это позволяет вам работать с различными типами звуковых файлов.
4. Обработка звука в реальном времени
Благодаря возможности работы с аудиопотоками в реальном времени, вы можете создавать звуковые эффекты, инструменты для музыкального производства, системы распознавания голоса и другие приложения, требующие непрерывной обработки аудиоданных.
5. Примеры применения PyAudio
- Разработка программ для записи и транскрибации аудио.
- Создание голосовых ассистентов и систем управления голосом.
- Построение звуковых анализаторов и спектрограмм.
- Реализация звуковых эффектов и синтеза звука.
- Интеграция в игровые приложения для воспроизведения и обработки звука.
6. Ссылки
PyAudio предоставляет широкие возможности для работы с аудио в Python и может быть полезным инструментом для реализации различных проектов, связанных с обработкой звука.
Пример использования PyAudio для записи и воспроизведения звука
import pyaudio
import wave
FORMAT = pyaudio.paInt16 # Формат звука (16 бит, стерео)
CHANNELS = 2
RATE = 44100 # Частота дискретизации
CHUNK = 1024 # Размер блока данных
p = pyaudio.PyAudio()
# Запись звука
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
frames = []
for i in range(0, int(RATE / CHUNK * 5)):
data = stream.read(CHUNK)
frames.append(data)
# Остановка записи
stream.stop_stream()
stream.close()
# Воспроизведение записанного звука
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
output=True)
for frame in frames:
stream.write(frame)
# Остановка воспроизведения
stream.stop_stream()
stream.close()
p.terminate()
Этот пример демонстрирует базовый функционал PyAudio для записи звука с микрофона, сохранения его в массив данных и воспроизведения этого звука.
PyAudio отлично подходит для разработки звуковых приложений, систем распознавания речи, аудиоанализа и других проектов, связанных с обработкой звука.
Запись с микрофона в WAV: рабочий пример
Здесь разобраны такие пункты: установка на разных системах, код записи, воспроизведение файла, выбор микрофона, частые ошибки.
Установка на разных системах
| Система | Команды |
|---|---|
| Windows | python -m pip install pyaudio |
| Ubuntu, Debian | sudo apt install portaudio19-dev python3-dev, затем python -m pip install pyaudio |
| macOS | brew install portaudio, затем python -m pip install pyaudio |
Если pip пытается собрать пакет из исходников и требует Microsoft Visual C++, значит, для вашей версии Python нет готового wheel. Проверьте страницу пакета на pypi.org или используйте версию Python, для которой wheel опубликован.
Код записи
import wave
import pyaudio
RATE = 44100
CHANNELS = 1
FORMAT = pyaudio.paInt16
CHUNK = 1024
SECONDS = 5
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE,
input=True, frames_per_buffer=CHUNK)
frames = []
try:
for _ in range(int(RATE / CHUNK * SECONDS)):
frames.append(stream.read(CHUNK, exception_on_overflow=False))
finally:
stream.stop_stream()
stream.close()
sample_width = p.get_sample_size(FORMAT)
p.terminate()
with wave.open("record.wav", "wb") as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(sample_width)
wf.setframerate(RATE)
wf.writeframes(b"".join(frames))
Блок try/finally гарантирует, что поток и PortAudio будут освобождены даже при ошибке или нажатии Ctrl+C. Иначе микрофон может остаться занятым до перезапуска программы.
Разберем параметры. RATE задает частоту дискретизации: 44100 отсчетов в секунду дают качество компакт-диска, а для распознавания речи обычно хватает 16000. FORMAT = paInt16 означает 16 бит на отсчет, то есть 2 байта. CHUNK определяет размер блока, который читается за один вызов: маленький блок уменьшает задержку, но повышает риск переполнения буфера. Пять секунд моно-записи при таких настройках занимают около 430 КБ, стерео вдвое больше. Если нужен сжатый файл, сначала сохраните WAV, а затем конвертируйте его отдельным инструментом.
Воспроизведение файла
with wave.open("record.wav", "rb") as wf:
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(), output=True)
while data := wf.readframes(1024):
stream.write(data)
stream.close()
p.terminate()
Выбор микрофона
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
info = p.get_device_info_by_index(i)
if info["maxInputChannels"] > 0:
print(i, info["name"], int(info["defaultSampleRate"]))
p.terminate()
Номер нужного устройства передайте в p.open(..., input_device_index=номер). Одно и то же устройство часто появляется в списке несколько раз, по разу для каждого звукового API Windows (MME, DirectSound, WASAPI). Начинайте с варианта MME: он самый совместимый.
Частые ошибки
- OSError -9981 Input overflowed: программа не успевает читать данные. Увеличьте
CHUNKили передайтеexception_on_overflow=False. - OSError -9997 Invalid sample rate: устройство не поддерживает частоту. Возьмите
defaultSampleRateиз информации об устройстве. - Тишина в записи: выбран не тот вход или в системе запрещен доступ к микрофону для приложений.
Частые вопросы
Короткие ответы на вопросы, которые чаще всего возникают по этой теме.
Может ли PyAudio открыть MP3-файл?
Нет. PyAudio принимает и отдает только несжатые отсчеты PCM. Для WAV используйте стандартный модуль wave, а MP3, OGG и FLAC сначала декодируйте другой библиотекой, например pydub или soundfile.
Как записывать звук, пока программа делает что-то еще?
Откройте поток с параметром stream_callback. PortAudio будет вызывать вашу функцию в отдельном потоке для каждого блока данных, а основной код продолжит работу. Функция должна быть быстрой и возвращать кортеж из данных и флага pyaudio.paContinue.
Есть ли альтернатива PyAudio?
Популярная замена - библиотека sounddevice. Она тоже построена на PortAudio, ставится из готовых пакетов и сразу возвращает данные в виде массивов NumPy, что удобно для анализа сигнала.
Как измерить громкость звука с микрофона?
Преобразуйте блок байтов в числа, например через array.array("h", data) или NumPy, и вычислите среднеквадратичное значение. Сравнивая его с порогом, можно включать запись только при наличии речи.