树莓派使用snowboy以及百度语音api实现语音识别助手

2020-04-10 13:01 树莓派 4798 0
一.唤醒模块1.安装所需依赖sudoapt-getinstallpython3-pyaudiosudoapt-getinstallswigsudoapt-getinstalllibatlas-base-dev2.安装snowboygitclonehttps://gitee.com/passerma/snowboy.gitcdsnowboy/swig/Python3&&make3.测试是否安装成功ps:需注意要将snowboy/examples/Python3目录下的snowboydecoder.py文件的第5行代码from*importsnowboydetect改为importsnowboydetect然后执行cd~cdsnowboy/examples/Python3python3demo.pyresources/models/snowboy.umdl其中resources/models/snowboy.umdl是语音识别模型文件,这个后面可以替换成你需要的模型运行后会出现以下然后说出唤醒词snowboy将会出现滴的一声,同时输出INFO:snowboy:Keyword1detectedattime:2020-04-1011:51:22说明安装环境成功4.修改唤醒词进入snowBoy官网,登录成功后选择CreateHotword随后进行录制声音,推荐录制好后上传录音,只支持WAV格式之后再测试一遍通过后即可下载,下载完成后将得到一个mmdl文件替换之前resources/models/snowboy.umdl文件即可完成对唤醒词的修改或者在运行的时候直接选择你的pmdl文件,比如我的文件是ma.pmdl,运行时输入也可cd~cdsnowboy/examples/Python3python3demo.pyresources/models/ma.pmdl至此,唤醒模块已经完成,接下来就是录制声音进行语音识别了二.语音识别模块1.申请百度智能云账号随后进入控制台选择人工智能下的语音模块,然后创建一个应用,目前百度的语音识别次数免费额度只有50000次,所有大家好好珍惜然后点击管理应用后你将得到你的APIKey和SecretKey,记录备用但是目前新建账号已经没有免费额度了,需要开通付费,不过依旧可以领取免费额度来使用前往管理中心的控制台选择语音识别,然后可以看到概览,里面的表格里可以领取2.树莓派录制声音上传百度这一步我将结合python的程序,直接上程序1.需要现获取到token,才能有权限,文件名为fetchToken.pyimportsysimportjson#保证兼容python2以及python3IS_PY3=sys.version_info.major==3ifIS_PY3:fromurllib.requestimporturlopenfromurllib.requestimportRequestfromurllib.errorimportURLErrorfromurllib.parseimporturlencodefromurllib.parseimportquote_pluselse:importurllib2fromurllibimportquote_plusfromurllib2importurlopenfromurllib2importRequestfromurllib2importURLErrorfromurllibimporturlencode#替换你的API_KEYAPI_KEY='***************'#替换你的SECRET_KEYSECRET_KEY='***************'TOKEN_URL='http://openapi.baidu.com/oauth/2.0/token'deffetch_token():params={'grant_type':'client_credentials','client_id':API_KEY,'client_secret':SECRET_KEY}post_data=urlencode(params)if(IS_PY3):post_data=post_data.encode('utf-8')req=Request(TOKEN_URL,post_data)try:f=urlopen(req,timeout=5)result_str=f.read()exceptURLErroraserr:print('tokenhttpresponsehttpcode:'+str(err.code))result_str=err.read()if(IS_PY3):result_str=result_str.decode()result=json.loads(result_str)if('access_token'inresult.keys()and'scope'inresult.keys()):ifnot'audio_tts_post'inresult['scope'].split(''):print('pleaseensurehascheckthettsability')return''returnresult['access_token']else:print('pleaseoverwritethecorrectAPI_KEYandSECRET_KEY')return''2.主程序,文件名为snow.pyimportsnowboydecoderimportsignalimportwaveimportsysimportjsonimportrequestsimporttimeimportosimportbase64frompyaudioimportPyAudio,paInt16importwebbrowserfromfetchTokenimportfetch_tokenimporttimeIS_PY3=sys.version_info.major==3ifIS_PY3:fromurllib.requestimporturlopenfromurllib.requestimportRequestfromurllib.errorimportURLErrorfromurllib.parseimporturlencodefromurllib.parseimportquote_pluselse:importurllib2fromurllibimportquote_plusfromurllib2importurlopenfromurllib2importRequestfromurllib2importURLErrorfromurllibimporturlencodeinterrupted=False#snowboy监听唤醒结束标志endSnow=False#程序结束标志framerate=16000#采样率num_samples=2000#采样点channels=1#声道sampwidth=2#采样宽度2bytesFILEPATH='./audio/audio.wav'#录制完成存放音频路径music_exit='./audio/exit.wav'#唤醒系统退出语音music_open='./audio/open.wav'#唤醒系统打开语音os.close(sys.stderr.fileno())#去掉错误警告defsignal_handler(signal,frame):"""监听键盘结束"""globalinterruptedinterrupted=Truedefinterrupt_callback():"""监听唤醒"""globalinterruptedreturninterrupteddefdetected():"""唤醒成功"""print('唤醒成功')play(music_open)globalinterruptedinterrupted=Truedetector.terminate()defplay(filename):"""播放音频"""wf=wave.open(filename,'rb')#打开audio.wavp=PyAudio()#实例化pyaudio#打开流stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)data=wf.readframes(1024)whiledata!=b'':data=wf.readframes(1024)stream.write(data)#释放IOstream.stop_stream()stream.close()p.terminate()defsave_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()defmy_record():"""录音"""pa=PyAudio()stream=pa.open(format=paInt16,channels=channels,rate=framerate,input=True,frames_per_buffer=num_samples)my_buf=[]#count=0t=time.time()print('开始录音...')whiletime.time()<t+4:#秒string_audio_data=stream.read(num_samples)my_buf.append(string_audio_data)print('录音结束!')save_wave_file(FILEPATH,my_buf)stream.close()defspeech2text(speech_data,token,dev_pid=1537):"""音频转文字"""FORMAT='wav'RATE='16000'CHANNEL=1CUID='baidu_workshop'SPEECH=base64.b64encode(speech_data).decode('utf-8')data={'format':FORMAT,'rate':RATE,'channel':CHANNEL,'cuid':CUID,'len':len(speech_data),'speech':SPEECH,'token':token,'dev_pid':dev_pid}#语音转文字接口该接口可能每个人不一样,取决于你需要哪种语音识别功能,本文使用的是语音识别极速版url='https://vop.baidu.com/pro_api'headers={'Content-Type':'application/json'}#请求头print('正在识别...')r=requests.post(url,json=data,headers=headers)Result=r.json()if'result'inResult:returnResult['result'][0]else:returnResultdefget_audio(file):"""获取音频文件"""withopen(file,'rb')asf:data=f.read()returndatadefidentifyComplete(text):"""识别成功"""print(text)maps={'打开百度':['打开百度。','打开百度','打开百度,','baidu']}if(text=='再见。'ortext=='拜拜。'):play(music_exit)#关闭系统播放反馈语音exit()iftextinmaps['打开百度']:webbrowser.open_new_tab('https://www.baidu.com')play('./audio/openbaidu.wav')#识别到播放反馈语音else:play('./audio/none.wav')#未匹配口令播放反馈语音print('操作完成')if__name__=="__main__":whileendSnow==False:interrupted=False#实例化snowboy,第一个参数就是唤醒识别模型位置detector=snowboydecoder.HotwordDetector('ma.pmdl',sensitivity=0.5)print('等待唤醒')#snowboy监听循环detector.start(detected_callback=detected,interrupt_check=interrupt_callback,sleep_time=0.03)my_record()#唤醒成功开始录音TOKEN=fetch_token()#获取tokenspeech=get_audio(FILEPATH)result=speech2text(speech,TOKEN,int(80001))iftype(result)==str:identifyComplete(result.strip(','))至此代码结束接下来需要将以下文件移入你自己的文件夹1.之前snowboy/swig/Python3目录下编译好的_snowboydetect.so,以及snowboydetect.py文件2.然后是snowboy/examples/Python3目录下的snowboydecoder.py文件3.再是snowboy/resources整个文件夹4.最后就是你的两个程序文件fetchToken.py,snow.py,然后是唤醒模型ma.pmdl,5.再是audio文件夹,可以没有,这个文件夹主要是语音反馈文件,就是主程序里的开启关闭成功的语音然后你的文件夹目录应该有以下几个文件然后cd到你的目录,运行python3snow.py即可然后就会是以下效果代码已上传至GitHub至此,树莓派使用snowboy以及百度语音api实现语音识别助手基本完成,接下来的拓展无非是以这个为基础,实现完整的语音助手
暂无评论,我会出手
说点什么
登录用户可以修改和删除评论,可以收到回复的邮件提醒点击登录/注册
最多上传8张图片,仅支持jpg,png格式图片,单张大小5MB以内!
用户名: