用小米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镜像加速模型下载
  • 项目管理功能,支持多个项目并行处理

使用流程:

  1. 上传音频文件
  2. 点击"开始分片",自动检测语音段并分割
  3. 切换到"语音识别"Tab,初始化ASR模型
  4. 点击"开始识别",自动转录所有片段
  5. 在"结果编辑"Tab中手动修正错误
  6. 导出为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(百度网盘) (☆▽☆)

有趣的现象

  1. 女声都带有"卡姐味":微调后的模型生成的女声都带有卡姐的特色,听起来都很像卡姐,这点数据量产生的影响比想象中大
  2. 男声很奇怪:微调后的模型生成的男声很奇怪,几乎不可用。这可能是因为训练数据中只有女声,且只有卡姐一个人 (°ー°〃)
  3. 推理更快:微调后的模型比原模型推理更快,这个现象我不太清楚是为什么 (・∀・)

使用体验

参考音频的影响

在使用OmniVoice时,参考音频对生成效果的影响非常大:

如果参考音频质量好(清晰、无噪音、情感丰富),生成的音频质量也会很高;如果参考音频质量差(【有噪音、情感平淡】),生成的音频质量也会很差(其实如果从你想克隆出噪音的这个角度那么其实算效果很好);参考音频的语速、语气会直接影响生成音频的语速和语气 (´・ω・`)

因此,选择合适的参考音频非常重要。我建议:

  • 选择3-10秒的音频片段,参考音频越长推理时间越长
  • 选择清晰、无噪音的音频
  • 选择与目标情感和语速一致的音频(虽然有调速选项,但是我认为还是如果参考音频能实现更好)
  • 选择与目标语言一致的音频,跨语种还是有一些违和感

instruct模式

除了参考音频,OmniVoice还支持instruct模式,可以通过文字描述来控制声音,也就是demo中的声音设计(应该是,我没有细看):

audio = model.generate(
    text="你好,我是卡姐",
    instruct="女声,慢速,温柔"
)

instruct模式的优点是:不需要参考音频、可以精确控制声音属性、适合批量生成,但缺点是:生成的声音无法复现,即使每次的参数一样、无法使用自然语言描述声音 (;′⌒`)

总结

通过这次实践,我成功地克隆了卡姐的声音。与之前用过的GPT-Sovits相比,虽然过程中遇到了很多问题但还是更加易用,且效果不错 (~ ̄▽ ̄)~

致谢

【感谢小米开源的MiMo-V2.5-ASR模型,感谢OmniVoice项目的开发者】,感谢B站@卡娅缇也不知道鸭”被”提供的声音素材,祝尽早复活 (╥﹏╥)

希望这篇文章对想要进行声音克隆的朋友有所帮助。如果你有任何问题或建议,欢迎在评论区留言 (★ω★)


声明:本文仅用于技术学习和研究,不用于任何商业用途。声音克隆技术应遵守相关法律法规,尊重他人的肖像权和声音权 (•̀ᴗ•́)و

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