前有古人,后有小王,大家好,我是你们爱思考的小王学长,今天咱们继续漫游语音识别技术哈,今天内容稍微专业一些,大家可以结合上一篇漫游语音识别技术一起学习。
上篇我们简单了解了语音识别技术的概念、前世今生以及基本识别原理,一会学长带着大家漫游到语音识别技术更深(更专业)的世界里。
文章目录:(大家先预览下)
一、语音识别基础
二、信号处理过程
1、降噪处理
①小波变换降噪法
②谱减法
③自适应噪声抵消法
④声音滤波器
2、预加重
3、分帧加窗
4、端点检测
三、特征提取
四、语音识别方法
1、声学模型
2、语言模型
3、解码器
4、基于端到端的学习方法
五、深度学习-CNN实战举例
六、声网 Agora 一站式智能语音识别方案
七、语音识别开发平台
深度学习平台
语音识别开发平台
八、语音识别相关开源学习资料
开源数据集
开源语音识别项目
作者介绍
说到语音识别,我们应该先思考一下声音是什么呢?
通常我们可以认为声音是在空气中传播的波,但是它不像水波那样传播波的高低变化,它传播的是空气的密度变化。比如,我们拍手时手掌的振动将空气挤出,对比周围的大气压,空气被挤入的地方压力增高,而空气被挤出的地方则相对压力降低;压力高的部分向手掌四周移动,而压力低的部分则紧随其后。这种由手掌振动所引发空气密度发生周期性变化的波称为压缩波,空气中的压缩波一旦碰到鼓膜那样的薄膜,就会使其产生振动。麦克风的作用就是将这种振动以电信号的形式提取出来。下面的图大家可以参考一下
以振动的幅度为纵轴,以时间为横轴,就能够将声音可视化。
换句话说,声音以波的形式传播,即声波。当我们以波的视角来理解声音时,幅度(Magnitude)、频率(Frequency)、相位(Phase)便构成了声波及其所有的叠加声波,声音的不同音高(Pitch)、音量(Loudness)、音色(Timbre) 也由这些基本单位组合而来。
世界上各种各样的声波都可以“降解”到基本波身上,傅里叶变换(Fourier Transform)的基本思想也是这样的。不同的声波有不同的频率和幅度(决定音量),人耳也有自己的接受范围。人耳对频率的接受范围大致为 20 Hz 至 20 kHz,于是以人为本地将更高频率的声波定义为超声波(Ultrasound Wave)、更低频率的声波定义为次声波(Infrasound Wave), 虽然其它动物可以听到不同范围的声音。
上一篇大家应该对 ASR 有了个初步的了解,语音识别说白了最终是统计优化问题,给定输入序列 O={O1,…,On},寻找最可能的词序列 W={W1,…,Wm},其实就是寻找使得概率 P(W|O)最大的词序列。用贝叶斯公式表示为:
其中 P(O|W)叫做声学模型,描述的是给定词 W 时声学观察为 O 的概率;P(W)叫做语言模型,负责计算某个词序列的概率;P(O)是观察序列的概率,是固定的,所以只看分母部分即可。
语音选择的基本单位是帧(Frame),一帧数据是由一小段语音经过 ASR 前端的声学特征提取模块产生的,整段语音就可以整理为以帧为单位的向量组。每帧的维度固定不变,但跨度可调,以适应不同的文本单位,比如音素、字、词、句子。
大多数语音识别的研究都是分别求取声学和语言模型,并把很多精力放在声学模型的改进上。但后来,基于深度学习和大数据的端到端(End-to-End)方法发展起来,能将声学和语言模型融为一体,直接计算 P(W|O)。
在降噪之前,我先跟大家讲讲为什么要进行降噪处理?
我们在录制音频数据的同时,大量噪声都会掺杂进来,不同环境和情境下产生的噪声也不尽相同,噪声信号中的无规则波纹信息影响了声学信号所固有的声学特性,使得待分析的声音信号质量下降,并且噪声对声音识别系统的识别结果会产生重要影响。所以说,我们在对声音信号分析和处理之前,是一定要进行降噪处理的。(语音的具体噪声分类:看学长这篇文章)
下面我们来看几个降噪的常用方法:
小波变换降噪法简称小波降噪,一般在声音降噪中使用最多的是小波阈值降噪法,它主要是说在带噪声音信号中,有效声音信号与噪声在不同频率上有着不同的小波系数,其中有效信号能量谱表现会比较集中,在能量谱集中的区域小波系数的绝对值会比较大;而噪声的能量谱比较分散,所以其系数的绝对值比较小。接下来,根据此特点,利用小波变换法将带噪声音信号分解到不同频率上,然后设置阈值进行差分调整,保留有效声音信号的小波系数,最后根据小波重构算法还原带噪信号中的有效信号,从而可以达到降噪的效果。
这是其基本原理,其中阈值的设定也可以分为硬阈值和软阈值法。具体涉及的相关公式和计算方法大家感兴趣的可以百度或者跟我留言。以下是利用小波降噪法得到的前后对比图(在 MATLAB 环境下得到):
谱减法又称频谱减法降噪,是根据噪声的可加性、局部平稳性以及噪声和有效声音信号不相关性的一种声音信号降噪方法。这种降噪方法不会涉及到参考信号,其主要思想就是带噪声音信号是有效信号与噪声的叠加,那么带噪信号的功率也是相当于有效声音信号的功率和噪声功率的叠加,利用计算得到“静音”片段(信号中不含有有效信号,只含有系统噪声或者环境噪声)中噪声的频谱估计值来等值替换有效声音信号存在期间所含噪声的频谱,最后带噪声音信号的频谱与噪声的频谱估计值相减,就可以得到有效声音信号频谱的估计值。
自适应噪声抵消法的核心组成部分是自适应算法和自适应滤波器。自适应算法可以自动调节输入滤波器的加权系数使滤波器达到最优滤波效果,所以自适应噪声抵消法的关键是在于找到某种算法,可以实现自动调节加权系数。
自适应噪声抵消法的主要思想是:除了带噪声音信号 x(t)=s(t)+n(t),假设还可以得到另外一个参考信号 r(t),而这个参考信号与噪声 n(t) 相关,但是与有效声音信号 s(t)不相关,那么就可以根据 Widrow 算法(一种近似最速下降的神经网络算法)抵消带噪声信号中的噪声,从而达到降噪的效果。
数字滤波器作为数字信号处理中的重要组成部分,可以通过数值之间的运算来实现滤波的效果,去除噪声成分。数字滤波器有很多种类,根据冲激响应函数的时域特性数字滤波器可分为两种,即无限冲激响应(Infinite Impulse Response,IIR)滤波器和有限冲激响应(Finite Impulse Response,FIR)滤波器。这两种滤波器可分别实现低通、高通、带通和带阻 4 种功能。
预加重是一种在发送端对输入信号高频分量进行补偿的信号处理方式。随着信号速率的增加,信号在传输过程中受损很大,为了在接收终端能得到比较好的信号波形,就需要对受损的信号进行补偿,预加重技术的思想就是在传输线的始端增强信号的高频成分,以补偿高频分量在传输过程中的过大衰减。而预加重对噪声并没有影响,因此有效地提高了输出信噪比。(百科官方解释)
预加重原理:语音信号高频段能量大,低频段能量小。而鉴频器输出噪声的功率谱密度随频率的平方而增加(低频噪声大,高频噪声小),造成信号的低频信噪比很大,而高频信噪比明显不足,从而导致高频传输衰弱,使高频传输困难。因此,在传输之前把信号的高频部分进行加重,然后接收端再去重,提高信号传输质量。
“分帧”是把一段声音信号分成一些时间长度相等的音频信号。它可以在预加重后的声音信号上平滑地移动规定长度的窗函数得到,窗函数的窗口大小由声音信号的采样频率来确定。采用可以随着时间移动的窗函数对猪声音信号进行“交叠分帧”,可以防止在分帧时出现遗漏有效的声音信号,也可以保证每段声音信号在滑动时保持平稳性和连续性。
常用的几种窗函数:幂窗、矩形窗、三角窗、汉宁窗、汉明窗、高斯窗(不懂的自行百度下或评论问我哈)
端点检测是指确定一段声音信号中有效信号的起始点和终止点。采集到的声音信号中含有无效的声音片段,进行端点检测确定出猪声音信号的起始点与终止点,可以排除大量的干扰信号,剪除静音片段,为后续的特征参数提取减小了运算量,缩短了提取时间。
常用方法:
短时过零率是指每帧声音信号通过零点的次数,其算法就是计算每帧声音信号幅值符号改变的总次数,如果相邻采样点的幅值符号是相同的,则没有发生过零点的情况,相反,如果相邻采样点幅值的符号发生了改变,那么表示声音信号发生了过零的情况。
短时能量一定程度上反应了声音信号的幅度变化,应用在区分声音信号中的清音和浊音,因为声音信号中清音的能量比浊音的能量小很多;区分无声片段和有声片段,因为无声片段的短时能量基本等于零,而有声片段是有能量存在的。
双门限端点检测法是常用的端点检测方法之一,其通过声音信号的短时能量和短时平均过零率确定声音信号的端点位置,短时过零率检测到声音信号的起始点和终止点可能过于宽泛,这样就降低了声音信号处理系统的速度;而短时能量检测到声音信号的起始点和终止点可能包含噪声信号,这样会导致提取的声音信号不太准确。所以将二者***结合***起来来检测猪声音信号的起始点和终止点,即双门限检测法提取声音信号的端点。
接下来带大家详细学习下 MFCC 特征提取知识:
先说下 MFCC,人的耳朵在接收信号的时候,不同的频率会引起耳蜗不同部位的震动。耳蜗就像一个频谱仪,自动在做特征提取并进行语音信号的处理。在语音识别领域中 MFCC(Mel Frequency Cepstral Coefficents)特征提取是最常用的方法,具体来说,MFCC 特征提取的步骤如下:
- 对语音信号进行分帧处理
- 用周期图(periodogram)法来进行功率谱(power spectrum)估计
- 对功率谱用 Mel 滤波器组进行滤波,计算每个滤波器里的能量
- 对每个滤波器的能量取 log
- 进行离散余弦变换(DCT)变换
- 保留 DCT 的第 2-13 个系数,去掉其它
其中,前面两步是短时傅里叶变换,后面几步主要涉及到梅尔频谱。
大家需要重要掌握的特征提取知识点:
过零率(zero crossing rate) 是一个信号符号变化的比率,即在每帧中语音信号从正变为负或从负变为正的次数。 这个特征已在语音识别和音乐信息检索领域得到广泛使用,通常对类似金属、摇滚等高冲击性的声音的具有更高的价值。一般情况下,过零率越大,频率近似越高。
频谱质心(Spectral Centroid) 是描述音色属性的重要物理参数之一,是频率成分的重心,是在一定频率范围内通过能量加权平均的频率,其单位是 Hz。它是声音信号的频率分布和能量分布的重要信息。在主观感知领域,谱质心描述了声音的明亮度,具有阴暗、低沉品质的声音倾向有较多低频内容,谱质心相对较低,具有明亮、欢快品质的多数集中在高频,谱质心相对较高。该参数常用于对乐器声色的分析研究。
声谱衰减(Spectral Roll-off) 是对声音信号形状(波形图)的一种衡量,表示低于总频谱能量的指定百分比的频率。
梅尔频率倒谱系数(Mel-frequency cepstral coefficients,MFCC) 是在 Mel 标度频率域提取出来的倒谱参数,Mel 标度描述了人耳频率的非线性特性。其中梅尔尺度(Mel Scale)是建立从人类的听觉感知的频率;比如若把音调频率从 1000Hz 提高到 2000Hz,我们的耳朵只能觉察到频率似乎提高了一些而不是一倍。但是通过把频率转换成梅尔尺度,我们的特征就能够更好的匹配人类的听觉感知效果。
色度频率(Chroma Frequencies) 色度频率是音乐音频有趣且强大的表示,其中整个频谱被投影到 12 个区间,代表音乐八度音的 12 个不同的半音。
在今天的主流语音识别系统中,声学模型是一个混合(hybrid)模型,它包括用于序列跳转的隐马尔可夫模型(HMM)和根据当前帧来预测状态的深度神经网络。
隐马尔可夫模型(Hidden Markov Model,HMM) 是用于建模离散时间序列的常见模型,它在语音识别中已经使用了几十年了,算是很典型的声学模型。
HMM 涉及的主要内容有:两组序列(隐含状态和观测值),三种概率(初始状态概率,状态转移概率,发射概率),和三个基本问题(产生观测序列的概率计算,最佳隐含状态序列的解码,模型本身的训练),以及这三个问题的常用算法(前向或后向算法,Viterbi 算法,EM 算法)。语音识别的最终应用对应的是解码问题,而对语音识别系统的评估、使用也叫做解码(Decoding)。
在研究 HMM 之前,先带大家简单的回顾一下马尔科夫链。马尔科夫链是建模随机过程的一种方法,用天气来举个简单点的例子就是,今天是否下雨和前一天是否下雨有关,有一种关联的特点。放在语音识别里就是,我们能知道语音的频谱,但不知道之前的频谱代表什么意思的,就可以通过历史的频谱,来推导新的频谱的对应结果。
高斯混合模型(GMM,Gaussian Mixed Model),主要就是通过 GMM 来求得某一音素的概率。
在语音识别中,HMM 用于建模 subword 级别(比如音素)的声学建模。通常我们使用 3 个状态的 HMM 来建模一个音素,它们分别表示音素的开始、中间和结束。
现在流行的语音系统不再使用 GMM 而是使用一个神经网络模型模型,它的输入是当前帧的特征向量(可能还要加上前后一些帧的特征),输出是每个音素的概率。比如我们有 50 个音素,每个音素有 3 个状态,那么神经网络的输出是 50x3=150。这种声学模型叫做”混合”系统或者成为 HMM-DNN 系统,这有别于之前的 HMM-GMM 模型,但是 HMM 模型目前还在被使用。
语言模型要解决的问题是如何计算 P(W),常用的方法基于 n 元语法(n-gram Grammar)或 RNN。目前主要有 n-gram 语言模型和 RNN 语言模型。
n-gram 语言模型是典型的的自回归模型,而 RNN 语言模型因为当前的结果依赖于之前的信息,所以可以使用单向循环神经网络进行建模,在这里感兴趣的自己再去学习下哈,内容实在太多了,学长挑重要的跟大家讲。
根据前面说的 P(W|O),我们的最终目的是选择使得 P(W|O) = P(O|W)P(W) 最大的 W ,所以解码本质上是一个搜索问题,并可借助加权有限状态转换器(Weighted Finite State Transducer,WFST) 统一进行最优路径搜索(先了解下)
CTC (连接时序分类,Connectionist temporal classification), CTC 方法早在 2006 年就已提出并应用于语音识别,但真正大放异彩却是在 2012 年之后,随之各种 CTC 研究铺展开来。CTC 仅仅只是一种损失函数,简而言之,输入是一个序列,输出也是一个序列,该损失函数欲使得模型输出的序列尽可能拟合目标序列。之前需要语音对齐到帧,用这个就可以不需要对齐,它只会关心预测输出的序列是否和真实的序列是否接近(相同)。
Attention 模型 看了很多概念还是觉得引用之前的例子最容易理解了:
当我们人在看一样东西的时候,我们当前时刻关注的一定是我们当前正在看的这样东西的某一地方,换句话说,当我们目光移到别处时,注意力随着目光的移动也在转移。 Attention 机制的实现是通过保留 LSTM 编码器对输入序列的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时将输出序列与之进行关联。
前面说了这么多理论知识,现在用 Python 代码把 CNN 网络模型进行简单讲解(让大家以实例来更加了解语音分类过程),同时推荐大家看下此PPT(点击可查看下载)实属学习干货!!!
#搭建CNN模型
model = Sequential()
# 输入的大小
input_dim = (16, 8, 1)
model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷积层
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷积层
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化层
model.add(Dropout(0.1))
model.add(Flatten()) # 展开
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 输出层:20个units输出20个类的概率
# 编译模型,设置损失函数,优化方法以及评价标准
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.summary()
# 训练模型
model.fit(X_train, Y_train, epochs = 20, batch_size = 15, validation_data = (X_test, Y_test))
# 预测测试集
def extract_features(test_dir, file_ext="*.wav"):
feature = []
for fn in tqdm(glob.glob(os.path.join(test_dir, file_ext))[:]): # 遍历数据集的所有文件
X, sample_rate = librosa.load(fn,res_type='kaiser_fast')
mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0) # 计算梅尔频谱(mel spectrogram),并把它作为特征
feature.extend([mels])
return feature
X_test = extract_features('./test_a/')
X_test = np.vstack(X_test)
predictions = model.predict(X_test.reshape(-1, 16, 8, 1))
preds = np.argmax(predictions, axis = 1)
preds = [label_dict_inv[x] for x in preds]
path = glob.glob('./test_a/*.wav')
result = pd.DataFrame({'name':path, 'label': preds})
result['name'] = result['name'].apply(lambda x: x.split('/')[-1])
result.to_csv('submit.csv',index=None)
!ls ./test_a/*.wav | wc -l
!wc -l submit.csv
讲完前面的语音识别必备知识,接下来咱们思考一下语音识别在语音聊天、音乐社交、视频直播,这些与“声音”有关的社交场景中应用越来越广的背景下,还会出现哪些问题呢,其中最突出的问题就是现有的语音内容审核+实时音视频服务,部署、调试、运维的成本高,而且很多方案对有背景音乐、噪声的音频识别效果差。
小王学长也是查看了许多应用解决方案,觉得声网 Agora 一站式智能语音识别方案是比较不错的,推荐给大家。肯定会有人问为什么你觉得好,好在哪里?
先说说现有传统方案,简单分为三步:
内容经过转码或直接推流至 CDN;
内容审核厂商从 CDN 拉流,然后进行 AI 、人工内容审核;
完成审核后,传回给服务器端。
存在问题: 首先,开发者需要对接三个厂商,要进行很多次的部署与调试,其中有很多调试会产生成本与风险,并且,当 CDN 出现故障的时候,会耗费较长时间来排查问题,也需要支付额外的拉流成本。
另一方面,目前的方案还需解决噪声的问题,例如语音社交、语音 FM 这些场景常常伴有背景音乐和环境噪声,会影响现有内容审核方案的识别率。
声网现已提供业界独有的一站式智能语音识别方案:
开发者只需要在应用中集成声网 Agora SDK,即可让音频在 Agora SD-RTN™ 网络中实时传输的过程中完成语音内容识别与审核。并整合了业界 Top 3 语音识别服务,通过声网独家研发的 AI 音频降噪引擎消除背景音,优化音频质量,让语音更加清晰。
声网语音识别方案的优势:
1、调用 RESTful API,一站式接入: 在应用中集成 Agora SDK 后,开发者可以通过调用 RESTful API,即可为自己的应用增加语音内容审核服务。相比传统内容审核方案,声网方案可以节省开发时间、服务器等接入成本。
2、AI 降噪,识别率更高 : 利用声网 AI 音频降噪引擎对音频进行优化,以提升语音的识别率。
3、语音交互低延时: 声网 SDK 实现了全球端到端 76ms 的实时音视频低延时传输。声网 Agora SD-RTN™ 实时通信网络采用私有 UDP 协议进行传输,基于软件定义优化路由选择最优传输路径,自动规避网络拥塞和骨干网络故障带来的影响。
所以说,看完声网与传统解决方案的优缺点对比是不是觉得声网的一站式解决方案很香!!!
除此之外,再跟大家推荐一个好用的工具-声网 Agora 的工具水晶球
简单说,水晶球是声网 Agora 推出的 RTC 行业首个质量监控与数据分析工具,主要解决终端用户的问题反馈链太长等问题。想深入了解的可以点击这里
特点:1.自建监控
2.集成多种 RTC 监控工具
3.使用同一 RTC 服务商所提供的质量调查工具
(小伙伴们看完记得点赞收藏下哈,小王学长希望能帮助到大家~)