对于语音识别,算是在应用的热门方向,我们也能用语音玩出很多花样,比如语音控制设备,成语接龙游戏.因此特别研究了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仍然是网络原因