
Запись звука через микрофон в Python требует точного указания его индекса в системе. Библиотеки PyAudio и sounddevice работают с устройствами через числовые идентификаторы, но по умолчанию они не отображают понятные пользователю названия. Например, в Windows индекс микрофона может быть 1, а в Linux – 3, при этом список устройств меняется в зависимости от подключенных аудиоинтерфейсов.
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
dev = p.get_device_info_by_index(i)
if dev['maxInputChannels'] > 0:
print(f"Индекс: {i}, Название: {dev['name']}")
В sounddevice аналогичная задача решается проще: print(sounddevice.query_devices()). Обратите внимание на поле hostapi – оно указывает на используемый аудиодрайвер (например, 0 для WASAPI в Windows или 1 для ALSA в Linux). Если микрофон не отображается, проверьте настройки системы или переподключите устройство.
Для записи звука с конкретного микрофона передайте его индекс в параметр input_device_index при создании потока. Например, в PyAudio: stream = p.open(input_device_index=2, ...). В sounddevice используйте sounddevice.rec(device=2, ...). Убедитесь, что выбранный индекс соответствует нужному устройству, иначе запись будет происходить с другого микрофона или вовсе завершится ошибкой.
Установка необходимых библиотек для работы с аудиоустройствами
Для записи звука с микрофона в Python потребуются специализированные библиотеки, взаимодействующие с аудиопотоками на низком уровне. Основной выбор – sounddevice и pyaudio. Первая работает поверх PortAudio и поддерживает асинхронную запись, вторая – более распространена, но требует ручной компиляции зависимостей на некоторых системах.
sounddevice устанавливается через pip одной командой: pip install sounddevice numpy. Библиотека зависит от numpy для обработки аудиоданных в массивах, поэтому установка включает оба пакета. Для корректной работы на Linux дополнительно потребуется libportaudio2 – установите его через пакетный менеджер: sudo apt-get install libportaudio2 (Debian/Ubuntu) или sudo dnf install portaudio-devel (Fedora).
pyaudio – альтернатива с более широкой совместимостью, но сложнее в установке. На Windows используйте pip install pyaudio, предварительно скачав wheel-файл с сайта Кристофа Гольке для вашей версии Python. На macOS установите зависимости через Homebrew: brew install portaudio, затем pip install pyaudio. На Linux потребуется portaudio и компилятор: sudo apt-get install portaudio19-dev python3-dev (Debian/Ubuntu).
Для анализа аудиопотоков в реальном времени подключите librosa – библиотеку для обработки звука. Установите её с зависимостями: pip install librosa. Она требует ffmpeg для декодирования форматов, поэтому на Linux выполните sudo apt-get install ffmpeg, на macOS – brew install ffmpeg. На Windows ffmpeg можно установить через официальный сайт или choco install ffmpeg (если используется Chocolatey).
Если планируется работа с низкоуровневыми аудиодрайверами, рассмотрите pyalsaaudio (Linux) или pywin32 (Windows). Первая устанавливается через pip install pyalsaaudio и требует libasound2-dev (sudo apt-get install libasound2-dev). Вторая – pip install pywin32, но актуальна только для Windows API. Обе библиотеки позволяют напрямую взаимодействовать с устройствами, минуя абстракции PortAudio.
При проблемах с установкой pyaudio на Windows попробуйте сборку из исходников: скачайте исходный код, распакуйте и выполните python setup.py install. Убедитесь, что Python и компилятор (например, Microsoft Visual C++ Build Tools) установлены. Для sounddevice на macOS может потребоваться указать путь к PortAudio: export DYLD_LIBRARY_PATH=/usr/local/lib перед установкой.
Для кроссплатформенной работы с аудиофайлами установите pydub: pip install pydub. Библиотека использует ffmpeg для конвертации форматов, поэтому убедитесь, что путь к ffmpeg добавлен в переменную окружения PATH. Пример проверки: from pydub import AudioSegment; AudioSegment.from_wav("test.wav"). Если возникает ошибка, укажите путь к ffmpeg вручную: AudioSegment.converter = "C:/path/to/ffmpeg.exe".
Получение списка доступных микрофонов с помощью PyAudio

