欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

毕业设计-树莓派人脸检测语音交互机器人设计(三)-------------音频播放与录音

程序员文章站 2024-01-23 12:12:34
...

树莓派板子上只有一个音频输出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秒,一开始的时候会报一些错误,但是能够完成录音,我就是想把这些报错弄没了搞崩的。

'>>>>>>>>>>>基本的实现录音和播放功能,其中如有一些错误请见谅,有什么问题可留言区提出共同探讨<<<<<<<<<<<<<<<<<