GPT-SoVITS icon indicating copy to clipboard operation
GPT-SoVITS copied to clipboard

2月11日的更新引入了引号会导致日文推理丢字的bug

Open Arcgurus opened this issue 1 year ago • 16 comments

问题描述 在 070ac9b 及之前无此问题,但在 b607aa3 及之后,推理日文的时候,如果文本中混有一些引号,可能导致部分字直接被吃掉,该问题直到现在依然存在。 复现文本(不包括序号) 1、ある“予言”の中だけに登場する伝説上の聖騎士。 2、超金属「クロンデジゾイド」製である。 这两段文本分别推理的时候,第一段引号内的“予言”和第二段括号外的“超金属”均会丢字。但如果将这两段翻译成中文或者英文的话,就没有这个问题了。或者将括号引号去掉,也可以正常读出来。

本地配置 使用花佬发布的时间戳为2024/1/23 21:00:40的一键包,并手动从github下载新版源码覆盖,并运行runtime\python.exe -m pip install -r requirements.txt更新依赖。

Arcgurus avatar Feb 17 '24 07:02 Arcgurus

@Arcgurus 是否对GPT进行了重新训练,如果进行了,请尝试将最新代码中的将DPO选项关闭后再次训练,检查问题是否依然存在。

WatchTower-Liu avatar Feb 17 '24 08:02 WatchTower-Liu

@Arcgurus 是否对GPT进行了重新训练,如果进行了,请尝试将最新代码中的将DPO选项关闭后再次训练,检查问题是否依然存在。

您好,出现该问题使用的,是加入DPO之前训练的角色模型。刚刚在最新版代码 f6c9803 下,对同一数据集重新训练GPT和SoVITS,并取消勾选“是否开启DPO训练选项”。然而新模型依旧能够复现该问题。

Arcgurus avatar Feb 17 '24 08:02 Arcgurus

@WatchTower-Liu 感谢解答!请问该问题是否有跟进修复的打算?因为目前日文中使用汉字频率也并不算低,在日文推理中避免使用汉字可能确实比较困难。另外,如果把复现文本中的引号和括号删除的话,这几个日文汉字就可以读出来了,因此说明词表其实是认识这几个字的读音的,并非由于无法转换成音素而丢字。

Arcgurus avatar Feb 17 '24 08:02 Arcgurus

@Arcgurus 嗯嗯,因为日文引号与中文有区别,这可能会成为影响,后续应该会进行修复。或使用多语言混合进行推理。

WatchTower-Liu avatar Feb 17 '24 08:02 WatchTower-Liu

@WatchTower-Liu 我刚刚试了下,将运行环境回退到1月整合包的,并仅安装了LangSegment后再次尝试(不然推理界面直接打不开),但是问题依旧。所以看来似乎并不是NLTK的问题?

Arcgurus avatar Feb 17 '24 09:02 Arcgurus

@Arcgurus 是这个LangSegment造成,这个会使用词表做分词,所以有这个就会有问题,这种语言冲突比较难以根除,所以建议:使用多语言混合,或者手动将内容调整为纯净的单语言,或版本回退。 这个可能需要与RVC-Boss联系。 ['ある“', '予言”', 'の中だけに登場する伝説上の聖騎士。'] ['ja', 'zh', 'ja'] LangSegment的分割结果

WatchTower-Liu avatar Feb 17 '24 09:02 WatchTower-Liu

@WatchTower-Liu 看起来确实有点头疼。加个标点就会导致语种识别错误。而且第一句是引号内的文字识别错误,第二句就变成了括号外面的识别错误。 诶等等,我在推理的时候选的就是“日文”而非混合,但LangSegment照样能识别成中文?

Arcgurus avatar Feb 17 '24 09:02 Arcgurus

@Arcgurus 我详细的看了LangSegment的代码,这个工具的分词十分的简单粗暴,如果没有事先设置的标记,就会按照语言编码特点与标点进行切分,甚至没用分词工具,之前提到的NLTK和这个没关系(抱歉造成误解)。然后识别语言,所以会有这个问题。

WatchTower-Liu avatar Feb 17 '24 09:02 WatchTower-Liu

@Arcgurus 楼主目标文本语种选项选的是哪个?

RVC-Boss avatar Feb 17 '24 10:02 RVC-Boss

@RVC-Boss 目标文本选的是“日文”,而非任何混合选项。这两段文本本身也是纯日文。

Arcgurus avatar Feb 17 '24 10:02 Arcgurus

@Arcgurus 我详细的看了LangSegment的代码,这个工具的分词十分的简单粗暴,如果没有事先设置的标记,就会按照语言编码特点与标点进行切分,甚至没用分词工具,之前提到的NLTK和这个没关系(抱歉造成误解)。然后识别语言,所以会有这个问题。

啊这,确实没想到会是这么个操作。

Arcgurus avatar Feb 17 '24 10:02 Arcgurus

@Arcgurus 试下最新版呢?https://github.com/RVC-Boss/GPT-SoVITS/pull/509 看看是不是已经修了

RVC-Boss avatar Feb 17 '24 10:02 RVC-Boss

@Arcgurus #509 给出的一些方案,最好是用相应的语言tag进行区分,但是这意味着要用户自己负责输入内容的可用性,事实上GPT会根据上下文自行调整音素的生成,所以建议添加一个是否进行语言筛选的选项,或者将seg的结果暴露到前端,供调整 @RVC-Boss

WatchTower-Liu avatar Feb 17 '24 11:02 WatchTower-Liu

@RVC-Boss @WatchTower-Liu 经测试,#509 似乎已解决该问题,两段文本均正常朗读。

Arcgurus avatar Feb 17 '24 13:02 Arcgurus

@Arcgurus #509 给出的一些方案,最好是用相应的语言tag进行区分,但是这意味着要用户自己负责输入内容的可用性,事实上GPT会根据上下文自行调整音素的生成,所以建议添加一个是否进行语言筛选的选项,或者将seg的结果暴露到前端,供调整 @RVC-Boss

其实一开始在这个位置引入LangSegment主要是为了解决日文模式下乱读其他语言数据的问题。还有就是为了同步auto模式(也就是LangSegment实现的)下的英文分切规则。日文会有这次bug应该是由于中文和日文的字符编码相同引发的,LangSegment优先识别为中文。

KamioRinn avatar Feb 17 '24 15:02 KamioRinn

@Arcgurus 我详细的看了LangSegment的代码,这个工具的分词十分的简单粗暴,如果没有事先设置的标记,就会按照语言编码特点与标点进行切分,甚至没用分词工具,之前提到的NLTK和这个没关系(抱歉造成误解)。然后识别语言,所以会有这个问题。

分词功能已更新,升级后应该能解决您的问题: pip install --upgrade LangSegment

我解释下分词原理,任何语言对文字的处理都是基于词级分析的,包括python语言底层解析器也是词级代码解析的。 按标点划分并非是简单粗暴,它是基于词级的处理~然后再继续细分给大语言模型进行识别。 此外,中日在混合模式下,因中文与日文有大量汉字重叠情况,这对自动精准分词造成了较大的挑战性。 有时候,若遇到中日汉字自动分词错误,您不得不人工干预,一般手动添加标签即可解决。

最后,建议您前往了解一下 LangSegment , 它提供了详尽的分词帮助以及操作说明: https://github.com/juntaosun/LangSegment

此外,LangSegment项目也提供了webui可视化界面,帮助您更好处理自动分词和添加手动标签。 webui

juntaosun avatar Feb 17 '24 19:02 juntaosun

问题已解决。

RVC-Boss avatar Feb 18 '24 09:02 RVC-Boss