PyAudio предоставляет метод get_device_count() для определения количества доступных аудиоустройств, включая микрофоны. Этот метод возвращает целое число, но не содержит информации о самих устройствах. Для получения детальных данных используйте get_device_info_by_index(index), где index – порядковый номер устройства от 0 до get_device_count() - 1. Пример кода:
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
device = p.get_device_info_by_index(i)
print(f"Индекс: {i}, Название: {device['name']}")
Ключевые параметры устройства в возвращаемом словаре: name (имя), maxInputChannels (максимальное количество входных каналов), defaultSampleRate (частота дискретизации по умолчанию). Если maxInputChannels > 0, устройство поддерживает запись звука. На Windows имена устройств могут содержать префиксы типа «Микрофон (Realtek Audio)», на Linux – «hw:0,0» или «pulse».
На macOS системные микрофоны часто отображаются как «Built-in Microphone», но могут дублироваться с разными индексами из-за виртуальных устройств. Проверяйте hostApi – значение 0 обычно соответствует Core Audio. Для фильтрации устройств используйте условие: if device['maxInputChannels'] > 0 and 'mic' in device['name'].lower(). Это исключит динамики и виртуальные аудиокарты.
При работе с несколькими микрофонами учитывайте, что индексы могут меняться после перезагрузки системы или подключения новых устройств. Для стабильной работы сохраняйте не индекс, а уникальный идентификатор устройства – device['name'] в сочетании с hostApi. Альтернативный подход: используйте p.get_default_input_device_info() для получения информации о микрофоне по умолчанию, но это ненадёжно в системах с несколькими устройствами.
Ошибка IOError при вызове get_device_info_by_index() указывает на некорректный индекс или проблемы с драйверами. На Linux установите зависимости: sudo apt-get install portaudio19-dev python3-pyaudio. На Windows обновите драйверы звуковой карты через Диспетчер устройств. Если PyAudio не видит микрофон, проверьте настройки конфиденциальности в Windows 10/11 – доступ к микрофону должен быть разрешён для Python.
Определение индекса микрофона по его названию в системе

В Python для работы с аудиоустройствами часто требуется указать индекс микрофона, особенно при использовании библиотек типа sounddevice или pyaudio. Однако индексы устройств динамически назначаются системой и могут меняться после перезагрузки или подключения новых устройств. Единственный стабильный способ идентификации – сопоставление индекса с названием микрофона, заданным в настройках ОС.
Для получения списка доступных устройств с названиями и индексами используйте метод query_devices() из библиотеки sounddevice. Пример кода:
import sounddevice as sd
devices = sd.query_devices()
for i, device in enumerate(devices):
if device['max_input_channels'] > 0:
print(f"Индекс: {i}, Название: {device['name']}")
Результат выведет все микрофоны с их текущими индексами и названиями, например: Индекс: 1, Название: Microphone (Realtek Audio). Обратите внимание на поле max_input_channels – оно должно быть больше нуля, чтобы устройство поддерживало запись.
В Windows названия микрофонов можно также проверить через «Панель управления» → «Звук» → вкладка «Запись». В Linux используйте команду arecord -L или pactl list sources, в macOS – system_profiler SPAudioDataType. Эти данные помогут сопоставить системное название с индексом из Python.
Для автоматического поиска индекса по названию напишите функцию, которая фильтрует устройства по части имени. Пример:
def find_microphone_index(name_part):
devices = sd.query_devices()
for i, device in enumerate(devices):
if device['max_input_channels'] > 0 and name_part.lower() in device['name'].lower():
return i
return None
mic_index = find_microphone_index("realtek")
Функция вернёт индекс первого найденного микрофона, содержащего в названии строку «realtek» (регистр не учитывается). Если устройство не найдено, возвращается None.
При работе с pyaudio аналогичный подход реализуется через PyAudio.get_device_info_by_index(). Пример:
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
info = p.get_device_info_by_index(i)
if info.get('maxInputChannels', 0) > 0:
print(f"Индекс: {i}, Название: {info['name']}")
Здесь ключевое поле – maxInputChannels, аналогичное max_input_channels в sounddevice. Названия устройств могут отличаться из-за различий в реализации библиотек, поэтому проверяйте оба варианта.
Если микрофон не отображается в списке устройств, убедитесь, что он правильно подключён и выбран в настройках системы как устройство записи по умолчанию. В Windows это можно сделать через «Панель управления» → «Звук» → вкладка «Запись» → контекстное меню устройства → «Использовать по умолчанию». В Linux проверьте настройки ALSA/PulseAudio, в macOS – «Системные настройки» → «Звук». После изменения настроек перезапустите скрипт Python.
Проверка корректности индекса перед началом записи

