基于飞桨paddlespeech训练中文唤醒词模型

文章讲述了作者如何利用飞桨Paddlespeech框架训练中文唤醒词模型,选择“你好米雅”数据集并结合其他数据集进行训练,处理数据增强和降噪问题,以提高唤醒率和降低误唤醒率。在实际录音测试中发现并解决了频率滤波问题,最终优化模型并评估不同特征维度对唤醒效果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

飞桨Paddlespeech中的语音唤醒是基于hey_snips数据集做的。Hey_snips数据集是英文唤醒词,对于中国人来说,最好是中文唤醒词。经过一番尝试,我发现它也能训练中文唤醒词,于是我决定训练一个中文唤醒词模型。

要训练中文唤醒词模型,主要有如下工作要做:找数据集,做数据增强(augmentation),做标注,训练和评估等。关于数据集,调研下来发现“你好米雅”这个数据集不错。它不仅可以做声纹识别,也可以做唤醒词识别。它录制人数较多,既近场拾音(44.1KHZ),又用了麦克风阵列远场拾音(16kHZ),还有快速、正常语速、慢速等,极大地丰富了语料。难能可贵的是出品方希尔贝壳还出了一个补充数据集,全是“你好米雅”的相似发音,比如“你好呀”、“你好米”等。把这些作为负样本加入训练,会大大地降低说“你好米雅”相似词的误唤醒率。经过评估后我决定用“你好米雅”这个唤醒词。因为“你好米雅”数据集只有唤醒词语料,为了降低误唤醒,我又把AIDataTang数据集中两三秒左右的语料提取出来作为负样本加入训练。这样整个数据集包括三部分:“你好米雅”的原始数据集,相似发音的补充数据集(作为负样本)和AIDataTang数据集(作为负样本)。先把“你好米雅”数据集中44.1k采样的语料变成16K采样的,再分别将三个数据集分成训练集、验证集、测试集三部分。数据集分好后,还需要做数据增强,目前主要用的是加噪。从NOISEX-92中选取10种典型噪声,再结合各种SNR叠加到干净语音中形成带噪语音。数据增强做好后又把数据集增大了好多,形成一个近300万个wav的数据集。最后写python代码按照paddlespeech里规定的格式做了数据标注,得到了train.json/dev.json/test.json三个文件。在json文件中对于一个wav文件的标注格式如下图:

 包括文件的时长、文件的路径、id以及是否是唤醒词等。

以上这些工作做好后就开始训练和评估了,验证集和测试集下的结果都不错。又想试试真实录音的wav的准确率如何,请了几个人在办公室环境下用手机录了“你好米雅”的音频,在得到的模型下去测试,结果让我大失所望,识别率特别低。为什么呢?测试集上的结果可挺好的呀。输入模型的特征是频域的fbank,于是我就从频谱上找差异。对比测试集里能识别的和自己录的不能识别的wav的频谱,发现能识别的在7K HZ附近处做了低通滤波,而不能识别的却没有,具体见下图:

                做了7k HZ低通滤波的能识别                             没做7k HZ低通滤波的不能识别

我试着将不能识别的也在7K HZ附近处做了低通滤波,再去做测试就能识别了。这样自己录的不能识别的原因就找到了:没去做7K HZ附近的低通滤波。整个数据集是由3个子数据集(“你好米雅”数据集,“你好米雅”相似词数据集,AIDATATANG数据集)组成的,前两个是同一出品方且用相同的设备录的。我看了这三个子数据集的频域特性,前两个都在7K HZ附近处做了低通滤波,而AIDATATANG的没有。这暴露了我在数据集准备上的一个错误:没有做到训练集/验证集/测试集频域特性上的一致。

