今晚折腾了一下 TTS,想让小鸟游六花说几句自己写的台词。

本来以为找个现成音色就好了,结果逛了一圈,搜了不少渠道,还是没找到一个满意、又能直接拿来用的。也不是说互联网上完全没有六花模型,有些资源需要注册、评论才能下载,有些又涉及版本兼容。既然找起来这么费劲,那就自己造一个吧。

最后用 GPT-SoVITS 的 Mac 整合包,配上从动画原声里整理的参考音频,生成了几段中文和日语试听。算是一次小实践,把过程和踩到的坑记下来。

一、先跑通,不急着训练

这里说的“造音色”,具体是零样本克隆。这次没有从头训练模型,也没有微调出一套六花专属权重。

GPT-SoVITS 可以使用角色微调后的模型,也可以先用预训练底模,加上一小段参考音频和对应文字来合成。前者需要准备训练数据或找到兼容的模型,后者更适合我这次的目标:先让它说出一句话,看看值不值得继续折腾。

我用的是官方 v2 底模。要让它往六花的声音靠,关键输入就是参考音频。参考里不只有音色,还有说话的节奏、语气和停顿。这个区别,一开始没太在意,后面很快就踩到了。

Mac 这边先处理了整合包运行时的隔离标记和 Python 解释器链接,再启动 WebUI。确认 PyTorch 能使用 MPS 后,推理配置采用 device: mps、is_half: false。这是本次整合包的配置记录,换版本时仍要检查对应支持情况。

二、几秒参考音频,比想象中难找

素材选自 B 站上的六花告白场景片段。难点在于,要从有配乐、有人物对话的动画里,找出一段干净的六花单人台词。

标题写着六花,不代表整段都只有她。旁边勇太的一声回应,剪进去就多了一个说话人;背景音乐太重,模型拿到的也不再只是她的声音。

这次先对照画面和嘴型定位台词,再借助弹幕时间轴找线索,用 faster-whisper 的日语转写和词级时间戳辅助切分。几种信息要一起看,字幕、弹幕和识别结果都可能出错,Whisper 本身也不能判断“这就是六花”。说话人不明确的素材,先放到备选里。

确定片段后,用整合包里的 UVR5 分离人声和背景音乐,再用 ffmpeg 裁剪、调整响度,输出为 32kHz 单声道 WAV。人声分离能减少配乐干扰,但不会自动把不同人物的声音分开,裁剪边界还是要自己确认。

第一版参考音频选了两段告白台词,拼起来约 5 秒。我想要的是那种害羞的感觉,参考文字也保留了断续的表达:

1
私、勇太のことが好き……私…勇太が…

文字大致对上了,风格却给后面的合成埋了个坑。

三、能出声了,为什么说话这么碎

跑通之后,第一版的问题是说话频繁停顿。一句话被拆得很碎,跟“等它生成要等多久”是两件事:前者是音频里的节奏,后者才是推理速度。

回头看输入,这个结果有迹可循。两段告白被拼在一起,中间加了约 0.3 秒间隔,原台词又有犹豫和气声,参考文字里还有多个省略号。我给模型的示范,本身就不是一口气说完的话。

先不急着调语速,用同样的阈值看看停顿有多少:

1
2
ffmpeg -i "试听1_中文自我介绍.wav" \
-af "silencedetect=noise=-35dB:d=0.25" -f null -

这里把低于 -35dB、持续至少 0.25 秒的区间记为静音。它只是统一比较的尺子,不能单靠这个判断听感。正常换气、句间停顿也会被统计进去。

第一版共 11.24 秒,检测到 6 段静音,总计约 4.69 秒。一句话里约 42% 的时间都被计入静音,值得先检查参考里的节奏。

四、换成一句连贯的话,再合成同一段文本

后来回到同一场景,选了中二宣言里一段连续的话。原段开头还有一次较长停顿,于是把起点后移,只取人声轨的 52.95 到 57.00 秒,共 4.05 秒。

1
2
3
ffmpeg -i vocal.wav -ss 52.95 -to 57.00 \
-af "afade=t=in:d=0.01,loudnorm=I=-20:TP=-3" \
-ar 32000 -ac 1 "参考3_连续句_推荐.wav"

这条参考不再拼接,同时换成对应文本,不额外加省略号。日语识别稿仍有待人工校对的词,所以没有把它当成准确台词照抄。参考文字和实际发音能否对齐,也会影响合成质量。

目标文本仍用同一句:

你好呀,我是小鸟游六花。邪王真眼可是最强的哦!

按实践记录,推理参数保持默认。对两个留存 WAV 重新做相同的静音检测,结果如下:

指标 告白拼接参考 连续单句参考
合成音频时长 11.24 秒 6.16 秒
检测到的静音段数 6 4
静音总时长 4.69 秒 2.02 秒
静音占比 约 42% 约 33%

这组结果支持先检查参考材料的方向,但还不能说已经找到了唯一原因。参考音频、配套文本和语气一起变了,也没有做固定随机种子的多轮对照。它只能说明,在这次保留的样本里,换成连续单句后,输出里的静音时间明显少了。

更不能把“静音少了”等同于“更像六花了”。相似度、发音是否正确、语气是否自然,仍然需要听音判断。把生成结果交给 Whisper 再识别一遍,可以辅助找问题,但识别出近似音节不代表每个字都读对了。

五、这次先做到这里

现在留存了中文自我介绍、中二招式、日语问候,以及修复前后的同句对比。参考音频和生成的试听保留在本地,博客里先记录过程。

连续单句更适合作为这次的默认参考,不过它也有取舍:中二宣言的语气更强,未必适合所有句子;告白参考虽然断续,却保留了另一种情绪。后面如果想继续改善,可以先找一条既符合目标语气、又连贯干净的单句,再考虑整理更多语料微调模型。训练是否值得做,要看参考音频调整后还剩下什么问题。

今晚最有收获的地方,是发现选参考音频本身就在做决策。想要什么说话方式,就得检查参考里有没有相应的节奏,而不只是听出“这是六花的声音”就结束。下次再遇到合成语音卡顿,我会先把参考和生成结果放在一起对照,再决定要不要改参数。