樹莓派學習手記——使用Python錄音
有的時候我們想讓樹莓派能夠錄音,以實現語音控制等功能。所以今天我們總結一下用在樹莓派上使用Python錄音的過程。
準備硬體
樹莓派上自帶的3.5mm介面只能作為語音輸出口,不能接麥克風。所以我們需要另外購買USB音效卡,某寶上5元左右就能買到,當然你還需要一個麥克風。總費用應該在20元以內。
檢查硬體是否正常
使用arecord -l可以列出所有錄音裝置,一般輸出如下:
arecord -l
**** List of CAPTURE Hardware Devices **** card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0
同樣地,aplay -l可以列出所有播放裝置,輸出中也能找到形如 Device [USB Audio Device]
的裝置。
我們可以直接在命令列執行Linux自帶的錄音/播放命令,測試硬體是否正常:
arecord -D hw:1,0 -t wav -c 1 -r 44100 -f S16_LE test.wav
aplay -D hw:0,0 test.wav
arecord
是錄音命令,其中 hw:1,0
表示 card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]
的 card 1 , device 0
,如果你的USB音效卡錄音裝置不是 card 1 , device 0
ctrl + c
結束。
aplay
是播放命令,其中 hw:0,0
表示樹莓派板載音訊介面,如果你把耳機插在USB音效卡介面,還請進行相應修改,如改成 hw:1,0
。
*****如果你發現錄製的音訊內沒有聲音,只有細微的雜音,但 arecord -l
和 aplay -l
列出的裝置中確實有USB音效卡。那麼你可以嘗試著把麥克風介面拔出來一些,只插進去2/3,或許能夠解決你的問題。筆者不是很明白其中的緣由,如果你有什麼想法懇請留言告知。
安裝pyaudio
在Python中執行錄音命令需要pyaudio模組,直接用pip命令安裝:
pip install pyaudio
如果你使用pip命令下載速度很慢,或許修改pip源可以幫到你。
*****如果你使用了virtualenv,一般會發現pyaudio安裝失敗。這種情況下你需要安裝APT中的PortAudio開發標頭檔案,然後安裝PyAudio:
sudo apt-get install portaudio19-dev
pip install pyaudio
使用Python錄音
該例程修改自官方主頁例程PyAudio。
import pyaudio
import wave
import os
import sys
CHUNK = 512
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("recording...")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("done")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
執行後會錄製一段5秒的音訊,輸出為同目錄下的output.wav檔案。
python3 rec.py
* 隱藏錯誤訊息
一般情況下,在樹莓派上執行上述Python程式碼後,你會看到非常多的ALSA報錯和JACK報錯:
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition ‘cards.bcm2835.pcm.front.0:CARD=0’
…
…
connect(2) call to /tmp/jack-1000/default/jack_0 failed (err=No such file or directory) attempt to connect to server failed
但你會發現其實能夠正常地錄音。如果你不想看到這些錯誤訊息,可以在程式碼中加入下述命令隱藏錯誤:
os.close(sys.stderr.fileno())
小結
使用Python錄音很簡單,你還可以在GPIO口上接入一個按鈕,修改例程,實現按下按鈕自動開始錄音的功能。下一步的目標是把Python錄音和Cloud Speech API語音識別結合起來。
感謝你閱讀文章!