Skip to content

你永远不可能搞不到简中字幕, 因为我要创造一个什么都不懂的人也能轻松使用 AI 字幕翻译的世界

关于怎么看动画片之外挂字幕上哪儿搞的问题我理论上属于是已经讲得非常清楚了:

https://zhuanlan.zhihu.com/p/1907127114509034779但你挡不住就是有例外, 虽然就目前看来还算少见吧, 比如说『アラフォー男の異世界通販 / 四十左右中年男的异世界网购』或者『0歳児スタートダッシュ物語 / 零岁儿开始冲刺的故事』之类的都是比较典型的例子, 就是说没有任何版权字幕, 完了接手的字幕组都半死不活的可能播完了都没搞到第十集, 更过分的搞不好还会出现什么第十集没人做然后第十一集出来的了的情况··· 甚至直接就没字幕组接, 我反正都碰到过.

你可能会想哎我都没听过这些动画片··· 那是你的问题, 我可是每季所有动画片都要看的, 相信像我这样的人也不在少数. 而我本来还打算拖一拖, 就懒得讲这个事儿, 结果没想到『自動販売機に生まれ変わった俺は迷宮を彷徨う 2nd Season / 转生成自动贩卖机的我在迷宫徘徊 第二季』出了. 都不用说了, 这片儿第一季就没字幕. 完了我这季人设超可我超爱 (暂定) 的『ゲーセン少女と異文化交流 / 与游戏中心的少女异文化交流』也是完全没有版权字幕, 几个接了的组也多少沾点儿不上心, 感觉也事岌岌可危了.

所以, 虽然怎么搞字幕这个问题还有上万个方法我都还没介绍到, 但今天我就要直接丢个王炸, 相信就算将来字幕组全死绝了你也永远能舒舒服服地看动画片. 另外就是, 不是经常有那种今晚都出了结果字幕却要等到明天中午的绝望事件吗? 你要真等不了的话那现在也真不用等了.

啊那字幕组还有啥用··· ? 那确实没用了.

这就事版本答案之—— AI 翻译.

你说从英语翻译过来的能看吗? 我可以明确告诉你很多版权字幕都很显然就是这么搞的. 因为日语经常省略主语及动词等成分, 日译中都因此形成一套黑话翻译腔了, 而英文字幕则没法这么省, 那我听着没有的成分结果你字幕译出来了那不明摆着就英文文本翻过来的吗? 其实光就你字幕会带标点符号就··· 说实在的很多时候我甚至都还能再给你脑翻回英文文本. 另外就是有时候会碰到他、她不分的字幕··· 这我确实没搞懂是怎么回事, 难道英文字幕会出现强行补进去的主语连 He、She 都不分的情况吗?

不过我的意思是, 反正这些都完全不影响观看, 观感还是很好的.

然后将来我还是会介绍一些没那么牛逼的方法, 因为呃··· 这个方法虽然很轻松但你需要额外的工具, 而且, 理论上你的日语水平越牛逼你对字幕的需求就越没那么牛逼了嘛, 所以有时候我可能开个机翻就啃了, 反正我本来都听得懂.

目録

0. 具体代码与演示环节

0.1. 简单翻译个几句给你看看 0.2. 具体代码

1. 前置工具

1.1. 关于 Mathematica 的交流学习版 1.2. 至于说 AI 吧, 随便你自己搭还是用啥就瞎比找个快的就行了

2. 流程解析

2.1. 首先英文字幕哪里来? 2.2. 字幕翻译的流程详解

0. 具体代码与演示环节

0.1. 简单翻译个几句给你看看:

总得来说你只需要复制粘贴三次然后按三下回车就结束了, 毕竟我就只写了四行代码, 甚至发起疯来我两行就能解决··· 如果你能调 AI 的 API 的话那一行就能搞定, 现在 MMA 也能接入 AI 了. 但我们这个其实只需复制粘贴, 纯免费的, 文本翻译嘛, 也不是什么高端功能.

首先我们比如说从英语字幕文件里抽出了字幕内容:

​`` Dialogue: 0,0:00:01.21,0:00:02.77,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:03.97,0:00:05.85,main,Lammis,0,0,0,,Good morning, Boxxo! Dialogue: 0,0:00:05.85,0:00:06.87,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:06.87,0:00:08.85,main,Karios,0,0,0,,Good morning, Lammis! Dialogue: 0,0:00:09.27,0:00:12.85,main,Lammis,0,0,0,,Karios, Gorth! Thanks for /Nkeeping watch again today! Dialogue: 0,0:00:12.85,0:00:16.11,main,Gorth,0,0,0,,Sure. Nothing beats sweet tea /Nat the end of a night shift. Dialogue: 0,0:00:16.98,0:00:19.42,italics,Boxxo,0,0,0,,I look forward to your next use. Dialogue: 0,0:00:18.17,0:00:19.42,overlap,Gorth,0,0,0,,Mhm! Dialogue: 0,0:00:20.71,0:00:23.45,italics,protagonist,0,0,0,,I died and was reborn as a vending machine. Dialogue: 0,0:00:23.45,0:00:26.32,italics,protagonist,0,0,0,,That's a bizarre situation /Nto suddenly be in... Dialogue: 0,0:00:26.32,0:00:27.50,main,kids,0,0,0,,Good morning! Dialogue: 0,0:00:27.50,0:00:30.74,italics,protagonist,0,0,0,,but I've found ways to make /Nthe whole thing enjoyable. Dialogue: 0,0:00:34.17,0:00:37.01,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,{/blur3/fad(1773,1)/an8/fs20}Reborn as a Vending Machine,/N{/fnTimes New Roman/c&H020222&}I {/c&H161C79&}Now {/c&H1C379A&}Wander {/c&H1D6FE2&}the {/c&H2D9CED&}Dungeon Dialogue: 0,0:00:39.47,0:00:41.06,italics,protagonist,0,0,0,,On the outside, a rectangular steel box. Dialogue: 0,0:00:41.32,0:00:43.30,italics,protagonist,0,0,0,,Hidden within is a human soul! Dialogue: 0,0:00:43.30,0:00:48.72,italics,protagonist,0,0,0,,In a world of wonder, I go to and fro /Non the back of my partner Lammis! Dialogue: 0,0:00:44.39,0:00:50.27,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,{/blur3/fad(1773,1)/an8/fs20}Reborn as a Vending Machine,/N{/fnTimes New Roman/c&H020222&}I {/c&H161C79&}Now {/c&H1C379A&}Wander {/c&H1D6FE2&}the {/c&H2D9CED&}Dungeon Dialogue: 0,0:00:48.72,0:00:51.14,italics,protagonist,0,0,0,,I am Boxxo! Hello there! Dialogue: 0,0:00:51.14,0:00:52.87,italics,protagonist,0,0,0,,That means 'yes'! Dialogue: 0,0:02:07.06,0:02:10.98,sign_2040_26_The_Vending_Mach,text,0,0,0,,{/fad(734,473)/fscx100/fsp.4/pos(430,55)}Hunters and Motives Dialogue: 0,0:02:09.44,0:02:11.38,main,Lammis,0,0,0,,It really feels like summer now! ​``

然后我们就把它复制到 MMA 里, 这一步是为了保护时间轴:

再将按小回车后输出的

{DialogTrans[1], "Hello there."}, {DialogTrans[2], "Good morning,Boxxo!"}, {DialogTrans[3], "Hello there."}, {DialogTrans[4], "Good morning,Lammis!"}, {DialogTrans[5], "Karios,Gorth! Thanks for/Nkeeping watch again today!"}, {DialogTrans[6], "Sure.Nothing beats sweet tea/Nat the end of a night shift."}, {DialogTrans[7], "I look forward to your next use."}, {DialogTrans[8], "Mhm!"}, {DialogTrans[9], "I died and was reborn as a vending machine."}, {DialogTrans[10], "That's a bizarre situation/Nto suddenly be in..."}, {DialogTrans[11], "Good morning!"}, {DialogTrans[12], "but I've found ways to make/Nthe whole thing enjoyable."}, {DialogTrans[13], "Reborn as a Vending Machine,/NI Now Wander the Dungeon"}, {DialogTrans[14], "On the outside,a rectangular steel box."}, {DialogTrans[15], "Hidden within is a human soul!"}, {DialogTrans[16], "In a world of wonder,I go to and fro/Non the back of my partner Lammis!"}, {DialogTrans[17], "Reborn as a Vending Machine,/NI Now Wander the Dungeon"}, {DialogTrans[18], "I am Boxxo! Hello there!"}, {DialogTrans[19], "That means'yes'!"}, {DialogTrans[20], "Hunters and Motives"},

发给任何一个生成式 AI, 它必能精准返回翻译后的文本:

