背景:想把公众号文章变成播客
我最近想给「本虚幻灵」做一个播客版本。
文章已经写了一年多,但文字有个问题:读者得坐下来读。声音内容更适合开车、做饭、通勤时听。
问题是我不会播音。
自己录了两分钟,回放一听就放弃了:语调平、气息乱、结尾总是突然泄气。播音不是“有嘴就行”,它是门手艺。
所以我换了一个思路:我不学播音,让 AI 学我的声音。
这篇记录的是我用 Qwen3-TTS Base ICL 在本地做声音克隆的过程。结论先放前面:
声音克隆最容易被忽略的关键,不是提示词,也不是模型参数,而是参考音频和参考文本必须逐字对齐。
差一个字,效果就可能歪一截。
本地方案
我的目标不是做商业级 TTS,而是满足个人播客的最低可用版本:
- 用自己的声音读公众号稿件
- 本地运行,不依赖付费 API
- 能按段落生成,再拼成一整期音频
- 输出格式适合后续发布和存档
这次使用的核心组件:
| 环节 | 工具 |
|---|---|
| 声音克隆模型 | Qwen3-TTS Base ICL |
| 参考音频转写 | faster-whisper |
| 音频切片/拼接 | ffmpeg |
| 运行设备 | M 系列芯片设备 |
参考音频是一段 53 秒的播客开场白。
ICL 方案大概是这样:
参考音频 + 参考音频对应文本 + 待朗读文本
↓
Qwen3-TTS ICL
↓
克隆音频片段
这里的“参考音频对应文本”就是这次翻车的关键。
第一次失败:0.6B 版本直接生成噪音
我一开始用的是 0.6B 参数版本。
生成过程能正常跑完,但音频打开以后基本是噪音,听不出人声结构。为了确认不是我主观听错,我把生成音频再丢给 Whisper 做转写,结果出来的是乱码。
这一步的结论很简单:
0.6B 做中文声音克隆,基本不用浪费时间。
不是说它完全没价值,而是在这个任务上,它扛不住。
第二次失败:1.7B 能出声,但不像我
后来我换成 1.7B 版本。
这版模型大约 2.9GB,14 个文件,下载花了接近一小时。加载到内存后,峰值大约 11GB。M 系列芯片能跑,但已经接近临界点。
这次生成结果比 0.6B 好很多:
- 能听出完整人声
- 时长基本正常
- 片段之间衔接也还可以
- 中文句子不再是乱码
但问题是:一听就不是我。
不是那种完全错误的声音,而是“好像接近了,但气质不对”。音色、节奏、尾音都有偏差。
这类问题最麻烦,因为它不像报错那样明确。模型能跑,音频能出,结果也不是废品,但就是不对。
真正的问题:参考文本被我“修整”过
排查半天,最后问题出在参考文本。
我当时没有直接用工具逐字转写参考音频,而是自己写了一个“整理版文本”。录音里有一些口误、停顿、轻微重复,我觉得这些不重要,就顺手修掉了。
对人来说,这很合理。
但对 ICL 声音克隆模型来说,这是灾难。
因为模型要做的是:
用参考文本对齐参考音频
从对齐关系里学习音色、节奏、发音习惯
再把这些特征迁移到新文本上
如果参考音频里说的是 A,参考文本里写的是 B,模型从第一步对齐就已经歪了。
我后来用 faster-whisper 重新逐字转写参考音频,拿到了一版更接近真实录音的文本。里面有些我之前觉得“没必要写”的内容,包括口误、奇怪停顿和轻微重复。
这些东西对读者来说是废话。
但对模型来说,它们是对齐锚点。
修正后:音色和节奏终于对了
我把精确转写后的参考文本重新喂给模型,再跑一次。
这次效果明显变了:
- 音色更接近我自己的声音
- “欢迎收听本虚幻灵”这类句子的尾音上扬保留下来了
- 句与句之间的换气节奏也更像原始录音
- 整体听感不再像“另一个人读我的稿子”
它还不是完美版本。
主要问题是情绪起伏偏平,读故事类内容时还不够生动。但至少已经从“能出声”到了“听得出是我”的阶段。
当前工作流
现在我的流程是这样的:
1. 写好播客稿
2. 按段落切成 6 个左右的文本片段
3. 每个片段单独用 ICL 生成音频
4. 用 Whisper 回听/转写,检查生成内容是否跑偏
5. 用 ffmpeg 拼接片段
6. 输出 OGG 文件
为什么要切段?
因为长文本一次性生成更容易出问题:
- 中途语速变化
- 后半段发音漂移
- 句子吞字
- 失败后重跑成本高
切成短片段之后,每段失败可以单独重跑,后续拼接也方便。
一个简化版流程可以写成这样:
# 1. 用 faster-whisper 转写参考音频,拿到逐字参考文本
faster-whisper reference.wav --language zh --model medium
# 2. 分段生成音频
# 这里替换成自己的 Qwen3-TTS 推理脚本或 WebUI 调用
python generate_tts.py \
--reference-audio reference.wav \
--reference-text reference.txt \
--input segment_01.txt \
--output segment_01.wav
# 3. 拼接音频片段
ffmpeg -f concat -safe 0 -i segments.txt -c:a libopus output.ogg
上面命令只表达流程,具体参数要按你自己的 Qwen3-TTS 运行环境调整。
验证方式:不要只靠耳朵听
声音克隆很容易出现一种错觉:听第一遍觉得还行,过一会儿又觉得怪。
我的验证方式是双重检查:
- 人耳听:判断音色、节奏、气息是否像本人
- Whisper 转写:判断生成内容和输入文本是否一致
如果 Whisper 转写结果和输入文本差很多,说明模型在朗读内容层面已经出问题。
如果转写基本一致,但听起来不像本人,大概率是参考音频、参考文本或模型大小的问题。
这次踩坑总结
1. 参考文本必须逐字精确
声音克隆不是给模型一个“意思差不多”的文本就行。
录音里说了什么,文本就写什么。口误、停顿、重复,能保留就保留。你以为的废话,可能是模型识别节奏和发音习惯的关键。
2. 0.6B 不适合这个中文克隆任务
至少在我这次实验里,0.6B 直接生成噪音。想少走弯路,建议直接从 1.7B 起步。
3. 本地跑得动,但内存要留余量
1.7B 版本加载后峰值大约 11GB。M 系列芯片可以跑,但不要同时开太多重任务。
4. 长文本建议切段生成
一次性生成整期播客听起来省事,但失败成本更高。切成 5-8 个片段更稳。
5. 生成后一定要做内容验证
用 Whisper 回转写是一个很实用的检查方式。它不能判断“像不像本人”,但能判断有没有读错、漏读、乱读。
适用场景和边界
这个方案适合:
- 个人播客试水
- 公众号文章转音频
- 本地 AI 工作流实验
- 对成本敏感、不想依赖付费 API 的创作者
不适合:
- 商业配音
- 对情绪表达要求很高的内容
- 需要稳定批量生产的团队级流程
- 不能接受本地模型调试成本的人
我的第一版播客还称不上成熟,但已经够做实验了。
这次最大的收获不是“AI 能不能学会我的声音”,而是意识到:声音克隆这种任务,很多时候不是模型不够强,而是输入没对齐。
差一个字,声音就不是你。
本文首发于公众号「本虚幻灵」。一个上班族业余玩 AI 的记录者,不卖课,不制造焦虑,只记录真实折腾和踩坑过程。