NEKOparapa / AiNiee

一款专注于Ai翻译的工具,可以用来一键自动翻译RPG SLG游戏,Epub Word TXT小说,Srt Vtt Lrc字幕等等。
GNU General Public License v3.0
1.4k stars 77 forks source link

[BUG] 在翻译多行短语时,经常会出现译文与原文错位的问题 #281

Closed neavo closed 1 month ago

neavo commented 1 month ago

举个例子:

"1_モニターe": "1_妮特罗单间前e",
"2_ニトロ09f": "2_妮特罗单间前09f",
"2_ニトロ09g": "2_妮特罗单间前09g",
"2_ニトロ09j": "2_显示器09j",

很明显,モニター 和 ニトロ 的翻译错位了

对翻译质量影响较大,因为这些短语都是经常使用的菜单项

但是暂时还不知道如何稳定复现,而且很难通过译后脚本进行排查,先留个记录

NEKOparapa commented 1 month ago

应该是AI翻译错行的问题,在开启处理首位非文本字符功能后,原文是 "モニター": "ニトロ": "ニトロ" "ニトロ"

然后AI翻译成 "妮特罗单间前", "妮特罗单间前", "妮特罗单间前", "显示器",

这个没办法检查出来

neavo commented 1 month ago

是不是应该排查一下代码BUG?印象中好像之前没有遇到这个问题,我也再试试看能不能稳定复现

NEKOparapa commented 1 month ago

以前的gpt3.5一直出现这个问题,针对性写了个错行检查方法,用检查原句与译句的字数,符号,以及词向量距离来判断,不过后面在线模型出现这个问题越来越少了,就弃了

neavo commented 1 month ago

以前的gpt3.5一直出现这个问题,针对性写了个错行检查方法,用检查原句与译句的字数,符号,以及词向量距离来判断,不过后面在线模型出现这个问题越来越少了,就弃了

我试着手动发了一些请求case来观察结果,并未发现错位的情况,可能还是应该检查一下代码

neavo commented 1 month ago

以前的gpt3.5一直出现这个问题,针对性写了个错行检查方法,用检查原句与译句的字数,符号,以及词向量距离来判断,不过后面在线模型出现这个问题越来越少了,就弃了

已确认是代码问题而非模型输出的问题。 这是一个Case:

原文为:

{
    "当たり前じゃん……ってあれ?" :"",
    "ああ、そっかあんまし" :"",
    "が遅いから様子見に来たんだっけ。" :"",
    "夜更かしはダメだよ、幾ら男子だからってね。" :"",
    "年取ってからお肌にキちゃうぞ?" :"",
    "あ、ああ……うん。" :"",
    "ごめんよ、もうすぐ休むから……。" :"",
    "ウン、じゃあ上で待ってるね。" :"",
    "う、うん……すぐに行くよ……。" :"",
    "……大丈夫だよ。" :"",
    "の言う通り今日は大人しくしてるからさ。" :"",
    "安心して出掛けて来て?" :"",
    "。心配してたんだよ?" :"",
    "すぐに帰って来るって言ったでしょ。" :"",
    "それより調子はどう?" :"",
    "うん、もうすっかり大丈夫。" :"",
    "って言うかその……さ。もしかしてあたしったら" :"",
    "何か" :"",
    "に変な事言ったりした?" :"",
    "何か今日は妙に心配してくれるし……。" :"",
    "ただ、ひどく疲れているみたいだったからね。" :"",
    "暫くは休んでいた方がいいのかもと思ってさ。" :"",
    "大丈夫だって。ホラ、この通り。くるくるっ。" :"",
    "(くるくる……?)" :"",
    "そうだ、ニトロ。少しだけジっとしていてくれる?" :"",
    "何?あ、ただいまのキス?" :"",
    "もしかして眼とか閉じた方がイイ感じ?" :"",
    "ち、違うって……。" :"",
    "(やっぱり……症状そのものはほんの少しだけど、確かに" :"",
    "進行はしている。でも……思った程じゃない)" :"",
    "(そうなんだ……思った程じゃない。このマドロ特区に" :"",
    "いれば当然反応する様な数値でしかない。" :""
}

模型输出为:

