python語音智慧對話聊天機器人,linux&&樹莓派雙平臺相容

路易十四發表於2016-08-19

專案簡介:運用百度語音進行聲音轉中文的識別與合成,智慧對話使用圖靈機器人,錄音則,linux端用pythonaudio 模組.樹莓派端因為pythonaudio不相容問題,因此用arecord進行錄音.最終程式碼約150行.程式碼釋出在github上.https://github.com/luyishisi/python_yuyinduihua

0.目錄:

  • 1:環境搭建
  • 2:百度語音合成與識別
  • 3:圖靈機器人
  • 4:linux下使用pythonaudio進行音訊解析
  • 5:樹莓派下使用arecord進行錄音
  • 6:linux整體除錯
  • 7:主要bug解析
  • 8:原始碼樹莓派下的

1.環境搭建

這點非常關鍵,在後期多數問題都是出現在環境不相容上.

1.1:linux 版本

這部分環境最好搭建,只需要

apt-get install python-wave* 這類的安裝命令就可以輕鬆搞定.本質上安裝模組就是在找安裝的命令.我一半就是把模組肯定會有的名詞後面接上*用於模糊匹配.

如果有模組不懂得裝,還是百度一下,難度不大.還有mpg123用來播發

1.2:樹莓派版本

如果你出現這個博文下出現的錯誤,請果斷棄坑.換用命令列錄音實現,不要折騰pyaudio了.

主要使用的工具

想通過終端來調整揚聲器的音量,只需要輸入alsamixer.這個很重要你使用的錄音裝置的錄音音量需要這裡設定,而且你可以明顯的看到自己的音效卡是否有問題.

使用的錄音裝置我用的是 https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-3667091491.40.mktumv&id=41424706506

錄音的命令使用的是arecord

arecord,aplay是命令列的ALSA音效卡驅動的錄音和播放工具.
arecord是命令列ALSA音效卡驅動的錄音程式.支援多種檔案格式和多個音效卡.
aplay是命令列播放工具,支援多種檔案格式.

命令格式:這部分需要研讀一下.主要使用dfr三個引數

示例:

2:百度語音合成與識別

這部分難度不大,測試程式碼如下.

3:圖靈機器人

官方網址:http://www.tuling123.com/

圖靈機器人部分的測試程式碼

難度不大非常輕鬆.你得去註冊一下,然後使用他們給你的key和api.剩下的就是json的文字提取

4:linux下使用pythonaudio進行音訊解析

這部分,在正常電腦上,只要環境沒有大問題就很輕鬆,程式碼放在整體的原始碼中,這裡做個小說明.

這部分程式碼不可執行,在整體原始碼中可以.不過這部分稍微需要抽取出來,作為理解

建立的pa是pyudio物件,可以獲取當前的音高,然後檢測當音高超過200就啟動,錄音.同時有一個5秒的額外限制.

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,…

檢視音效卡

6:整體除錯linux平臺下的

原始碼如下:解析在註釋上

7:主要bug解析

這裡算是解析一下主要坑的地方.除了環境因素,就是中文編碼,還有物件解析了.原始碼中從百度語音識別出來返回的是一個字典物件,而字典物件中有部分是直接一個字串,有的則是陣列,首先得讀出字串來確定是否是succees.然後再讀取text陣列.中的中文.

另外一個bug是中文編碼.要這麼處理

然後移植到樹莓派上出現的主要問題是有aercode命令出現檔案目錄找不到.那麼說明是你音效卡選擇錯了,錄音聲音太小了也是,使用alsamixer選擇清楚.

還有錄音識別效率問題,問題主要集中在百度有他的要求,所以得設定16bit.然後再聽一遍錄製的聲音,看看音量會不會太大,,有沒有很粗糙的聲音.最好能分開測試

8:原始碼-樹莓派環境下

pyaudio錯誤得我不要不要的,,所以還是繞開,使用aercode進行錄音命令,然後python進行掉用..程式碼也短很多,但是失去了實時處理音波的能力.

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

python語音智慧對話聊天機器人,linux&&樹莓派雙平臺相容

相關文章