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 的录音应用软件
1 | sudo apt - get - y install alsa - utils pulseaudio |
lsusb
命令查看一下USB设备:
1 2 3 4 5 6 7 | ( 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秒的声音进行测试
1 | 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声卡,
1 | alsamixer |
选择F6
然后按下F5
,将录音和播音设备都展示出来,因为我的USB声卡只支持录音,所以播音的音量无法调整,我们将录音的音量按上键调高
注意这个声音最好调成0,不然会有严重的电流刺啦声音
然后使用aplay
命令来播放,也可以双击使用树莓派自带的媒体软件播放。
1 | aplay - D "plughw:0,0" test.wav |
如果录音有问题,可能是缺少一些录音软件
1 | sudo apt - get install alsa - utils ulseaudio |
语音录音
树莓派支持 3.5mm 接口音频输出和 HDMI 音频输出,可以通过 config 界面来进行配置
如下图所示,输入
1 | sudo raspi - config |
声音输出模式配置
(1)选择进入第 7 项 - Advanced Options
(2)选择 Audio,单击回车
配置声音输出模式
0 - 自动选择
1 - 3.5mm 音频接口输出
2 - HDMI 输出,这种方式一般是在显示器有喇叭的情况下,使用显示器自带的喇叭播放音频
选择播放模式后,使用 TAB 键切换到 OK,然后单击回车确认,就完成了音频输出模式配置
退出配置界面后,SSH终端会显示模式配置成功
插上耳机到输出孔,看是否有声音,没有的话,把输出改成3.5mm
测试例程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | ''' 功能: 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 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) 使用指定下一个要播放的音乐文件,当前的音乐播放完成后自动开始播放指定的下一个。一次只能指定一个等待播放的音乐文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2019-12-15 arduino (2) 浊度传感器