基於百度語音和圖靈的交互機器人
1.準備工作:
(1)硬件:樹莓派3b usb麥克風 音響
(2) 軟件:百度語音api 圖靈機器人api python2或3(樹莓派自帶)mplayer
申請一個百度語音賬號,創建一個新應用,並獲取相應的Key,截圖如下:
註意:每天請求次數有限制,如果不夠可以自己向百度申請,免費的
申請一個圖靈機器人賬號,創建新應用,並獲取相應的api,截圖如下:
用命令行 sudo apt-get install mplayer安裝mplayer
在安裝python的一些第三方庫時可能會出現各種各樣的問題,我百度了好多解決方法,感覺最好用的就是 sudo apt-get install python-庫名,這裏默認是python2,如果是3的話,把python換成python3即可。
軟硬件到這裏基本上就OK了
2.初步測試
(1)圖靈機器人測試,從一個能夠進行文本交互的機器人開始,代碼如下:
1 import urllib,urllib2 2 import json 3 4 def gethtml(url): 5 page = urllib2.urlopen(url) 6 html = page.read() 7 return html 8 9 if __name__==‘__main__‘: 10 key = ‘**********‘ 11 api = ‘**********‘ 12 info = raw_input(‘Me:’)13 request = api + info 14 response = gethtml(request) 15 dic_json = json.loads(response) 16 print‘Robot:‘.decode(‘utf-8‘)+dic_json[‘text‘]
測試結果機器人還不是太傻,具有初步的撩人功能,附上我們的聊天記錄:
(2) 百度語音識別測試,可以自行搜索百度文檔,裏面有詳細的代碼樣例,代碼如下;
import wave import urllib,urllib2,pycurl import base64 import jsondef get_token(): apiKey=‘**********‘ secreKey=‘**********‘ auth_url="https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credential&client_id="+apiKey+"&client_secret="+secretKey res = urllib2.urlopen(auth_url) json_data = res.read() rerurn json.loads(json_data)[‘access_token‘] def dump_res(buf): print (buf) def use_cloud(token): fp = wave.open(‘niu.wav‘,‘rb‘) nf = fp.getnframes() f_len = nf*2 audio_data = fp.readframs(nf) cuid = "******" srv_url = ‘http://vop.baidu.com/server_api‘+‘?cuid=‘+cuid+‘&token=‘+token http_header=[‘Content-Type:audio/pcm;rate=8000‘,‘Content-Length: %d‘%f_len] c=pycurl.Curl() c.setopt(pycurl.URL,str(srv_url)) c.setopt(c.HTTPHEADER,http_header) c.setopt(c.POST,1) c.setopt(c.CONNECTTIMEOUT,30) c.setopt(c.TIMEOUT,30) c.setopt(c.WRUTEFUNCTION,dump_res) c.setopt(c.POSTFIELDS,audio_data) c.setopt(c.POSTFIELDSIZE,f_len) c.perform() if __name__==‘__main__‘: token=get_token() use_cloud(token)
測試結果發現基本上都能識別準確,但偶爾會因未對噪音進行處理而出現偏差,上圖:
(3) 麥克風和音響測試
用命令行 sudo arecord -D "plughw;1,0" 5 niu.wav錄制一段5秒的音頻
用命令行 omxplayer -o local niu.wav即可播放剛剛錄制的音頻
註意:樹莓派支持3.5mm音頻輸出和HDMI音頻輸出,可以通過config界面進行控制,具體方法可自已解決
如果以上測試都成功的話,下面就很簡單了,只是把上述內容整合一下即可
3.源代碼
import json
import wave,urllib,urllib2,pycurl,base64 import os,time from aip import AipSpeech def gethtml(url): page = urllib2.urlopen(url) html = page.read() return html def get_token(): apiKey=‘**********‘ secreKey=‘**********‘ auth_url="https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credential&client_id="+apiKey+"&client_secret="+secretKey res = urllib2.urlopen(auth_url) json_data = res.read() rerurn json.loads(json_data)[‘access_token‘] def dump_res(buf): global duihua print(buf) a=eval(buf) if a[‘err_msg‘]==‘success.‘: duihua =a[‘result‘][0] print duihua def use_cloud(token): fp = wave.open(‘niu.wav‘,‘rb‘) nf = fp.getnframes() f_len = nf*2 audio_data = fp.readframs(nf) cuid = "******" srv_url = ‘http://vop.baidu.com/server_api‘+‘?cuid=‘+cuid+‘&token=‘+token http_header=[‘Content-Type:audio/pcm;rate=8000‘,‘Content-Length: %d‘%f_len] c=pycurl.Curl() c.setopt(pycurl.URL,str(srv_url)) c.setopt(c.HTTPHEADER,http_header) c.setopt(c.POST,1) c.setopt(c.CONNECTTIMEOUT,30) c.setopt(c.TIMEOUT,30) c.setopt(c.WRUTEFUNCTION,dump_res) c.setopt(c.POSTFIELDS,audio_data) c.setopt(c.POSTFIELDSIZE,f_len) c.perform() def answer(): key = ‘********‘ api =‘http://www.tuling123.com/openapi/api?key=‘+key+‘&info=‘ info =duihua request = api+info response = gethtml(request) return response def getmp3():
APP_ID=‘*********‘
APP_KEY=‘********‘
SECRET_KEY=‘*********‘
client=AipSpeech(APP_ID,APP_KEY,SECRET_KEY)
result = client.sysnthesis(a,‘zh‘,1,{‘vol‘:5,})
if not isinstance(result,dict):
with open(‘niu.mp3‘,‘wb‘) as f:
f.write(result)
while True:
print‘Speaker:‘
os.ayatem(‘sudo arecord -D "plughw:1,0" -f S16_LE -d 4 -r 8000 niu.wav‘)
token =get_token()
use_cloud(token)
dic_json = json.loads(answer())
a=dic_json[‘text‘].encode(‘utf-8‘)
getmp3() os.system(‘mplayer niu.mp3‘) time.sleep(0.5)
4.總結
總的來說,中間沒有遇到太多復雜問題,而且最後的實測效果還是不錯,但是仍然有反應慢,識別不準等問題需要進一步解決,另外還需要加上語音喚醒,以及語音結束等相關功能,代碼有錯的地方希望大家能夠多多指正。(測試視頻就不發了,因為我沒有公眾平臺,尷尬,不過是有的喔,嘿嘿,想要的我可以私發)
基於百度語音和圖靈的交互機器人