(1)硬件:樹莓派3b usb麥克風 音響html
(2) 軟件:百度語音api 圖靈機器人api python2或3(樹莓派自帶)mplayerpython
申請一個百度語音帳號,建立一個新應用,並獲取相應的Key,截圖以下:json
注意:天天請求次數有限制,若是不夠能夠本身向百度申請,免費的api
申請一個圖靈機器人帳號,建立新應用,並獲取相應的api,截圖以下:curl
用命令行 sudo apt-get install mplayer安裝mplayer測試
在安裝python的一些第三方庫時可能會出現各類各樣的問題,我百度了好多解決方法,感受最好用的就是 sudo apt-get install python-庫名,這裏默認是python2,若是是3的話,把python換成python3便可。ui
軟硬件到這裏基本上就OK了url
(1)圖靈機器人測試,從一個可以進行文本交互的機器人開始,代碼以下:spa
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 json 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): 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界面進行控制,具體方法可自已解決
若是以上測試都成功的話,下面就很簡單了,只是把上述內容整合一下便可
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)
總的來講,中間沒有遇到太多複雜問題,並且最後的實測效果仍是不錯,可是仍然有反應慢,識別不許等問題須要進一步解決,另外還須要加上語音喚醒,以及語音結束等相關功能,代碼有錯的地方但願你們可以多多指正。(測試視頻就不發了,由於我沒有公衆平臺,尷尬,不過是有的喔,嘿嘿,想要的我能夠私發)