语音识别实战(python代码)(一)

Posted 逆境清醒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语音识别实战(python代码)(一)相关的知识,希望对你有一定的参考价值。

语音识别实战

(python :pyttsx、SAPI、SpeechLib实例代码)(一)

本文目录:

一、语音识别的基本原理

(1)、语音识别的起源与发展

(2)、语音识别的基本原理

(3)、语音识别过程

(4)、语音识别的近期发展

二、Python 语音识别

(1)、文本转换为语音

(2)、文本转存为语音文件wav

三、总结


一、语音识别的基本原理

(1)、语音识别的起源与发展

  语音识别是一门涉及声学、语言学、信号处理、模式识别、心理学,以及计算机科学等多个学科领域的复杂交叉技术学科。

  语音识别技术的发展:

(2)、语音识别的基本原理

  对普通人来说,我们通常感觉语音是由一个个单词构成,但它是如何产生和被我们感知的?

  其实,语音是一种连续动态的音频流,由一部分相当稳定的状态与诸多动态变化的状态混合而成。在这种状态序列中,人们可以定义或多或少类似的声音或音素。

  语音是随时间变化的语音动态波形。

  一个典型的语音对话系统一般包括如下几个技术模块:

  • 对话管理器(Dialog Manager)
  • 语音识别器(Speech Recognizer)
  • 语言解析器(Language Parser)
  • 语言生成器(Language Generator)
  • 语音合成器(Speech Synthesizer)

  其中,语音识别器(又可称为语言识别模块或者语言识别系统)主要用于将用户输入的语音转换为文本。

 (3)、语音识别过程

  语音识别的一般方法是:

  首先,声音输入,提取一个波形,然后,将波形分解为语音片段并尝试识别每个语音片段中所包含的内容。

  通常情况下,要做到这一点,我们需要尝试将所有可能的单词组合与音频进行匹配,最后选择最佳匹配组合,这时就要依赖声音模型、语音模型、各种发音词典。在这个匹配过程中,由于参数的数量很大,需要对其进行优化。一般来说,会将语音分成小单位的帧,然后,对于每帧(通常为时长10ms左右),提取出39个代表语音特征的数字,这些数字即语音特征向量。

  语音识别过程示意图:

  语音识别是一个先编码后解码的过程。其中,信号处理(Signal Processing)与特征提取(Feature Extraction)是语音识别系统的开始,这是一个编码的过程。

  特征提取是指从原始的语音输入经过相应处理后得到语音特征向量。

  语言模型:当若干词组成的一个序列合乎语法时,这个序列才能算是一个句子,因此,人们在语音识别中引入了语言模型来实现这种约束。

  当前的语言模型主要有基于句法的语言模型和基于统计的语言模型两大类。

  句法语言模型(Syntactic Language Model),也称确定性语言模型(Deterministic Language Model)或形式语言模型(Formal Language Model),是人工对人类语言的内在规律总结出一套形式上可以推理和扩展的文法,对识别结果中不符合文法的结果进行排除。这种方法在某些识别任务中能够获得很好的效果。

  基于统计的语言模型对大量文本中的词的出现频率及其出现条件进行统计。通常我们将统计语言模型与声学模型结合起来完成识别任务,这可以降低因为声学模型的不合理带来的拒识率。 目前在大词汇量连续语音识别中常用的是 N-Gram 语言模型[23],对中文而言,我们称之为汉语语言模型(CLM,Chinese Language Model)。

    一个语言模型的质量的评价指标通常用语言模型复杂度(Perplexity)来表述,其定义为词序列概率的几何平均的倒数。公式:

   当复杂度越低,说明语言模型对当前词的预测确定程度越高。因此对语言模型的训练一般把训练语句的复杂度最小化作为目标。而实现这个目标,先要对训练语句中的词频进行统计,以此计算出语言模型的参数。而在词表很大而训练的数据不是充分多的时候,就会发生有些词的序列的概率很小或者没有出现过的情况(oov)。为了解决这些问题,就需要用到 discouting和 back-off等一些技术。

  一个语言模型的质量的评价指标通常用语言模型复杂度(Perplexity)来表述,其定义为词序列概率的几何平均的倒数。

