找不到满意的六花音色,就自己用 GPT-SoVITS 做一个
今晚折腾了一下 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 | ffmpeg -i "试听1_中文自我介绍.wav" \ |
这里把低于 -35dB、持续至少 0.25 秒的区间记为静音。它只是统一比较的尺子,不能单靠这个判断听感。正常换气、句间停顿也会被统计进去。
第一版共 11.24 秒,检测到 6 段静音,总计约 4.69 秒。一句话里约 42% 的时间都被计入静音,值得先检查参考里的节奏。
四、换成一句连贯的话,再合成同一段文本
后来回到同一场景,选了中二宣言里一段连续的话。原段开头还有一次较长停顿,于是把起点后移,只取人声轨的 52.95 到 57.00 秒,共 4.05 秒。
1 | ffmpeg -i vocal.wav -ss 52.95 -to 57.00 \ |
这条参考不再拼接,同时换成对应文本,不额外加省略号。日语识别稿仍有待人工校对的词,所以没有把它当成准确台词照抄。参考文字和实际发音能否对齐,也会影响合成质量。
目标文本仍用同一句:
你好呀,我是小鸟游六花。邪王真眼可是最强的哦!
按实践记录,推理参数保持默认。对两个留存 WAV 重新做相同的静音检测,结果如下:
| 指标 | 告白拼接参考 | 连续单句参考 |
|---|---|---|
| 合成音频时长 | 11.24 秒 | 6.16 秒 |
| 检测到的静音段数 | 6 | 4 |
| 静音总时长 | 4.69 秒 | 2.02 秒 |
| 静音占比 | 约 42% | 约 33% |
这组结果支持先检查参考材料的方向,但还不能说已经找到了唯一原因。参考音频、配套文本和语气一起变了,也没有做固定随机种子的多轮对照。它只能说明,在这次保留的样本里,换成连续单句后,输出里的静音时间明显少了。
更不能把“静音少了”等同于“更像六花了”。相似度、发音是否正确、语气是否自然,仍然需要听音判断。把生成结果交给 Whisper 再识别一遍,可以辅助找问题,但识别出近似音节不代表每个字都读对了。
五、这次先做到这里
现在留存了中文自我介绍、中二招式、日语问候,以及修复前后的同句对比。参考音频和生成的试听保留在本地,博客里先记录过程。
连续单句更适合作为这次的默认参考,不过它也有取舍:中二宣言的语气更强,未必适合所有句子;告白参考虽然断续,却保留了另一种情绪。后面如果想继续改善,可以先找一条既符合目标语气、又连贯干净的单句,再考虑整理更多语料微调模型。训练是否值得做,要看参考音频调整后还剩下什么问题。
今晚最有收获的地方,是发现选参考音频本身就在做决策。想要什么说话方式,就得检查参考里有没有相应的节奏,而不只是听出“这是六花的声音”就结束。下次再遇到合成语音卡顿,我会先把参考和生成结果放在一起对照,再决定要不要改参数。