用小米MiMo-V2.5-ASR和OmniVoice克隆虚拟主播声音:一次完整的TTS微调实践
用小米MiMo-V2.5-ASR和OmniVoice克隆虚拟主播声音:一次完整的TTS微调实践
前言
作为一个“老东西”,我一直想用AI技术“复活”我喜欢的虚拟主播。最近,小米开源了MiMo-V2.5-ASR语音识别模型和OmniVoice零样本文本转语音模型。我决定借“玩模型”的机会,找一找复活的方向。(总之,其实主要还是体验一下这两个模型啦⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄)这篇博客记录一下全流程的体验和踩坑经历。
“死者”——卡娅缇也不知道鸭 (╥﹏╥)
我最喜欢的虚拟主播是——@卡娅缇也不知道鸭,简称卡姐(卡缇娅也不知道鸭B站主页),已毕业。本次实践用的音频素材是卡姐最后一场2D直播的录像。
模型介绍
语音识别:MiMo-V2.5-ASR
小米在2025年5月开源了MiMo-V2.5-ASR,这是一个端到端的自动语音识别模型,支持多种中文方言、中英混读、歌词识别、噪声环境、多人对话。据官方描述,该模型识别率很精准,特别是对中文方言的支持,且支持原生标点,无需后处理等。
文本转语音:OmniVoice
OmniVoice是小米k2-fsa团队开源的另一个项目,支持600+语言的零样本文本转语音(TTS类型的)。OmniVoice可以语音克隆和语音设计,而且因为是TTS,所以推理较快。
数据准备
1. 获取音频
首先,用Downkyi(Github仓库)下载了卡姐最后一场2D直播的录像。这场直播大约有3个半小时,包含了卡姐唱歌、聊天、互动等各种场景。
2. 去除背景音乐
直播中有大量的背景音乐,这会干扰后续的微调训练。我使用了UVR5(Ultimate Vocal Remover 5)来去除背景音乐。
UVR5是一个基于深度学习的音频分离工具,可以将人声和伴奏分离】。我使用了以下设置:
- 处理方法:VR Architecture
- 窗口大小:512
- 处理强度:5
- 模型:4_HP-Vocal-UVR
- 输出:仅人声(记得勾选使用GPU转换选项)
处理后的音频质量还不错,但还是会有一些残留的伴奏或噪音。由于我的UVR几百年没有更新了,还在5.6.0版本,新模型应该效果会好一些 ( ̄▽ ̄)"
3. 音频分片和识别
为了提高数据处理效率,我开发了一个名为mimo-asr-tool(Github仓库)的全自动数据处理工具。这个工具集成了Silero VAD和MiMo-V2.5-ASR,提供了完整的Gradio界面,支持:
功能特点:
- 自动分片:使用Silero VAD进行语音活动检测,自动分割长音频
- 语音识别:集成MiMo-V2.5-ASR,支持中文、英文和自动语言检测
- 手动编辑:支持合并、拆分片段,修改识别文本
- 断点续处理:分片和识别分开保存,支持中断后继续
- 复选框操作:通过勾选复选框进行批量合并、删除操作
- 实时进度显示:详细的进度条和状态信息
技术实现:
- 使用Gradio构建Web界面
- 支持8bit量化以适配低显存设备
- 使用HuggingFace镜像加速模型下载
- 项目管理功能,支持多个项目并行处理
使用流程:
- 上传音频文件
- 点击"开始分片",自动检测语音段并分割
- 切换到"语音识别"Tab,初始化ASR模型
- 点击"开始识别",自动转录所有片段
- 在"结果编辑"Tab中手动修正错误
- 导出为OmniVoice需要的JSONL格式
这个工具大大提高了数据处理效率,原本需要数小时的手动分片和识别工作,现在可以在几分钟内完成 ( •̀ ω •́ )✧
分片我设置了以下参数:
- 最小片段时长:3秒
- 最大片段时长:10秒
但是又bug,有分片会超出10秒的上限,懒得修了 (~ ̄▽ ̄)~
分片完成后,使用MiMo-V2.5-ASR对每个片段进行语音识别效果挺好。但是MiMo-V2.5-ASR的显存占用比较大,我的RTX 4060 Laptop(8GB显存)无法直接运行。所以我fork了原仓库稍微改了一下代码,使用8bit量化来减少显存占用。量化后的显存占用几乎顶满8G,基本可以运行,会有点慢。量化会带来一些精度损失,不过在实际使用中没有明显感觉,有需要的话链接放在这里了:8bit量化修改仓库 (´・ω・`)
4. 数据格式
mimo-asr-tool可以直接将数据整理成OmniVoice需要的JSONL格式并一并导出音频文本,选对路径即可:
{"id": "segment_0000", "audio_path": "/path/to/audio/segment_0000.wav", "text": "你好,我是卡姐", "language_id": "zh"}
{"id": "segment_0001", "audio_path": "/path/to/audio/segment_0001.wav", "text": "今天给大家唱一首歌", "language_id": "zh"}
每个样本包含:
- id:唯一标识符
- audio_path:音频文件路径(绝对路径)
- text:识别的文本
- language_id:语言代码(可选)
模型微调
按照OmniVoice的要求使用uv来管理依赖(有一说一uv真的好用,之前用conda难用到爆炸)(┛✧Д✧))┛
硬件踩坑经历
第一次尝试:本机 RTX 4060 Laptop(8GB显存)
最开始我打算在自己的笔记本上完成训练,毕竟数据量不大。使用了以下参数:
- batch_tokens: 2048
- gradient_accumulation_steps: 4
结果发现一个epoch就要跑好几个小时,5000步下来估计要跑™56小时,直接原地爆炸 (╯°□°)╯︵ ┻━┻
第二次尝试:租用 RTX 5090(32GB显存)
再AutoDL上租了一张5090,心想32GB显存应该绰绰有余,直接把 batch_tokens 拉满到 8192。结果刚跑几步就OOM了 (⊙ˍ⊙):
RuntimeError: CUDA out of memory. Tried to allocate 2.00 GiB
原来 OmniVoice 的显存占用比想象中大得多,即使有32GB也不能太嚣张。最后调整为:
- batch_tokens: 4096
- gradient_accumulation_steps: 2
这次终于稳定了,显存占用大约在 20GB 左右 ( ̄ω ̄)
最终训练参数
- batch_tokens: 4096
- gradient_accumulation_steps: 2
- learning_rate: 1e-5
- steps: 5000
- keep_last_n_checkpoints: 3
训练过程
训练在RTX 5090(32GB显存)上进行,大约需要半小时。忘记记录训练log了,机器都释放了,懒得再搞了 ( ̄▽ ̄;)
训练过程中会保存checkpoint,我设置了只保留最近3个checkpoint。一开始没设置这个参数,结果checkpoint把30GB系统磁盘占满了,训练直接报错退出。加上keep_last_n_checkpoints: 3后切换输出目录到数据盘问题解决 (;′⌒`)
微调效果
微调后的模型效果非常明显,生成的卡姐声音更加逼真和清晰,听起来几乎就是真人(当然微调前效果也很好,只是有点电),微调的模型链接放在这里,可以自行玩耍OmniVoice_Katya.tar.gz(百度网盘) (☆▽☆)
有趣的现象
- 女声都带有"卡姐味":微调后的模型生成的女声都带有卡姐的特色,听起来都很像卡姐,这点数据量产生的影响比想象中大
- 男声很奇怪:微调后的模型生成的男声很奇怪,几乎不可用。这可能是因为训练数据中只有女声,且只有卡姐一个人 (°ー°〃)
- 推理更快:微调后的模型比原模型推理更快,这个现象我不太清楚是为什么 (・∀・)
使用体验
参考音频的影响
在使用OmniVoice时,参考音频对生成效果的影响非常大:
如果参考音频质量好(清晰、无噪音、情感丰富),生成的音频质量也会很高;如果参考音频质量差(【有噪音、情感平淡】),生成的音频质量也会很差(其实如果从你想克隆出噪音的这个角度那么其实算效果很好);参考音频的语速、语气会直接影响生成音频的语速和语气 (´・ω・`)
因此,选择合适的参考音频非常重要。我建议:
- 选择3-10秒的音频片段,参考音频越长推理时间越长
- 选择清晰、无噪音的音频
- 选择与目标情感和语速一致的音频(虽然有调速选项,但是我认为还是如果参考音频能实现更好)
- 选择与目标语言一致的音频,跨语种还是有一些违和感
instruct模式
除了参考音频,OmniVoice还支持instruct模式,可以通过文字描述来控制声音,也就是demo中的声音设计(应该是,我没有细看):
audio = model.generate(
text="你好,我是卡姐",
instruct="女声,慢速,温柔"
)
instruct模式的优点是:不需要参考音频、可以精确控制声音属性、适合批量生成,但缺点是:生成的声音无法复现,即使每次的参数一样、无法使用自然语言描述声音 (;′⌒`)
总结
通过这次实践,我成功地克隆了卡姐的声音。与之前用过的GPT-Sovits相比,虽然过程中遇到了很多问题但还是更加易用,且效果不错 (~ ̄▽ ̄)~
致谢
【感谢小米开源的MiMo-V2.5-ASR模型,感谢OmniVoice项目的开发者】,感谢B站@卡娅缇也不知道鸭”被”提供的声音素材,祝尽早复活 (╥﹏╥)
希望这篇文章对想要进行声音克隆的朋友有所帮助。如果你有任何问题或建议,欢迎在评论区留言 (★ω★)
声明:本文仅用于技术学习和研究,不用于任何商业用途。声音克隆技术应遵守相关法律法规,尊重他人的肖像权和声音权 (•̀ᴗ•́)و
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)