• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
经典 树莓派录音和播放声音
 
 
 

 1 硬件设置

播放声音

插上耳机

选择av JACK

重启树莓派即可播放

 

 

硬件

http://www.alsrobot.cn/goods-579.html

 

 

 

 

1 usb免驱动语音输入

https://blog.csdn.net/qq_38113006/article/details/105757167

https://blog.csdn.net/Smile_h_ahaha/article/details/106369731

 

安装库

安装 ALSA 的录音应用软件

sudo apt-get -y  install  alsa-utils   pulseaudio

  

 

lsusb命令查看一下USB设备:

 

 

(2)通过[sudo apt-get update]进行源更新。(无外网时可以跳过,如果后面命令执行时出现问题,请返回此步并执行此步和(3)步)

(3)通过[sudo apt-get upgrade]进行包更新。(无外网时可以跳过)

(4)通过[sudo modprobe snd_bcm2835]载入声卡驱动。

(5)通过[arecord -D hw:2,0 -d 5 -f cd test.wav -c 1]进行录音测试。(默认保存在/home/test.wav)(命令说明:arecord -d 录制时间(s)-D 设备 名称)

  

 

 

USB声卡的使用

 

arecord -l可以列出所有录音设备

 

 

 

直接执行Linux自带的录音命令,录制一段5秒的声音进行测试

arecord -D "plughw:1,0" -f S16_LE -r 16000 -d 5 -t wav test.wav

  

 其中 hw:1,0 表示card 1 , device 0,即我们的USB声卡,arecord 其他的参数如下:

 

 

 

如果声音过小,输入命令 alsamixer,来对音量进行调整,按下F6,选择USB声卡,

alsamixer

  

 

 

 选择F6

 

 

 

 

 

 然后按下F5,将录音和播音设备都展示出来,因为我的USB声卡只支持录音,所以播音的音量无法调整,我们将录音的音量按上键调高

 

 注意这个声音最好调成0,不然会有严重的电流刺啦声音

 

 然后使用aplay命令来播放,也可以双击使用树莓派自带的媒体软件播放。

aplay -D "plughw:0,0" test.wav

 如果录音有问题,可能是缺少一些录音软件

sudo apt-get install  alsa-utils ulseaudio

 

语音录音

树莓派支持 3.5mm 接口音频输出和 HDMI 音频输出,可以通过 config 界面来进行配置
如下图所示,输入

sudo raspi-config

  声音输出模式配置
(1)选择进入第 7 项 - Advanced Options
(2)选择 Audio,单击回车

 

 

 

 配置声音输出模式
0 - 自动选择
1 - 3.5mm 音频接口输出
2 - HDMI 输出,这种方式一般是在显示器有喇叭的情况下,使用显示器自带的喇叭播放音频
选择播放模式后,使用 TAB 键切换到 OK,然后单击回车确认,就完成了音频输出模式配置
退出配置界面后,SSH终端会显示模式配置成功

插上耳机到输出孔,看是否有声音,没有的话,把输出改成3.5mm

 

测试例程

'''
功能:
1录音保存wmv
2上传百度语音识别返回结果
'''
#树莓派4B 使用USB免驱动麦克风保存录音
import json
import subprocess

vioce_path="voice.wav"

def getvoice(vioce_path):  
    print('开始语音输入,5秒内说出目标点 红色  绿色  蓝色,之后保持安静!')
    #arecord -l可以列出所有录音设备 查看板卡号和驱动号
    #vioce_path="voice.wav"
    Audio_drivce="plughw:2,0"#USB面驱动麦克风 板卡2 驱动0
    vioce_time="5" #录制5秒语音
    msg="arecord -D "+Audio_drivce+" -f S16_LE -r 16000 -d "+vioce_time+" -t wav "+vioce_path
    result=subprocess.call(msg, shell=True)#执行 同级目录保存文件
    #print("录音结束")

#getvoice()
    
    
from aip import AipSpeech


def usevoice(vioce_path):
    print('开始语音识别,请等待。。。')
  
    """ 修改成你的百度 APPID AK SK """
  
        
    APP_ID = '23159731'
    API_KEY = 'DIQ9g1OKcI4dIyU0xeFoTyK3'
    SECRET_KEY = 'P9zittbiFGpkmGsMMqGd74tbyG3bcOhp'
    
    
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

    # 读取文件
    def get_file_content(file_path):
        with open(file_path, 'rb') as fp:
            return fp.read()
        
    vioce_file=get_file_content(vioce_path)


    '''
    1536 普通话(支持简单的英文识别) 无标点
    1537 普通话(纯中文识别)       有标点
    1737 英语                   有标点
    '''
    # 识别本地文件
    Recresult = client.asr(vioce_file, 'wav', 16000, {
        'dev_pid': 1537,  # 默认1537(普通话 输入法模型),dev_pid参数见本节开头的表格
    })

    jsonRec=json.loads(json.dumps(Recresult))


    #print(jsonRec)
    #for i in jsonRec:
    #    print(i)
    VoiceRuselt=jsonRec["result"][0]
    print("识别结果为:  "+VoiceRuselt)
    

    if VoiceRuselt=="红色。":     #返回结果默认加了句号
        print('到达红色区域停止')    
        return "red"
    elif VoiceRuselt=="蓝色。":
        print('到达蓝色区域停止')
        return "blue"       
    elif VoiceRuselt=="绿色。":
        print('到达绿色区域停止')
        return "green"
    else:
        print('没有匹配结果,请重新识别')
        return "black"
