python錄音
學(xué)習(xí)目標(biāo):掌握python的pyaudio擴(kuò)展包和Wave模塊錄制語(yǔ)音的方法
- Wav音頻:聲道數(shù),采樣頻率,,量化位數(shù)
python Wav包是自帶的,,pyaudio需要下載
pip3 install pyaudio
python讀Wav文件:
fp=wave.open('','rb')
nf=fp.getnframes()#獲取文件的采樣點(diǎn)數(shù)量
print('sampwidth:',fp.getsampwidth())
print('framerate:',fp.getframerate())
print('channels:',fp.getnchannels())
f_len=nf*2#文件長(zhǎng)度計(jì)算,每個(gè)采樣2個(gè)字節(jié)
audio_data=fp.readframes(nf)
python寫(xiě)Wav文件:
def save_wave_file(filename,data):
'''save the date to the wavfile'''
wf=wave.open(filename,'wb')
wf.setnchannels(channels)#聲道
wf.setsampwidth(sampwidth)#采樣字節(jié) 1 or 2
wf.setframerate(framerate)#采樣頻率 8000 or 16000
wf.writeframes(b''.join(data))#https:///questions/32071536/typeerror-sequence-item-0-expected-str-instance-bytes-found
wf.close()
利用PyAudio錄音:
def my_record():
pa=PyAudio()
stream=pa.open(format = paInt16,channels=1,
rate=framerate,input=True,
frames_per_buffer=NUM_SAMPLES)
my_buf=[]
count=0
while count<TIME*20:#控制錄音時(shí)間
string_audio_data = stream.read(NUM_SAMPLES)#一次性錄音采樣字節(jié)大小
my_buf.append(string_audio_data)
count+=1
print('.')
save_wave_file('01.wav',my_buf)
stream.close()
利用PyAudio播放音頻
chunk=2014
def play():
wf=wave.open(r'01.wav','rb')
p=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(chunk)
if data=='':break
stream.write(data)
stream.close()
p.terminate()
完整錄音播放的demo
import wave
from pyaudio import PyAudio,paInt16
framerate=8000
NUM_SAMPLES=2000
channels=1
sampwidth=2
TIME=2
def save_wave_file(filename,data):
'''save the date to the wavfile'''
wf=wave.open(filename,'wb')
wf.setnchannels(channels)
wf.setsampwidth(sampwidth)
wf.setframerate(framerate)
wf.writeframes(b''.join(data))
wf.close()
def my_record():
pa=PyAudio()
stream=pa.open(format = paInt16,channels=1,
rate=framerate,input=True,
frames_per_buffer=NUM_SAMPLES)
my_buf=[]
count=0
while count<TIME*20:#控制錄音時(shí)間
string_audio_data = stream.read(NUM_SAMPLES)
my_buf.append(string_audio_data)
count+=1
print('.')
save_wave_file('01.wav',my_buf)
stream.close()
chunk=2014
def play():
wf=wave.open(r'01.wav','rb')
p=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(chunk)
if data=='':break
stream.write(data)
stream.close()
p.terminate()
if __name__ == '__main__':
my_record()
print('Over!')
play()
更多用法詳見(jiàn) pyaudio文檔
|