树莓派学习手记——使用Python录音

有的时候咱们想让树莓派可以录音,以实现语音控制等功能。因此今天咱们总结一下用在树莓派上使用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 -laplay -l 列出的设备中确实有USB声卡。那么你能够尝试着把麦克风接口拔出来一些,只插进去2/3,或许可以解决你的问题。笔者不是很明白其中的原因,若是你有什么想法恳请留言告知。code

安装pyaudio

在Python中执行录音命令须要pyaudio模块,直接用pip命令安装:orm

pip install pyaudio

若是你使用pip命令下载速度很慢,或许修改pip源能够帮到你。server

*若是你使用了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语音识别结合起来。

感谢你阅读文章!

相关文章
相关标签/搜索