Python. Используем PyAudio для записи звука

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

Windows:

python -m pip install pyaudio

Debian/Ubuntu

sudo apt-get install python-pyaudio python3-pyaudio

Mac OS X

brew install portaudiopip install pyaudio

Официальный сайт библиотеки PyAudio http://people.csail.mit.edu/hubert/pyaudio/

Работа с PyAudio

PyAudio — это библиотека предоставляет возможность записи аудио(звука) с помощью Python. PyAudio записывает полученный аудио поток в объекты типа bytes. В последующем данные могут быть сохранены в виде файлов WAV с использованием таких библиотек как scipy или wave соответственно. Для того что бы записать звук например с микрофона, нам надо определить идентификатор используемого устройства, в нашем случае микрофона.

Для этого нам надо написать следующий код, который выведет нам весь список доступных устройств и их идентификаторы:

import pyaudiop = pyaudio.PyAudio()for i in range(p.get_device_count()):print(i, p.get_device_info_by_index(i)['name'])

после запуска скрипта мы получим список всех устройств и их идентификаторы:

0 Переназначение звуковых устр. - Input1 Микрофон (Realtek High Definiti2 Переназначение звуковых устр. - Output3 Динамики (Realtek High Definiti4 Первичный драйвер записи звука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 pyaudioimport wavechunk = 1024 # Запись кусками по 1024 сэмплаsample_format = pyaudio.paInt16 # 16 бит на выборкуchannels = 2rate = 44100 # Запись со скоростью 44100 выборок(samples) в секундуseconds = 3filename = "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()# Завершить интерфейс PortAudiop.terminate()​print('Finished recording!')​# Сохранить записанные данные в виде файла WAVwf = 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 файл который можно открыть в любом плеере.

EnglishRussianUkrainian