前言
我最近一直在搞一个名叫 A. N. N. A. 的 Python 语音机器人项目(Anna 是什么单词的缩写我就不说了,自己猜去),需要用的强大的语音识别技术。翻看全网教程,没有一篇说的通的,要么就是教会如何购买百度AI会员,要么就是教如何翻墙使用谷歌语音……
我最近发现PocketSphinx语音识别很不错,但是全网还是没有哪篇文章会告诉你,如何从头到尾下载这个库,用这个库进行语音识别,并且不在电脑上留下任何垃圾,可以随时删除的安装方法。然后你又会抱怨PocketSphinx有多么垃圾。
在这篇文章里,我将告诉你如何安装pocketsphinx,并将其嵌入speech_recognition库,来更好地实现最终的语音转文字。
电脑环境
- 系统:
macOS Catalinav10.15.3; - 软件
Xcodev11(版本其实无所谓);Homebrew(安装命令:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)")Python 3
安装PocketSphinx
我们先来看一下PocketSphinx的依赖关系图:
PocketSphinx
|
|-- SphinxBase
| |--libogg
| |--libvorbis
| |--flac
| |--libsamplerate
| `--libsndfile
`-- Swig
`--PCRE
- 打开终端,运行如下
brew命令:
$ brew install pcre
$ brew install swig
其中,swig是pocketsphinx的依赖,pcre是swig的依赖。别听网上瞎说什么swig要自己编译,根本不用,直接用brew安装即可
- 再使用
brew安装SphinxBase:
$ brew install SphinxBase
这个命令会将SphinxBase及其所有依赖安装到电脑上。现在,brew list应该如下:
index_out_of_range@imac ~ % brew list
cmu-sphinxbase libogg libvorbis portaudio
flac libsamplerate openssl@1.1 swig
ldid libsndfile pcre
注:
portaudio、ldid和openssl是我自己安装的,不用安装。
- 克隆
PocketSphinx仓库,我们要在之后的步骤手动安装仓库,别问我为什么:
git clone git@github.com:cmusphinx/pocketsphinx.git
# 或者(推荐)
git clone --recursive https://github.com/cmusphinx/pocketsphinx.git
# cd 到仓库
cd pocketsphinx-python
注意:必须clone,直接下载仓库会有文件缺失,因为这个库引用了其它仓库代码。如果网速太慢,可以fq或者把仓库导入gitee。
- 使用
vim更改关键文件(如果直接用pip安装,会有文件出错1):
vim deps/sphinxbase/src/libsphinxad/ad_openal.c
接下来用vim把
#include <al.h>
#include <alc.h>
改为
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
- 使用
setup.py安装(至关重要的一步,仔细看命令!):
python3 setup.py install
注意是python3而不是python。我一开始没加3,结果安装到python2系统目录去了。
测试安装
使用如下命令测试PocketSphinx是否安装成功:
index_out_of_range@imac ~ % python3
Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pocketsphinx
>>>
如果像我一样import没有报错,就是安装成功了!
语音识别
英文识别
安装完PocketSphinx后,就进入到我们的第二个阶段,嵌入speech_recognition模块进行语音识别了。你可以将speech_recognition模块理解为众多语音识别SDK与API的一个高层封装模块。使用pip install SpeechRecognition安装即可。
接下来,新建一个.py文件,输入如下代码:
# 注:安装时用的是 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)
# 打印并返回结果
print(result)
return result
if __name__ == '__main__':
recognize(r, mic)
使用终端运行代码(我用VSCode不知为何打不开麦克风):程序首先会打印Please wait...,等待一会Please wait...会变成Say something:,之后说一句英文(比如hello),程序就会打印出hello。
但是问题来了,我们是中国人啊!于是你把recognize(r, mic)改成了recognize(r, mic, lang="zh-CN"),程序报错了。
中文识别
说白了,程序的报错原因就是你没有中文语言模型,PocketSphinx是默认只有英文的。接下来我们添加中文模型:
- 到 SourceForge 的这个项目里,找到 Mandarin(普通话),点进去有个
tar包,下载下来并解压。 - 将解压出的目录改名为
zh-CN,拖动到/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/speech_recognition/pocketsphinx-data/目录下。 - 按图中方式,将
zh-CN目录里的文件按en-US目录里文件的命名规律改名:
现在把程序里recognize(r, mic)改成recognize(r, mic, lang="zh-CN"),程序成功运行!不过通过实验发现,这个模型识别出来的中文貌似很垃圾……只能自己训练模型了……
END
https://github.com/bambocher/pocketsphinx-python/issues/28 ↩︎