pyAudio是開源聲音庫PortAudio(
http://www.portaudio.com/)提供的Python庫
使用pyAudio播放聲音
import pyaudio
import wave
buf = 1024
wf = wave.open(r"C:\Users\yuli\Desktop\a\forest.wav", 'rb')
p = pyaudio.PyAudio()
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True)
while True:
data = wf.readframes(buf)
if data == "": break
stream.write(data)
stream.close()
p.terminate()
pyAudio類的open函數參數:
- rate - 取樣頻率
- channel - 聲道
- 1=>mono為單聲道
- 2=>stereo為雙聲道(立體聲)
- format - 取樣值量化格式
- pyaudio.paFloat32 = 1
- pyaudio.paInt32 = 2
- pyaudio.paInt24 = 4
- pyaudio.paInt16 = 8
- pyaudio.paInt8 = 16
- pyaudio.paUInt8 = 32
- pyaudio.paCustomFormat = 65536
- input - 若為True則為開啟輸入流
- output - 若為True則為開啟輸出流
- input_device_index - 輸入所使用的設備編號,不指定則為系統預設
- output_device_index - 輸出所使用的設備編號,不指定則為系統預設
- frames_per_buffer - 緩存塊大小
- start - 是否立即開始輸入輸出流,不指定則為True
使用pyAudio錄音
from pyaudio import PyAudio, paInt16
import numpy as np
from datetime import datetime
import wave
def save_wave_file(filename, data):
wf = wave.open(filename, 'wb')
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(SAMPLING_RATE)
wf.writeframes(b"".join(data))
wf.close()
NUM_SAMPLES = 2000
SAMPLING_RATE = 8000
LEVEL = 1500
COUNT_NUM = 20
SAVE_LENGTH = 8
pa = PyAudio()
stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True,
frames_per_buffer=NUM_SAMPLES)
save_count = 0
save_buffer = []
while True:
string_audio_data = stream.read(NUM_SAMPLES)
audio_data = np.fromstring(string_audio_data, dtype=np.short)
large_sample_count = np.sum( audio_data > LEVEL )
print(np.max(audio_data))
if large_sample_count > COUNT_NUM:
save_count = SAVE_LENGTH
else:
save_count -= 1
if save_count < 0:
save_count = 0
if save_count > 0:
save_buffer.append( string_audio_data )
else:
if len(save_buffer) > 0:
filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav"
save_wave_file(filename, save_buffer)
save_buffer = []
print(filename, "saved")