(4)、语音识别的近期发展

  据:中国语音产业联盟《中国智能语音产业发展报告(2021-2022)》统计数据:

  从全球范围来看,2022年全球智能语音产业规模将达351.2亿美元,保持33.1%的高速增长;从我国来看,根据德勤统计数据,2022年我国智能语音市场将达341亿元,同比增长13.4%。

  科大讯飞、百度、阿里等龙头企业通过打造技术能力开放平台,构建开源生态,引领行业技术创新和应用开发。

  报告指出,我国智能语音企业在多项难点技术上实现新的突破。纵向上从语音识别、合成、翻译向计算机视觉、认知智能、运动智能领域延伸,横向上从单点技术突破模式发展到机器认知、多模式复杂场景应用。

  在语音合成方面,随着电商直播等行业的繁荣,语音合成技术也表现出拟人化、口语化的发展趋势。

  在语音识别方面,视听融合的多模态交互技术成为技术演进的主要方向。

  在工业领域,我国打造了包括国家智能语音创新中心在内的一批语音技术创新“国家队”, 开展工业声学、多语种、AI语音芯片等关键共性技术研究工作。

  在城市领域,智能语音技术已在安徽省一体化网上政务服务平台、聊城城市大脑、三亚市崖州湾科技城智慧产城园区、天津市AI银发智能服务平台等创新示范项目中应用。

  在医疗领域,智能外呼和智医助理可用于独居老人、留守儿童的日常关爱和兜底保障。

  在教育领域,利用智能语音和人工智能技术可实现英语听说教、学、考、评、管一站式服务,减少无效训练。

  在运营商领域,智能语音技术与健康养老、家庭教育、家庭娱乐等场景结合,带来更加智慧的家庭生活体验。融合5G与机器翻译技术的无障碍智能通信,让普通的5G手机用户,不用下载任何软件,就可以使用实时翻译和转写服务,实现跨语种的无障碍视频通话。

  在汽车领域,智能语音已成人机交互关键环节,并从车内交互衍生车外交互,从单模交互走向多模交互,从被动交互发展为主动交互,为车企提供全栈技术赋能。

  在消费者产品领域,AI学习机、翻译笔等AI+学习产品帮助学生学习减负增效;智能录音笔、智能办公本、智能鼠标等AI+办公产品深受职场人士欢迎;AI翻译机、智能麦克风、智能语音键盘、智能耳机、智能助听器等AI+生活产品,让更多人享受AI科技的便利。

  语音的发展路径:

  针对智能语音多学科交叉的学科特性,研究人员需要探索新原理、新机制、新材料、新工艺和新器件,集成创新推动核心技术进步。另一方面,语音技术需要进一步向深度理解延伸。“更先进的语音交互系统不仅要 "能听会说" ,还要深度地去理解人的信息。有了明确的发展方向,才能促进智能语音技术持续突破。

二、Python 语音识别

(1)、文本转换为语音

(a)、使用 pyttsx

安装 pyttsx 包

  • import pyttsx3 as pyttsx
import pyttsx3 as pyttsx
engine = pyttsx.init()
engine.say('I can because i think i can. 逆境清醒 Life is not all roses.人生并不是康庄大道。')
engine.runAndWait()

  如果你安装没有出错,打开电脑的声音,就能听到语音(把我们刚才在代码里写的文本文字转换成语音播报出来了)

代码分析:

pyttsx3通过初始化来获取语音引擎,在调用init后会返回一个engine对象。

import pyttsx3

#初始化语音引擎
engine = pyttsx3.init()

 

设置语速、音量等参数:

engine.setProperty('rate', 100)   #设置语速
engine.setProperty('volume',0.6)  #设置音量

 

查看语速、音量等参数

rate = engine.getProperty('rate')
print(f'语速:rate')
volume = engine.getProperty('volume')   
print (f'音量:volume') 

 完整实例代码:

import pyttsx3 as pyttsx
engine = pyttsx.init()
engine.say('I can because i think i can. 逆境清醒 Life is not all roses.人生并不是康庄大道。')
rate = engine.getProperty('rate')
print(f'语速:rate')
volume = engine.getProperty('volume')   
print (f'音量:volume') 
engine.runAndWait()

运行结果为:

 

查看语音合成器
voices = engine.getProperty('voices') 
for voice in voices:
    print(voice) 

合成器的主要参数如下:

合成器的主要参数如下:
age发音人的年龄默认为None
gender以字符串为类型的发音人性别

male, female, or neutral.

默认为None

id关于Voice的字符串确认信息
languages发音支持的语言列表默认为一个空的列表
name发音人名称默认为None
语音合成器

默认的有两个

两个语音合成器均可以合成英文音频,

只有第一个合成器能合成中文音频。

如果需要其他的语音合成器需要自行下载和设置。

#设置第一个语音合成器
voices = engine.getProperty('voices') 
engine.setProperty('voice',voices[0].id)   

语音播报:

engine.say('I can because i think i can. 逆境清醒 Life is not all roses.人生并不是康庄大道。')
engine.runAndWait()
engine.stop()

 

import pyttsx3
engine = pyttsx3.init() #初始化语音引擎
engine.say('I can because i think i can. 逆境清醒 Life is not all roses.人生并不是康庄大道。')
rate = engine.getProperty('rate')
print(f'语速:rate')
volume = engine.getProperty('volume')   
print (f'音量:volume') 
engine.setProperty('rate', 100)   #设置语速
engine.setProperty('volume',0.6)  #设置音量
voices = engine.getProperty('voices') 
engine.setProperty('voice',voices[0].id)   #设置第一个语音合成器
engine.runAndWait()
engine.stop()

运行结果为:

  如果你没有出错,打开电脑的声音,就能听到语音(把我们刚才在代码里写的文本文字转换成语音播报出来了:I can because i think i can. 逆境清醒 Life is not all roses.人生并不是康庄大道。)

  我们设置使用第一个语音合成器,同时,屏幕会打印出当前语速是200,音量是:1.0

(b)、使用 SAPI

  也可以使用 SAPI 来做文本到语音的转换。

   SAPI是微软Speech API , 是微软公司推出的语音接口。

from win32com.client import Dispatch
# 获取讲话对象
speaker = Dispatch('SAPI.SpVoice')
# 讲话内容
speaker.Speak('Just Be You')
speaker.Speak('No one can do it just like you')
speaker.Speak('Something magic in the way you move')
speaker.Speak('You are original, you know it is true')
speaker.Speak('do not let anybody take your tune')
speaker.Speak('You are not got a single thing to prove')
speaker.Speak('You are original, so just be you')
speaker.Speak('Just be you')
speaker.Speak('You are one of a kind')
speaker.Speak('The kind of once in a lifetime')
speaker.Speak('Not just another face in the crowd')
speaker.Speak('You light up a room')
speaker.Speak('With the light that is inside you')
speaker.Speak('do not be afraid to let it out')
speaker.Speak('So hold your head up')
speaker.Speak('do not let anybody get you down')
speaker.Speak('No one can do it just like you')
speaker.Speak('Something magic in the way you move')
speaker.Speak('You are original, you know it is true')
speaker.Speak('do not let anybody take your tune')
speaker.Speak('You are not got a single thing to prove')
speaker.Speak('You are original, so just be you')
speaker.Speak('Just be you')
speaker.Speak('Ooh, just be you')
speaker.Speak('Ooh, just be you')
speaker.Speak('You gotta believe')
speaker.Speak('You are here for a reason')
speaker.Speak('This world needs somebody like you')
speaker.Speak('Cause anybody can be a copy')
speaker.Speak('And there will always be people talking')
speaker.Speak('So face your fears and chase your dreams')
speaker.Speak('And dance like no one is watching')
speaker.Speak('No one can do it just like you')
speaker.Speak('Something magic in the way you move')
speaker.Speak('You are original, you know it is true')
speaker.Speak('do not let anybody take your tune')
speaker.Speak('You are not got a single thing to prove')
speaker.Speak('You are original, so just be you')
speaker.Speak('Just be you')
speaker.Speak('Ooh, just be you')
speaker.Speak('Ooh, just be you')
speaker.Speak('You are one of a kind')
speaker.Speak('The kind of once in a lifetime')
speaker.Speak('Not just another face in the crowd')
speaker.Speak('No one can do it just like you')
speaker.Speak('Something magic in the way you move')
speaker.Speak('You are original, you know it is true')
speaker.Speak('do not let anybody take your tune')
speaker.Speak('You are not got a single thing to prove')
speaker.Speak('You are original, so just be you')
speaker.Speak('Just be you')
speaker.Speak('Ooh, just be you')
speaker.Speak('Ooh, just be you')

