目录

1.引言

1.1 语音识别

1.2 mindspore

2.项目学习

2.1分帧加窗

2.2时域特征提取

2.3频域特征

3 初步尝试

4. 初期结果

5.后期改进

5.1数据预处理

5.1.1语音拼接

5.1.2引入自然噪声丰富数据集

5.2 特征提取xvector:

5.3 模型训练方法:

6. 独立于内容的说话人识别

6.1音频预处理模块

6.2 特征提取模块

6.3 DNN训练部分模块

6.4 实时识别模块

7. 实验结果

8.总结


1.引言

1.1 语音识别

语音识别(Automatic Speech Recognition, ASR)是人工智能的重要分支,旨在将人类语音信号转化为可处理的文本或指令。其核心任务是理解语音内容,关键技术包括声学建模、语言建模和解码算法。应用场景涵盖智能助手(如Siri、Alexa)、实时字幕生成、语音输入法等。

说话人识别(又称声纹识别)是语音识别领域的重要分支,其核心目标是通过语音特征确定说话人身份,而非识别语音内容。主要任务之一是从已知说话人库中确定语音对应的身份(1:N搜索)。

1.2 mindspore

MindSpore架构设计以全场景AI开发为核心,涵盖多领域扩展(如大模型支持、科学计算套件AI4S)、开发态友好(动态/静态图统一编程、多级编译与调试工具)、运行态高效(动态图调度、图算融合、模型压缩与跨硬件优化)、全场景部署(通过MindRT实现端-边-云协同)及多样性硬件适配(支持昇腾、GPU/CPU及三方硬件算子),强调高效性、灵活性与安全性,满足从科研到工业落地的全链路AI需求。

2.项目学习

语音识别领域的基础都是相近的,都涉及如何处理原始录制的声音录像(语音信号预处理),以及如何将一段时间序列处理为能够被模型有效使用分析的特征(语音特征提取)。

2.1分帧加窗

由于不同的语音是由人的口腔肌肉运动构成声道某种形状而产生的响应,而这种口腔肌肉运动相对于语音频率来说是非常缓慢的,所以语音信号具有短时平稳性。据此,任何语音信号的分析和处理必须进行“短时分析”,将语音信号分为等时的段来分析其特征参数,其中每一段称为一“帧”。这样,对于整体的语音信号来讲,分析出的是由每一帧特征参数组成的时间序列。

具体来讲,分帧加窗是指用一定的窗函数 w(n)

来乘语音信号 s(n) ,从而形成加窗语音信号 sw(n)= w(n)×s(n)

在语音信号数字处理中常用的窗函数有三种:

矩形窗:

汉明窗:

海宁窗:

2.2时域特征提取

查询相关的文献,发现语音识别提取的时域特征大多为以下三种。

1.短时过零率:指在一定时间内,语音信号波形穿过零轴的次数。这个特征能够反映信号的动态变化,与信号的频率内容有关。高频成分较多的信号通常会有较高的过零率。

2.短时能量:短时能量衡量语音信号在某一短时间帧内能量大小的指标,通过计算该帧内所有样本值的平方和来得到。这个特征对语音信号的振幅变化非常敏感,可以用来区分有声和无声阶段。

E_n=\sum_{m=0}^{N-1}{x_n^2\left(m\right)}

3. 短时平均幅度:短时平均幅度是语音信号在某一短时间帧内的平均绝对值,它反映了信号的幅度分布。这个特征有助于分析语音信号的平稳性。

M_n=\sum_{m=0}^{N-1}\left|x\left(m\right)\right|

2.3频域特征

频域特征主要是MFCC,即梅尔(Mel)倒谱系数。Mel频率谱是在已知信号频谱的基础上,基于人类听觉系统的感知特性,设计出的一种频谱分组方式。通过计算 Mel 频谱,将得到比原始傅里叶频谱更加具有区分性的频域紧凑表达。

