0. 研究背景
在做虚拟数字人对话时,我们可能会遇到有些用户不懂普通话,使用当地方言和虚拟数字人沟通,那么我们在使用开源的模型中,你会发现基本上没有方言识别能力,因此,训练一个可以识别方言的ASR模型很有必要。阿里开源了SenseVoiceSmall模型,这个模型有很好的学习能力,可以根据提供的方言数据集进行学习到方言到简体中文的映射。这里收集了2231条客家话数据集,基于SenseVoiceSmall来训练出一个可以识别梅州客家话,惠州客家话和粤西客家话的模型。
1. 数据集构成
本次训练使用了2231条客家话数据集,其中包含梅州客家话,惠州客家话以及粤西客家话。这些数据从某音和youtube上通过视频采集,同时还加上了100条自己录制的客家话。
2. 运行
运行前,先安装 funasr 依赖,同时要确保你已经安装了 torch 和 ffmpeg,并且要配置 ffmpeg 环境变量,具体可以看我的博客。
pip install funasr
下面给出一个demo.py方便你们测试。
# !/usr/bin/env python
# _*_ coding utf-8 _*_
# @Time: 2025/7/21 1:41
# @Author: Luke Ewin
# @Blog: https://blog.lukeewin.top
from funasr import AutoModel
model = AutoModel(
model="lukeewin01/SenseVoiceSmall_Hakka",
# vad_model="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch",
# vad_kwargs={"max_single_segment_time": 30000},
disable_update=True,
)
input_wav = (
r"D:\test\audio\hakka_test.wav",
r"D:\test\audio\hakka_a.wav",
r"D:\test\audio\hakka_b.wav",
)
res = model.generate(input=input_wav, batch_size_s=0, beam_size=5, use_itn=True, gain_event=True, fp16=True, language="zh")
print(res)
注意:把上面代码中的 input_wav 中的三个音频路径替换为你电脑中的路径。
为了方便对比训练前后的效果,这里可以运行下面代码,下面代码中使用的是训练之前的 SenseVoiceSmall 模型。
# !/usr/bin/env python
# _*_ coding utf-8 _*_
# @Time: 2025/7/21 1:41
# @Author: Luke Ewin
# @Blog: https://blog.lukeewin.top
from funasr import AutoModel
model = AutoModel(
model="iic/SenseVoiceSmall",
# vad_model="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch",
# vad_kwargs={"max_single_segment_time": 30000},
disable_update=True,
)
input_wav = (
r"D:\test\audio\hakka_test.wav",
r"D:\test\audio\hakka_a.wav",
r"D:\test\audio\hakka_b.wav",
)
res = model.generate(input=input_wav, batch_size_s=0, beam_size=5, use_itn=True, gain_event=True, fp16=True, language="zh")
print(res)
从输出的结果中不难看出,训练之后的效果比训练之前好很多。下面是结果。
正确文本
hakka_test: 这里我来测试一下语音识别看看识别的怎么样。
hakka_a: 你好大家好欢迎大家来到我的视频频道。
hakka_b: 你吃饭了吗今晚你吃什么菜呢?
训练前
[{'key': 'hakka_test', 'text': '<|zh|><|NEUTRAL|><|Speech|><|withitn|>地下来来测试一下语唔识劈睇睇识劈得怎么样。'}, {'key': 'hakka_a', 'text': '<|zh|><|NEUTRAL|><|Speech|><|withitn|>以号太假后稳人太假来到我的视频频道。'}, {'key': 'hakka_b', 'text': '<|zh|><|NEUTRAL|><|Speech|><|withitn|>女式花蕾梦点呀儿式乜牙菜呢?'}]
训练后
[{'key': 'hakka_test', 'text': '<|zh|><|NEUTRAL|><|Speech|><|withitn|>这我来测试一下语音识别大弟识别的怎么样。'}, {'key': 'hakka_a', 'text': '<|zh|><|NEUTRAL|><|Speech|><|withitn|>你好大家好欢迎大家来到我的视频频道。'}, {'key': 'hakka_b', 'text': '<|zh|><|NEUTRAL|><|Speech|><|withitn|>你吃话联吗今晚你吃什么菜呢?'}]
可以看到明显的区别,说明训练是有效果的。
3. 训练loss曲线
下面是训练中的loss曲线。
4. 其它
由于当前使用的是梅州、惠州以及粤西地区的客家话数据集训练的客家话ASR模型,如果你测试的时候使用的是非这三个地区的客家话,可能会识别出的字错率偏高。如果你想要使得训练的模型达到工业级水平,你应该准备更多的方言数据集用于训练,至少要200小时。
如果你想要进一步提升模型的识别准确率,欢迎联系 lukeewin01,或者你有其它方言需要训练,也欢迎联系 lukeewin01。
5. 联系
个人博客:https://blog.lukeewin.top
个人代码仓库:https://github.com/lukeewin