speaker.Speak('没有人能像你一样')
speaker.Speak('那样的充满魔力')
speaker.Speak('你知道的,你是最初的你')
speaker.Speak('不要让任何人改变你')
speaker.Speak('你不需要去证明什么')
speaker.Speak('你是最初的你,做你自己')
speaker.Speak('做你自己吧')
speaker.Speak('你是独一无二的')
speaker.Speak('一生仅有一个的那种')
speaker.Speak('你不像人群中的另一种面孔')
speaker.Speak('你用你内心的温暖')
speaker.Speak('照亮了整个房间')
speaker.Speak('不要害怕说出来')
speaker.Speak('抬起你的头吧')
speaker.Speak('不要因为任何人而让你失望')
speaker.Speak('没有人能像你一样')
speaker.Speak('那样的充满魔力')
speaker.Speak('你知道的,你还是最初的你')
speaker.Speak('不要让任何人改变你')
speaker.Speak('你不用去证明什么')
speaker.Speak('因为你就是你')
speaker.Speak('做你自己')
speaker.Speak('Ooh, just be you')
speaker.Speak('做你自己吧')
speaker.Speak('Ooh, just be you')
speaker.Speak('做你自己')
speaker.Speak('你必须要相信')
speaker.Speak('你来这一趟是有原因的')
speaker.Speak('这个世界需要像你一样的人存在')
speaker.Speak('因为任何人都可是一个复制品')
speaker.Speak('人们总是在背后指指点点')
speaker.Speak('战胜内心的恐惧,去追逐你的梦想')
speaker.Speak('假装没有人在看你,自在地舞动吧')
speaker.Speak('没有人能像你一样')
speaker.Speak('那样的充满魔力')
speaker.Speak('你知道的,你还是最初的你')
speaker.Speak('不要因为任何人而改变你自己')
speaker.Speak('你也不用去证明什么')
speaker.Speak('你就是最初的你')
speaker.Speak('做你自己')
speaker.Speak('做你自己吧')
speaker.Speak('做你自己')
speaker.Speak('你是独一无二的')
speaker.Speak('一生仅有一个的那种')
speaker.Speak('不像人群中的另一种面孔')
speaker.Speak('没有人像你')
speaker.Speak('如此有魔力')
speaker.Speak('你也知道的,你还是原本的你')
speaker.Speak('不要让任何人改变你')
speaker.Speak('你不需要去证明什么')
speaker.Speak('你还是原来的你')
speaker.Speak('做你自己')
speaker.Speak('做你自己吧')
speaker.Speak('Ooh, just be you')
speaker.Speak('做你自己吧')
# 释放对象
del speaker

  如果你没有出错,打开电脑的声音,就能听到语音(把我们刚才在代码里写的文本文字转换成语音播报出来了)

(2)、文本转存为语音文件wav

(a)、用SpeechLib库

方法:1.从文本文件中获取输入语音的文本内容,将其转换为语音,保存成.wav格式

使用 SpeechLib,需要先安装, 命令如下:

  • pip install comtypes
from comtypes.client import CreateObject
engine = CreateObject('SAPI.SpVoice')
stream = CreateObject('SAPI.SpFileStream')
from comtypes.gen import SpeechLib
infile = '就算世界无童话.txt'
outfile = '就算世界无童话.wav'
stream.open(outfile, SpeechLib.SSFMCreateForWrite)
engine.AudioOutputStream = stream
f = open(infile, 'r', encoding='utf-8')
theText = f.read()
f.close()
stream.close()

  如果你没有出错,电脑里同一个目录里出现了转换好的语音文件“ 就算世界无童话.wav ”

三、总结

  本文主要从概念上图文论述了语音识别的起源与发展、语音识别的基本原理、语音识别过程、语音识别的近期发展。

  代码上分析了Python 语音识别所用到的技术,从 (1)、文本转换为语音。(2)、文本转存为语音文件wav。两个方面实例操作了语音识别的技术实现方式,并提供了完整源代码供参考。

  python语音识别还有其他的方法,例如从话筒等输入语音来识别,这些将会在后面更新博文时再详细分析。

            推荐阅读:

34

让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud)

33python Format()函数的用法___实例详解(一)(全,例多)___各种格式化替换,format对齐打印
32Background 全属性实例图解(10种全)(一)
31Element Plus 实例详解(一)
30

​​​​​

Vue3安装配置、开发环境搭建(组件安装卸载)(图文详细)
29

SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例)

28

查看jdk安装路径,在windows上实现多个java jdk的共存解决办法,安装java19后终端乱码的解决

27

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(1)

26

2023年春节祝福第二弹——送你一只守护兔,让它温暖每一个你【html5 css3】画会动的小兔子,炫酷充电,字体特

25

2023春节祝福系列第一弹(上)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

24

HTML+CSS+svg绘制精美彩色闪灯圣诞树,HTML+CSS+Js实时新年时间倒数倒计时(附源代码)

23

​草莓熊python绘图(春节版,圣诞倒数雪花版)附源代码

22

【程序人生】卡塔尔世界杯元素python海龟绘图(附源代码),世界杯主题前端特效5个(附源码)

21

python爱心源代码集锦(18款)

20

巴斯光年python turtle绘图__附源代码

19

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

18

​草莓熊python turtle绘图代码(玫瑰花版)附源代码