Mel倒谱系数的计算,是将语音信号做傅里叶变换后,通过Mel滤波器组得到Mel频谱,再通过对应关系

Mel\left(f\right)=2595\log_{10}{\left(1+\frac{f}{700}\right)}

得到对数频谱,最后通过离散余弦变换得到MFCC系数。其流程如图2-1所示。

图2-1 Mel倒谱系数计算流程示意图

其中,Mel 滤波器组是一系列三角形的滤波器序列,记为H_m(k)\ ,\ \ 0\le m<M

,M为滤波器的个数。在 Mel 频率范围内,这些滤波器是等带宽的,如图2-2所示。

图2-2 相邻三角滤波器关系

其中,\sum_{m}^{M-1}{H_m\left(k\right)}=1

每个带通滤波器的传递函数为:

3 初步尝试

我们研究了一项基于对DFCNN+Transformer端到端语音识别框架的研究,研究针对语音信号输入,实现了精细到拼音和声调的识别,并且最终实现了识别文字的效果。系统创新性地在华为云ModelArts平台进行搭建,方便直接复现成果。

实验采用MFCC(Mel频率倒谱系数)作为音频特征提取方法,通过预加重、分帧、加窗、FFT变换及Mel滤波器组处理生成语谱图,并将其作为DFCNN的输入。

DFCNN网络通过多层卷积和池化操作对语谱图进行特征抽象,输出拼音序列;随后,Transformer模块通过自注意力机制对拼音序列进行上下文建模,生成对应的文字结果。为适配端到端训练需求,损失函数采用连接时序分类(CTC)损失,旨在直接优化输入序列与输出序列的对齐概率。

4. 初期结果

系统实现了较为准确的语音识别。成功的从语音文件里提取出拼音,并且以此为基础识别出了对应的文本,准确率较高。

图4-1 DFCNN+Transformer语音识别系统结果示意图

但是,整个程序也暴露出一些问题。系统仅使用单一样本进行模型验证,训练过程中损失值稳定在140左右且无法收敛。同时,系统的识别过程是建立在拼音识别的基础上的,需要较为标准的语音数据才能运行,难以实现独立于内容的任务,比如说话人识别。

这些结果凸显了原方案在特征鲁棒性、数据多样性及框架适配性上的不足,为后续改进提供了明确方向。

5.后期改进

5.1数据预处理

5.1.1语音拼接

在论文《应用于短时语音语种识别的时长扩展方法》中,研究者探讨了通过语音拼接技术来增加语音时长,从而扩充数据集,以实现更好的识别效果。语音拼接是指根据一定标准对原音频进行切样,然后将这些样本进行拼接,以生成新的语音数据。这种方法带来了以下好处。

多样化数据集:语音拼接后的音频数据,可以有效增加训练数据集的多样性。

提升模型鲁棒性:语音拼接操作可以模拟一些情况下说话人不连续的发音,以增加模型的鲁棒性。

5.1.2引入自然噪声丰富数据集

Geoffrey等人在《Deep Neural Networks for Acoustic Modeling in Speech Recognition》论文中讨论了如何通过引入噪声来提升语音识别系统的鲁棒性,也就是通过引入噪声来提升系统在有噪声环境下的表现。

论文提出了一种数据增强的技术。简单来说,就是通过对现有的语音数据进行加工处理,制造出带有不同噪声的数据来训练模型。这样,系统在训练时就能学会如何应对真实生活中可能遇到的各种噪声。

5.2 特征提取xvector:

Snyder等人在原有的时、频域特征的基础上,提出了xvector。这是是一种基于深度学习的说话人嵌入方法,旨在将可变长度的语音片段映射为固定长度的特征向量。该方法在噪声及跨信道场景下表现优异。

Xvector特征的提取,首先采用时间延迟神经网络(TDNN)提取帧级声学特征,然后通过统计池化层聚合全局时序信息,对前面输出的帧级特征计算均值𝜇和标准差𝜎),并将二者合并。

