关于质量
边玩边翻译游戏,是一件真正困难的事
读取正在运行的游戏画面并就地翻译,是一个困难的工程问题——比从外面看上去要难得多,而这正是Playto一直在死磕的地方。与其假装这是一个已经打勾的、解决完毕的问题,我们更愿意诚实地说说为什么难。如果某个画面读错了,通常是下面这些原因之一,而不是我们不用心——而且每一条,我们都在持续改进。这个页面讲的就是这些原因背后的工程逻辑,不涉及内部实现细节。
1 · 翻译
翻译之前,必须先把画面读出来
网页会把干净的文本直接交给翻译工具。而游戏交给你的是一张图片——文字是画成像素的,下面没有可以直接读取的文本流。所以每一次翻译都要先从画面里把文字重新读出来,后面的每一步都会继承这第一步的错误。
游戏文字对这一步「读取」来说,几乎是最难啃的情况:
- 为了氛围而不是可读性设计的装饰字体和手写风格字体。
- 叠在动态、有动画的背景上的低对比度文字。
- 极小的UI标签,以及直接画进美术图里的文字。
一个字读错就可能让意思整个反转——而且没有拼写检查能拦下它,因为那个词往往是专有名词,或者是游戏自己造出来的术语。接下来翻译本身还要面对第二个问题:游戏文字是以碎片的形式出现的。两个字的菜单标签。HUD上的一个数字。还在一个字一个字往外蹦的对话。翻译模型最擅长处理完整的句子,而游戏给到的,是顺序打乱、没有上下文、还带着通用模型从没见过的词汇的碎片。
而这一切都得在游戏运行的同时,在你自己的机器上跑起来。云端服务可以把世界上最大的模型砸在一句话上。实时悬浮窗要和你正在玩的游戏共享内存与显卡——所以很大一部分工夫,都花在从小到能和游戏共存的模型里挖出好结果,而不是一味去用最大的模型。
2 · 悬浮窗
在一个静不下来的游戏画面上作画
在屏幕上放文字很简单。在一个正在运行的游戏上放文字,还不能碍事,就不简单了。
翻译该放在哪里? 文字会出现在你没法预测的地方——下方的对话、右侧的道具说明、光标处的工具提示、屏幕中央的系统消息。在错误的时机盖住错误的位置,悬浮窗就变成了它本来要解决的那个问题。
画面一直在动。 同一行对话,在滚动、淡入淡出或逐字显示的过程中,会横跨几十帧持续存在。哪怕底层像素每一帧都在轻微变化,悬浮窗也必须认出「这还是我已经在显示的那一行」——不然就会不停闪烁、反复重绘。做不好看起来就是抖动;做好了,就是在下面的画面从未真正静止的情况下,依然把翻译稳稳地钉在那里。
而这一切都不能拖累游戏。画面捕捉和渲染运行在游戏自身线程之外,不会偷走它的帧时间,也不会往游戏里注入任何东西——Playto从外部读取屏幕,方式和录屏软件一样。
3 · 记录
知道你到底读过什么
这是最不起眼的一个问题,某种意义上也是最难的一个。Playto的工作之一,是记住你遇到过的句子和单词,让你玩过的游戏变成日后可以复习的内容。听起来像是简单的记账。其实不是——因为游戏文字并不是一份界限清晰的干净列表。
- 同一句话在逐字显示的过程中,会出现在很多帧里。
- 你站着不动时,同一个画面会在每一次捕捉里反复出现。
- 明明没变的同一段文字,不同帧读出来会有细微差别。
所以「这是一句值得保留的新句子」还是「这句我已经有了」,是每秒都要做很多次的真实判断。偏向一边,日志里就会堆满同一句话的重复;偏向另一边,又会悄悄漏掉你想要的句子。判断一句话什么时候算说完了本身也是个难题——一句还在一个字一个字冒出来的话,看起来很像一句已经说完的短句。
做得好的时候,这一切都不会被看见。你看到的只是一份干净的阅读记录。而这种「看不见」,恰恰就是工作量的大头。
常见问题
为什么游戏翻译有时不准确?
因为游戏把文字画成像素,而不是可读取的文本,所以每一次翻译都要先从画面里把文字重新读出来(OCR)。装饰字体、叠在动态背景上的低对比度文字、极小的UI文字都会让这一步变难,任何一次误读都会带进后面的翻译里。游戏文字还常常以缺乏上下文的碎片形式出现,并使用通用模型从未见过的自造词。这是一个本质上就很难的问题,也是我们把翻译质量当作持续在做的工作、而不是已经完成的事情来对待的原因。
翻译质量会随时间变好吗?
会。读取和悬浮窗的行为一直在持续调优,更新也会定期发布。不同的游戏会以不同的方式出问题,所以真实的游戏是我们能得到的最好信号。如果某款游戏读取效果不好,免费Demo是确认它的方式,把情况告诉我们也能帮助我们改进。
为什么不直接用最大、最准的AI模型?
云端服务可以给每一句话都配上一个庞大的模型。而一个实时悬浮窗是在你运行游戏的PC上跑的,要和游戏共享内存与显卡——所以这门手艺的核心,是从小到能和游戏共存的模型里挖出好结果,而不是单纯选最大的模型。你也可以接入自己的云端API key,但我们大部分精力都投在本地这条路径上。
能读装饰字体或手写风格的游戏字体吗?
标准印刷体文字读取又快又稳。装饰性强或手写风格的字体是普通文字识别的弱项,所以我们准备了可以直接读取这类字体的图像识别模式——你可以按具体游戏的渲染方式来选择模式。这里存在真实的取舍:图像识别更慢、负载也更重,所以它是为需要它的字体准备的,而不是默认一直开着。