python基于PocketSphinx实现简单中文语音识别(可自定义中文词)

源码网址:PocketSphinx_Speech_Recognition

一、实现环境

系统环境:win 10

编译环境:Pycharm 2020.1.4 x64

编程语言:python 3.8.3

依赖库的版本:

  • SpeechRecognition 3.8.1
  • PocketSphinx 0.1.15
  • PyAudio 0.2.11
  • Numpy 1.18.1
  • Scipy 1.5.1
  • wave 0.0.2

如果需要识别之后有电子语音回馈,还需要安装:

  • playsound 1.2.2
  • pyttsx3 2.90

二、实现思路:

  1. 获取识别音频;
  2. 提取音频有效值( 音频预处理 );
  3. 下载并安装PocketSphinx;
  4. 制作中文命令词库;
  5. 使用PocketSphinx进行简单的语音识别;

注:其中第1、2两步代码来自 rocketeerLi 大神,此处附上 rocketeerLi 大神的 计算机视听实验 github 网址 计算机视听实验

三、具体实现步骤:

1、获取识别语音:

通过 pyaudio 和 scipy.fftpack 实现;

2、提取音频有效值( 音频预处理 ):

运用双门限法进行音频有效值提取;( 这段代码真的很感谢 rocketeerLi 大神的分享,音频的预处理实在是困扰了我好久,直到看到了 rocketeerLi 大神的文章才解决了我将数学函数代码化的问题 )

原理文章:

语音短时能量计算——Python实现

语音短时过零率计算——Python实现

双门限法语音端点检测(Python实现)

更新短时过零率/github

3、下载并安装PocketSphinx:

这一步网上基本上都有相关的教程,我在这里就不过多的赘述,大家可以自行在网上查找教程;

4、制作中文命令词库:

这一步一定要耐心!一定要耐心!一定要耐心!

按照步骤一步一步来一定能完成的,一定要耐心!

  • 找到 SpeechRecognition 安装位置,例如我的安装位置为:C:\Users\hp\AppData\Local\Programs\Python\Python37\Lib\site-packages\speech_recognition
  • 打开 pocketsphinx-data 文件夹,会发现里面有一个名为 en-US 的文件夹,这个文件夹就是 PocketSphinx 的识别库;
  • CMU Sphinx 打开此网站,找到 Mandarin 点进去并下载其中的压缩包并解压;
  • 解压并得到 “cmusphinx-zh-cn-5.2” 文件夹,在其中找到 zh_cn.dic 文件,以记事本打开,因为数据量比较大,所以打开的时候可能会卡顿一下。这个文件就是中文的对照表,一定要保存好;
  • 在桌面新建一个文件夹,并在里面创建一个名为 command.txt 的文件,在文件中写下你想要定义的中文词汇,例如:
开门
西瓜开门
  • Sphinx Knowledge Base Tool – VERSION 3 打开此网站,上传刚刚我们写好的 txt 文件并点击 “COMPILE KNOWLEDGE BASE” 按钮,跳转到新页面后,点击最后一个文件,网页将会自动下载,下载好后解压到桌面;
  • 选取文件类型为 “dic”、“lm” 的两个文件剪切到刚刚创建 txt 的文件夹下,将两个文件分别重命名为:
language-model.lm.bin
pronounciation-dictionary.dict
  • 打开之前的中文对照表 “zh_cn.dic” 文件,打开我们刚刚改名的 “pronounciation-dictionary.dict” 文件,在 “zh_cn.dic” 文件按下 Ctrl+f 搜索你的自定义词汇,复制其中的译音文字,粘贴到我们 “pronounciation-dictionary.dict” 文件中相对应的词汇后面,如果中文对照表中没有你要的词,可以单个字搜索,然后拼接起来,例如:
开门	k ai1 m en2
西瓜开门	x i1 g ua1 k ai1 m en2

(注意:中文和译音文字之间有一个Tab的空格,每个译音文字之间有个空格,比如 “西瓜 x i1+空格+g ua1”)
  • 保存文件后,将我们自己的两个文件替换掉 “cmusphinx-zh-cn-5.2” 文件夹中的 “zh_cn.dic” 文件和 “zh_cn.lm.bin” 文件(注意,记得先将 “zh_cn.dic” 文件先保存到另一个地方,方便以后自定义词汇时使用),将 “cmusphinx-zh-cn-5.2” 文件夹名称改为 “zh-CN” ,打开 C:\Users\hp\AppData\Local\Programs\Python\Python37\Lib\site-packages\speech_recognition 将文件夹放进去,参照 “en_US” 文件夹中的命名,将 “zh-CN” 文件夹中的文件检查一边,没有按照 “en_US” 文件夹命名的,全都更改过来;

至此,中文命令词汇自定义完成。调用方法:

print(r.recognize_sphinx(audio, language='zh-cn'))	# 输出识别到的中文词汇

5、使用PocketSphinx进行简单的语音识别:

直接调用已安装好的 PocketSphinx API 即可,注意 SpeechRecognition 在导入时需要写成 speech_recognition 的形式,否则会报错;

SpeechRecognition 库的具体用法可以参考以下文章:

Python实现语音识别:SpeechRecognition

注意:这里的识别表现出来的反应基本在 7s 左右,其实不是识别的速度慢,而是 pyttsx3 的语音回馈慢,自定义词的识别速度与您自定义词库的大小有关,一般自定义词库的识别速度在 1~2s 左右,当然,要想提高 pyttsx3 语音回馈的反应速度也有其他的解决方法,就是将您希望用到的回馈语音先保存下来,提取有效片段,在语音识别完成后利用 Playsound库进行播放也可以达到高速反应的目的;

至此,pyhton基于PocketSphinx实现简单语音识别项目结束

如果您对项目有什么疑问,欢迎您给我发送邮件进行讨论:damowangazhong@gmail.com

特别感谢 rocketeerLi 大神,虽然我们素未谋面,但是您的文章确实对我启发极大,解决了我在这个项目上的大部分疑问,希望大家也去看看 rocketeerLi 大神的文章,真的写得很棒!

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