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

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

Windows:

python -m pip install pyaudio

Debian/Ubuntu

sudo apt-get install python-pyaudio python3-pyaudio

Mac OS X

brew install portaudio
pip install pyaudio

Официальный сайт библиотеки PyAudio http://people.csail.mit.edu/hubert/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 файл который можно открыть в любом плеере.