他抬起头,摘下眼镜,放在桌上。没有镜片的遮挡,他的眼睛看起来比平时小一些,眼窝更深,眼睛下面的阴影更明显。他看著她,沉默了很久。工作室的空调发出低频的嗡鸣,和机房的风扇声一模一样。
“我爸。”他说。声音很低,低到像是他在自言自语。“他在我留学第二年走的。心梗。”
温以宁没有说话。她的手指从键盘上移开,放在膝盖上。
“那天是周末。我在图书馆写作业,手机关静音。等我看到未接来电的时候,已经过了四个小时。”他的视线落在键盘上,落在那些他刚才还在敲击的按键上。“我妈打了十七通。最后一通是医生的,他说人已经走了。”
工作室的空调停止了运转,四周突然变得很安静。
“他那年五十三岁。”他继续。“身体一直很好,没有高血压,没有糖尿病。每年体检都是蓝色的单子。我出国前一天他还跟我说,等你毕业回来,爸给你煮牛肉面。”
他的右手放在键盘旁边,手指伸直了,平放在桌上。那只手在过去的几天里敲了几万行程式码,每一行都稳定、精确,但此刻它静止在那里,像是一件被关闭的机器。
“他留了一段语音留言。八秒。”他的声音出现了一个极细微的停顿。“‘小晏,爸等你回来。’”
温以宁的胸腔里有什么东西收紧了。她想起自己的十五秒。外婆说,以宁,你瘦了。有没有好好吃饭?同样的长度,同样的语气,同样的永远不会到来的等待。
“我把那八秒剪辑成循环。”他说。“用软体去掉背景噪音,把音量调到最舒服的大小。做成一个音档,放在手机里,设成闹钟。每天早上醒来第一件事,就是听他说那句话。”
他的右手手指微微弯曲,又伸直。重复了三次。
“后来我觉得不够。”他的声音变得更低。“八秒太短了。我想听他多说一些话。想听他说今天吃了什么,想听他说天气好不好,想听他说他过得怎么样。所以我用AI生成了一段更长的对话。”
温以宁的手指在膝盖上握紧了。
“我用他以前的语音留言、通话录音、甚至家庭录影带里的对话,训练了一个模型。很粗糙的模型,没有你的情感计算那么精确,只会模仿他的音色和说话节奏。但够了。够让我在深夜的时候,听一个像他的声音说一些像他会说的话。”
他停下来。他的呼吸变浅了,浅到她几乎看不见他胸腔的起伏。
“然后有一天,那个AI问我。‘小晏,你最近过得好吗?’我回答了。我说还好。然后它说‘那就好,爸放心了。’”
他的声音在最后一个字上裂开了。不是崩溃,是一道很细很细的裂缝,细到如果不是在凌晨两点安静的工作室里,她根本不会听见。
“那不是我爸会说的话。”他说。“我爸从来不说‘爸放心了’。他只会说‘回来给你煮牛肉面’。那个AI在说我让它说的话,不是我爸会说的话。”
他抬起头看她。他的眼睛是干的,没有泪水,但她在那双眼睛里看见了某种比泪水更深的东西。
“我删掉了那个模型。删掉了所有生成的对话。只留下那八秒。”他的声音恢复了平静,但那种平静不是真正的平静,是经过反复练习后形成的肌肉记忆。“然后我开始写Echo·lite。我想让其他人不必像我那样,用假AI替代真遗憾。”
她看著他。他的表情没有变化,但她看得出来——他刚才说的那段话,他可能从来没有对任何人说过。因为他说到“爸放心了”那四个字的时候,他的右手手指在桌上画了一个很小的圆圈,那是一个无意识的动作,像是他试图在平面上抓住什么。
“你从未对任何人说过这件事。”她说。不是疑问。
“没有。”
“包括你的合伙人?”
“我没有合伙人。”
“朋友?”
他没有回答。他的沉默就是答案。
工作室的空调重新启动,低频的嗡鸣填满了房间。窗外的路灯在某一刻闪烁了一下,像是电压不稳。她的视线落在他的右手上——那只手现在完全静止了,手指微微弯曲,掌心朝下,像是刚放下一个很重的东西。
“我也是。”她说。
他转头看她。
“外婆走的时候,我在MIT的实验室写论文。”她的声音比她预期的平静。“那天模型一直不收敛,我很生气,把马克杯摔在地上。然后手机响了。舅舅说外婆走了,下午三点十七分。”
她没有停下来。她怕一停下来就不会再继续。
“我挂了电话,把地上的碎片扫干净,继续调模型。那天晚上模型收敛了。我看著萤幕上的损失函数曲线,觉得很开心。然后我意识到,我开心是因为模型收敛了,不是因为其他事情。甚至不是因为外婆走了。”
她的手放在桌上,掌心贴著冰凉的木头表面。“后来我回台湾参加葬礼。舅舅给了我一个随身碟,里面是外婆留下的录音。三段,总共四十七秒。最长的一段是十五秒。她说‘以宁,你瘦了。有没有好好吃饭?’”
她感觉到自己的眼眶开始发热,但她没有停。
“我把那十五秒听了一千次。然后我开始写Echo。我想让AI学会外婆说话的方式,学会她关心人的节奏,学会她什么时候该说话、什么时候不该说话。我想让AI变成她。”
她停下来。她的手指在桌上握紧了,指甲压进木头表面,留下浅浅的凹痕。
“但AI不是她。”她说。这句话她对自己说过无数次,但这是第一次她对另一个人说。“AI只是一个模型。它不知道饿是什么感觉,不知道想念是什么感觉,不知道一个人坐在实验室里听到外婆的声音时,胸口那种闷闷的痛是什么感觉。它只知道把声波转换成特征向量,再把特征向量转换成文字。它什么都不懂。”
她的声音在最后一个字上颤抖了一下。她闭上嘴,深呼吸。胸腔里的震动透过肋骨传到桌面,她感觉得到木头在她的掌心下微微震动。
工作室里安静了很久。空调的嗡鸣、电脑风扇的旋转、窗外远处偶尔传来的车声——这些声音填满了他们之间的沉默,但没有压迫感。那种沉默不是空白,是容器,装著两个人的十五秒和八秒,装著一千次播放和一万七千通未接来电。
“你保留了那十五秒吗?”他问。
“嗯。”她从口袋里拿出手机,解锁,打开语音备忘录。最上面一条的标题是“外婆”。录音时长00:15。最后一次播放是三天前。她的手指悬在播放键上方,犹豫了两秒,然后按下去。
手机喇叭传出声音。背景有轻微的杂音,像是老旧的录音设备在运转。然后外婆的声音出现了——不是她记忆中的声音,比记忆中更沙哑,语速更慢,每个字之间有比正常对话更长的间隔。
“以宁,你瘦了。有没有好好吃饭?”
十五秒结束。手机萤幕回到备忘录列表。
她没有看他。她的视线落在手机萤幕上,落在那条标题为“外婆”的备忘录上。三天前。她三天前还在听这段录音,在凌晨四点的工作室里,在他不知道的时候。
“我可以用你的模型,把这段扩展成完整的对话。”他的声音从旁边传来。
她转头看他。他的表情很认真,眉头微皱,嘴唇微微抿著——那是一个正在思考技术方案的人会有的表情。但他的眼睛不一样。她的模型从来没有教过她如何辨识那种眼神,因为她自己从来没有在数据集里标注过这种类别。
她看著他的眼睛,看了很久。
“不急。”她说。“我们先帮别人。”
他的眉头动了一下。不是皱眉,是某种更细微的变化——眉头的内侧微微抬高,外侧维持不变,形成一个极浅的弧度。那是惊讶,但惊讶里面还混杂著别的东西。她的模型如果看到这个表情,可能会归类为“被理解后的放松”,但她不确定。因为她自己从来没有在测试数据里见过这个组合。
“好。”他说。
他转回自己的萤幕,打开一个新的档案。她看见他在档案最上方输入了一行注释:“Echo·Memory — 让每个人留住他们不想失去的声音。”
她看著那行字,看了很久。然后她转回自己的萤幕,打开知识蒸馏的训练脚本。损失曲线还在下降,已经从0.37降到0.21。她调整了一个超参数,按下重新训练。萤幕上跳出预计完成时间——四小时三十七分钟。
她靠在椅背上。这次她没有继续写程式码。她只是坐在那里,看著萤幕上的损失曲线缓慢下降。每一秒下降零点零零几个百分点,像是某种倒数计时。
“程司晏。”
“嗯。”
“你爸的八秒。你还听吗?”
他的键盘声停了一秒,然后继续。“每天。”
“早上?”
“对。”
“闹钟?”
“对。”
她没有再问。她闭上眼睛,靠在椅背上。黑暗中她看见外婆的脸——不是最后几年的样子,是她小时候的记忆,外婆坐在客厅的藤椅上,手里拿著针线,头顶有一盏不算亮的灯。那盏灯的光线是橘黄色的,和路灯很像。
她睁开眼睛。他的萤幕光还亮著,他的键盘声还在继续,稳定、均匀,像是某种不会停止的心跳。她看著他的侧脸——眼镜重新戴上了,镜片反射出程式码的绿色字体,嘴唇微微抿著,眉头放松了。他看起来比刚才年轻一些,像是放下了某个背了很久的东西。
她转回自己的萤幕。损失曲线降到0.19。训练时间还剩三小时五十二分钟。她打开emotion_model_v8_core.py,在档案的最上方加了一行注释。
“给那个每天用八秒当闹钟的人:你的闹钟可以多一个选项了。我帮你留了十五秒的位置。”
她按下储存。身后的键盘声停了大概两秒,然后重新响起。这次的节奏比之前快了一些,但她不确定那是因为他看见了那行注释,还是因为训练脚本进入了新的阶段。
窗外的天空开始变亮。路灯在某一刻熄灭了,橘黄色的光线被灰白色的晨光取代。她看著窗户上的影子从深蓝变成浅灰,再从浅灰变成淡金。损失曲线降到0.11。训练时间还剩一小时零三分。
她没有睡。她只是坐在那里,看著天色变亮,听著身后的键盘声,想著那些十五秒和八秒,想著那些被删除的假对话和被保留的真录音。她想起他说的“让其他人不必像我那样,用假AI替代真遗憾”。她想起自己写的“记忆不是储存,是重建”。这两句话在同一个工作室里,隔著几公尺的距离,安静地共处了一整夜。