用pyaudio模組讀寫音訊流
python中的pyaudio模組對wave音訊流的讀寫特別簡單方便。
一.模組下載
https://pypi.python.org/pypi/PyAudio
二.自帶文件
http://people.csail.mit.edu/hubert/pyaudio/docs/#
三.解析
通過wave模組從音訊檔案中讀取資料,返回wave類。然後把讀取的str資料通過pyaduio模組寫到聲卡里。
1. wave模組
wf =wave.open(filenanme, mode’)此處讀取音訊檔案,返回instance物件類
對wave類操作如下:
wf.setnchannels(1) 設定音訊檔案的聲道數,用在寫音訊流時
wf.setsampwidth(2) 設定音訊檔案每個取樣值得儲存位數,用在寫音訊流時
wf.setframerate(8000)設定取樣率,用在寫音訊流時
wf.getnchannels() 獲得音訊檔案的聲道數,用在讀音訊流時
wf.getsampwidth() 獲得音訊檔案每個取樣值得儲存位數,用在讀音訊流時
wf.getframerate()獲得取樣率,用在讀音訊流時
2. pyaudio模組
通過p = pyaudio.PyAudio()返回pyaudio類instance,通過此類可以操作聲音輸出輸入
PyAudio類的open函式有許多引數:
rate - 取樣頻率
channels - 聲道數
format - 取樣值的量化格式 (paFloat32, paInt32, paInt24, paInt16, paInt8 …)。在上面的例子中,使用 get_format_from_width方法將wf.sampwidth()的返回值2轉換為paInt16
input - 輸入流標誌,如果為True的話則開啟輸入流
output - 輸出流標誌,如果為True的話則開啟輸出流
input_device_index - 輸入流所使用的裝置的編號,如果不指定的話,則使用系統的預設裝置
output_device_index - 輸出流所使用的裝置的編號,如果不指定的話,則使用系統的預設裝置
frames_per_buffer - 底層的快取的塊的大小,底層的快取由N個同樣大小的塊組成
start - 指定是否立即開啟輸入輸出流,預設值為True
四.播放wave音訊
-*-coding:utf-8-*
import pyaudio,wave
wf = wave.open(r"zhe.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(1000)#從音訊流中讀取1000個取樣資料,data型別為str.注意對音訊流的讀寫都是字串
if data == "":#判斷是否結束
break
stream.write(data)#從wf中讀資料,然後寫到stream中。就是從檔案中讀取資料然後寫到聲卡里
stream.stop_stream()#暫停
stream.close()#關閉
p.terminate()
五.錄製wave
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyaudio,wave
pa = pyaudio.PyAudio()
stream = pa.open (format=pyaudio.paInt16,
channels=1,
rate=8000,
input=True,
frames_per_buffer=2000)
save_buffer = ''
wf = wave.open('haha.wav', 'wb')
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(8000)
try:
while True:
string_audio_data = stream.read(1000)
save_buffer += string_audio_data
if len(save_buffer) >= 80000:#取樣8次就儲存
wf.writeframes(save_buffer)
break
except:
wf.close()