
比较语音合成训练数据:10小时、5小时和3小时——三语 TTS 几乎没有差别
克罗地亚语语音合成模型的后续。这次让一个小型模型说克罗地亚语、日语和英语这三种语言。并比较了“每种语言的训练数据为 10 小时、5 小时和 3 小时时,差别有多大”。
先说结论。
- 无论每种语言是 10 小时、5 小时还是 3 小时,最终几乎没有差别。 三者在最佳时点的字符错误率都是 0.7%(32 句话中有 28 句完全一致)
- 学习进展也几乎相同。日语和英语都在 3,000~5,000 步时、克罗地亚语也在 10,000 步时,基本能按台本朗读
- 只有 3 小时版在一段时间内仍保留了把“Bok!(你好)”误读成“Blok”的习惯。达到最佳状态所需的时间稍长一些
- 即使是充满专业术语的句子,也没有出现差异。我原以为 10 小时版会更擅长词汇,所以进行了测试,但三者几乎一样
- 三个模型对专业术语的误读,都以相同的方式出现在相同的词上。在英语中,原因不在模型,而在于把文字转换为音标的部分(词典)
做了什么
模型:与上次相同,使用 Matcha-TTS(约 1,830 万参数)以及将其还原为波形的 Vocos(约 1,350 万参数)。说话者为一名 20 多岁的男性。
实现三种语言的方法:将模型输入统一为三种语言共用的发音符号(IPA)。像“ʦ”“ʨ”这样跨语言相同的音,使用同一个符号。至于说哪种语言,则将原本用于切换说话者的编号作为“语言编号”来指定。
- 克罗地亚语:这门语言基本按书写内容发音,因此只需将文字一对一替换为发音符号
- 日语:用 OpenJTalk 提取读音和重音,并标出音高上升、下降的位置
- 英语:使用 g2p_en(CMU 发音词典,以及一个用于推测词典中没有的词如何发音的小模型)转换为发音符号
训练数据:由同一名男性朗读三种语言对话台词的音频。通过语音识别与台本比对、去除误读后的数据量为:克罗地亚语 9.4 小时、日语 9.7 小时、英语 8.3 小时(合计约 27 小时)。将其称为“10 小时版”。
从中为每种语言随机抽取恰好 5 小时(合计 15 小时)的版本称为“5 小时版”,每种语言抽取 3 小时(合计 9 小时,约 5,800 条)的版本称为“3 小时版”。其余设置(模型大小、批次大小、60,000 步)全部相同。由于步数相同,数据越少,就会越多次看到相同的音频(3 小时版约为 10 小时版的 3 倍)。
训练使用一张 RTX 4090,每次耗时 6~8 个半小时。
对比聆听训练过程中的声音
用训练数据中未包含的以下句子,由训练过程中的模型进行合成。
- 英语:明天我们要去海边,后天会去斯普利特看望我奶奶。
- 日语:明天去海边,后天计划去奶奶家玩。
- 克罗地亚语:明天我们去海边,后天会去斯普利特看望奶奶。
从左到右依次为 10 小时版、5 小时版、3 小时版。
| 步骤 | 10小时版 | 5小时版 | 3小时版 |
|---|---|---|---|
| 1,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 2,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 3,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 4,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 5,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 10,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 20,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 30,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 40,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 50,000 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
从听感来看,1,000 步的版本都还不够清晰。但英语已经大致能听懂在说什么。日语则因版本而异:5 小时版在 1,000 步时,就已将这句话逐字准确转写出来。相比之下,10 小时版听成了“请试着承蒙关照”,3 小时版则成了“到明天为止的医护人员……”,完全是不同的句子。
到3,000~5,000 步时,所有版本的日语和英语都能按台词读出来。克罗地亚语稍慢一些,开头的 “Sutra(明天)” 会被听成 “Sve”“Straj”“Satra” 等情况,一直持续到大约 5,000~10,000 步。20,000 步以后,即使听起来,三个版本之间的差异也几乎分辨不出来。
用数字来看
我用 Whisper large-v3 转写了评估用句子(克罗地亚语 14 句、日语 9 句、英语 9 句,均未包含在训练数据中),并测量了与台词之间的字符错误率(CER)。日语则先改为片假名读音后再比较,以避免因汉字写法差异(如“あさって”和“明後日”)而被算作错误。
首先是三种语言共 32 句的平均值。括号内为完全一致的数量。
| 步数 | 10 小时版 | 5 小时版 | 3 小时版 |
|---|---|---|---|
| 1,000 | 43.8%(2) | 41.9%(2) | 43.8%(1) |
| 2,000 | 16.6%(7) | 17.7%(12) | 17.6%(9) |
| 3,000 | 7.7%(16) | 6.2%(16) | 9.9%(14) |
| 4,000 | 5.9%(21) | 3.7%(19) | 2.7%(25) |
| 5,000 | 2.1%(23) | 3.3%(20) | 4.5%(23) |
| 10,000 | 1.4%(24) | 1.1%(23) | 1.7%(24) |
| 15,000 | 0.8%(26) | 0.7%(26) | 2.0%(24) |
| 20,000 | 0.7%(27) | 0.8%(26) | 0.9%(25) |
| 30,000 | 0.7%(28) | 0.8%(26) | 1.7%(26) |
| 40,000 | 1.2%(25) | 1.7%(26) | 0.7%(26) |
| 45,000 | 3.9%(25) | 0.7%(28) | 0.7%(27) |
| 50,000 | 0.7%(28) | 0.7%(26) | 0.7%(28) |
| 60,000 | 1.8%(26) | 0.8%(27) | 1.9%(25) |
按语言来看则是这样(克罗地亚语 / 日语 / 英语)。
| 步数 | 10 小时版 | 5 小时版 | 3 小时版 |
|---|---|---|---|
| 5,000 | 2.8 / 1.2 / 1.8% | 6.5 / 1.2 / 0.3% | 2.0 / 1.8 / 11.1% |
| 10,000 | 2.2 / 1.2 / 0.3% | 1.7 / 1.2 / 0.3% | 2.9 / 1.2 / 0.3% |
| 20,000 | 0.8 / 1.2 / 0.0% | 0.9 / 1.2 / 0.0% | 0.8 / 1.8 / 0.3% |
| 30,000 | 0.7 / 1.2 / 0.0% | 1.1 / 1.2 / 0.0% | 3.2 / 1.2 / 0.0% |
| 50,000 | 0.7 / 1.2 / 0.0% | 0.9 / 1.2 / 0.0% | 0.7 / 1.2 / 0.0% |
- 表现最好的是:10 小时版在 30,000 和 50,000 步时、5 小时版在 45,000 步时,以及 3 小时版在 50,000 步时。全都是总体 0.7%,32 句中有 28 句完全一致,三个版本都达到了同一水平
- 中途数值跳升的地方,几乎都是一个词的差别。例如 “Bok!(你好)” 被听成 “Bog”,或 “Hi!” 被听成 “Bye.”。对于只有 1~2 个词的短句,仅相差一个字符就会让错误率大幅跳升
- 3 小时版在 15,000~35,000 步时,克罗地亚语处于 3% 左右。查看内容后发现,几乎都是将 “Bok!” 读成 “Blok” 的同一句话。到 50,000 步时已经修正。数据较少时,短句中的这种习惯似乎需要更久才能消除
- 日语的 1.2% 每次都只来自一句:把“嘘,安静。”中的“嘘”转写成了“し”。这是长音该写到什么程度的问题;实际听起来,确实说的是“嘘”
- 克罗地亚语剩余的错误,大多是转写一侧的习惯,例如将 “prekosutra(后天)” 写成分开的两个词 “preko sutra”
10 小时、5 小时和 3 小时之间的差异都在误差范围内。 至少就“能否按台词读出来”而言,每种语言 3 小时的数据已足够。不过,3 小时版需要更长时间才会稳定,因此最好训练到 40,000 步以上。
用满是专业术语的句子比较
日常对话即使数据较少也足够,但如果是训练数据中几乎不会出现的难词,数据更多的版本是否会更有优势?基于这个想法,我制作了 10 句包含医学、IT、法律、化学、金融等专业术语的句子,并让三种语言来读。所有模型都使用了 50,000 步的版本。
- 因怀疑是心肌梗死,请立即准备冠状动脉造影和溶栓治疗。
- 我们怀疑是心肌梗死,请立即准备冠状动脉造影和溶栓治疗。
- 我们怀疑是心肌梗死,因此请立即准备冠状动脉造影和溶栓治疗。
- 该算法采用了结合卷积神经网络与循环网络的结构。
- 该算法将卷积神经网络与循环架构相结合。
- 该算法将卷积神经网络与循环架构相结合。
- 被告人的律师以证据被非法收集为由,在上诉审中主张无罪。
- 被告人的律师以证据被非法取得为由,在上诉中主张无罪。
- 被告人的辩护律师因证据非法取得,请求在上诉程序中作出无罪判决。
- 在光合作用中,叶绿体类囊体膜中的电子传递链发挥作用,并合成三磷酸腺苷。
- 在光合作用中,叶绿体类囊体膜内的电子传递链会产生三磷酸腺苷。
- 在光合作用中,叶绿体类囊体膜内的电子传递链会产生三磷酸腺苷。
- 利用量子纠缠的密码密钥分发,在原理上能够检测窃听行为。
- 基于纠缠的量子密钥分发原则上可以检测任何窃听行为。
- 基于纠缠的量子密钥分发原则上可以检测任何窃听行为。
- 中央银行因应通胀率上升,决定上调政策利率并实施量化紧缩。
- 为应对不断上升的通胀,中央银行决定加息并开始量化紧缩。
- 由于通胀上升,中央银行决定提高利率并启动量化紧缩。
- 对于膝骨关节炎患者,采用玻尿酸关节腔内注射与物理治疗相结合的方法。
- 膝骨关节炎患者接受关节腔内玻尿酸注射与物理治疗相结合的治疗。
- 膝骨关节炎患者接受关节内玻尿酸注射,并结合物理治疗。
- 这座桥梁以预应力混凝土梁支撑钢筋混凝土桥面板。
- 这座桥以预应力混凝土梁支撑钢筋混凝土桥面板。
- 这座桥以预应力混凝土梁承载钢筋混凝土板。
- 加密货币交易所通过共识算法验证分布式账本的完整性。
- 该加密货币交易所通过共识算法验证其分布式账本的完整性。
- 该加密货币交易所使用共识算法验证分布式总账的完整性。
- 抗生素的过量使用会导致多重耐药菌出现,并提高院内感染的风险。
- 过度使用抗生素会导致多重耐药菌,并增加医院感染的风险。
- 过度使用抗生素会导致多重耐药菌,并增加院内感染的风险。
| 句子 | 10小时版 | 5小时版 | 3小时版 |
|---|---|---|---|
| 1. 怀疑有心肌梗死,请立即准备冠状动脉造影和溶栓治疗。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 2. 该算法采用了结合卷积神经网络与循环神经网络的结构。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 3. 被告的律师以非法收集证据为由,在上诉审中主张无罪。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 4. 在光合作用中,叶绿体的类囊体膜内电子传递链发挥作用,并合成三磷酸腺苷。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 5. 利用量子纠缠进行的密钥分发,能够从原理上检测窃听行为。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 6. 中央银行因通胀率上升,决定上调政策利率并实施量化紧缩。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 7. 对于膝骨关节炎患者,我们会联合采用玻璃酸关节腔注射和物理治疗。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 8. 该桥梁以预应力混凝土梁支撑钢筋混凝土桥面板。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 9. 加密货币交易所通过共识算法验证分布式账本的完整性。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
| 10. 滥用抗生素会导致多重耐药菌出现,并增加院内感染的风险。 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 | 英语 日语 克罗地亚语 |
结果。
| 克罗地亚语 | 日语 | 英语 | 30 句中的完全一致数 | |
|---|---|---|---|---|
| 10 小时版 | 0.6% | 1.5% | 4.6% | 17 |
| 5 小时版 | 0.3% | 1.0% | 3.9% | 20 |
| 3 小时版 | 0.5% | 1.0% | 4.1% | 18 |
结果并不是 10 小时版更强。 三者都差不多,反而是 5 小时版略好一些。为保险起见,又用训练 60,000 步的模型测了 10 小时版和 5 小时版,结果是 10 小时版 1.9%、5 小时版 2.0%,排名又反过来了。也就是说,这个差异只是偶然波动,无法说哪个更好。另外,只有 3 小时版因为 GPU 被其他工作占用,合成和转写是在 CPU 上完成的,因此条件略有不同。
有意思的是,错误的内容。
- 英语的“cryptocurrency”,三个模型全部都被听写成了类似“Kripke-Kunershi”“Kripke-Kinoshi”“Kripik-Innershi”的词
- “intra-articular”“multidrug-resistant”“angiography”也都被三个模型以相同的方式读错了
- 日语的“冠動脈造影”,三个模型都被转写成了“〜増え”;“床版”则全都被转写成“障板”
- 克罗地亚语的“pooštravanje(收紧)”,所有模型都被听成了“poštravanje”
训练数据量不同的模型,却会在同样的单词上以同样的方式出错。英语的原因很明确:问题不在模型,而在于将文字转换为音标的部分。
这次的模型不直接读取文字,而是读取音标。对于英语,词典中没有的单词会由 g2p_en 推测其发音。实际检查后发现,“cryptocurrency”被转换成了接近“クリパキュナーシ”的音标,“angiography”则被转换成中间多了 n 的音标。模型只是照着收到的音标发声,因此无论训练数据是 10 小时还是 3 小时,都会在相同的地方出错。
日语的情况稍有不同。OpenJTalk 给出的读音“床版(ショーバン)”“冠動脈造影(カンドーミャクゾーエー)”是正确的。“床版”变成“障板”,是因为使用了读音相同的另一个汉字,因此在读音上是对的。“造影”变成“増え”,可能是 Whisper 把不常见的词往更熟悉的词上靠,也可能是模型发音不够清晰;用这次的测量方法无法区分。不过,在这里三个模型同样都以相似的方式出错。
也就是说,在这套机制中,至少英语专业术语的表现并不由训练数据量决定,而是由发音词典决定。如果想增强对专业术语的支持,与其增加数据,不如把词语登记进词典,速度更快。
总结
- 可以让一个小型模型(总计约 3,200 万个参数)说三种语言
- 训练数据无论每种语言是 10 小时、5 小时还是 3 小时,最终的读音准确度都几乎相同。3 小时版需要稍长一点时间才能稳定下来
- 即使是专业术语也没有出现差异。错误发生在发音词典这一侧,无法通过数据量来修正
制作数据既花时间也花钱,所以看起来可以先为每种语言准备 3 小时的数据试试看,不够再补充。接下来打算基于这个结果,把语言数量增加到 10 种。不过,这次测量的只有“说了什么”。至于声音的自然度、情感表现的幅度等无法用字符错误率衡量的部分,更多数据可能仍然有优势。这一点想亲耳确认。



