1. 程式人生 > >基於百度語音和圖靈的交互機器人

基於百度語音和圖靈的交互機器人

好用 font 想要 ext auth for res 希望 簡單

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 printRobot:.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界面進行控制,具體方法可自已解決


如果以上測試都成功的話,下面就很簡單了,只是把上述內容整合一下即可

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: 
  
printSpeaker:
  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.總結 

  總的來說,中間沒有遇到太多復雜問題,而且最後的實測效果還是不錯,但是仍然有反應慢,識別不準等問題需要進一步解決,另外還需要加上語音喚醒,以及語音結束等相關功能,代碼有錯的地方希望大家能夠多多指正。(測試視頻就不發了,因為我沒有公眾平臺,尷尬,不過是有的喔,嘿嘿,想要的我可以私發

基於百度語音和圖靈的交互機器人