python語音智能對話聊天機器人--linux&&樹莓派雙平台兼容

此項目只不過是之前大三剛學python就想做點好玩的項目試試看(因此技術含量不高),後來這個成為畢業設計的一部分,長期看博客上訪問量也不錯,就發布出來,希望有想入門python 的朋友可以參考寫來玩玩,用項目練技術,用成果獲取編碼的樂趣。

-------------------*********---------********

項目簡介:運用百度語音進行聲音轉中文的識別與合成,智能對話使用圖靈機器人,錄音則,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了.

komey.utdme.com/archive

##先更新軟體包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 | 机器人 |