那不是当然的吗……咦?
啊啊,对了,因为
太晚了,所以才过来看看情况的吧。
熬夜可不行哦,就算是男孩子也一样。
上了年纪以后皮肤会变差的哦?
啊,啊啊……嗯。
抱歉,我马上去睡……
嗯,那我在楼上等你哦。
嗯、嗯……我马上就去……
……没事的。
正如
所说,今天我会老老实实的。
放心地出门吧?
。很担心你哦?
我不是说过马上就会回来吗。
比起这个,身体怎么样了?
嗯,已经完全没事了。
话说那个……啊。难道说
对
说了什么奇怪的话吗?
总觉得今天你莫名地担心我……
只是,你好像非常疲惫的样子。
所以我觉得暂时休息一下比较好。
都说没事了。你看,就像这样。转转转。
(转转转……?)
对了,硝化甘油。能稍微静止一下吗?
什么?啊,是说刚才的吻吗?
难道说闭上眼睛会更有感觉吗?
不、不是啦……
(果然……虽然症状本身只有一点点,但确实
在进行。但是……没有想象中那么严重)
(这样啊……没有想象中那么严重。只是在这个马多罗特区
理所当然会有的反应而已。

应用内结果为:

{
    "当たり前じゃん……ってあれ?": "那不是当然的嘛……诶?",
    "ああ、そっかあんまし": "啊啊,对了,因为",
    "が遅いから様子見に来たんだっけ。": "太晚了,所以过来看看情况。",
    "夜更かしはダメだよ、幾ら男子だからってね。": "熬夜可不行哦,就算是男孩子也一样。",
    "年取ってからお肌にキちゃうぞ?": "上了年纪以后皮肤会变差的哦?",
    "あ、ああ……うん。": "啊,啊啊……嗯。",
    "ごめんよ、もうすぐ休むから……。": "抱歉,我马上休息……",
    "ウン、じゃあ上で待ってるね。": "嗯,那我在上面等你。",
    "う、うん……すぐに行くよ……。": "嗯,嗯……我马上就去……",
    "……大丈夫だよ。": "……没事的。",
    "の言う通り今日は大人しくしてるからさ。": "正如",
    "安心して出掛けて来て?": "所说,今天我会老实待着的。",
    "。心配してたんだよ?": "放心地出门吧?",
    "すぐに帰って来るって言ったでしょ。": "我可是很担心你的哦?",
    "それより調子はどう?": "我不是说了马上就会回来吗。",
    "うん、もうすっかり大丈夫。": "比起这个,你身体怎么样了?",
    "って言うかその……さ。もしかしてあたしったら": "嗯,已经完全没事了。",
    "何か": "话说……那个。难道我",
    "に変な事言ったりした?": "说了什么",
    "何か今日は妙に心配してくれるし……。": "奇怪的话吗?",
    "ただ、ひどく疲れているみたいだったからね。": "总觉得今天你莫名地担心我……",
    "暫くは休んでいた方がいいのかもと思ってさ。": "只是,你好像非常疲惫。",
    "大丈夫だって。ホラ、この通り。くるくるっ。": "所以我觉得你暂时休息一下比较好。",
    "(くるくる……?)": "都说没事了。你看,就像这样。转转转。",
    "そうだ、ニトロ。少しだけジっとしていてくれる?": "(转转转……?)",
    "何?あ、ただいまのキス?": "对了,妮特罗。你能稍微站定一下吗?",
    "もしかして眼とか閉じた方がイイ感じ?": "什么?啊,是说回来时的吻吗?",
    "ち、違うって……。": "难道说闭上眼睛会更有感觉?",
    "(やっぱり……症状そのものはほんの少しだけど、確かに": "不,不是的……",
    "進行はしている。でも……思った程じゃない)": "(果然……虽然症状本身只有一点点,但确实",
    "(そうなんだ……思った程じゃない。このマドロ特区に": "在恶化。但是……没有想象中那么严重)",
    "いれば当然反応する様な数値でしかない。": "(这样啊……没有想象中那么严重。只是在这个马托罗特区"
}

可以看到,原文为 32 行 模型在翻译时,将 の言う通り今日は大人しくしてるからさ。 拆为了 2 行,输出变为了 33 行 但是应用并未检测到行数不一致,而是直接取了前 32 行,最终导致错位

这个问题应该只需要在进行结果检验时确保 输入输出行数一致 就可以解决了 但是我在代码中发现只检查了 输出行数大于输入行数且连续 这是为什么?

NEKOparapa commented 1 month ago

之前模型输出串行内容时,有时会中间缺一行,比如回复 0:xxx 1:bbb 3:cccc

Sakura是回复行文本,没有带序号,是程序直接转换成json格式,规避了序号检查。确实没有考虑过Sakura错误输出后多行的情况,可以改进一下行数检查,再加个行数是否一致

neavo commented 1 month ago

之前模型输出串行内容时,有时会中间缺一行,比如回复 0:xxx 1:bbb 3:cccc

Sakura是回复行文本,没有带序号,是程序直接转换成json格式,规避了序号检查。确实没有考虑过Sakura错误输出后多行的情况,可以改进一下行数检查,再加个行数是否一致

ok,一会儿我发个pr