我们严格按照官方提供的PDF文档,逐步完成环境的搭建。在搭建的过程中,遇到了一些问题,比如:cuda版本过低、py缺少核心组件……在我们队员以及官方团队的配合下,逐步解决了遇到的各个问题,这为我们之后的训练过程奠定了一个良好基础。
数据集的收集
数据集包括ASR、TTS以及CV三个部分,前两者为队员的录音数据集,后者为网络素材,格式如表2.1所示。对于ASR,为了适应更为复杂的实际应用场景,我们采用多人混合录音的模式。并且在录音过程中适当加入了一定的噪声,为了模拟出实际的环境,并且加入了自我介绍。对于TTS,任务的主要目的为实现清晰的、无失真的语音播报,因此对录音的要求比较高。我们采用专人录音的模式,保证语音数据集的低噪声、声音特征明显的特点。CV部分我们利用官方提供的照片素材以及网络公开照片素材,尽可能地保证了照片的隐私以及多样性,也更符合我们亚洲人的生理特点。
表2.1 数据集格式
数据集类型 | 声道模式 | 频率/Hz | 格式 | 数目/个 |
---|---|---|---|---|
ASR | 单声道 | 44100 | wav | 30 |
TTS | 单声道 | 44100 | wav | 100 |
CV(口罩识别) | / | / | png |
训练过程
整体训练结果如表2.2所示。
表2.2 训练结果
训练类别 | 总训练次数 | 单次平均训练时长 | Batch_size | Epoch | 准确率/客观评分 | Loss |
---|---|---|---|---|---|---|
ASR(语音转文字) | 10 | 5m | / | 20 | 100% | / |
TTS(文字转语音) | 5 | 10h | 35 | 1800~2500 | 1.8~2.25 | 0.325 |
CV(口罩识别) | 400 | 30s | 4 | 400 | 88.9% |
ASR训练
我们对收集到的语音数据集,利用自己写的py脚本生成符合官方要求的JSON格式文件(如图2.1所示)。利用nvidia官方提供的QuartzNet 15X5作为预训练模型,使用迁移学习的方式,对ASR语音数据集进行了20轮的训练,并且加入了自己的姓名,最终取得了不错的效果。正确率可以达到100%,由于使用的是预训练模型,训练过程比较理想。
图2.1 创建JSON格式文件脚本
TTS训练
对于收集到的TTS语音数据集,我们同样采取了ASR给数据打标注的方式。与ASR相比,此训练过程要为复杂的多。因为我们要考虑到语音合成的质量,我们采用了不同的数据集收集方式。第一种为人工录音,但需要尽可能地降低环境噪声;第二种为利用市面上的语音合成工具,但这样可能不符合我们本次活动的初心,而且合成语音质量本身偏低;第三种为利用网络上现有的语音数据集,但语音内容并不符合我们的要求。因此,我们进行了多次的训练过程,每次训练轮数为1800~2500轮(Epoch值),生成了5个训练模型。经过我们的综合考虑之后,我们决定采用第一种方式,并且选择了效果最好的一个模型作为我们最终部署的模型。
在训练过程中,也遇到了许多问题,比如:由于yaml版本的问题,需要对yaml的加载方式进行修改;在训练的过程中,由于硬件设备的限制,导致GPU显存溢出,因此我们在保证数据集相对充足的情况下(50~150条),适当降低了bsize值。
CV(口罩识别)训练
口罩识别的数据集是在官网上下载的数据,利用resnet模型模型进行训练。我们将标签label转换成了json的格式来进行模型的训练,图2.2是配置文件中的部分设置。在训练的过程中要注意batch_size_per_gpu的大小的设置,因为这涉及到了显存的容积的问题。本电脑的显卡为1050,所以batch_size_per_gpu最大值设置为4。并且我们在刚开始训练的时候由于test数据的原因始终无法做到模型收敛。所以只能放弃了训练了两天的模型重新开始训练模型。图2.3是模型训练400次之后取得的结果。
图2.2 配置文件
图2.3 模型训练之后的结果
但是改模型还是有很多不足之处,因为我们没有另外找其他数据来训练,所以在服务器部署的时候,针对于系统提供的图片的训练结果并不是很理想。
Jetson Nano模型部署和推理
最后在官方团队的指导下,我们将最好的训练模型部署到nano设备上。我们按照官方的方法,分别实现了三个部分,完成了最基本的要求。在此过程中,还较为顺利。