Pyaudio: библиотека для работы с аудиоданными в Python
Pyaudio - это модуль для Python, который позволяет осуществлять взаимодействие с звуком - записывать звук с микрофона, проигрывать звук на динамиках, создавать звуковые эффекты и многое другое.
Для начала необходимо установить pyaudio. Для этого можно воспользоваться pip:
pip install pyaudio
Запись звука из микрофона осуществляется с помощью метода `open()` и `read()` объекта `PyAudio`. Например, чтобы записать 5-секундный фрагмент звука с частотой дискретизации 16 кГц и сохранить его в файл, можно использовать следующий код:
python
import wave
import pyaudio
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
stream.stop_stream()
stream.close()
audio.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(audio.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
Чтение звука из файла и его проигрывание можно осуществить с помощью метода `open()` и `write()` объекта `PyAudio`. Например, чтобы проиграть ранее записанный звук из файла `output.wav`, можно использовать следующий код:
python
import pyaudio
import wave
CHUNK = 1024
wf = wave.open("output.wav", 'rb')
audio = pyaudio.PyAudio()
stream = audio.open(format=audio.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(CHUNK)
while data:
stream.write(data)
data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
audio.terminate()
Pyaudio также позволяет создавать звуковые эффекты. Например, создадим простой эффект - задержку на 500 мс. Для этого воспользуемся функцией `delay()` из модуля `sound`
python
import pyaudio
import numpy as np
import sound
def delay(data, delay_time, decay_rate):
delay_samples = int(delay_time * RATE)
decay = decay_rate ** np.arange(delay_samples, 0, -1, dtype=float)
decay = np.expand_dims(decay, axis=1)
z = np.zeros((delay_samples, CHANNELS), dtype=float)
temp_data = np.concatenate((z, data))
for n in range(delay_samples, temp_data.shape[0]):
temp_data[n, :] += decay[n-delay_samples]*temp_data[n-delay_samples, :]
return temp_data
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(np.frombuffer(data, dtype='int16'))
stream.stop_stream()
stream.close()
audio.terminate()
data = np.concatenate(frames)
data = delay(data, 0.5, 0.5)
data = np.asarray(data, dtype='int16')
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, output=True)
stream.write(data.tobytes())
stream.stop_stream()
stream.close()
audio.terminate()
В результате при проигрывании записанного звука мы услышим его с эффектом задержки на 500 мс, который мы добавили с помощью функции `delay()`.