\mu=\frac{1}{T}\sum_{t=1}^{T}h_t

\sigma=\sqrt{\frac{1}{T}\sum_{t=1}^{T}\left(h_t-\mu\right)^2}

g=\mathrm{Concat}\left(\mu,\sigma\right)

最后经全连接层生成高区分性的嵌入向量(通常为512维)。

x\mathrm{-vco}=W_\mathrm{f}g+b_\mathrm{f}

5.3 模型训练方法:

我们发现训练时的loss曲线的平滑性较差,说明函数对输入的微小变化敏感。

斯里瓦斯塔瓦等人在Dropout: A Simple Way to Prevent Neural Networks from Overfitting中提出将噪声注入网络内部层的训练策略,即暂退法(Dropout)。其原理为在训练过程中,在计算每一层的同时随机丢弃部分神经元,从而增强输入-输出映射的平滑性。我们的训练过程也引入了同样的方法。

图5-1 暂退法效果示意图

6. 独立于内容的说话人识别

程序的流程如图6-1所示。

图6-1 系统流程图

6.1音频预处理模块

该模块针对采样后得到的wav文件进行处理。首先进行语音拼接,对音频文件按照固定时间长度进行裁剪然后再拼接起来;然后进行低通滤波,去掉高频噪声;最后使用数据增强,将本地自然噪声文件与拼接录音文件融合。

经过处理,我们得到了本次实验的数据集。共包括了5位说话人,每人录制100条音频文件,其中前50条为3-5s,后50条为5-15s。然后经过拼接、加噪等操作,每人拓展184条语音数据,共同组成由1420条语音数据组成的数据集。

6.2 特征提取模块

为了方便实验,我们封装了一个特征向量提取函数库,包括时域、频域等特征提取方法。通过修改函数中method参数,可以使用不同的方法进行特征提取。

6.3 DNN训练部分模块

我们的DNN训练模型主要包括1个输入层,2个隐藏层与1个输出层。我们在每个隐藏层进行了批归一化,同时在第一层隐藏层的最后采用了Dropout,防止出现过拟合。最终,输出与类别相同维度的向量。

具体的网络结构如下:

Input Layer(输入层)

输入维度由表格数据的特征数量决定

Hidden Layer 1(隐藏层1)

全连接层

批归一化

激活函数 ReLU

Dropout,dropout_rate=0.3

Hidden Layer 2(隐藏层2)

全连接层

批归一化

激活函数 ReLU

Output Layer(输出层)

全连接层 (Dense)

此外,训练过程中,我们还基于mindspore,进行了计算图优化与数据下沉,实现了加速训练的效果。

6.4 实时识别模块

该模块利用训练的模型,实现了从实时录音到最终说话人识别的功能。主要包括:录音、降噪、绘制音频分析图、特征提取、分类预测。

7. 实验结果

训练结果显示,我们的模型在测试集上的准确率高达99%。具体结果如图7-1所示。

图7-1 混淆矩阵与ROC曲线

观察混淆矩阵可以发现,模型针对测试集中一共285个样本进行预测时,仅有2个被错分类;而ROC曲线中针对不同类别,都有AUC=1。这说明我们的模型在训练和预测时的准确率很高。

除此之外,我们在实时识别模块实现了精准的说话人识别,准确率可达95%以上。

图7-2 实时语音识别示意图

8.总结

在本次项目中,借鉴现有mindspore项目我们学习了语音识别领域的基本操作,在此基础上,我们通过mindspore构建神经网络来实现说话人识别。通过对结果的分析与资料的查询,在初期的工作上进行了迭代改进,例如通过引入自然噪声增加鲁棒性、归一化来增强模型收敛稳定,最终在mindspore鲜少应用的说话人问题上取得了优良的结果。通过本次项目,我们加深了对mindspore的理解,掌握了利用mindspore导入数据集、进行个性化的数据处理、动态搭建调整模型、引入神经网络常用操作等等技术,获益匪浅。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