實現最小化的智能語音系統
主要概念:
- TTS(text-to-speech): 文字轉語音系統是將一般語言的文字轉換為語音;暫且類比為人的嘴巴??。
- STT(speech-to-text): 語音轉文字,即語音識別;通過電腦自動將人類的語音內容轉換為相應的文字;暫且類比為人的耳朵??。
- Logic Engine: 邏輯處理引擎,控制中心;暫且類比為人的大腦??(brain)。
基本思路:
- 機器是不知道一段語音的意思,需要通過文字來做媒介傳遞信息;所以要實現人和機器互動,需要將人的語音轉換成文字(STT,耳朵??),然後對文字進行分析處理得到一系列的操作指令(Brain,大腦??),指令再控制機器講話,即播放一段語音(TTS,嘴巴??)
Python + baidu api實現:
百度有api可以支持語音識別,文檔地址:百度語音-文檔中心。
對於TTS,使用baidu api上傳一段文字,可以得到對應的一段音頻文件;
對於STT,使用baidu api上傳一段音頻文件,可以得到對應識別文字;
對於Brain,可以對一些簡單的指令返回一些文字;如:TTS裡面的 『天氣』 二字可以讓大腦(Brain)去查詢天氣信息回來,給到TTS。
1、獲取Baidu token:
// API Key = iambaiduapikey// Secret Key = iambaidusecretkey// 注意更換自己的api key 和secret key$ curl -XGET http://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=iambaiduapikey&client_secret=iambaidusecretkey// 返回結果裡面的access_token即接下來使用到的token{ access_token: , // ??這個就是token session_key: , scope: , refresh_token: , session_secret: , expires_in: }
2、TTS
- baidu tts api
{ tex: , // 轉語音的文本 lan: , // 語言: zh tok: , // token(參考1) ctp: 1, // 客戶端類型選擇,web端填寫固定值1 cuid: , // 用戶唯一標識,python可用:str(get_mac())[:32] 生成 per: 0 // 語音發聲人:0 | 1 | 3 | 4}$ curl -XGET https://tsn.baidu.com/text2audio?tex=***&lan=zh&cuid=***&ctp=1&tok=***
上面得到的音頻文件即文本通過baidu轉換出來的語音了,得到語音還需要自動播放才更自然。播放則簡單的多,自需要使用機器自帶的播放功能即可。
// 在mac os下可以通過play播放音頻文件$ play test.mp3// 在ubuntu/centos下可以通過aplay播放$ aplay test.ma3
3、STT
- baidu stt api
curl --request POST --url http://vop.baidu.com/server_api --header content-type: application/json --data { "format": "wav", // 文件格式,wav | pcm | amr "token": "", // token(參考1) "len": "", // 語音文件位元組數 "rate": 16000, // 採樣率:16000 "speech": "", // 語音文件的的二進位語音數據,需要進行base64編碼 "cuid": "", // 用戶唯一標識,python可用:str(get_mac())[:32] 生成 "channel": 1 // 聲道數: 1 }
上面data裡面的參數相對複雜一下,在python中可以通過wave打開音頻文件,然後得到相應的參數:
wave_file = wave.open(test.wav, rb)frames = wave_file.getnframes()frame_rate = wave_file.getframerate()audio = wave_file.readframes(frames)base_data = base64.b64encode(audio)cuid = str(get_mac())[:32]"""post body裡面的data可以從上面的數據中獲得了: len = len(audio) rate = frame_rate speech = base_data cuid = cuid"""
4、Brain
要知道一段文本的意思,需要分詞斷句,分析語法,中文博大精深,還需要知道一些口語意思。涉及到自然語言處理(NPL),同樣可以使用第三方服務api:如百度AI。在這裡簡單的介紹對『天氣』二字進行處理。
def say(text): # 運行TTS模塊進行播放文本speech_text = 今天的天氣如何?words_of_speech = speech_text.split()checking = [天, 氣]if set(checking).issubset(set(words_of_speech)): return say(今天多雲,溫度介於18度到23度之間,出行記得帶雨傘哦。)else: return say(您可以試試問我天氣如何。)
上面這個簡單的大腦只能處理天氣,而且是很蠢的大腦。因為,只要你說的話裡面包含了『天』 和 『氣』,他就會告訴你天氣了。比如:你說,「今天我好氣啊!!」,檢測到有『天』 『氣』,大腦返回天氣信息。然而這段話並不是在問天氣,所以對於自然語言的處理需要大量的機器學習才能達到一個較好的效果。
示例中使用了少量Python代碼做解釋,其實通過以上的分析,可以用任何語言去構建一個簡單的語音系統。
除了上述的內容外還有關鍵詞喚醒(如:hey siri / ok google)等,後續添加。
推薦閱讀:
※Hover Camera:無人機勇士還是烈士?
※科技的封閉與自由
※為什麼諾基亞可以生產這麼多種機型?
※蘋果怎麼了?美國消費者對蘋果公司信任度排名墊底
※不用 https 的網站在想什麼?