Python PyAudio Как обновить список микрофонов при повторном подключении
WIndows 10. Python. При работе с pyaudio выставляю индекс микрофона = 1. Гоняю цикл с микрофоном. При отключении внешнего микрофона от ноутбука перехватываю ошибку и продолжаю гонять цикл, в котором подхватывается все также микрофон с индексом = 1 (который теперь не внешний, а уже встроенный). Но данные в программе относительно информации о микрофоне обновить не могу. Вот так получаю список микрофонов:
def get_mics_list(): mics = [] p = pyaudio.PyAudio() for i in range(p.get_device_count()): if p.get_device_info_by_index(i)['name'] == 'Microsoft Sound Mapper - Input': pass elif p.get_device_info_by_index(i)['name'] == 'Microsoft Sound Mapper - Output': break else: mics.append(p.get_device_info_by_index(i)) return mics
На выходе имею список словарей с информацией о каждом микрофоне в системе. Но при изменении микрофона в системе (например отключении микрофона), обновить информацию, используя эту функцию, не могу. Возвращает тот же список словарей, что и был до отключения микрофона. Почему так?
Перечислите все микрофоны, подключенные к системе, на Python с помощью PyAudio.
Программисты Python, работающие с аудиоданными, имеют доступ к гибкому пакету PyAudio. Он предлагает привязки PortAudio Python, многоплатформенный набор инструментов ввода/вывода звука (I/O), который позволяет программам Python воспроизводить и записывать звук на нескольких платформах. В этом посте мы рассмотрим использование PyAudio для получения списка всех микрофонов, подключенных к системе. Эта функция особенно полезна при работе с аудиоданными.
Установка PyAudio
Прежде чем переходить к примерам, давайте сначала убедимся, что PyAudio установлен в вашей системе. Установщик пакетов для Python, pip, упрощает этот процесс. Запустите следующую команду после открытия терминала –
pip install pyaudio
Использование восклицательного знака перед командой позволит вам выполнить ее внутри блокнота Jupyter −
!pip install pyaudio
Основы PyAudio и идентификация микрофонов
Во-первых, вы должны создать экземпляр PyAudio для связи с аудиовозможностями вашей системы. Вы можете использовать все методы PyAudio, если у вас есть их экземпляр. Функции get_device_info_by_index и get_device_count имеют особое значение в этой ситуации.
import pyaudio # Create an instance of PyAudio p = pyaudio.PyAudio() # Get the number of audio I/O devices devices = p.get_device_count() # Print the total number of devices print(f'Total number of devices: ')
Этот скрипт выведет общее количество устройств ввода/вывода звука, подключенных к вашей системе.
Нам необходимо неоднократно пройтись по всем устройствам и определить, являются ли они устройствами ввода (микрофонами), чтобы составить список всех микрофонов. Функция устройства maxInputChannels помогает определить, является ли это микрофоном.
import pyaudio # Create an instance of PyAudio p = pyaudio.PyAudio() # Get the number of audio I/O devices devices = p.get_device_count() # Iterate through all devices for i in range(devices): # Get the device info device_info = p.get_device_info_by_index(i) # Check if this device is a microphone (an input device) if device_info.get('maxInputChannels') > 0: print(f"Microphone: , Device Index: ")
Расширенное использование: выбор микрофона
Давайте усложним наш скрипт. Подумайте о выборе микрофона для записи звука. Для этого мы можем использовать свойство index устройства. Вот иллюстрация того, как вы можете это сделать:
import pyaudio # Create an instance of PyAudio p = pyaudio.PyAudio() def select_microphone(index): # Get the device info device_info = p.get_device_info_by_index(index) # Check if this device is a microphone (an input device) if device_info.get('maxInputChannels') > 0: print(f"Selected Microphone: ") else: print(f"No microphone at index ") # Select a microphone with a specific index select_microphone(1)
Заключение
Вы можете легко управлять подключенными микрофонами и изменять их с помощью PyAudio — надежного набора инструментов для обработки аудиоданных на Python, который дает вам возможность создавать сложные приложения для обработки звука.
Примеры, которые мы рассмотрели, демонстрируют, как выбрать конкретный микрофон из списка всех микрофонов, подключенных к вашей системе. С помощью этих основ вы можете разрабатывать свои аудиоприложения, включающие в себя более сложные возможности, такие как запись, анализ и обработка звука в реальном времени.
Все права защищены. © Linux-Console.net • 2019-2023
Как сделать диктофон на python
Инструкция по созданию приложения на python, с помощью которого можно записывать звук с микрофона, подключенного к компьютеру.
Создадим простой скрипт на python, с помощью которого можно записывать звук с микрофона, подключенного к компьютеру.
Я буду приводить пример для raspberry pi 3, но также это дело можно адаптировать для windows, проверял на ноутбуке с windows 7 с внутренним и usb микрофоном, записывает отлично.
Для начала нам нужно узнать, определился ли подключенный к системе микрофон.
Вlinux список подключенных устройств можно просмотреть командой:
Установка необходимых аудио-инструментов для Raspberry Pi
Мы будем использовать библиотеку Python ‘pyaudio’ для записи и воспроизведения аудиоданных с USB-микрофона.
Прежде чем мы сможем начать использовать ‘pyaudio,’ нам нужно убедиться, что RPi имеет все для необходимое для этого, установив следующие пакеты:
sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev
Если все вышеперечисленное выполнено успешно, мы можем загрузить библиотеку ‘pyaudio’ (Я устанавливаю на Python 3.x с помощью команды ‘pip3’):
sudo pip3 install pyaudio
Если все вышеуказанное было сделано успешно, мы готовы перейти к следующему разделу и убедиться, что USB-микрофон работает, а Pi выбрал правильное устройство.
Тестирование USB микрофона и Pyaudio
Откройте в терминале Python 3.x и введите следующее:
>>> import pyaudio
>>> p = pyaudio.PyAudio()
>>> for i in range(p.get_device_count()):
>>> print(p.get_device_info_by_index(i).get(‘name’))
Это должно вывести индекс каждого аудиоустройства подключенного к вашему RPi.
Обратите внимание на индекс (номер) устройства USB, потому что нам нужно будет настроить индекс устройства pyaudio в соответствии с приведенной выше последовательностью. Например, our USB device index is “2” (index 0 is ALSA blank, index 1 is IEC958/HDMI, etc…).
ПРИМЕЧАНИЕ: ОБРАТИТЕ ВНИМАНИЕ НА ИНДЕКС (номер) USB-УСТРОЙСТВА, ПОТОМУ ЧТО НАМ НУЖНО будет указать его в PYAUDIO DEVICE.
НАПРИМЕР, МОЕ USB-УСТРОЙСТВО НАХОДИТСЯ ПО ИНДЕКСУ 2 (ИНДЕКС 0 IS ALSA MAIN, INDEX 1 IS IEC958/HDMI, ETC…).
Теперь, когда мы узнали под каким номером определился наш USB-микрофон, мы можем записать тестовый образец с помощью pyaudio. Подробную информацию об использовании pyaudio можно найти здесь.
import pyaudio
import wave
form_1 = pyaudio.paInt16 # 16-bit resolution
chans = 1 # 1 channel
samp_rate = 44100 # 44.1kHz sampling rate
chunk = 4096 # 2^12 samples for buffer
record_secs = 3 # seconds to record
dev_index = 2 # device index found by p.get_device_info_by_index(ii)
wav_output_filename = ‘test1.wav’ # name of .wav file
audio = pyaudio.PyAudio() # create pyaudio instantiation
# create pyaudio stream
stream = audio.open(format = form_1,rate = samp_rate,channels = chans, \
input_device_index = dev_index,input = True, \
frames_per_buffer=chunk)
print(«recording»)
frames = []
# loop through stream and append audio chunks to frame array
for ii in range(0,int((samp_rate/chunk)*record_secs)):
data = stream.read(chunk)
frames.append(data)
# stop the stream, close it, and terminate the pyaudio instantiation
stream.stop_stream()
stream.close()
audio.terminate()
# save the audio frames as .wav file
wavefile = wave.open(wav_output_filename,’wb’)
wavefile.setnchannels(chans)
wavefile.setsampwidth(audio.get_sample_size(form_1))
wavefile.setframerate(samp_rate)
wavefile.writeframes(b».join(frames))
wavefile.close()
Выходной файл .wav должен иметь длину 3 секунды (при условии, что приведенный выше код не изменился) и дискретизируется с частотой 44,1 кГц с максимальным разрешением 16 бит. В зависимости от используемого микрофона частоту дискретизации можно увеличить до 48 кГц. Битовую глубину также можно изменить, хотя я не совсем уверен в ограничениях возможностей Pi.
Python. Используем PyAudio для записи звука
В этой публикации мы расмотрим как при помощи библиотеки PyAudio записать звук из любого источника, будь то микрофон, микшер или что-то еще. Перед началом работы надо установить библиотеку , для разных ОС существуют разные способы установки:
python -m pip install pyaudio
sudo apt-get install python-pyaudio python3-pyaudio
brew install portaudio pip install pyaudio
Работа с PyAudio
PyAudio — это библиотека предоставляет возможность записи аудио(звука) с помощью Python. PyAudio записывает полученный аудио поток в объекты типа bytes. В последующем данные могут быть сохранены в виде файлов WAV с использованием таких библиотек как scipy или wave соответственно. Для того что бы записать звук например с микрофона, нам надо определить идентификатор используемого устройства, в нашем случае микрофона.
Для этого нам надо написать следующий код, который выведет нам весь список доступных устройств и их идентификаторы:
import pyaudio p = pyaudio.PyAudio() for i in range(p.get_device_count()): print(i, p.get_device_info_by_index(i)['name'])
после запуска скрипта мы получим список всех устройств и их идентификаторы:
0 Переназначение звуковых устр. - Input 1 Микрофон (Realtek High Definiti 2 Переназначение звуковых устр. - Output 3 Динамики (Realtek High Definiti 4 Первичный драйвер записи звука 5 Микрофон (Realtek High Definition Audio) 6 Первичный звуковой драйвер 7 Динамики (Realtek High Definition Audio) 8 Динамики (Realtek High Definition Audio) 9 Микрофон (Realtek High Definition Audio) 10 Стерео микшер (Realtek HD Audio Stereo input) 11 Микрофон (Realtek HD Audio Mic input) 12 Speakers (Realtek HD Audio output)
В полученном списке мы ищем запись «Микрофон» и определяем его идентификатор, который равен 2. Далее этот идентификатор мы будем использовать в настроках PyAudio. Прежде чем использовать библиотеку PyAudio нам надо определить некоторые параметры:
- format — размер семпла и его формат (pyaudio.paInt16, pyaudio.paInt24, pyaudio.paInt8)
- channels — кол-во каналов аудио (обычно 2)
- frames_per_buffer — размер буффера записи
- rate — частота дискритизации 96000, 44100, 22050, 11025, 8000
- input_device_index — идентификатор устройства
- input — вывод True или False
Как будет работать запись: для начала надо будет инициализовать поток PyAudio через параметры. Далее в цикле будем записывать кусками данные в массив, после того как закончиться запись мы запишем все данные в файл.
Пример кода
Пример кода для записи звука:
import pyaudio import wave chunk = 1024 # Запись кусками по 1024 сэмпла sample_format = pyaudio.paInt16 # 16 бит на выборку channels = 2 rate = 44100 # Запись со скоростью 44100 выборок(samples) в секунду seconds = 3 filename = "output_sound.wav" p = pyaudio.PyAudio() # Создать интерфейс для PortAudio print('Recording. ') stream = p.open(format=sample_format, channels=channels, rate=rate, frames_per_buffer=chunk, input_device_index=2, # индекс устройства с которого будет идти запись звука input=True) frames = [] # Инициализировать массив для хранения кадров # Хранить данные в блоках в течение 3 секунд for i in range(0, int(rate / chunk * seconds)): data = stream.read(chunk) frames.append(data) # Остановить и закрыть поток stream.stop_stream() stream.close() # Завершить интерфейс PortAudio p.terminate() print('Finished recording!') # Сохранить записанные данные в виде файла WAV wf = wave.open(filename, 'wb') wf.setnchannels(channels) wf.setsampwidth(p.get_sample_size(sample_format)) wf.setframerate(fs) wf.writeframes(b''.join(frames)) wf.close()
после выполнения скрипта мы получим wav файл который можно открыть в любом плеере.