樹莓派打造對話機器人 Python(轉)


工具列表

 1. **樹莓派**(型號不要求,本人使用的是3B)

 2. **usb麥克風**(某寶有賣,我就不打廣告了) 用來錄音

 3. **音響或者喇叭**(某寶也有賣) 用來播放     

以上就是需要的工具


對話機器人分成5步

1. 第一步:“錄音”:錄音我用到的是使用了*arecord* 
安裝arecord: sudo apt-get install arecord

               使用arecord錄音:
               `arecord -D "plughw:1" -f S16_LE -r 16000 -d 3 /home/pi/Desktop/voice.wav`

2.第二步:”語音識別”:語音識別自我感覺使用百度的比較不錯,識別率也挺高的 下面附上語音識別代碼

“`

coding: utf-8

import sys 
import json 
import urllib2 
import base64 
import requests

reload(sys) 
sys.setdefaultencoding(“utf-8”)

def get_access_token(): 
url = “https://openapi.baidu.com/oauth/2.0/token” 
body = { 
“grant_type”:”client_credentials”, 
“client_id” :”此處填寫自己的client_id”, 
“client_secret”:”此處填寫自己的client_secret”, 
}

r = requests.post(url,data=body,verify=True)
respond = json.loads(r.text)
return respond["access_token"]

def yuyinshibie_api(audio_data,token): 
speech_data = base64.b64encode(audio_data).decode(“utf-8”) 
speech_length = len(audio_data) 
post_data = { 
“format” : “wav”, 
“rate” : 16000, 
“channel” : 1, 
“cuid” : “B8-27-EB-BA-24-14”, 
“token” : token, 
“speech” : speech_data, 
“len” : speech_length 
}

url = "http://vop.baidu.com/server_api"
json_data = json.dumps(post_data).encode("utf-8")
json_length = len(json_data)
#print(json_data)

req = urllib2.Request(url, data=json_data)
req.add_header("Content-Type", "application/json")
req.add_header("Content-Length", json_length)

#print("asr start request\n")
resp = urllib2.urlopen(req)
#print("asr finish request\n")
resp = resp.read()
resp_data = json.loads(resp.decode("utf-8"))
if resp_data["err_no"] == 0:
   return resp_data["result"]
else:
    print(resp_data)
    return None

def asr_main(filename,tok): 
try: 
f = open(filename, “rb”) 
audio_data = f.read() 
f.close() 
resp = yuyinshibie_api(audio_data,tok) 
return resp[0] 
except Exception,e: 
print “e:”,e 
return “識別失敗”.encode(“utf-8”)

**識別完成之后呢 我們就要開始第三步了 我們要和機器人對話 那么它一定得回復我們,對吧。為了能夠智能點,我們就用到了圖靈得接口 圖靈真的非常好用 能夠 查天氣語音\講故事\講笑話\ 下面附上第三步的代碼 
“`**

3.第三步:“圖靈回復”

# coding: utf-8 import requests import json import sys reload(sys) sys.setdefaultencoding("utf-8") def Tuling(words): Tuling_API_KEY = "此處填寫自己的Turling KEY" body = {"key":Tuling_API_KEY,"info":words.encode("utf-8")} url = "http://www.tuling123.com/openapi/api" r = requests.post(url,data=body,verify=True) if r: date = json.loads(r.text) print date["text"] return date["text"] else: return None 

4.第四步:“語音合成” 圖靈回復了之后 我們要讓它播放出來 就用到了百度的語音合成**

coding: utf-8

import sys 
import urllib2 
import json 
import os 
import yuyinshibie

reload(sys) 
sys.setdefaultencoding(“utf-8”)

def yuyinhecheng_api(tok,tex): 
cuid = “XX-XX-XX-XX-XX-XX” 
spd = “4” 
url = “http://tsn.baidu.com/text2audio?tex=“+tex+”&lan=zh&cuid=”+cuid+”&ctp=1&tok=”+tok+”&per=3” 
#print url 
#response = requests.get(url) 
#date = response.read() 
return url

def tts_main(filename,words,tok): 
voice_date = yuyinhecheng_api(tok,words)

f = open(filename,"wb")
f.write(voice_date)
f.close()

 

語音合成之后 我們要播放出來 用到了mpg123 為什么我會用這個呢 因為它可以直接播放網頁上的音頻 非常的好用 
安裝mpg123: sudo apt-get install mpg123 
安裝好了之后 我后面等用到了再說怎么用 現在先不說

現在錄音 語音識別 語音合成 播放 所需要的工具 代碼都准備好了 下面就開始整合在一起

5.第五步:“整合”

先貼上代碼 我再具體說說

# coding: utf-8 import os import time import yuyinhecheng import Turling import yuyinshibie tok = yuyinshibie.get_access_token() switch = True while switch: os.system('sudo arecord -D "plughw:1" -f S16_LE -r 16000 -d 3 /home/pi/Desktop/voice.wav') time.sleep(0.5) info = yuyinshibie.asr_main("/home/pi/Desktop/voice.wav",tok) if '關閉'.encode("utf-8") in info: while True: os.system('sudo arecord -D "plughw:1" -f S16_LE -r 16000 -d 10 /home/pi/Desktop/voice.wav') time.sleep(10) info = yuyinshibie.asr_main("/home/pi/Desktop/voice.wav",tok) if '開啟'.encode("utf-8") in info: break url = "http://tsn.baidu.com/text2audio?tex=開啟成功&lan=zh&cuid=B8-27-EB-BA-24-14&ctp=1&tok="+tok+"&per=3" os.system('mpg123 "%s"'%url) elif '暫停'.encode("utf-8") in info: url = "http://tsn.baidu.com/text2audio?tex=開始暫停&lan=zh&cuid=B8-27-EB-BA-24-14&ctp=1&tok="+tok+"&per=3" os.system('mpg123 "%s"'%url) time.sleep(10) url = "http://tsn.baidu.com/text2audio?tex=暫停結束&lan=zh&cuid=B8-27-EB-BA-24-14&ctp=1&tok="+tok+"&per=3" os.system('mpg123 "%s"'%url) continue else: tex = Turling.Tuling(info) url = yuyinhecheng.yuyinhecheng_api(tok,tex) os.system('mpg123 "%s"'%url) time.sleep(0.5) 

 


首先我用到了錄音工具 先錄一段話 然后用語音識別去識別我說了什么 然后用if來判斷我說的話

里面有沒有關鍵字 如果有關鍵字的話 例如“關閉”那么就會進入一個無限循環 一直來識別我說

的話,一直到識別到了我說 關鍵字“開啟”之后就退出這個循環 回到主循環。為什么我加這個

功能,因為我們總不可能一直把機器人開在那 一直識別我們說的話 然后一直回復我們 對吧。

為了實現這個功能 我想了很久 雖然這個辦法不好 因為它會一直循環識別 但這也是沒有辦法的辦

法了。如果各位有更好的辦法可以聯系我Qq:1281248141。繼續往下 識別了我的話之后呢 圖靈

就會回復我一個信息 然后把這個信息文本提交給語音合成,語音合成就把這段文字給合成好了

然后用上面說到的mpg123來播放這段音頻 mpg123用法mpg123 “url”這樣就能夠實現對話了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM