#頭條創作挑戰賽#
對于語音識别,算是在應用的熱門方向,我們也能用語音玩出很多花樣,比如語音控制裝置,成語接龍遊戲.是以特别研究了Python下的語音識别庫,基本使用最多的是 speech_recognition
語音識别庫speech_recognition的介紹
這個識别庫相當于網上好幾種識别引擎的的集合,把各種庫整合成統一的接口給開發者調用.
是以相當好用.相當于産家給的直接sdk,大大減少學習成本.
它目前支援如下7個識别引擎
- recognize_bing():Microsoft Bing Speech
- recognize_google(): Google Web Speech API
- recognize_google_cloud():Google Cloud Speech 需要安裝 google-cloud-speech包
- recognize_houndify(): Houndify by SoundHound
- recognize_ibm():IBM Speech to Text
- recognize_sphinx():CMU Sphinx - 需要安裝 PocketSphinx
- recognize_wit():Wit.ai
其中完全脫機是是 CMU(美國卡内基梅隆大學 )開發Sphinx引擎.其中PacketSphinx 是針對嵌入式裝置的版本.我們後面着力測試這個.
其餘幾個需要聯網在雲端識别,但是隻有Google Web Speech API内置預設 API 密鑰api key可以直接使用,但是google的位址需要調整一下才能在國内通路.
是以可以優先選擇這兩個包來測試
依賴包和本身的安裝
#Mac下聲音庫安裝,隻在Mac OSX下安裝
brew install portaudio
#語音播放及錄音功能需要
pip3 install pyAudio
#識别包安裝
pip3 install SpeechRecognition
#PacketSphinx 安裝
pip3 install PocketSphinx
下載下傳Sphinx模型檔案
PocketSphinx預設隻支援美國英語識别,如裡想支援其它語言,需要單獨下載下傳對應的模型檔案
下載下傳在其項目首頁 http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/
這裡的Mandarin 檔案就是國語模型,下載下傳為一個壓縮檔案
cmusphinx-zh-cn-5.2.tar.gz 解壓到模型檔案目錄
pip3 show SpeechRecognition
這裡提示的Location: /opt/anaconda3/lib/python3.9/site-packages
進入 speech_recognition/pocketsphinx-data 建立一個zh-CN,把壓縮檔案裡 zh_cn.cd_cont_5000檔案夾重命名為acoustic-model、zh_cn.lm.bin命名為language-model.lm.bin、zh_cn.dic中dic改為pronounciation-dictionary.dict
修正google連接配接不上
如果使用Google Web Speech 連接配接大機率連接配接不上.會報
speech_recognition.RequestError: recognition connection failed: [WinError 10060] 由于連接配接方在一段時間後沒有正确答複或連接配接的主機沒有反應,連接配接嘗試失敗。
可以換成google.cn的對應的api.方法如下,找到安裝包的目錄
pip3 show SpeechRecognition
這裡提示的Location: /opt/anaconda3/lib/python3.9/site-packages 就是安裝目錄
找到這個目錄下的 speech_recognition/__init__.py 修改Google的位址
在這個recognize_google()中url由google.com改為 google.cn
簡單代碼測試
使用麥克風輸入,可以簡單識别較短單詞
# 注:安裝時用的是 SpeechRecognition 這一名稱,但是注意 import 時要用 speech_recognition 這一名稱。
import speech_recognition as sr
r = sr.Recognizer()
mic = sr.Microphone()
def recognize(r, mic, lang="en-US"):
print("Please wait...", end="") # 在開始錄音前等待
with mic as source:
r.adjust_for_ambient_noise(source)
backspace = "\r" * 14 # 倒退字元
print(f'{backspace}Say something: ', end="")
audio = r.listen(source)
# 調用識别函數(這個函數隻有安裝了 PocketSphinx 才能調用),具體方法看官方文檔
# result = r.recognize_sphinx(audio, language=lang)
result = r.recognize_google(audio, language=lang)
# 列印并傳回結果
print(result)
return result
if __name__ == '__main__':
recognize(r, mic,"zh-CN")
這裡主要識别代碼是在recognize(r, mic,"zh-CN") 函數裡,第三個參數指明識别語言,
裡面計用recognize_google()表示使用 Google Web Speed接口,注意中文要換成 "cmn-Hans-CN"
如果換成recognize_sphinx() 表示使用 sphinx()接口
實測sphinx可以識别中英文.但google仍然是網絡原因