Индекс микрофона в Python – целое число, соответствующее устройству ввода звука. Библиотеки типа sounddevice или pyaudio возвращают список доступных устройств с индексами от 0 до N-1, где N – общее количество устройств. Перед записью проверьте, что выбранный индекс существует в этом диапазоне. Например, если sounddevice.query_devices() возвращает 3 устройства, допустимые индексы – 0, 1 и 2. Использование индекса 3 вызовет ошибку IndexError или PortAudioError.
Для проверки корректности индекса используйте метод query_devices() из sounddevice. Он возвращает список словарей с параметрами каждого устройства. Извлеките индексы с помощью списка [device['index'] for device in sounddevice.query_devices()]. Сравните выбранный индекс с этим списком. Если индекса нет, выведите предупреждение или предложите пользователю выбрать другое устройство.
В pyaudio аналогичную проверку можно выполнить через PyAudio.get_device_info_by_index(). Метод вернет None, если индекс недействителен. Оберните вызов в конструкцию try-except, чтобы перехватить исключение IOError при попытке доступа к несуществующему устройству. Это предотвратит аварийное завершение программы.
Не полагайтесь на жестко заданные индексы в коде. Конфигурация устройств может меняться: микрофоны подключаются/отключаются, драйверы обновляются. Динамически получайте список устройств перед каждой записью. Сохраняйте индекс в конфигурационном файле или переменной окружения, но проверяйте его актуальность при запуске скрипта.
Для пользовательских интерфейсов реализуйте выбор микрофона через выпадающий список. Заполните его данными из query_devices(), отфильтровав только устройства с полем max_input_channels > 0. Это исключит попытки записи с устройств, не поддерживающих ввод звука. Добавьте обработчик события изменения выбора, чтобы обновлять индекс в реальном времени.
При работе с несколькими микрофонами учитывайте, что индексы могут дублироваться в разных API. Например, sounddevice и pyaudio могут присваивать разные индексы одному устройству. Используйте уникальные идентификаторы, такие как name или hostApi, для сопоставления устройств между библиотеками. Храните соответствие индексов в отдельном словаре.
Тестируйте скрипт на разных системах. На Windows индексы могут отличаться от Linux или macOS из-за различий в реализации звуковых API. Проверьте поведение при отсутствии микрофонов: библиотеки могут возвращать пустой список или генерировать исключения. Добавьте резервный вариант записи, например, с использованием индекса по умолчанию None, если основной индекс недействителен.
Использование звуковых устройств по умолчанию в разных ОС