原因找到了,对应的措施就是对原先的数据集做7k HZ处的低通滤波处理。为了再降低误唤醒率,我又找来了cn-celeb数据集,因为这个里面包含的场景更丰富,有singing/vlog/movie/entertainment等。把里面几秒左右的音频都提取出来,先做7k HZ处的低通滤波处理,再把它们作为负样本加入到数据集中。数据处理好后就又开始训练了。一边训练模型,一边请更多的人用手机录“你好米雅”的唤醒词音频,还要对这些录好的做7k HZ处的低通滤波处理。模型训练好后在验证集和测试集上的评估效果(唤醒率和误唤醒率)都很好,再把自己录的音频在模型上跑,唤醒率跟在测试集上保持一致。同时还做了另外一个实验,把测试集里有唤醒词且有噪声的音频提取出来组成一个新的测试集。先在这个集上看唤醒率,再对这个集上的音频做降噪处理,再看唤醒率,发现唤醒率有一定程度的降低。这是模型没有学习降噪算法的结果,模型不像人耳,降噪后听起来更清晰未必能识别。通过这些实验说明:要想在嵌入式设备上语音唤醒效果好,得搞清楚特征提权前有哪些前处理算法(降噪等)。语料最好是在这款嵌入式设备上录,如果没有条件就要把语料过一下这些前处理算法后再拿去训练和评估,也就是要让模型学一下这些前处理算法。

现在的模型输入特征是80维的fbank,我又评估了一下维度改到40维后对唤醒效果的影响。评估下来发现唤醒率有0.2%左右的下降,误唤醒率有0.3%左右的提升,在可接受的范围内。好处是模型参数减少了1.6k(见下图),推理时的运算量也有一定程度的减少。

 目前用的是公开数据集里的中文唤醒词,通过实践找到一些能提高唤醒率和降低误唤醒率的方法。等做产品时用的数据集是私有的,把找到的方法用到模型训练上,就能出一个性能不错的语音唤醒方案。

为了更好的跟大家沟通,互帮互助,我建了一个讨论群。如您有兴趣,请搜薇号 david_tym  ,共同交流。谢谢!

### 如何获取并使用 PaddleSpeech 飞桨语音合成工具 #### 工具概述 PaddleSpeech 是由百度飞桨开源的一个强大的语音处理工具包,涵盖了多种语音技术应用,包括但不限于语音识别、语音合成、声纹识别以及语音指令等功能[^3]。 #### 获取文档与教程资源 官方提供了详尽的学习资料和实践指南来帮助开发者快速上手。具体可以通过以下途径获得相关文档: - **在线学习课程**:可以参考《飞桨PaddleSpeech语音技术课程》,其中包含了关于如何通过 paddle astudio 平台训练模型的具体指导[^1]。 - **GitHub 仓库中的 README 文件**:此文件不仅介绍了安装方法还列举了一些常见问题解答链接至 issues 页面供进一步查阅[^2]。 #### 安装与环境搭建 为了能够顺利运行该工具包内的各项功能模块,在正式操作之前需完成必要的软件依赖项配置工作: ##### 步骤说明(非实际步骤描述) 以下是推荐的一种实现方案用于设置开发环境以便于后续实验开展: ```bash # 克隆项目代码库到本地机器 git clone https://github.com/PaddlePaddle/PaddleSpeech.git # 进入指定子目录位置准备执行特定任务流程 cd PaddleSpeech/examples/zh_en_tts/tts3/ ``` 接着按照指示进行数据集准备工作之后即可启动针对 fastspeech2 和 hifigan 模型参数调整过程从而构建属于自己的个性化声音生成解决方案[^4]。 #### 功能探索实例分享 下面给出一段简单的 Python 脚本用来演示基本 API 接口调用方式实现文本转语音转换效果如下所示: ```python from paddlespeech.t2s.bin.synthesize import main as synthesize_main config_path = 'conf/default.yaml' checkpoint_path = './exp/checkpoints/snapshot_iter_10000.pdz' synthesize_main(config=config_path, ckpt=checkpoint_path, text="你好世界", output_dir='./output/') ``` 以上代码片段展示了如何利用 `main` 函数加载预先定义好的配置文件路径(`default.yaml`) 及保存下来的权重参数快照 (`snapshot_iter_10000.pdz`) 来完成给定字符串 ("你好世界") 向对应音频片段输出的过程。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值