有的時候咱們想讓樹莓派可以錄音,以實現語音控制等功能。因此今天咱們總結一下用在樹莓派上使用Python錄音的過程。python
樹莓派上自帶的3.5mm接口只能做爲語音輸出口,不能接麥克風。因此咱們須要另外購買USB聲卡,某寶上5元左右就能買到,固然你還須要一個麥克風。總費用應該在20元之內。shell
使用arecord -l能夠列出全部錄音設備,通常輸出以下:segmentfault
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]
的設備。app
咱們能夠直接在命令行執行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結束。spa
aplay
是播放命令,其中 hw:0,0
表示樹莓派板載音頻接口,若是你把耳機插在USB聲卡接口,還請進行相應修改,如改爲 hw:1,0
。命令行
*若是你發現錄製的音頻內沒有聲音,只有細微的雜音,但 arecord -l
和 aplay -l
列出的設備中確實有USB聲卡。那麼你能夠嘗試着把麥克風接口拔出來一些,只插進去2/3,或許可以解決你的問題。筆者不是很明白其中的原因,若是你有什麼想法懇請留言告知。code
在Python中執行錄音命令須要pyaudio模塊,直接用pip命令安裝:orm
pip install pyaudio
若是你使用pip命令下載速度很慢,或許修改pip源能夠幫到你。server
*若是你使用了virtualenv,通常會發現pyaudio安裝失敗。這種狀況下你須要安裝APT中的PortAudio開發頭文件,而後安裝PyAudio:
sudo apt-get install portaudio19-dev pip install pyaudio
該例程修改自官方主頁例程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語音識別結合起來。
感謝你閱讀文章!