python語音智能對話聊天機器人--linux&&樹莓派雙平台兼容
-------------------*********---------********
項目簡介:運用百度語音進行聲音轉中文的識別與合成,智能對話使用圖靈機器人,錄音則,linux端用pythonaudio 模塊.樹莓派端因為pythonaudio不兼容問題,因此用arecord進行錄音.最終代碼約150行.
代碼發布在github上:luyishisi/python_yuyinduihua
博客有該文的原文:python語音智能對話聊天機器人,linux&&樹莓派雙平台兼容 | | URl-team
0.目錄:
- 1:環境搭建
- 2:百度語音合成與識別
- 3:圖靈機器人
- 4:linux下使用pythonaudio進行音頻解析
- 5:樹莓派下使用arecord進行錄音
- 6:linux整體調試
- 7:主要bug解析
- 8:源代碼樹莓派下的
1.環境搭建
這點非常關鍵,在後期多數問題都是出現在環境不兼容上.
1.1:linux 版本
# -*- coding: utf-8 -*-nfrom pyaudio import PyAudio, paInt16nimport numpy as npnfrom datetime import datetimenimport wavenimport timenimport urllib, urllib2, pycurlnimport base64nimport jsonnimport osnimport sysnreload(sys)nsys.setdefaultencoding( "utf-8" )n
這部分環境最好搭建,只需要
apt-get install python-wave* 這類的安裝命令就可以輕鬆搞定.本質上安裝模塊就是在找安裝的命令.我一半就是把模塊肯定會有的名詞後面接上*用於模糊匹配.
如果有模塊不懂得裝,還是百度一下,難度不大.還有mpg123用來播發
1.2:樹莓派版本
如果你出現這個博文下出現的錯誤,請果斷棄坑.換用命令行錄音實現,不要折騰pyaudio了.
http://komey.utdme.com/archives/2321?utm_source=tuicool&utm_medium=referral##先更新軟體包nsudo apt-get updatensudo apt-get upgraden##安裝必要的程序nsudo apt-get -y install alsa-utils alsa-tools alsa-tools-gui alsamixerguin
主要使用的工具
想通過終端來調整揚聲器的音量,只需要輸入alsamixer.這個很重要你使用的錄音設備的錄音音量需要這裡設置,而且你可以明顯的看到自己的音效卡是否有問題.
使用的錄音設備我用的是 Raspberry Pi B+ 3代 USB麥克風 話筒 免驅動 pcduino 樹莓派專用
錄音的命令使用的是arecord
arecord,aplay是命令行的ALSA音效卡驅動的錄音和播放工具.
arecord是命令行ALSA音效卡驅動的錄音程序.支持多種文件格式和多個音效卡.aplay是命令行播放工具,支持多種文件格式.
命令格式:這部分需要研讀一下.主要使用dfr三個參數
arecord [flags] [filename]n 參數比較多,請從博客獲取。n
示例:
aplay -c 1 -t raw -r 22050 -f mu_law foobarnt播放raw文件foobar.以22050Hz,單聲道,8位,mu_law格式.nn arecord -d 10 -f cd -t wav -D copy foobar.wavnt以CD質量錄製foobar.wav文件10秒鐘.使用PCM的"copy".n
2:百度語音合成與識別
這部分難度不大,測試代碼如下.如有以為情參看之前的博文
代碼比較長請從博客或者github獲取n
3:圖靈機器人
官方網址:圖靈機器人-中文語境下智能度最高的機器人大腦
圖靈機器人部分的測試代碼
難度不大非常輕鬆.你得去註冊一下,然後使用他們給你的key和api.剩下的就是json的文本提取
# -*- coding: utf-8 -*-nimport urllibnimport jsonnndef getHtml(url):n page = urllib.urlopen(url)n html = page.read()n return htmlnnif __name__ == __main__:nn key = 05ba411481c8cfa61b91124ef7389767n api = http://www.tuling123.com/openapi/api?key= + key + &info=n while True:n info = raw_input(我: )n request = api + infon response = getHtml(request)n dic_json = json.loads(response)n print 機器人: .decode(utf-8) + dic_json[text]n
4:linux下使用pythonaudio進行音頻解析
這部分,在正常電腦上,只要環境沒有大問題就很輕鬆,代碼放在整體的源代碼中,這裡做個小說明.
這部分代碼不可運行,在整體源代碼中可以.不過這部分稍微需要抽取出來,作為理解
建立的pa是pyudio對象,可以獲取當前的音高,然後檢測當音高超過200就啟動,錄音.同時有一個5秒的額外限制.
NUM_SAMPLES = 2000 # pyAudio內部緩存的塊的大小nSAMPLING_RATE = 8000 # 取樣頻率nLEVEL = 1500 # 聲音保存的閾值nCOUNT_NUM = 20 # NUM_SAMPLES個取樣之內出現COUNT_NUM個大於LEVEL的取樣則記錄聲音nSAVE_LENGTH = 8 # 聲音記錄的最小長度:SAVE_LENGTH * NUM_SAMPLES 個取樣n# 開啟聲音輸入npa = PyAudio()nstream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True,n frames_per_buffer=NUM_SAMPLES)\nstring_audio_data = stream.read(NUM_SAMPLES)n # 將讀入的數據轉換為數組n audio_data = np.fromstring(string_audio_data, dtype=np.short)n # 計算大於LEVEL的取樣的個數n large_sample_count = np.sum( audio_data > LEVEL )nn temp = np.max(audio_data)n if temp > 2000 and t == 0:n t = 1#開啟錄音n print "檢測到信號,開始錄音,計時五秒"n begin = time.time()n print tempn
5:樹莓派下使用arecord進行錄音
這裡主要還是記錄下整體的一些資料.在樹莓派上能夠成功運行下面的命令就算ok.別的是一路研究的資料.
sudo arecord -D "plughw:1,0" -d 5 f1.wav
參數釋義: -D這個參數的意思就選擇設備,外部設備就是plughw:1,0 內部設備就是plughw:0,0,樹莓派本身並沒有錄音模塊,故沒有內部設備。-d 5
的意思就是錄製時間為5秒,如果不加這個參數就是一直錄音直到ctrol+C停止, 最後生成的文件名字叫做f1.wav
百度語音要求的是16比特的所以還需要設定-f
具體pcm的說明如下:
這都是PCM的一種表示範圍的方法,所以表示方法中最小值等價,最大值等價,中間的數據級別就是對應的進度了,可以都映射到-1~1範圍。
- S8: signed 8 bits,有符號字元 = char, 表示範圍 -128~127
- U8: unsigned 8 bits,無符號字元 = unsigned char,表示範圍 0~255
- S16_LE: little endian signed 16 bits,小端有符號字 = short,表示範圍 -32768~32767
- S16_BE: big endian signed 16 bits,大端有符號字 = short倒序(PPC),表示範圍 -32768~32767
- U16_LE: little endian unsigned 16 bits,小端無符號字 = unsigned short,表示範圍 0~65535
- U16_BE: big endian unsigned signed 16 bits,大端無符號字 = unsigned short倒序(PPC),表示範圍 0~65535
- 還有S24_LE,S32_LE等,都可以表示數字的方法,PCM都可以用這些表示。
- 上面這些值中,所有最小值-128, 0, -32768, -32768, 0, 0對應PCM描敘來說都是一個值,表示最小值,可以量化到浮點-1。所有最大值也是一個值,可以量化到浮點1,其他值可以等比例轉換。
PCMU應該是指無符號PCM:可以包括U8,U16_LE,U16_BE,...
PCMA應該是指有符號PCM:可以包括S8,S16_LE,S16_BE,...查看音效卡
cat/proc/asound/cards nncat/proc/asound/modulesn
6:整體調試linux平台下的
源代碼如下:解析在注釋上
比較長,請從github獲取。n
7:主要bug解析
這裡算是解析一下主要坑的地方.除了環境因素,就是中文編碼,還有對象解析了.源代碼中從百度語音識別出來返回的是一個字典對象,而字典對象中有部分是直接一個字元串,有的則是數組,首先得讀出字元串來確定是否是succees.然後再讀取text數組.中的中文.
另外一個bug是中文編碼.要這麼處理
import sysnreload(sys)nsys.setdefaultencoding( "utf-8" )nn#還有nn#print 機器人: .decode(utf-8) + dic_json[text]n#huida = .decode(utf-8) + dic_json[text]na = dic_json[text]nprint type(a)nunicodestring = ann# 將Unicode轉化為普通Python字元串:"encode"nutf8string = unicodestring.encode("utf-8")n
然後移植到樹莓派上出現的主要問題是有aercode命令出現文件目錄找不到.那麼說明是你音效卡選擇錯了,錄音聲音太小了也是,使用alsamixer選擇清楚.
還有錄音識別效率問題,問題主要集中在百度有他的要求,所以得設定16bit.然後再聽一遍錄製的聲音,看看音量會不會太大,,有沒有很粗糙的聲音.最好能分開測試
8:源代碼-樹莓派環境下
pyaudio錯誤得我不要不要的,,所以還是繞開,使用aercode進行錄音命令,然後python進行掉用..代碼也短很多,但是失去了實時處理音波的能力.
代碼比較長,請從github獲取n
原創文章,轉載請註明: 轉載自URl-team
本文鏈接地址: python語音智能對話聊天機器人,linux&&樹莓派雙平台兼容
Related Posts:
學習—用 Python 和 OpenCV 檢測和跟蹤運動對象 (4)使用pyaiml機器人模塊快速做個和你智能對話的大腦 (4)基於樹莓派以及語音與人臉識別的迎賓機器人交互系統開發計劃(已完結github中) (3)樹莓派開機左上角游標閃爍無法進圖形系統問題解決 (3)百度語音識別api使用python進行調用 (3)讓樹莓派開機運行Python腳本 (3)
推薦閱讀:
※有誰用過V-REP嗎?給新手一些指導吧
※如果智商可以科學的量化,那用它來進行人的階級分層違背倫理嗎?
※2016 美國機器人路線圖報告解讀-醫療機器人
※能征服崎嶇道路的 MARLO,會跟波士頓動力一樣靈活嗎?
TAG:Python | 树莓派RaspberryPi | 机器人 |