然后你再把 AI 反馈的结果复制回来并粘贴到 TimeLineTabTrans 的等号右边然后按小回车就得到了最终文本:

这就事你要的简中字幕:

​`` Dialogue:0,0:00:01.21,0:00:02.77,italics,Boxxo,0,0,0,,你好。 Dialogue:0,0:00:03.97,0:00:05.85,main,Lammis,0,0,0,,早上好,博克斯! Dialogue:0,0:00:05.85,0:00:06.87,italics,Boxxo,0,0,0,,你好。 Dialogue:0,0:00:06.87,0:00:08.85,main,Karios,0,0,0,,早上好,拉米斯! Dialogue:0,0:00:09.27,0:00:12.85,main,Lammis,0,0,0,,卡里奥斯,戈尔思!谢谢你/N今天又值班了! Dialogue:0,0:00:12.85,0:00:16.11,main,Gorth,0,0,0,,当然。没有什么比夜班结束时/N来杯甜茶更棒的了。 Dialogue:0,0:00:16.98,0:00:19.42,italics,Boxxo,0,0,0,,我期待你下次使用。 Dialogue:0,0:00:18.17,0:00:19.42,overlap,Gorth,0,0,0,,嗯! Dialogue:0,0:00:20.71,0:00:23.45,italics,protagonist,0,0,0,,我死了,然后重生为一台自动售货机。 Dialogue:0,0:00:23.45,0:00:26.32,italics,protagonist,0,0,0,,这真是个奇怪的/N突发状况 Dialogue:0,0:00:26.32,0:00:27.50,main,kids,0,0,0,,早上好! Dialogue:0,0:00:27.50,0:00:30.74,italics,protagonist,0,0,0,,但我已经找到了让/N这一切变得愉快的方法。 Dialogue:0,0:00:34.17,0:00:37.01,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,重生为自动售货机,/N我现在在地下城里游荡 Dialogue:0,0:00:39.47,0:00:41.06,italics,protagonist,0,0,0,,外表是一个长方形的钢盒子。 Dialogue:0,0:00:41.32,0:00:43.30,italics,protagonist,0,0,0,,里面藏着一个人类的灵魂! Dialogue:0,0:00:43.30,0:00:48.72,italics,protagonist,0,0,0,,在一个充满奇迹的世界里,我/N骑着我的搭档拉米斯四处游荡! Dialogue:0,0:00:44.39,0:00:50.27,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,重生为自动售货机,/N我现在在地下城里游荡 Dialogue:0,0:00:48.72,0:00:51.14,italics,protagonist,0,0,0,,我是博克斯!你好! Dialogue:0,0:00:51.14,0:00:52.87,italics,protagonist,0,0,0,,这意味着'是'! Dialogue:0,0:02:07.06,0:02:10.98,sign_2040_26_The_Vending_Mach,text,0,0,0,,猎人与动机 Dialogue:0,0:02:09.44,0:02:11.38,main,Lammis,0,0,0,,现在真像夏天啊! ​``

0.2. 具体代码:

​`` InPutSub = "[Events]"; InPutSubTab = StringReplace[ StringSplit[ StringReplace[ InPutSub, {"Dialogue:" -> "[Division]Dialogue:", "\n" -> ""}], "[Division]"], RegularExpression["\\{.*?\\}"] -> ""]; SplitLines[InPutSub_, nLine_] := StringSplit[Part[InPutSub, nLine], ",,"]; TimeLineTab = Table[{Part[SplitLines[#, nLine], 1], DialogTrans[nLine]}, {nLine, 1, Length[#]}] &[InPutSubTab]; Do[Dialogue[nLine] = Part[SplitLines[#, nLine], 2], {nLine, 1, Length[#]}] &[InPutSubTab]; InputForm[ Table[{DialogTrans[nLine], Dialogue[nLine]}, {nLine, 1, Length[#]}] &[InPutSubTab]] ​``

把提出的英文字幕复制到 [Events] 处, 不过要提前把文本里的「\」全都替换成「/」, 然后「"」也都换成「'」.

​`` TimeLineTabTrans = "[OutPut]"; Do[DialogTrans[nLine] = Part[TimeLineTabTrans, nLine, 2], {nLine, 1, Length[TimeLineTabTrans]}]; OutPutSub[n_] := Part[TimeLineTab, n, 1] <> ",," <> Part[TimeLineTab, n, 2]; OutPutSub[All] = Table[OutPutSub[n], {n, 1, Length[TimeLineTab]}]; StringRiffle[OutPutSub[All], "\n"] ​``

将 AI 的回应复制到 [OutPut] 处.

执行代码就是按小键盘的 Enter 或者 Shift + Enter.

1. 前置工具

1.1. 关于 Mathematica 的交流学习版:

在前文的基础上我们只需要两个额外的工具, 一个事 Mathematica, 一个事随便的什么生成式 AI. 这里选择用 MMA 是因为我平时搞科研就一直用的 MMA 所以搞到一半想看动画片了需要个编程工具我肯定直接 MMA:

https://zhuanlan.zhihu.com/p/136542995你寻思我糙还要学编程? 那其实也不用, 我都编好了嘛, 你就会按回车就行了. 然后等哪天有空了你再学点儿吧, 缺了这个工具平时我都寸步难行的, 很难跟你解释它究竟能多么有用, 比如今天你也发现看动画片它就派上用场了不是? 或者你平时整理图包啥的它也很有用呀:

https://www.zhihu.com/question/462238545/answer/3255502181而且学这玩意儿真不难, 就不会比哔哔邦邦地按科学计算器更难.

所以现在的问题是怎么安装对吧? 很简单, 哎··· 我虽然要教你怎么搞学习交流版, 但你有钱还是去支持下的比较好. 你就直接官网下, 然后上网搜 mathematica keygen online 就直接生成 key 了. 你点进去就按照指示多试几次就完了, 亲测按 Mathematica 13 生成的 key 放 14.1 也能用:

1.2. 至于说 AI 吧, 随便你自己搭还是用啥就瞎比找个快的就行了:

这里我将以 G**gle 的 Gemini 为例来作示范. 选它是因为它完全免费、就在手边、响应速度极快且性能足矣满足我们这次的一切需求. 像那种要思考或者响应个半天甚至断联的垃圾就别用了, 就字幕翻译的事儿你随便个生成式 AI 都能干得很好.

2. 流程解析

我真得从盘古开天地讲起了,,

2.1. 首先英文字幕哪里来?

答案事宇宙起源之「」上永远有最及时的英语生肉, 你要是个美国人, 那还编什么几把程? 问题都已经解决了. 你说我看得懂英语啊, 那你试试吧, 反正我是很不喜欢动画片里出现非原生英语.

你要不知道啥事宇宙起源之「」, 那就回顾前文:

https://zhuanlan.zhihu.com/p/1907127114509034779现在我强推人类的永恒挚友之 SubsPlease:

SubsPlease 有三胜: 永远能在第一时间上传动画片, 此速胜一也. 超高码率几乎质量天花板, 此质胜二也. 大家都下这资源挂着就下楼打饭都能撞俩做种的, 此稳胜三也.

那我怎么把内封字幕提出来呢? 这个简单, 下个 Maruko 就完了:

下完在菜单里搜的时候搜 X 别搜 M, 为毛这东西叫 xiaowan 而非 Maruko 我也蒙古,,,

https://link.zhihu.com/?target=https%3A//maruko.appinn.me/打开工具箱进入抽取页面:

就把动画片拖到 MKV 那一栏里然后点抽取轨道 2 就完了, 一般来说字幕就是 track 2, 不是的话就挨个试, 其他轨道还能分离出视频或者音频文件之类的东西. 但如果轨道太几把复杂了, 比如你下的 AMZN、NF 或者 DSNP 之类的源可能带你吗全球字幕, 那这种情况你可以按下面那个使用第三方工具抽取召唤出 gMKVExtractGUI, 就把动画片拖到最上面那条里就会开始自动处理, 等几秒再从下面的 Track 里勾选自己想要的并点击提取即可.

2.2. 字幕翻译的流程详解:

你先用记事本打开字幕文件吧, 估计就看到的这个:

而需要翻译的就只有 [Events] 里的各条 Dialogue 里的英文短句, 所以下一步就是想办法把这些句子抽出来. 你可能在想既然 AI 那么聪明那就直接把这些 Events 都扔上去不就完了吗? 就比如说:

​`` Dialogue: 0,0:00:01.21,0:00:02.77,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:03.97,0:00:05.85,main,Lammis,0,0,0,,Good morning, Boxxo! Dialogue: 0,0:00:05.85,0:00:06.87,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:06.87,0:00:08.85,main,Karios,0,0,0,,Good morning, Lammis! Dialogue: 0,0:00:09.27,0:00:12.85,main,Lammis,0,0,0,,Karios, Gorth! Thanks for \Nkeeping watch again today! Dialogue: 0,0:00:12.85,0:00:16.11,main,Gorth,0,0,0,,Sure. Nothing beats sweet tea \Nat the end of a night shift. Dialogue: 0,0:00:16.98,0:00:19.42,italics,Boxxo,0,0,0,,I look forward to your next use. ​``

那你试试吧, 它能给你原格式输出就有鬼了, 你这等于超过半数以上的输入都是无效字符然后指望生成式 AI 给你判断个三四百句再精准翻译后按原格式输出··· 你要不信邪你可以试试, 总之就是前面那些跟翻译一毛钱关系都没有的字符但凡错几个标点你就整个文本都全废了.

所以我们这里就要派出賢いMMAさん, 就以下面这几句为例吧:

​`` Dialogue: 0,0:00:01.21,0:00:02.77,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:03.97,0:00:05.85,main,Lammis,0,0,0,,Good morning, Boxxo! Dialogue: 0,0:00:05.85,0:00:06.87,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:06.87,0:00:08.85,main,Karios,0,0,0,,Good morning, Lammis! Dialogue: 0,0:00:09.27,0:00:12.85,main,Lammis,0,0,0,,Karios, Gorth! Thanks for \Nkeeping watch again today! Dialogue: 0,0:00:12.85,0:00:16.11,main,Gorth,0,0,0,,Sure. Nothing beats sweet tea \Nat the end of a night shift. Dialogue: 0,0:00:16.98,0:00:19.42,italics,Boxxo,0,0,0,,I look forward to your next use. Dialogue: 0,0:00:18.17,0:00:19.42,overlap,Gorth,0,0,0,,Mhm! Dialogue: 0,0:00:20.71,0:00:23.45,italics,protagonist,0,0,0,,I died and was reborn as a vending machine. Dialogue: 0,0:00:23.45,0:00:26.32,italics,protagonist,0,0,0,,That's a bizarre situation \Nto suddenly be in... Dialogue: 0,0:00:26.32,0:00:27.50,main,kids,0,0,0,,Good morning! Dialogue: 0,0:00:27.50,0:00:30.74,italics,protagonist,0,0,0,,but I've found ways to make \Nthe whole thing enjoyable. Dialogue: 0,0:00:34.17,0:00:37.01,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,{\blur3\fad(1773,1)\an8\fs20}Reborn as a Vending Machine,\N{\fnTimes New Roman\c&H020222&}I {\c&H161C79&}Now {\c&H1C379A&}Wander {\c&H1D6FE2&}the {\c&H2D9CED&}Dungeon Dialogue: 0,0:00:39.47,0:00:41.06,italics,protagonist,0,0,0,,On the outside, a rectangular steel box. Dialogue: 0,0:00:41.32,0:00:43.30,italics,protagonist,0,0,0,,Hidden within is a human soul! Dialogue: 0,0:00:43.30,0:00:48.72,italics,protagonist,0,0,0,,In a world of wonder, I go to and fro \Non the back of my partner Lammis! Dialogue: 0,0:00:44.39,0:00:50.27,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,{\blur3\fad(1773,1)\an8\fs20}Reborn as a Vending Machine,\N{\fnTimes New Roman\c&H020222&}I {\c&H161C79&}Now {\c&H1C379A&}Wander {\c&H1D6FE2&}the {\c&H2D9CED&}Dungeon Dialogue: 0,0:00:48.72,0:00:51.14,italics,protagonist,0,0,0,,I am Boxxo! Hello there! Dialogue: 0,0:00:51.14,0:00:52.87,italics,protagonist,0,0,0,,That means "yes"! Dialogue: 0,0:02:07.06,0:02:10.98,sign_2040_26_The_Vending_Mach,text,0,0,0,,{\fad(734,473)\fscx100\fsp.4\pos(430,55)}Hunters and Motives Dialogue: 0,0:02:09.44,0:02:11.38,main,Lammis,0,0,0,,It really feels like summer now! 首先一个大问题是 MMA 对「\」与「"」非常敏感, 所以你要现在记事本里按 Ctrl + h 召唤出文本替换来, 依次做如下的全部替换: ​``

然后我们就得到了我们的 InPutSub:

​`` Dialogue: 0,0:00:01.21,0:00:02.77,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:03.97,0:00:05.85,main,Lammis,0,0,0,,Good morning, Boxxo! Dialogue: 0,0:00:05.85,0:00:06.87,italics,Boxxo,0,0,0,,Hello there. Dialogue: 0,0:00:06.87,0:00:08.85,main,Karios,0,0,0,,Good morning, Lammis! Dialogue: 0,0:00:09.27,0:00:12.85,main,Lammis,0,0,0,,Karios, Gorth! Thanks for /Nkeeping watch again today! Dialogue: 0,0:00:12.85,0:00:16.11,main,Gorth,0,0,0,,Sure. Nothing beats sweet tea /Nat the end of a night shift. Dialogue: 0,0:00:16.98,0:00:19.42,italics,Boxxo,0,0,0,,I look forward to your next use. Dialogue: 0,0:00:18.17,0:00:19.42,overlap,Gorth,0,0,0,,Mhm! Dialogue: 0,0:00:20.71,0:00:23.45,italics,protagonist,0,0,0,,I died and was reborn as a vending machine. Dialogue: 0,0:00:23.45,0:00:26.32,italics,protagonist,0,0,0,,That's a bizarre situation /Nto suddenly be in... Dialogue: 0,0:00:26.32,0:00:27.50,main,kids,0,0,0,,Good morning! Dialogue: 0,0:00:27.50,0:00:30.74,italics,protagonist,0,0,0,,but I've found ways to make /Nthe whole thing enjoyable. Dialogue: 0,0:00:34.17,0:00:37.01,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,{/blur3/fad(1773,1)/an8/fs20}Reborn as a Vending Machine,/N{/fnTimes New Roman/c&H020222&}I {/c&H161C79&}Now {/c&H1C379A&}Wander {/c&H1D6FE2&}the {/c&H2D9CED&}Dungeon Dialogue: 0,0:00:39.47,0:00:41.06,italics,protagonist,0,0,0,,On the outside, a rectangular steel box. Dialogue: 0,0:00:41.32,0:00:43.30,italics,protagonist,0,0,0,,Hidden within is a human soul! Dialogue: 0,0:00:43.30,0:00:48.72,italics,protagonist,0,0,0,,In a world of wonder, I go to and fro /Non the back of my partner Lammis! Dialogue: 0,0:00:44.39,0:00:50.27,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,{/blur3/fad(1773,1)/an8/fs20}Reborn as a Vending Machine,/N{/fnTimes New Roman/c&H020222&}I {/c&H161C79&}Now {/c&H1C379A&}Wander {/c&H1D6FE2&}the {/c&H2D9CED&}Dungeon Dialogue: 0,0:00:48.72,0:00:51.14,italics,protagonist,0,0,0,,I am Boxxo! Hello there! Dialogue: 0,0:00:51.14,0:00:52.87,italics,protagonist,0,0,0,,That means 'yes'! Dialogue: 0,0:02:07.06,0:02:10.98,sign_2040_26_The_Vending_Mach,text,0,0,0,,{/fad(734,473)/fscx100/fsp.4/pos(430,55)}Hunters and Motives Dialogue: 0,0:02:09.44,0:02:11.38,main,Lammis,0,0,0,,It really feels like summer now! ​``

其中的 /N 是换行的, 你可以通过将全文的 /N 都替换为空以删掉它们, 但留着也挺好. 不过那些类似于 {/fad(734,473)/fscx100/fsp.4/pos(430,55)} 这样的东西我们都得删掉, 而这我代码里都有, 就不用你操心了:

可以看到我通过 StringReplace[ StringSplit[ StringReplace[ InPutSub, {"Dialogue:" -> "[Division]Dialogue:", "\n" -> ""}], "[Division]"], RegularExpression["\{.*?\}"] -> ""] 短短一行代码就将输入的文本转化为了字符串的表格. 而我们最初的输入 InPutSub 就是前面做了两项简单替换的 Events 文本, 唯一需要的注意的就是第一行的 InPutSub = "[Events]" 里可别忘了在文本外加上「""」, 这个双引号是用来字符串化这些 Events 文本的.

然后就是英文文本的提取:

这里将文本与时间轴关联后再提取了出来, 这一步就是为了保护时间轴, 随便四行代码就能实现:

​`` SplitLines[InPutSub_, nLine_] := StringSplit[Part[InPutSub, nLine], ",,"]; TimeLineTab = Table[{Part[SplitLines[#, nLine], 1], DialogTrans[nLine]}, {nLine, 1, Length[#]}] &[InPutSubTab] Do[Dialogue[nLine] = Part[SplitLines[#, nLine], 2], {nLine, 1, Length[#]}] &[InPutSubTab]; InputForm[ Table[{DialogTrans[nLine], Dialogue[nLine]}, {nLine, 1, Length[#]}] &[InPutSubTab]] ​``

然后你复制输出的结果的 {DialogTrans[1], "Hello there."}, {DialogTrans[2], "Good morning,Boxxo!"}, {DialogTrans[3], "Hello there."}, {DialogTrans[4], "Good morning,Lammis!"}, {DialogTrans[5], "Karios,Gorth! Thanks for/Nkeeping watch again today!"}, {DialogTrans[6], "Sure.Nothing beats sweet tea/Nat the end of a night shift."}, {DialogTrans[7], "I look forward to your next use."}, {DialogTrans[8], "Mhm!"}, {DialogTrans[9], "I died and was reborn as a vending machine."}, {DialogTrans[10], "That's a bizarre situation/Nto suddenly be in..."}, {DialogTrans[11], "Good morning!"}, {DialogTrans[12], "but I've found ways to make/Nthe whole thing enjoyable."}, {DialogTrans[13], "Reborn as a Vending Machine,/NI Now Wander the Dungeon"}, {DialogTrans[14], "On the outside,a rectangular steel box."}, {DialogTrans[15], "Hidden within is a human soul!"}, {DialogTrans[16], "In a world of wonder,I go to and fro/Non the back of my partner Lammis!"}, {DialogTrans[17], "Reborn as a Vending Machine,/NI Now Wander the Dungeon"}, {DialogTrans[18], "I am Boxxo! Hello there!"}, {DialogTrans[19], "That means'yes'!"}, {DialogTrans[20], "Hunters and Motives"}, {DialogTrans[21], "It really feels like summer now!"} 再配合类似于这样的文字发给 AI: 我将发给你一张由英文短句构成的表格, 这些短句都以 DialogTrans[n] 这样的形式编号, 请保持表格原格式地将其中的英文短句翻译为中文.

具体示范:

然后你就再把 AI 反馈的结果都复制回来为所有的 DialoTrans[n] 都赋上具体的译文文本就能得到包含简中译文的 TimeLineTab 了:

这里是通过一个 Do 循环完成的赋值:

​`` TimeLineTabTrans = {DialogTrans[1], "你好。"}, {DialogTrans[2], "早上好,博克斯!"}, {DialogTrans[3], "你好。"}, {DialogTrans[4], "早上好,拉米斯!"}, {DialogTrans[5], "卡里奥斯,戈尔思!谢谢你/N今天又值班了!"}, {DialogTrans[6], "当然。没有什么比夜班结束时/N来杯甜茶更棒的了。"}, {DialogTrans[7], "我期待你下次使用。"}, {DialogTrans[8], "嗯!"}, {DialogTrans[9], "我死了,然后重生为一台自动售货机。"}, {DialogTrans[10], "这真是个奇怪的/N突发状况\[Ellipsis]\[Ellipsis]"}, {DialogTrans[11], "早上好!"}, {DialogTrans[12], "但我已经找到了让/N这一切变得愉快的方法。"}, {DialogTrans[13], "重生为自动售货机,/N我现在在地下城里游荡"}, {DialogTrans[14], "外表是一个长方形的钢盒子。"}, {DialogTrans[15], "里面藏着一个人类的灵魂!"}, {DialogTrans[16], "在一个充满奇迹的世界里,我/N骑着我的搭档拉米斯四处游荡!"}, {DialogTrans[17], "重生为自动售货机,/N我现在在地下城里游荡"}, {DialogTrans[18], "我是博克斯!你好!"}, {DialogTrans[19], "这意味着\[OpenCurlyQuote]是\[CloseCurlyQuote]!"}, {DialogTrans[20], "猎人与动机"}, {DialogTrans[21], "现在真像夏天啊!"}; Do[DialogTrans[nLine] = Part[TimeLineTabTrans, nLine, 2], {nLine, 1, Length[TimeLineTabTrans]}]; ​``

接着无非就是将这些文本和相应的时间轴一起拼成简中的 Events:

拼这个也是一两行就解决了:

​`` OutPutSub[n_] := Part[TimeLineTab, n, 1] <> ",," <> Part[TimeLineTab, n, 2]; OutPutSub[All] = Table[OutPutSub[n], {n, 1, Length[TimeLineTab]}]; StringRiffle[OutPutSub[All], "\n"] ​``

最后你就只需把输出的文本:

​`` Dialogue:0,0:00:01.21,0:00:02.77,italics,Boxxo,0,0,0,,你好。 Dialogue:0,0:00:03.97,0:00:05.85,main,Lammis,0,0,0,,早上好,博克斯! Dialogue:0,0:00:05.85,0:00:06.87,italics,Boxxo,0,0,0,,你好。 Dialogue:0,0:00:06.87,0:00:08.85,main,Karios,0,0,0,,早上好,拉米斯! Dialogue:0,0:00:09.27,0:00:12.85,main,Lammis,0,0,0,,卡里奥斯,戈尔思!谢谢你/N今天又值班了! Dialogue:0,0:00:12.85,0:00:16.11,main,Gorth,0,0,0,,当然。没有什么比夜班结束时/N来杯甜茶更棒的了。 Dialogue:0,0:00:16.98,0:00:19.42,italics,Boxxo,0,0,0,,我期待你下次使用。 Dialogue:0,0:00:18.17,0:00:19.42,overlap,Gorth,0,0,0,,嗯! Dialogue:0,0:00:20.71,0:00:23.45,italics,protagonist,0,0,0,,我死了,然后重生为一台自动售货机。 Dialogue:0,0:00:23.45,0:00:26.32,italics,protagonist,0,0,0,,这真是个奇怪的/N突发状况 Dialogue:0,0:00:26.32,0:00:27.50,main,kids,0,0,0,,早上好! Dialogue:0,0:00:27.50,0:00:30.74,italics,protagonist,0,0,0,,但我已经找到了让/N这一切变得愉快的方法。 Dialogue:0,0:00:34.17,0:00:37.01,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,重生为自动售货机,/N我现在在地下城里游荡 Dialogue:0,0:00:39.47,0:00:41.06,italics,protagonist,0,0,0,,外表是一个长方形的钢盒子。 Dialogue:0,0:00:41.32,0:00:43.30,italics,protagonist,0,0,0,,里面藏着一个人类的灵魂! Dialogue:0,0:00:43.30,0:00:48.72,italics,protagonist,0,0,0,,在一个充满奇迹的世界里,我/N骑着我的搭档拉米斯四处游荡! Dialogue:0,0:00:44.39,0:00:50.27,sign_1939_25_Reborn_as_a_Vend,title,0,0,0,,重生为自动售货机,/N我现在在地下城里游荡 Dialogue:0,0:00:48.72,0:00:51.14,italics,protagonist,0,0,0,,我是博克斯!你好! Dialogue:0,0:00:51.14,0:00:52.87,italics,protagonist,0,0,0,,这意味着'是'! Dialogue:0,0:02:07.06,0:02:10.98,sign_2040_26_The_Vending_Mach,text,0,0,0,,猎人与动机 Dialogue:0,0:02:09.44,0:02:11.38,main,Lammis,0,0,0,,现在真像夏天啊! ​``

拿去覆盖原字幕文件中的那些英文 Events 就得到了最终简中字幕.

相信我, 要就那么几百句的话, Gemini 大气都不带喘一口的:

关于本文的封面我只想说它真是完美地契合了我对这段留言的想象:

    • I was 15. I've been heavily in love in those days and I always heard it on my Walkman walking home from my girlfriend through the neon lighted streets, staring at the illuminated factories and the motorway. I can't describe this kind of industrial romantic as it fitted perfectly to my romantic feelings about the girl. Think Grauzone keeps this both poles still. And I always like to hear this great record again···「Denn Kälte kriecht durch die Wände und bedeckt unsere verletzten Hände!」
    • 我当时十五岁. 我在那些日子里深深地陷入了爱情然后我还总是用 Walkman 听着这张专辑从女友那穿过霓虹灯照亮的街道往家走, 盯着灯火通明的工厂与高速公路. 我无法形容这种工业式的浪漫, 它完美地与我对那个女孩的浪漫感受相契合. 我想 Grauzone 至今仍维系着这两极. 我也总会乐意再听一遍这张伟大的作品···「因为寒气爬过墙壁并覆盖我们受伤的双手! 」

https://zhuanlan.zhihu.com/p/1912125754227012949

用 Markdown 与 LaTeX 记录清晰、可复查的学习过程。