依稀記得去年生日,對著 Google 說 “Sing me Happy Birthday” 。
她真的給我唱了英文版的生日歌,滿懷深情地(我感覺……)。最後還加了一串調皮的鼓聲。
我轉頭對著公司的前臺小姐姐說,看見沒有,你的 Siri 不愛我。。。
基於以上的淵源,我用 Python 寫了一個還算得上智慧的語音助理。
截圖如下:
演示影片:用 Python 實現的智慧語音機器人(一)
原始碼
不要慌,用的是現成的框架和公共 API,一百來行程式碼而已,權當遊戲。
一、整體結構
沒有做過多的設計(不懂。。。),整體就是一個簡單的線性結構,順序執行。
一次互動完畢後,從頭開始重複執行。
SpeechRecognition(錄音)--> 百度語音(Speech-to-Text)--> 圖靈機器人(語義分析及應答)--> 百度語音(Text-to-Speech)--> PyAudio(音訊播放)
二、SpeechRecognition
SpeechRecogintion 是 Python 的一個語音識別框架,已經對接瞭如谷歌和微軟的 STT (語音轉文字)服務。
本專案裡的語音識別及合成用的是百度的開放服務,所以只是需要 SpeechRecogintion 的錄音功能。
它可以檢測語音中的停頓自動終止錄音並儲存,比 PyAudio 更人性化(程式碼寫起來也更簡單)。
安裝依賴庫
Windows
安裝 SpeechRecognition 需要提前裝好 Python 的 PyAudio 框架。PyAudio 貌似需要編譯安裝,Windows 系統上估計會有點麻煩。
我用的是 Anaconda 軟體,Windows 系統上用它管理 Python 包很方便。
嫌這個軟體太大的話,也有簡化版的 Miniconda 。
裝好以後直接執行下面的命令即可(當然也可以在 conda 的虛擬環境裡安裝,不贅述):
conda install pyaudio
PyAudio 裝好以後,直接使用 Python 的包管理工具 pip 安裝 SpeechRecognition 即可:
pip install SpeechRecognition
Linux
Linux 系統下就顯得省事一點了。可以直接使用系統自帶的包管理器安裝 PyAudio (如 Ubuntu 和 Raspbian 系統的 apt-get)
$ sudo apt-get install python3-pyaudio
當然也可以使用 pip 命令安裝,不過需要提前裝好編譯用的依賴庫 portaudio19 :
|
|
同樣的,PyAudio 裝好以後,安裝 SpeechRecognition :
pip install SpeechRecognition
錄音程式碼
|
|
從系統麥克風拾取音訊資料,取樣率為 16000(貌似百度語音 API 最高就支援到 16k 的取樣率)。
之後把採集到的音訊資料以 wav 格式儲存在當前目錄下的 recording.wav 檔案中,供後面的程式使用。
錄音完成後,可以找到錄好的音訊檔案試聽一下效果。
三、百度語音(STT)
建立應用
百度語音是百度雲 AI 開放平臺提供的支援語音識別和語音合成的服務,註冊以後就可以直接訪問它的 REST API ,並且有向普通使用者提供免費的呼叫額度。
註冊成功以後,進入語音服務的控制檯建立一個新的應用,記下自己的名字 AppID、API Key 和 Secret Key。
語音識別程式碼
百度 AI 有提供面向 Python 的框架 baidu-aip ,感覺就相當於重新打包以後的 requests 庫,用來訪問 REST API。這裡簡單起見,直接使用該框架。
安裝:
pip install baidu-aip
語音識別程式碼如下(程式碼中的 Key 替換成自己的):
|
|
簡單來說,將 SpeechRecognition 錄製的音訊上傳至百度語音的服務,返回識別後的文字結果並輸出。
四、圖靈機器人
圖靈機器人是一個提供(一定額度內)免費的智慧聊天服務的平臺,註冊以後就可以建立自己的智慧聊天機器人並接入到專案中。
首先進入圖靈機器人的控制檯並建立一個新的聊天機器人,記下分配到的 apikey。
該平臺也提供了開放的條件 REST API ,但是不像百度那樣打包自己的 SDK 。所以需要使用 Python 的 requests 庫訪問,程式碼如下:
|
|
簡單來說就是上傳一個 json 格式的請求(包含聊天內容和個人資訊等),獲取到回覆。再從收到的物件中提取出回覆的文字。
五、百度語音(TTS)
其實大部分系統都有內建的 TTS (即文字轉語音)引擎,如 MacOS 的 say 命令,只不過其中有很多都顯得太“機械”,呃,缺少“人情味兒”。。。
百度的 TTS 引擎語音效果聽起來還是很卡哇伊(4 號選手度丫丫)的,比較超出我的預期。
測試程式碼如下:
|
|
就是把需要轉換成語音的文字內容上傳,再將返回的資料儲存在本地。貌似只能生成 mp3 格式。
六、PyAudio 播放
這個我有點方,沒找到 Python 播放 MP3 的合適的方法,所以用 os.system 呼叫系統中的 sox 命令將 MP3 轉為 wav 格式,再用 PyAudio 播放。
sox 安裝
SoX 是一個強大的跨平臺的音訊處理工具,Linux 系統可以直接使用包管理器安裝:
$ sudo apt-get install sox libsox-fmt-mp3
Windows 系統安裝的預設的 SoX 是不包含 mp3 格式支援的,所以需要自己編譯(手動狗頭)或者下載已經編譯好的 dll 檔案(libmad.dll 和 libmp3lame.dll,放置在 SoX 的安裝目錄下。
最後將安裝目錄新增至系統的 PATH 環境變數即可。
程式碼如下:
|
|
七、最終程式碼及影片演示
整合後的最終程式碼我就不再貼一遍了,100 行左右,已上傳至 Github 。
影片效果:https://www.bilibili.com/video/av45532338/
聊天截圖:
對了,這個是支援樹莓派的。不過需要額外裝一個USB音訊驅動作為錄音裝置。參考樹莓派3 音訊配置及其應用場景(錄音、VoIP 電話等)
參考資料
SpeechRecognition
百度語音
圖靈機器人
PyAudio
SoX原文連結:https://www.starky.ltd/2019/03/03/python-voice-assistant/