В Windows выбор микрофона по умолчанию определяется через системные настройки звука. API waveInGetNumDevs() и waveInGetDevCaps() возвращают список устройств, но индекс активного микрофона можно получить через PyAudio с параметром input_device_index=None, что автоматически подтягивает устройство по умолчанию. В Windows 10/11 приоритет отдаётся устройству, выбранному в «Параметры → Система → Звук». Если микрофон не указан явно, система использует первое доступное устройство с поддержкой ввода.
macOS управляет звуковыми устройствами через Core Audio. Функция AudioObjectGetPropertyData() с параметром kAudioHardwarePropertyDefaultInputDevice возвращает идентификатор устройства по умолчанию. В Python библиотека sounddevice автоматически подхватывает это устройство при вызове sd.default.device[0]. В macOS Ventura и новее приоритет отдаётся устройству, выбранному в «Системные настройки → Звук → Ввод». Если устройство не задано, используется встроенный микрофон или первое подключённое USB-устройство.
Linux полагается на ALSA или PulseAudio. В ALSA устройство по умолчанию определяется через /proc/asound/card*/pcm*/sub*/info, но чаще используется PulseAudio, где активное устройство можно получить командой pactl get-default-source. В Python библиотека pyaudio при input_device_index=None использует устройство, заданное в ~/.config/pulse/default.pa или системном конфиге. Если конфигурация отсутствует, выбирается первое устройство из списка arecord -L.
- Windows: приоритет у устройства из «Параметры → Звук», иначе первое доступное.
- macOS: Core Audio возвращает устройство из системных настроек, иначе встроенный микрофон.
- Linux (PulseAudio): устройство из
pactl get-default-source, иначе первое в списке ALSA.
Проблемы возникают при подключении нескольких устройств. В Windows драйверы USB-микрофонов могут перехватывать приоритет, даже если в настройках выбрано другое устройство. В macOS Bluetooth-гарнитуры иногда игнорируются, если не установлены как основные вручную. В Linux PulseAudio может не обновлять устройство по умолчанию при горячем подключении – требуется перезапуск сервиса pulseaudio -k.
Для кроссплатформенной работы рекомендуется явно проверять устройство по умолчанию перед записью. Пример для sounddevice:
import sounddevice as sd
default_input = sd.default.device[0]
print(f"Используется устройство: {sd.query_devices(default_input)['name']}")
Если устройство по умолчанию не подходит, его можно изменить программно. В Windows через SetDefaultAudioEndpoint из pycaw, в macOS – AudioObjectSetPropertyData с флагом kAudioHardwarePropertyDefaultInputDevice, в Linux – pactl set-default-source <имя_устройства>. После изменения требуется переинициализация потока записи.
Обработка ошибок при неверном индексе микрофона

При попытке записи звука с несуществующим индексом микрофона библиотека PyAudio выбрасывает исключение IOError с кодом ошибки -9998 (Invalid number of channels) или -9997 (Invalid sample rate). Эти коды сигнализируют о том, что переданный индекс устройства выходит за пределы доступных. Для диагностики используйте метод get_device_count() перед инициализацией потока, чтобы получить актуальный список устройств.
Ошибка -9985 (Device unavailable) возникает, если микрофон физически отключён или занят другим процессом. Проверьте подключение устройства через pyaudio.PyAudio().get_device_info_by_index(index) – если метод возвращает None, индекс недействителен. В Windows список устройств можно дополнительно сверить с Диспетчером устройств или утилитой Sound Settings.
Для обработки исключений используйте конструкцию try-except с явным перехватом IOError. Пример кода:
try:
stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, input_device_index=invalid_index)
except IOError as e:
if e.errno == -9998:
print(f"Ошибка: индекс {invalid_index} не существует. Доступно устройств: {p.get_device_count()}")
else:
print(f"Неизвестная ошибка: {e}")
В Linux индексы микрофонов могут меняться после перезагрузки или подключения новых устройств. Для стабильной работы сохраняйте не индекс, а уникальный идентификатор устройства через get_device_info_by_index(index)['name'] и ищите его в списке при каждом запуске скрипта. Это особенно критично для систем с динамическим подключением USB-микрофонов.
Если индекс корректен, но запись не работает, проверьте параметры потока: несоответствие sample rate или формата данных (например, paInt16 вместо paFloat32) вызывает ошибку -9997. Уточните поддерживаемые параметры через get_device_info_by_index(index)['defaultSampleRate'] и ['maxInputChannels'].
В macOS индексы устройств могут дублироваться или сдвигаться при использовании виртуальных аудиодрайверов (например, BlackHole). Для диагностики используйте команду system_profiler SPAudioDataType в терминале – она выведет полный список устройств с их текущими индексами. Избегайте жёсткого кодирования индексов в коде.
Для автоматического выбора микрофона по имени реализуйте функцию поиска:
def find_mic_by_name(p, name):
for i in range(p.get_device_count()):
if name in p.get_device_info_by_index(i)['name']:
return i
raise ValueError(f"Микрофон '{name}' не найден")
Это избавит от необходимости вручную обновлять индексы при изменениях в системе.