'''
#1录音 5秒
getvoice(vioce_path)
#2对录音结果识别  vioceresult保存结果   
vioceresult=usevoice(vioce_path)
print(vioceresult)
'''

  

 

 

三、播放mp3

import time
import pygame
import os
from mutagen.mp3 import MP3



from multiprocessing import Process,Manager


def GET_mp3List():

    #获取地址并拼接
    path_mp3='mp3/'

    mp3_list_Path=[]
    for i in os.listdir(path_mp3):
        s=os.path.join(path_mp3,i)
        mp3_list_Path.append(s)
        print(i)
    return mp3_list_Path




def Mp3_paly_all():

   
    mp3_list_Path=GET_mp3List()


    if len(mp3_list_Path)==0:
        print("没有数据")
        return 0

    
        
        
    for Path_i in mp3_list_Path:
        # 获取每一首歌的时长
        audio = MP3(Path_i)
        print("歌曲时间",int(audio.info))
        pygame.mixer.init()
        path = Path_i
        pygame.mixer.music.load(path)
    
        pygame.mixer.music.play(10)#播放载入的音乐。该函数立即返回,音乐播放在后台进行
        time.sleep(int(10))
        pygame.mixer.music.pause() # 暂停
        time.sleep(int(3))
        pygame.mixer.music.unpause() # 接着播放
        #获取歌曲时间
        time.sleep(int(audio.info.length))


def Mp3_paly_while(ShareImages,lock):
    
    pygame.mixer.init()

    while 1:
            
        if ShareImages[9]==1:
            print("mp3 stop")
            
        if ShareImages[6]=="paly":

            ShareImages[6]="wait"
            path = ShareImages[7]
            pygame.mixer.music.load(path)
            print("开始播放歌曲",path)
            #audio = MP3(path)
            #print("歌曲时间",int(audio.info))

            pygame.mixer.music.play()

        elif ShareImages[6]=="stop":
            ShareImages[6]="wait"
            pygame.mixer.music.pause() # 暂停
        

        time.sleep(0.0001)




'''
if __name__ == '__main__':
   
  
    ShareImages=Manager().dict()
    lock=Manager().Lock()

    ShareImages[6]="wait"# ,mp3 动作
    ShareImages[7]="wait"# ,mp3 当前播放名字

    ShareImages[9]=0#用于关闭所有进程

    #1采集图像进程     
    t1=Process(target=Mp3_paly_while,args=(managerdata,sharelock))
    t1.start()
    t1.deamon=True  #伴随主进程关闭而关闭

    while 1:
        pass
'''

  

 

 

 pygame.init() 进行全部模块的初始化,
pygame.mixer.init() 或者只初始化音频部分
pygame.mixer.music.load('xx.mp3') 使用文件名作为参数载入音乐 ,音乐可以是ogg、mp3等格式。载入的音乐不会全部放到内容中,而是以流的形式播放的,即在播放的时候才会一点点从文件中读取。
pygame.mixer.music.play()播放载入的音乐。该函数立即返回,音乐播放在后台进行。
play方法还可以使用两个参数
pygame.mixer.music.play(loops=0, start=0.0) loops和start分别代表重复的次数和开始播放的位置。
pygame.mixer.music.stop() 停止播放,
pygame.mixer.music.pause() 暂停播放。
pygame.mixer.music.unpause() 取消暂停。
pygame.mixer.music.fadeout(time) 用来进行淡出,在time毫秒的时间内音量由初始值渐变为0,最后停止播放。
pygame.mixer.music.set_volume(value) 来设置播放的音量,音量value的范围为0.0到1.0。
pygame.mixer.music.get_busy() 判断是否在播放音乐,返回1为正在播放。
pygame.mixer.music.set_endevent(pygame.USEREVENT + 1) 在音乐播放完成时,用事件的方式通知用户程序,设置当音乐播放完成时发送pygame.USEREVENT+1事件给用户程序。 pygame.mixer.music.queue(filename) 使用指定下一个要播放的音乐文件,当前的音乐播放完成后自动开始播放指定的下一个。一次只能指定一个等待播放的音乐文件。

posted on 2020-12-15 22:35  MKT-porter  阅读(2093)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3