毕业设计-树莓派人脸检测语音交互机器人设计(三)-------------音频播放与录音
树莓派板子上只有一个音频输出3.5mm接口,没有音频输入接口,用USB声卡解决该问题。
音频播放
在这里推荐三款树莓派音频播放器omxplayer、sox、mplayer2。三种播放器的性能就不多说了。
sudp apt-get install omxplayer
sudp apt-get install sox
sudp apt-get install mplayer2
通过上面的命令进行下载,下载完成后用下面命令播放音频。
omxplayer -o local test.mp3
play test.mp3
mplayer test.mp3
如果树莓派没对输出口进行选择,一般会在板自带的3.5mm接口输出,如果要选择usb声卡输出,继续看下面。
录音
命令行录音
一般树莓派Debian系统配置alsa架构,也就有aplay、arecord、alsamixer命令。如果没有,进行下载。
sudo apt-get -y install alsa-utils alsa-tools alsa-tools-gui alsamixergui
插入usb声卡,先用命令查看音频播放有哪些声卡。
aplay -l
上面列出的文字注意card 0,device 0这样的信息,会在后面的配置中用到。card 0,device 0相当于hw 0,0
下面再来看下录音的有哪些声卡。
arecord -l
看过有哪些音频输入输出声卡后,我们需要配置选择从什么声卡播放录音。
alsa的配置文件是alsa.conf,它位于/usr/share/alsa目录下,通常还有/usr/share/alsa/card和/usr/shara/alsa/pcm两个子目录用来设置card相关的参数、别名以及一些PCM默认设置。一般不修改里面的内容。
alsa.conf 引用了/etc/asound.conf 和 ~/.asoundrc两个文件,这两个文件可以配置默认声卡和指定音频输入和输出声卡。
通过上段话可知,由两个文件配置声卡,我们采用~/.asoundrc文件配置声卡,系统正常情况下是没有这个文件,所以我们要创建这个文件和添加内容。
sudo vim ~/.asoundrc
然后添加如下内容:
pcm.!default{
type asym
playback.pcm{
type plug
slave.pcm "hw:1,0"
}
capture.pcm{
type plug
slave.pcm "hw:1,0"
}
}
ctl.!default{
type hw
card 1
}
上面代表的意思如下图。根据有哪些声卡做自己想要的配置。
调节播放和录音的音量大小
alsamixer
使用arecord录音测试
arecord -D hw:1,0 -t wav -c 1 -r 44100 -f S16_LE -d 3 test.wav
参数解析:
-D hw:1,0:选择录音声卡
-t wav :文件类型
-c 1:声道数
-r 44100:采样频率
-f S16_LE:采样点数据长度
-d 3:录音时长(秒)
上面这条语句不支持录音采样率16000的
如要采样16000,设备问题。
arecord -D "plughw:1" -t wav -c 1 -f S16_LE -r 16000 -d 3 voice.wav
录音结束后,可播放是否能听到声音,尽量调alsamixer里面的录音和播放的音量大一点。
pyaudio库录音
毕设为了声音大于设定声贝大小时才开始录音,就用了pyaudio库实时监测。
sudo apt-get install portaudio.dev
sudo apt-get install portaudio19-dev python-all-dev python3-all-dev
sudo apt-get install python-pyaudio python3-pyaudio
解决不能采16K的音频的错误提示。
sudo apt-get install pulseaudio
下面是测试程序:
import wave
from pyaudio import PyAudio, paInt16
import time
import numpy as np
import sys
framerate = 16000 # 采样率
num_samples = 1000 # 采样点
channels = 1 # 声道
sampwidth = 2 # 采样宽度2bytes
FILEPATH = 'speech.wav'
#将音频数据转换成wav文件
def save_wave_file(filepath, data):
wf = wave.open(filepath, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(sampwidth)
wf.setframerate(framerate)
wf.writeframes(b''.join(data))
wf.close()
#录音
def my_record():
pa = PyAudio()
#打开一个新的音频stream
stream = pa.open(format=paInt16, channels=channels,
rate=framerate, input=True, frames_per_buffer=num_samples)
my_buf = [] #存放录音数据
my_buf1 = []
print('准备开始,正在检测人说话的声音')
time1 = time.time()
while True:
data = stream.read(num_samples)
my_buf1.append(data)
audio_data = np.fromstring(data,dtype=np.short)
# large_sample_count = np.sum(audio_data > 8000)
temp = np.max(audio_data)
print("最大声贝:", temp)
time2 = time.time()
if time2 > time1 + 30:
stream.stop_stream()
stream.close()
pa.terminate()
return 'toface'
if temp > 8000 :
print("检测人说话的声音,开始录音4秒")
my_buf.append(data)
t = time.time()
while time.time() < t + 4: # 设置录音时间(秒)
string_audio_data = stream.read(num_samples)
my_buf.append(string_audio_data)
print('录音结束.')
save_wave_file(FILEPATH, my_buf)
stream.stop_stream()
stream.close()
pa.terminate()
break
return 'ok'
my_record()
上面调用my_record()函数完成,声贝大于8000开始录音4秒,一开始的时候会报一些错误,但是能够完成录音,我就是想把这些报错弄没了搞崩的。
'>>>>>>>>>>>基本的实现录音和播放功能,其中如有一些错误请见谅,有什么问题可留言区提出共同探讨<<<<<<<<<<<<<<<<<
上一篇: linux文件目录权限
下一篇: Ubuntu16.04安装PCL