伽利略的悲伤|树莓派学习手记——使用Python录音(转载)

留言请转SegmentFault:https://segmentfault.com/a/1190000013854294
有的时候我们想让树莓派能够录音 , 以实现语音控制等功能 。 所以今天我们总结一下用在树莓派上使用Python录音的过程 。
准备硬件树莓派上自带的3.5mm接口只能作为语音输出口 , 不能接麦克风 。 所以我们需要另外购买USB声卡 , 某宝上5元左右就能买到 , 当然你还需要一个麦克风 。 总费用应该在20元以内 。
伽利略的悲伤|树莓派学习手记——使用Python录音(转载)
文章图片
检查硬件是否正常使用arecord-l可以列出所有录音设备 , 一般输出如下:
arecord-l
1****ListofCAPTUREHardwareDevices****card1:Device[USBAudioDevice],device0:USBAudio[USBAudio]Subdevices:1/1Subdevice#0:subdevice#0同样地 , aplay-l可以列出所有播放设备 , 输出中也能找到形如Device[USBAudioDevice]的设备 。
我们可以直接在命令行执行Linux自带的录音/播放命令 , 测试硬件是否正常:
arecord-Dhw:1,0-twav-c1-r44100-fS16_LEtest.wav
aplay-Dhw:0,0test.wav
12arecord是录音命令 , 其中hw:1,0表示card1:Device[USBAudioDevice],device0:USBAudio[USBAudio]的card1,device0 , 如果你的USB声卡录音设备不是card1,device0 , 还请进行相应修改 。 另外 , 录音过程需要手动按ctrl+c结束 。
aplay是播放命令 , 其中hw:0,0表示树莓派板载音频接口 , 如果你把耳机插在USB声卡接口 , 还请进行相应修改 , 如改成hw:1,0 。
*****如果你发现录制的音频内没有声音 , 只有细微的杂音 , 但arecord-l和aplay-l列出的设备中确实有USB声卡 。 那么你可以尝试着把麦克风接口拔出来一些 , 只插进去2/3 , 或许能够解决你的问题 。 笔者不是很明白其中的缘由 , 如果你有什么想法恳请留言告知 。
安装pyaudio在Python中执行录音命令需要pyaudio模块 , 直接用pip命令安装:
pipinstallpyaudio
1如果你使用pip命令下载速度很慢 , 或许修改pip源可以帮到你 。
*****如果你使用了virtualenv , 一般会发现pyaudio安装失败 。 这种情况下你需要安装APT中的PortAudio开发头文件 , 然后安装PyAudio:
sudoapt-getinstallportaudio19-dev
pipinstallpyaudio
12使用Python录音该例程修改自官方主页例程PyAudio 。
importpyaudio
importwave
importos
importsys
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=[]
foriinrange(0,int(RATE/CHUNK*RECORD_SECONDS)):
data=https://pcff.toutiao.jxnews.com.cn/p/20200916/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()
12345678910111213141516171819202122232425262728293031323334353637383940执行后会录制一段5秒的音频 , 输出为同目录下的output.wav文件 。
python3rec.py
1*隐藏错误消息
一般情况下 , 在树莓派上执行上述Python代码后 , 你会看到非常多的ALSA报错和JACK报错:
ALSAlibconfmisc.c:1281:(snd_func_refer)Unabletofinddefinition‘cards.bcm2835.pcm.front.0:CARD=0’……connect(2)callto/tmp/jack-1000/default/jack_0failed(err=Nosuchfileordirectory)attempttoconnecttoserverfailed但你会发现其实能够正常地录音 。 如果你不想看到这些错误消息 , 可以在代码中加入下述命令隐藏错误: