KEN’S CAT LOG
▣

比较语音合成训练数据: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 步的版本。

  1. 因怀疑是心肌梗死,请立即准备冠状动脉造影和溶栓治疗。
    • 我们怀疑是心肌梗死,请立即准备冠状动脉造影和溶栓治疗。
    • 我们怀疑是心肌梗死,因此请立即准备冠状动脉造影和溶栓治疗。
  2. 该算法采用了结合卷积神经网络与循环网络的结构。
    • 该算法将卷积神经网络与循环架构相结合。
    • 该算法将卷积神经网络与循环架构相结合。
  3. 被告人的律师以证据被非法收集为由,在上诉审中主张无罪。
    • 被告人的律师以证据被非法取得为由,在上诉中主张无罪。
    • 被告人的辩护律师因证据非法取得,请求在上诉程序中作出无罪判决。
  4. 在光合作用中,叶绿体类囊体膜中的电子传递链发挥作用,并合成三磷酸腺苷。
    • 在光合作用中,叶绿体类囊体膜内的电子传递链会产生三磷酸腺苷。
    • 在光合作用中,叶绿体类囊体膜内的电子传递链会产生三磷酸腺苷。
  5. 利用量子纠缠的密码密钥分发,在原理上能够检测窃听行为。
    • 基于纠缠的量子密钥分发原则上可以检测任何窃听行为。
    • 基于纠缠的量子密钥分发原则上可以检测任何窃听行为。
  6. 中央银行因应通胀率上升,决定上调政策利率并实施量化紧缩。
    • 为应对不断上升的通胀,中央银行决定加息并开始量化紧缩。
    • 由于通胀上升,中央银行决定提高利率并启动量化紧缩。
  7. 对于膝骨关节炎患者,采用玻尿酸关节腔内注射与物理治疗相结合的方法。
    • 膝骨关节炎患者接受关节腔内玻尿酸注射与物理治疗相结合的治疗。
    • 膝骨关节炎患者接受关节内玻尿酸注射,并结合物理治疗。
  8. 这座桥梁以预应力混凝土梁支撑钢筋混凝土桥面板。
    • 这座桥以预应力混凝土梁支撑钢筋混凝土桥面板。
    • 这座桥以预应力混凝土梁承载钢筋混凝土板。
  9. 加密货币交易所通过共识算法验证分布式账本的完整性。
    • 该加密货币交易所通过共识算法验证其分布式账本的完整性。
    • 该加密货币交易所使用共识算法验证分布式总账的完整性。
  10. 抗生素的过量使用会导致多重耐药菌出现,并提高院内感染的风险。
  • 过度使用抗生素会导致多重耐药菌,并增加医院感染的风险。
  • 过度使用抗生素会导致多重耐药菌,并增加院内感染的风险。
句子 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 种。不过,这次测量的只有“说了什么”。至于声音的自然度、情感表现的幅度等无法用字符错误率衡量的部分,更多数据可能仍然有优势。这一点想亲耳确认。