《许愿三秒,验收三天》系列这个系列记录我和 Claude 一起折腾 MC 铁路服务器的两个月。这是第二篇,上一篇是《本来只想升级个模组》。
我是先认识 Minecraft Transit Railway,才认识港铁的。2022 年我玩上了这个模组,它的车站、列车、报站,几乎全都照着港铁(Mass Transit Railway)做。玩着玩着,我对真正的港铁好奇起来,2023 年就有了第一次去香港的想法。
可服务器里的列车一直不怎么会说话。MTR 自带的报站用的是系统无障碍里的讲述人,机械音念站名,到了 Linux 下干脆没声音。
这件事和上一篇的升级不一样,我完全能自己做:文案我自己就能写,交给 TTS 模型生成,再摆回游戏里。只是全服这么多站,每站每个方向的文案写下来,生成,再一个个摆回去,对人来说是个很累的活。于是懒癌又发作了。
升级做完半个多月后,我又想起了这件事,打算让列车真正开口说话:
我准备自制报站。目标是参考港铁的报站,带粤语、普通话、英语三种语言,我准备借助AI完成
克隆港铁的声音
至于用什么 AI 来做,选来选去还是用了 MiniMax,它能用一段录音克隆出一个音色。TTS 这方面,国外的 AI 对普通话的支持实在不敢恭维,之前和 GPT 的语音模式聊天,它那口中文口音差点没把我笑死。素材是我找到的一段荃湾线全程报站,七分多钟,粤语、普通话、英语轮着来。
要先从里面切出三个人干净的声音。Claude 想在本地装个语音识别模型来切,我拦住了:“不要上模型吧……它的语音之间总有停顿的”。它切出来的第一批片段,有好几段听着什么都没有;它还差点把关门的“滴滴”声当成了最干净的人声。我干脆自己听了一遍,把开头逐秒写给它:第一秒粤语“请勿靠近车门”,第二秒普通话,三到四秒英语,五到九秒关门滴滴声……
用“滴滴”声给录音分段关门提示音是 500 Hz 的基频加 1550 Hz 的谐波,和人声很好区分。按 500 Hz 附近的能量占比去找,整段录音找出 15 段提示音,正好是 16 个站之间的 15 个区间。每两段提示音之间,就是一站完整的三语报站。
我一看,调 API 克隆一个音色,啥都还没干就要 9.9 元,真是吓哭了。不过想着来都来了,尝尝咸淡吧……先克隆普通话,让它念一句我们服务器里的:“下一站,琶洲,乘客可以转乘0号线、6号线,或14号线,左边的车门将会打开”。
我听完只打了一句:
像,太像了!几乎完全一致啊
【这几个音色只在自己的服务器上用,所以文章里就不放声音了】
写文案
声音像了,可要听起来像港铁,还差得远。港铁的报站藏着很多细节,平时坐车不会特意注意,少了一处却马上不对味。
首先是开门的方向,S2 靠右行驶,岛式站台开左门,侧式站台开右门;有的站是西班牙式站台,两侧都开;站前折返的终点站,不同车种开的门还不一样,这些我都一条条报给了它。
然后是换乘,几条线都能换的时候,港铁并不会每条都念一遍,比如荃湾线往荃湾方向,下一站金钟时不会报换乘港岛线,因为前一站中环就能换,要去港岛线的乘客根本不会坐到这。S2 里也有好几处,比如区间车到琶洲不用报换乘 14 号线,到雪裂谷同台换乘更方便。这类换乘,例子给得够多的话,AI 应该也推得出来;只是全图也没几处,我自己判断更省事。
还有一些说法也要注意,比如快车每次报下一站之前,要先报出它剩下的停靠站;区间车要报“本班列車以海傍為尾站”;粤语里的“的”要用“嘅”。我还让它在拟文案时主动推荐改动,让遣词造句更有港铁味,尤其是粤语部分。
验收的时候,我让它把每个交路从头到尾会播的声音按顺序拼成一个音频,从起点一路听到终点,北行快速就是这样听出问题的:一会儿报南行的站,一会儿报北行的站,顺序全乱了。
念错的地方
AI 念错的地方也不少,比如调过一版参数以后,它把站名念了两遍:“下一站,琶洲,琶洲”。Pazhou 念得像 Pazou,最后干脆把英文写成 Pah Joe,让它照着念。“橓岭”的“橓”被它念成了 ying。筲箕湾的“筲箕”普通话该念得像“烧鸡”,它把“筲”念成了“骚”。我想让它在“左边的车门”和“将会打开”之间停一下,停顿给 0.1 秒嫌长,改成 0.05 秒,听着反而更长了。
时长和成本
S2 是我今年主要打造的线路,有什么新实验都先往它身上套,报站也不例外。第一版做完,进游戏坐上去一听,问题来了:区间车站距短,一站还没报完,车就到下一站了。
从这以后,报站就不只是写文案了。每条线开做之前,AI 先读存档,找出每个报站器在哪、列车停多久、什么时候关门,再按列车的加减速模拟一遍,算出每段报站最多能播多久。放不下的,就按门侧提示、欢迎语、粤语的顺序一样样去掉。后来连报站器都不用我一个个摆了,它把位置和设置直接写回世界里。
另外,每条线都整句整句地合成的话,花费很快就上去了,于是我提了个主意:常规句子、站名、线名各生成一次,然后我们自己拼。10 号线是环线,整句合成要大约 12,900 字,拼起来只花了 4,150 字左右,只有原来的三分之一。
站台广播器
光车上会说话还不够,港铁的站台也有广播,车快到了要提醒,车门要关了也要提醒。MTR 没有这样的东西,我就让 Claude 在 mod 里做了一个“站台广播器”:选好站台、交路和音频,再定在到站前或发车前几秒开始播,或者正好播完。

后来我又给它加了个“续播范围”。站台广播是放给等车的人听的,坐车进站的乘客,一下车就听到站台上播了一半的广播,会很怪。所以广播开始时人已经在站里、又不在车上的,走进站台能接着听;坐车进站的,就听不到站台刚刚放过的那段。
复刻御堂筋线
今年 5 月,我去了一趟大阪,人生第一次出国,来到了火车迷心中的圣地。各种铁道品鉴下来,我觉得日本的报站很有意思,尤其是特别爱用各种提示音,听过就忘不掉。回来以后,我决定把服务器的 3 号线改成大阪地铁御堂筋线的样子。
“提示音是精髓”,这是我跟 Claude 说的。它用 Whisper 把原声转成文字,扒出提示音,又克隆了两个音色【又是 19.8 元】。我纠正了它好几处:开门那段琶音是开门时播,不是到站时;始发的旋律要放两遍才开始报站。中间还有个小插曲:它把终点站音乐里的人声去掉以后,Whisper 对着纯音乐,一本正经地转写出一句“ご視聴ありがとうございました”(感谢收看)。那段时间我刚背了一半的五十音,Claude 还顺手给我讲了音读和训读。
到 10 月 18 日,服务器上已经有 11 条线开了口:S2 是港铁腔,3 号线是大阪腔,5 号线又回到原汁原味的港铁,开门时多了一声“叮咚”。
后记
S2 的报站第一次在游戏里响起来时,我的感觉和升级做完那天差不多:拖了好久的事,终于完成了。不一样的是,这件事我本来就会做,只是懒;现在有了 AI,又解放生产力了。
还有一件事是后来才意识到的:为了摆报站器,它已经学会了读写存档。于是有一天,我对它说:
既然你现在有编辑存档的知识了,我想搞一些自动建造的工作
