从零开始的ASR(语音识别)之旅


文章目录

  • 从零开始的ASR(语音识别)之旅
  • 一、语音识别简介
  • 二、将文字内容转换为语音实际代码演示
  • 1、使用pyttsx3实现文字转换成语音功能
  • 2、使用win32com.client自带的Dispatch包实现文字转换成语音功能
  • 3、使用SpeedLib实现文字转换成语音文件的功能
  • 三、将人类的语音内容转换为相应的文字
  • 1、使用PocketSphinx实现将英文语音转换成文字
  • 2、使用PocketSphinx实现将中文语音转换成文字
  • 四、结语


一、语音识别简介

语音识别技术,也被称为自动语音识别Automatic Speech Recognition,(ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。与说话人识别及说话人确认不同,后者尝试识别或确认发出语音的说话人而非其中所包含的词汇内容。
分为两部分

  1. 自动将人类的文字内容转换为相应的语音
  2. 自动将人类的语音内容转换为相应的文字

二、将文字内容转换为语音实际代码演示

这里有三种方法分别是使用pyttsx3包、win32com.client自带的Dispatch包、SpeedLib包。

1、使用pyttsx3实现文字转换成语音功能

a. 安装pyttsx3包

pip install pyttsx3 -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:这里最好使用Anaconda3创建一个新的环境安装好包后,在pycharm上运行。
b.将字符串转化成语音

# 01demo 使用pyttsx实现文本转换成语音
import pyttsx3 as pyttsx #换名换成pyttsx,没有什么用处问就好记
speaker=pyttsx.init()    #初始化一个pyttsx对象
speaker.say('Hello World,你好世界')   #运行say函数
speaker.runAndWait()     #运行并等待say end,不加这个就不会运行

运行结果截不了图,就不截了。
c.将文本内容转换成语音

# 01demoe 使用pyttsx实现文本转换成语音
import pyttsx3 as pyttsx #换名换成pyttsx,没有什么用处问就好记
speaker=pyttsx.init()    #初始化一个pyttsx对象

with open('in.txt','r',encoding='utf-8') as f:  #打开in.txt文本
    for line in f:
        speaker.say(line)

speaker.runAndWait()     #运行并等待say end

2、使用win32com.client自带的Dispatch包实现文字转换成语音功能

注:使用这个方法有一个好处就是不用下载额外的包可以直接运行
a.将字符串转化成语音

# 02demo 使用Dispatch 实现文本转换成语音
from win32com.client import Dispatch #加载Dispatch  包
speaker=Dispatch('SAPI.SpVoice')     # 生成一个Dispatch对象
speaker.Speak('Hello World,你好世界')  #巴拉一句话
del speaker                          #删除Dispatch对象

注1:pyttsx3的文本转换成语音的效果比自带的Dispatch 的SAPI好一点。
注2:这个将文本转换成语音的代码基本一致

3、使用SpeedLib实现文字转换成语音文件的功能

#demo3 使用SpeechLib,从文本输入并转换成语音

#一、创建speaker和stream对象
from comtypes.client import CreateObject
speaker=CreateObject("SAPI.SpVoice")
stream=CreateObject('SAPI.SpFileStream')

#二、获取输入输出文件地址
from comtypes.gen import SpeechLib
infile='in.txt'         #输入文件
outfile='out_audio.wav' #输出语音

# 三、将speaker语音输出流接到outfile里
stream.Open(outfile,SpeechLib.SSFMCreateForWrite)#将流stream与输出outfile地址所在文件绑定
speaker.AudioOutputStream=stream                 #将管道流stream接到speaker的语音输出里面
                                                 # 这样speaker就能输出out_audio.wav文件里面了

#四、获取infile文件内容
f=open(infile,'r',encoding='utf-8')
theText=f.read()                 #infile文件内全部内容都保存在theText中
f.close()

#五、利用SAPI方法输出文本内容,该输出内容会被输出到outfile中
speaker.speak(theText)           #speaker开始输出,在没有第11行之前是默认输出到标准输出流也就是说出来
                                 #现在修改管道流之后就变成输出到out_audio.wav了

#六、释放资源
stream.close()
del speaker

三、将人类的语音内容转换为相应的文字

PocketSphinx 是一个用于语音转换文本的开源API.它是一个轻量级语音识别引擎。在手机端和移动设备也能很好的工作

1、使用PocketSphinx实现将英文语音转换成文字

a.安装PocketSpinx包

pip install PocketSphinx -i https://pypi.tuna.tsinghua.edu.cn/simple/

当然这样子安装经常会遇到如下报错:

语音识别如何编码 语音识别程序怎么做_人工智能


如果报错了可以按照如下两种方法:

  • 参考方案a:从以下网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#pocketsphinx,下载离线包,我的python是3.8,64位,所以就下的pocketsphinx‑0.1.15‑cp38‑cp38‑win_amd64.whl,下载完成后,通过命令pip install pocketsphinx‑0.1.15‑cp38‑cp38‑win_amd64.whl 完成安装
  • 参考方案b:从官网上下载的swig最新压缩包4.0.2,官网地址为: http://www.swig.org/download.html.
    将下载好的文件解压缩到C盘根目录下。
    然后,在环境变量中新增加一条该文件的path路径。最后重新执行一遍pip install PocketSphinx -i https://pypi.tuna.tsinghua.edu.cn/simple/

b.安装SpeechRecognition包

pip install SpeechRecognition -i https://pypi.tuna.tsinghua.edu.cn/simple/

c、实现英文语音转换成文本的程序

#一、初始化一个speed_recognition对象
import speech_recognition as sr
r=sr.Recognizer()

#二、打开语音文件并编码后保存在audio中
audio_file='out_audio1.wav'
with sr.AudioFile(audio_file) as source:
    audio=r.record(source)

#三。将语音转换为文本
print('文本内容:',r.recognize_sphinx(audio))

注:由于recognize_sphinx默认语言模型是英文,所以如果有中文容易产生不是乱码的乱码。

2、使用PocketSphinx实现将中文语音转换成文字

a.下载普通话包

https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Mandarin/

语音识别如何编码 语音识别程序怎么做_人工智能_02


b.将包放到正确的位置

语音识别如何编码 语音识别程序怎么做_人工智能_03


这是我放置的位置

c.修改cmusphinx-zh-cn-5.2包名字为ze-CN同时修改文件夹里面的文件名字

语音识别如何编码 语音识别程序怎么做_初始化_04

名字参考里面,如果担心打错字可以copy隔壁en-US文件夹里面的对应文件的对应名字
d.使用PocketSphinx实现将中文语音转换成文字

# 04使用PocketSphinx完成语音转换成文本.py
#一、初始化一个speed_recognition对象
import speech_recognition as sr
r=sr.Recognizer()

#二、打开语音文件并编码后保存在audio中
audio_file='out_audio1.wav'
with sr.AudioFile(audio_file) as source:
    audio=r.record(source)
    
#三、将语音转换为文本
print('文本内容:',r.recognize_sphinx(audio,language='ze-CN'))

注1:与上一个程序唯一的区别就是修改了recognize_sphinx函数内语言默认参数为刚刚下载的普通话包
注2:不能转换英文为文本
注3:在这里我用PocketSphinx 做为例子,当然大家可以最新的Vosk库来实现相同的功能,那个可能更好一点,有时间我再过来更新这篇博客

四、结语

本篇博客,只是为了补充当前csdn缺少可以一套完整的入门代码,要真正走语音识别这一方向还有很多路要走,很多原理要学,加油奥。