tts-skill 最佳实践:用「转写→克隆」两步法获得高质量声音克隆
项目地址:github.com/boommanpro/tts-skill · 文档:boommanpro.github.io/tts-skill · MIT 协议,基于 OmniVoice
先说原理:为什么克隆总是不稳定
tts-skill 基于 OmniVoice,支持 600+ 语种零样本声音克隆。零样本克隆的底层逻辑是:模型同时读取参考音频和参考文本,把"这段声音"和"这些字"对齐,从而学会说话人的音色、韵律、口音。
对齐越准,克隆越稳。问题就出在这里——
大多数人凭耳朵听参考音频,手写 ref_text,结果:
漏字、吞音
同音字写错("的/得/地"、"在/再")
多音字标错读音("银行"的"行"、"重"的 zhòng/chóng)
英文专有名词拼写错
只要 ref_text 和音频对不上,模型对齐就会偏,克隆出来的声音要么音色像但语调怪,要么直接翻车。
最佳实践的核心:别自己写 ref_text,让 ASR(语音转文字)替你听准。
tts-skill 把 ASR 和 TTS 放在同一个 Web UI 里,天然支持这套两步法。
三步走工作流
第一步:打开 Web UI
直接对 skill 说一句话就行:
启动 tts-skill 的 Web UI
它会执行 python -m tts_skill web,浏览器打开 http://localhost:7860 。首次运行自动检测平台和 GPU、走国内镜像装依赖,不用管。
界面有 5 个标签页,我们只用 「语音转文字」 和 「声音克隆」 两个。
第二步:用 ASR 把参考音频听准
进入 「语音转文字」,上传参考音频(3-10 秒清晰人声),点转写。
模型默认
large-v3,精度最高语言可自动检测或手动指定
任务选
transcribe(保留原语言)
几秒后你会拿到:
纯文本:参考音频的准确文字内容——这就是你的 ref_text
JSON(含词级时间戳):更精细的对齐信息
这一步的意义:机器听比人听准。 large-v3 在中文上字准确率通常 95% 以上。把这段转写文本原样作为 ref_text,对齐就稳了。
第三步:音频 + 准确文本做克隆
切到 「声音克隆」:
参考音频:上传同一段
参考文本:粘贴上一步 ASR 转写出来的文字(不要手动改写润色,保持和音频一致)
目标文本:你想让克隆声音说的话
种子:先固定一个值(如 42)方便复现
点生成。因为 ref_text 准确,这一次的效果会明显比"凭感觉写文本"稳定。
进阶:批量探索 + 种子复现
单次生成受种子影响较大。tts-skill 内置 批量生成(默认 5 个不同种子),强烈建议用它挑最优解:
帮我用这段参考音频和转写文本,批量生成 5 个不同种子的克隆音频
5 个文件会在 Web UI 中独立展示,逐个试听,挑最满意的,记下种子。
复现逻辑:相同种子 + 相同参数 = 完全相同的音频。每次生成都会输出一条可复现命令,历史记录也保存在 history.json 里,随时能在 「历史记录」 标签页查看、重命名、调出复现命令(TTS 和 ASR 分区展示,不会混)。
关键技巧:英语不好或多音字翻车时,替换为中文
这是实战中最常踩的坑,也是本文要重点补充的一段。
场景一:参考音频里有英文,克隆效果差
OmniVoice 虽然支持 600+ 语种,但中英混读对模型仍是难点。如果参考音频里夹了英文单词(比如"我用了 iPhone"),ASR 转写可能写成"我用了爱疯"或直接漏掉,对齐就偏了。
处理办法:换参考音频,或者把英文片段换成中文。
优先:找一段纯中文的参考音频重新走流程
次优:如果非用这段不可,把 ref_text 里的英文改成中文谐音/意译(如"iPhone"→"苹果手机"),让文本和音频节奏尽量对齐
对 skill 说:参考音频里有英文导致克隆不稳,帮我换一段纯中文的参考音频重新转写并克隆
场景二:目标文本里有英文/专有名词,克隆声音读出来怪
克隆音色没问题,但目标文本里夹英文(产品名、人名、缩写),克隆声音念出来发音很怪、带口音。
处理办法:把目标文本里的英文替换成中文。
产品名:
iPhone→苹果手机、ChatGPT→聊天机器人缩写:
API→接口、CEO→首席执行官人名:按通用译名,
Tim Cook→蒂姆·库克
对 skill 说:目标文本里的英文读起来很怪,帮我把英文替换成中文再生成一遍
场景三:多音字读错
中文多音字是另一个高频翻车点。常见的:
"银行"(yín háng)vs"行进"(xíng jìn)
"重量"(zhòng liàng)vs"重复"(chóng fù)
"睡觉"(shuì jiào)vs"觉得"(jué de)
"长大"(zhǎng dà)vs"长短"(cháng duǎn)
模型按上下文判断读音,有时会判错,克隆声音就会读成另一个音。
处理办法:用同音字替换,强制指定读音。
"银行账号" → "银航账号"(强制 háng)
"重置密码" → "虫置密码"(强制 chóng)
"长大成人" → "掌大人成"(强制 zhǎng)
替换后文本意思虽然怪了,但读音对了;模型生成的是"声音",最终听众听到的是正确读音。生成完再把目标文本换回正常文字即可(不影响音频)。
对 skill 说:目标文本里的"银行"被读成了 xíng,帮我把 ref_text 里的"行"换成同音字"航"重新生成
参考音频选取要点
再好的工作流也救不了垃圾参考音频:
时长 3-10 秒:太短学不到音色,太长易引入噪声
单说话人:不要混入第二个人的声音
清晰、无背景音乐/噪声
自然语调:避免朗读腔过重或情绪极端
和目标文本同语种:跨语种克隆效果打折,这也是上面"替换为中文"的根本原因
调参建议(效果仍不理想时)
Web UI 里可调:
一句话总结
别凭耳朵写 ref_text,让 ASR 替你听;遇到英文或多音字翻车,换中文。
完整流程:
开 Web →
python -m tts_skill webASR 转写参考音频 → 拿到准确 ref_text
音频 + 准确文本克隆 → 对齐稳,效果好
批量 5 个种子挑最优 → 固定种子复现
英文/多音字翻车 → 替换为中文(换参考音频、或改目标文本)