搭建一个声音采集和输出的硬件平台。硬件设备包括一个usb麦克风和一个3.5mm音频输出,麦克风最好采用免驱和树莓派兼容的usb设备。音频输出直接采用树莓派的3.5mm音频输出,树莓派的3.5mm接口采用的是美国标准的输出,如何测试没有输出你需要看一下你的耳机或者音箱接口是不是一致的,不一致的可以在某宝上购买转接头。我们采用pyaudio录音,下面配置一下树莓派。

树莓派下安装pyaudio与使用

pyaudiopython的模块,在树莓派下安装pyaudio  首先需安装portaudio.dev

1、安装portaudio.dev :      sudo apt-get install portaudio.dev

2、安装python-pyaudio:     sudo apt-get install python-pyaudio

3、安装sox快速检测麦克风配置是否正确: sudo apt-get install sox

4、(可跳过)测试麦克风配置是否正确,树莓派终端输入以下命令: rec temp.wav

注意如果显示提示没有找到某个头文件失败了,可能是由于raspberry 8.0 图形界面设置默认声卡有BUG 就只能手动去改~/.asoundrc文件。在/home/pi目录下创建一个名为.asoundrc文件 然后把下面的复制进去。

pcm.!default {

        type asym

            playback.pcm {

                type plug

                slave.pcm "hw:0,0"

            }

            capture.pcm {

                type plug

                slave.pcm "hw:1,0"

            }        

}

ctl.!default {

        type hw

        card 1

}
View Code

4、测试pyaudio 代码如下:录音5s并保存为audio.wav播放。

# 测试pyaudio 使用pyaudio录音,录音完毕播放录音内容
# 需要安装pyaudio 安装过程在教程中讲解
# pyaudio API函数库参考: http://people.csail.mit.edu/hubert/pyaudio/docs/#pyaudio.Stream.write

import wave
from pyaudio import PyAudio,paInt16

# 设置采样参数
NUM_SAMPLES = 2000
TIME = 2
chunk = 1024

# read wav file from filename 
def read_wave_file(filename):
    fp = wave.open(filename,'rb')
    nf = fp.getnframes()     #获取采样点数量
    print('sampwidth:',fp.getsampwidth())  
    print('framerate:',fp.getframerate())
    print('channels:',fp.getnchannels())
    f_len = nf*2
    audio_data = fp.readframes(nf)

# save wav file to filename 
def save_wave_file(filename,data):
    wf = wave.open(filename,'wb')
    wf.setnchannels(1)      # set channels  1 or 2
    wf.setsampwidth(2)      # set sampwidth 1 or 2
    wf.setframerate(16000)  # set framerate 8K or 16K
    wf.writeframes(b"".join(data))  # write data
    wf.close()

#recode audio to audio.wav
def record():
    pa = PyAudio()     # 实例化 pyaudio
    # 打开输入流并设置音频采样参数 1 channel 16K framerate 
    stream = pa.open(format = paInt16,
                     channels=1,
                     rate=16000,
                     input=True,
                     frames_per_buffer=NUM_SAMPLES)

    audioBuffer = []   # 录音缓存数组
    count = 0

    # 录制40s语音
    while count<TIME*20:
        string_audio_data = stream.read(NUM_SAMPLES) #一次性录音采样字节的大小
        audioBuffer.append(string_audio_data)
        count +=1
        print('.'),  #加逗号不换行输出

    # 保存录制的语音文件到audio.wav中并关闭流
    save_wave_file('audio.wav',audioBuffer)
    stream.close()

# 播放后缀为wav的音频文件
def play():
    # 打开audio.wav
    wf = wave.open(r"audio.wav",'rb') 
    # 实例化pyaudio
    p = PyAudio()

    # 打开流
    stream = p.open( format=p.get_format_from_width(wf.getsampwidth()),
                     channels=wf.getnchannels(),
                     rate=wf.getframerate(),
                     output=True)
    # 播放音频
    while True:
        data = wf.readframes(chunk)
        if data == "":break
        stream.write(data)
    
    # 释放IO
    stream.stop_stream()
    stream.close()
    p.terminate()

# main函数 录制5s音频并播放
if __name__ == '__main__':
    print('record ready...')
    record()
    print('record over!') 
    play()
录音测试代码

注意如果启动程序报错误IO错误应该是没有启动pulseaudio

  确保pulseaudio服务器依旧在工作
  安装pulseaudio,如下命令:

                 sudo apt-get install pulseaudio

  然后运行pulseaudio

                 pulseaudio --start

注意如果有其他异常可以看下以下两个链接

  使用不同的usb摄像头会出现采样率报错的问题,解决方案参考以下博客:

                https://blog.csdn.net/u013860985/article/details/79326379

                https://blog.csdn.net/u013372900/article/details/80296125

  添加一个新的~/.asoundrc pi目录下:sudo nano ~/.asoundrc

      输入以下内容:

    pcm.!default{
        type hw
        card 1
   }
   ctl.!default{
        type hw
        card 1
   }
或者:
pcm.!default{
        type asym
            playback.pcm {
                type plug
                slave.pcm "hw:0,0"
}
            capture.pcm {
                type plug
                slave.pcm "hw:1,0"
}
}
ctl.!default{
        type hw
        card 1
}
View Code

树莓派音频输出设置:

1、选择树莓派 audio output AUTO或者3.5mm  

        在终端输入sudo raspi-config 设置:选择1.system options,然后选择audio,选择headphone即可。

2、如何调整输出音量,终端输入 alsamixer 命令然后上下键调整

3、语音合成的音频为MP3文件,pyaudio只能播放wav文件,所以需要安装MP3播放插件 mplayer

     安装  sudo apt-get install mplayer

     测试  mplayer  xx.mp3  (需先进入xx.mp3的文件夹下)

     Python 程序播放 MP3:  os.system('mplayer %s'%'xx.mp3')

     注意:  要到播放的的mp3路径下启动播放这个文件

     

 

posted on 2022-09-26 18:13  始终不够啊  阅读(1855)  评论(0)    收藏  举报