语音识别(上)


经常看国外电视剧的读者,要不自身英语水平非常高,要不就依赖字幕。以前有好事者给大家翻译制作字幕,现在人人字幕倒了,只好自己找字幕或者自行制作了。此时,语音识别就大显神通了。语音识别源于20世纪50年代早期在贝尔实验室所做的研究。早期语音识别系统仅能识别单个讲话者以及只有约十几个单词的词汇量。现代语音识别系统已经取得了很大进步,可以识别多个讲话者,并且拥有识别多种语言的庞大词汇表。语音识别的首要部分当然是语音。通过麦克风,语音便从物理声音被转换为电信号,然后通过模数转换器转换为数据。一旦被数字化,就可适用若干种模型,将音频转录为文本。大多数现代语音识别系统都依赖于隐马尔可夫模型(HMM)。其工作原理为:语音信号在非常短的时间尺度上(比如10毫秒)可被近似为静止过程,即一个其统计特性不随时间变化的过程。许多现代语音识别系统会在HMM识别之前使用神经网络,通过特征变换和降维的技术来简化语音信号。也可以使用语音活动检测器(VAD)将音频信号减少到可能仅包含语音的部分。目前来看,国内对中文语音识别比较好有迅飞科技、百度等。迅飞以语音识别起家,再到上市,实力不容怀疑。也提供了开发者API,能够线上翻译。百度也提供了多个方向的线上API。线上API虽好,但对于很多只能够线下的应用开发来说,还是不够方便。其中,SpeechRecognition就因便于使用脱颖而出。SpeechRecognition库可满足几种主流语音API,因此灵活性极高。其中Google Web Speech API支持硬编码到SpeechRecognition库中的默认API密钥,无需注册就可使用。SpeechRecognition以其灵活性和易用性成为编写 Python 程序的最佳选择。读者可使用pip命令从终端安装SpeechRecognition:

# ubuntu bionic
apt install -y swig
apt install -y libpulse-dev pip install pocketsphinx
pip install SpeechRecognition
# 安装完成后请打开解释器窗口并输入以下内容来验证安装:
python
>>> import speech_recognition as sr
>>> sr.__version__
'3.8.1'

SpeechRecognition 的核心就是识别器类。Recognizer API 主要目是识别语音,每个 API 都有多种设置和功能来识别音频源的语音,分别是:

  • recognize_bing(): Microsoft Bing Speech
  • recognize_google(): Google Web Speech API
  • recognize_google_cloud(): Google Cloud Speech - requires installation of the google-cloud-speech package
  • recognize_houndify(): Houndify by SoundHound
  • recognize_ibm(): IBM Speech to Text
  • recognize_wit(): Wit.ai
  • recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx

以上七个中只有 recognition_sphinx()可与CMU Sphinx 引擎脱机工作, 其他六个都需要连接互联网。而Sphinx的安装也需要一些步骤。

  • 从swig download处下载操作系统对应的版本,尤其是windows操作系统,需要下载对应的压缩文件后,将swig.exe所在目录加入到环境变量中。
  • pip install pocketsphinx

下述代码演示了语音识别能力。

import speech_recognition as srdef stt_sphinx(filehandle,lan=None):r = sr.Recognizer()harvard = sr.AudioFile(filehandle)with harvard as source:audio = r.record(source)if not lan:print(r.recognize_sphinx(audio))else:print(r.recognize_sphinx(audio,language=lan))targetwav = r'D:\test\stt\en.wav'
stt_sphinx(targetwav)targetwav = r'D:\test\stt\zh.wav'
stt_sphinx(targetwav,"zh-CN")

缺省情况下,sphinx提供了对英文的识别能力。因此可以正确的识别en.wav的内容("i knocked at the door on ancient side of the building")。但识别中文时会出现错误,需要从网站上下载对于中文语音的识别模型。下载完成后需要解压缩,并且根据英文模型的布局生成一个新目录。

对解压缩后的文件以及子目录进行重命名,保持与图中名称的一致,就可以识别中文语音了。对于测试的zh.wav能够正确识别为"我 认为 跑步 最 主要 的 就 是 给 我 带来 了 身体 健康"。不过,recognize_sphinx对中文的识别率是不如recognize_google的,但由于众所周知的原因,google不好访问,需要读者自行解决联网的问题。