17

立体多层玫瑰绘图源码__玫瑰花python 绘图源码集锦

16

皮卡丘python turtle海龟绘图(电力球版)附源代码

15

【CSDN云IDE】个人使用体验和建议(含超详细操作教程)(python、webGL方向)

14

草莓熊python turtle绘图(风车版)附源代码

13

用代码过中秋,python海龟月饼你要不要尝一口?

12

《 Python List 列表全实例详解系列(一)》__系列总目录、列表概念

11

用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心)

10

Python函数方法实例详解全集(更新中...)

9

matplotlib 自带绘图样式效果展示速查(28种,全)

8

手机屏幕坏了____怎么把里面的资料导出(18种方法)

7

2023年3月TIOBE 指数头条:编程语言 Go 进入 TIOBE 指数前 10 名,多家权威机构____编程语言排行榜__薪酬状

6

Python中Print()函数的用法___实例详解(全,例多)

5​​​​​​​​

色彩颜色对照表(一)(16进制、RGB、CMYK、HSV、中英文名)

4​​​​​​​​

Node.js (v19.1.0npm 8.19.3) vue.js安装配置教程(超详细)

3​​​​​​​​

Tomcat 启动闪退问题解决集(八大类详细)

2​​​​​​​​

Tomcat端口配置(详细)

1​​​​​​​​

tomcat11、tomcat10 安装配置(Windows环境)(详细图文)

语音识别入门Python音频处理示例(含完整代码)

一、读取本地音频数据

首先,需要import几个工具包,一个是python标准库中的wave模块,用于音频处理操作,numpmatplot提供数据处理函数。

import wave
# 用于绘制波形图
import matplotlib.pyplot as plt

# 用于计算波形数据
import numpy as np

# 用于系统处理 读取本地音频文件
import os


# 读取本地音频数据

# 打开wave文件
f = wave.open(r"audio06.wav",'rb')

# 读取格式信息
params = f.getparams()
nchannels ,sampwidth ,framerate ,nframes = params [:4]
print(framerate)

二、读取单通道音频,并绘制波形图(常见音频为左右两个声道)

(1) 通过第一步,可以继续读取音频数据本身,保存为字符串格式

readframes:读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位),readframes返回的是二进制数据(一大堆bytes),在Python中用字符串表示二进制数据

strData = f.readframes(nframes)
(2) 如果需要绘制波形图,则需要将字符串格式的音频数据转化为 int 类型

frombuffer:根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组,通过frombuffer函数将二进制转换为整型数组,通过其参数dtype指定转换后的数据格式。

waveData=np.frombuffer(strData,dtype=np.int16)

此处需要使用到 numpy 进行数据格式的转化

(3) 将幅值归一化

把数据变成(0,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。

waveData=waveData*1.0/(max(abs(waveData)))

这一步去掉也可画出波形图,可以尝试不用此步,找出波形图的不同

(4) 绘制图像

通过取样点数和取样频率计算出取样的时间:

time = np.arange(0,nframes)*(1.0/framerate)
(5)完整代码
import wave
# 用于绘制波形图
import matplotlib.pyplot as plt
# 用于计算波形数据
import numpy as np
# 用于系统处理 读取本地音频文件
import os
# 读取本地音频数据
# 打开wave文件
f = wave.open(r"audio06.wav",'rb')
# 读取格式信息
params = f.getparams()
nchannels ,sampwidth ,framerate ,nframes = params [:4]
print(framerate)

# 读取单通道音频 并绘制波形图(常见音频为左右两个声道)
# 读取波形数据
strData = f.readframes(nframes)

# 将字符串转换为16位整数
waveDate = np.frombuffer(strData,dtype=np.int16)

#归一化:把数据变成(0,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速
waveDate = waveDate*1.0/(max(abs(waveDate)))

# 计算音频时间
time = np.arange(0,nframes)*(1.0/framerate)

plt.plot(time,waveDate)
plt.xlabel("Time(s")
plt.ylabel("Amplitude")
plt.title("Single channel wavedata")
plt.show()


以上是关于语音识别实战(python代码)(一)的主要内容,如果未能解决你的问题,请参考以下文章

AI 全栈 SOTA 综述 这些你都不知道,怎么敢说会 AI?语音识别原理 + 实战

语音识别基于MFCC和DWT实现说话人语音识别

Keras深度学习实战(41)——语音识别

语音识别基于matlab GUI MFCC特征说话人识别系统含Matlab源码 1153期

用Python来使用科大讯飞语音识别,so easy

基于百度语音识别API的Python语音识别小程序