Files
SoundGame/docs/design/21-keeper-voice-ids.md
xsl ee5d4d2544 feat(playbook): 26 号交互手册全量落地——剩余 12 款深度重构 + 语音全量重制
storyline/escape/simon 首批之后的推广收官:15 款全部按 26 号模式运行
(发言权/回执/三档提示/迷茫接管/手势阶梯/断点复述),旧「双击重听/格挡/
菜单确认」等反模式口径全线废除,开场零规则念白(首句即动手)。

游戏层(12 款):rpg(格挡=前摇窗口内再单击)/ rhythm / space / radio /
dungeon / abyss / detective / cipher / teahouse / keeper / bridge /
hunt(联机切片):
- 每款 game.js 接引擎六模块 + makeInputPipeline(doubleTapWindow:0);
  四向玩法类 swipeCore + 长按帮助;双击是玩法的(space 护盾 / hunt
  旋风斩)按手势阶梯阶段 3 分档恢复双击窗口(doubletapCore)
- 每款 playtest 重写:玩法断言 + §6.2 乱点机器人(无声操作 / 被动
  原句重复 / 打断失败 = 0);15 款 3900+ 断言全绿
- 12 份 docs/design/26-apply-*.md 施工单 + tools/voice_lines_26/
  台词清单 + voice-ids 文档同步 + 转写会话剧本按新口径重写

引擎层(web/engine/,6 处修复):pipeline 增 doubletapCore;novice
teachLine 带 voice/ 前缀(此前教学句被静默丢弃);confusion.record
前置到新手门(锁定手势的乱点也计信号);InvalidHints 播完恢复解释前
状态(根治孤儿 BUSY);WaitPoint takeover(2) 台账去重;台账只在
speak 真正播出时登记。遗留引擎债登记 roadmap §3.1。

语音资产:台词表合并(新增 ~250 系统句 / 改 ~50 旧口径 / 删 ~110
废止句;合并器 tools/merge_voice_lines_26.py + 引用校验器
tools/validate_voice_refs.py),GPU 重录 1536 wav → 4204 ogg/m4a
落地,check_all_assets + validate_voice_refs 双绿;键盘变体同步扩表。

大厅/文档:15 款统一新交互口径(「新交互」徽标退役);README /
HANDOVER / rpg README 旧口径修正;roadmap P0-P3 置完成。
2026-10-02 12:33:20 +08:00

316 lines
33 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 21b · 《守塔人》(keeper) 语音台词表(voice ids,录音依据)
> **26 号对齐(资产清单,不是交互宪法)**
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准。
> - 本表仍是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准)。含「双击重听 / 双击使用 / 双击格挡 / 单击循环菜单」的句子 **停用或按游戏正文重录**。
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复;重听前加「再说一遍:」。
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听」类旧口径,或仅在阶段 3 解锁双击后启用。
> - 共用新句见 [14-guide-layer.md](14-guide-layer.md) §7(`sys_first_tap` 等)。各游戏 `_full` / `_short` 在游戏正文设计单里点名,补进本表后再进生成脚本。
> **给音频总监的录制说明**
> - **双性别组**(守塔人 KEEPER + 岸台/系统 SHORE,121 句):落 `web/keeper/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致(含全部 `_k` 变体)。
> - **KEEPER(守塔人=玩家)**:female = `Serena`,instruct 常量 `沉静克制的年轻女声,孤岛守塔人,低而稳,藏着心事`;male = `Uncle_Fu`,instruct 常量 `沉静克制的男声,孤岛守塔人,低而稳,藏着心事`。
> - **SHORE(岸台值班员/系统音/向导 gd_*)**:female = `Vivian`,instruct 常量 `清晰平稳的女声,海岸电台值班员,隔着无线电的温和干练`;male = `Dylan`,instruct 常量 `清晰平稳的男声,海岸电台值班员,隔着无线电的温和干练`。
> - 区分度设计:守塔人(塔内近讲,不滤波)与岸台(无线电清晰人声,不滤波)共用 speaker 池但**不同 speaker 配对**——female 侧守塔人 Serena / 岸台 Vivian、male 侧守塔人 Uncle_Fu / 岸台 Dylan,同场景高频对话的两者永不同 speaker。
> - **NPC 平铺组**(27 句):单音色、**不做双性别**,平铺落 `web/keeper/audio/voice/<id>.{ogg,m4a}`(引擎平铺回退命中),转码时按 §滤波表 加带通。NPC 共 3 人(≤5 约束),同一角色 speaker+instruct 恒定,区分度风险逐个标注:
> | 角色 | speaker | instruct 常量 | 滤波 | 区分度风险 |
> |---|---|---|---|---|
> | 阿澈(22 岁渔民,现在线·电台) | `Dylan` | `年轻男声,二十二岁渔民,海风养出的嗓子,风暴里喊话,慌而不乱` | 电台 350-3200Hz | **中**:与 male 岸台同 speaker——靠电台滤波(岸台不滤波)+ 年龄感 instruct 区分,二者相邻句出现(c1_holdo→c1_holde),请试听确认 |
> | 父亲(回忆·十二年前) | `Uncle_Fu` | `温和低沉的男声,四十岁守塔人,隔着老唱片,疲惫而坚定` | 唱片 300-2800Hz | **中**:与 male 守塔人同 speaker——插叙内锚句(不滤波)与父亲(唱片滤波)相邻,靠音质差+年代感 instruct 区分,请试听确认 |
> | 祖父(回忆·四十年前) | `Eric` | `苍老缓慢的男声,七十岁老守塔人,隔着更老的唱片,字字压秤` | 唱片 250-2600Hz | **低**:三代人里唯一 Eric,频带最窄最「远」 |
> - **三代人音色分配总账**:你(玩家,双性别随 settings.voice)+ 父亲(Uncle_Fu,仅插叙)+ 祖父(Eric,仅插叙)+ 阿澈(Dylan,仅现在线电台)。**任何时刻同场景说话的人声 ≤3 种质感**(近讲/电台/唱片),音质即身份。
> - **时空音质规则(本作命门)**:现在线=近讲(KEEPER/SHORE 不滤波)+电台(阿澈滤波);回忆线=唱片滤波(父/祖父)+**锚句恒为守塔人不滤波**(「现在的你」在回忆里旁白——干净人声 vs 唱片人声,强化时空感);唱片噪底由 `sfx/amb_vinyl` 常驻承担,人声滤波只做带通+轻压缩(`acompressor threshold=-20dB ratio=3`),不做失真(宁窄勿脏)。试听不可读的句子回退未滤波原声。
> - **称呼规则**:阿澈对玩家一律称「塔 / 守塔人」,**全表禁用**「姑娘/小哥/大哥/大姐/叔叔」类性别化称呼(玩家性别随用户设置变化);父亲在插叙中只对塔台/家人说话,无性别指向称谓。
> - **键盘变体(PC 键盘通道,P1 机制)**:带 `_k` 后缀的 id 为键盘措辞版(「按空格」「回车」「左右方向键/上箭头/下箭头」),与触屏版**成对生成、成对落盘**(`check_all_assets` 校验 `_k` 配对);运行时由 `gesture.inputMode()` 选择:`key` → `<id>_k`,`touch` → `<id>`,`auto` 跟随最近使用通道,`_k` 缺失回退无后缀版。变体共 **8 对**(7 对在下方 §G0.a 操作提示句区 + 首个抉择 p1),以粗体标注。
> - **数字规避**:幕次/信任/真相全部分档整句(prog_m1..3、tr_*、tru_*);句内数字(四十年前/十二年前/第七级台阶/十级/两百米/一刻钟/半个时辰/七个人/两艘/第三级/三遍/半里/三个浪头/三刻)写死在整句里,禁止运行时拼接。
> - **禁语速词**:instruct 不含任何语速描述(引擎 SoundTouch 变速);NPC 句靠短句+逗号停顿实现「风暴里喊/老唱片里缓」听感。
> - 管线:`tools/gen_voice_dual.py` 照录(SPEAKERS 表需新增 keeper 行);多音字自查见文末注记。
## G0 组 · 系统/向导/状态(SHORE 双性别 ×34)
### G0.a 操作提示句(含键盘变体,7 对 14 句——键盘玩家听这一区就够)
| id | 台词全文 | 触发 |
|---|---|---|
| `gd_brief` | 单击,继续值守。要选择时,向左或向右滑。 | 开场链最前(full 档,F8 先例) |
| **`gd_brief_k`** | 按空格,继续值守。要选择时,用左右方向键。 | 同上(inputMode=key) |
| `gd_continue` | 单击屏幕,继续。 | 叙事链末看门狗第 1 级(full 25s / standard 13s) |
| **`gd_continue_k`** | 按空格,继续。 | 同上(key) |
| `gd_again` | 还在吗?单击继续。 | 看门狗第 2 级(50s / 30s),新句不逐字重播 |
| **`gd_again_k`** | 还在吗?按空格继续。 | 同上(key) |
| `sys_help` | 单击继续,双击重新听。上滑听状态,下滑开菜单。选择时,左右滑。 | 上滑帮助 / 菜单内上滑 |
| **`sys_help_k`** | 空格继续,回车重新听。上箭头听状态,下箭头开菜单。选择时,左右箭头。 | 同上(key) |
| `sys_menu` | 菜单。单击切换选项,双击确认。 | 下滑呼出模态菜单 |
| **`sys_menu_k`** | 菜单。空格切换选项,回车确认。 | 同上(key) |
| `sys_skip` | 想跳过这句,单击就行。 | 开场每局一次(skip_hint 先例) |
| **`sys_skip_k`** | 想跳过这句,按空格。 | 同上(key) |
| `sys_continue_ask` | 检测到你的值守记录。单击继续上次,右滑开始新的风暴夜。 | 有存档进游戏 |
| **`sys_continue_ask_k`** | 检测到你的值守记录。空格继续上次,右箭头开始新的风暴夜。 | 同上(key) |
### G0.b 状态/系统句(无手势词,无变体)
| id | 台词全文 | 触发 |
|---|---|---|
| `gd_invalid` | 这个手势,塔里用不上。 | 无效手势(error 震,idle-only,同局限次) |
| `gd_prog1` | 滑动这里用不上。想想岸台刚说的话。 | 无进展轨 60s(第 1 级,乱按抢救) |
| `gd_prog2` | 别乱。停一停,再听一遍。 | 无进展轨 120s(第 2 级) |
| `sys_menu_resume` | 回到值守。 | 菜单项 |
| `sys_menu_restart` | 重新开始今夜。 | 菜单项 |
| `sys_menu_lobby` | 保存并回大厅。 | 菜单项(确认后跳转前播) |
| `sys_settings` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内设置提示 |
| `sys_new_night` | 新的风暴夜,开始了。 | 新夜开始 / 菜单重开 |
| `prog_m1` | 风暴起来了。今晚第一程。 | 上滑状态链首段·时位句(now,按当前幕选播) |
| `prog_m2` | 风暴到顶。第二程。 | 同上 |
| `prog_m3` | 风在退。最后一程。 | 同上 |
| `prog_mem_g` | 这是回忆:祖父的年代,四十年前。 | 上滑状态链首段·时位句(memory=插叙1/3 期间) |
| `prog_mem_f` | 这是回忆:父亲的最后一晚,十二年前。 | 上滑状态链首段·时位句(memory=插叙2 期间)+ 恢复链时位句先行 |
| `tr_deep` | 他把命,交给了你的声音。 | 信任 3-4(跨档时挂 CALM 链尾;上滑状态链) |
| `tr_half` | 他信一半,疑一半。 | 信任 1-2 |
| `tr_thin` | 今晚,他只信自己的手。 | 信任 0(各播报位附 warning 震) |
| `tru_zero` | 旧账压在灯底,你一页没翻。 | 真相度 0(上滑状态链,逐值为真) |
| `tru_one` | 灯下的旧账,你翻开了一角。 | 真相度 1(仅插叙1) |
| `tru_two` | 祖父和父亲的事,你都翻到了。 | 真相度 2(插叙1+2,缺页未读) |
| `tru_full` | 三代人的账,今夜见底了。 | 真相度 3(插叙1+2+3) |
## G1 组 · 开场(双性别 ×4)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `b_open` | 守塔人 | 白角灯塔,风暴夜。我是今晚的守塔人。 | INTRO(配 sfx/amb_storm+amb_room) |
| `b_rain` | 守塔人 | 浪拍到第七级台阶。雾角两长一短——塔在,我也在。 | INTRO(**教「雾角=塔报平安」,配 sfx/foghorn**) |
| `b_rule` | 岸台 | 岸台的规矩就一条:风暴夜,灯不能灭。 | INTRO(一句规矩,P4;与灯三态兑现一致) |
| `b_goal` | 岸台 | 今夜两艘货轮过境。守住灯,也守住频道。 | INTRO(货轮/频道双目标承诺),随后 C1 |
## C1 组 · 幕一·风暴起(双性别 16〔含 p1_k〕+ 阿澈平铺 5 + 祖父平铺 2 = 23)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `c1_tune` | 岸台 | 频道里有动静。很轻,像隔着整片海。 | C1 起始(配 sfx/radio_tune) |
| `amo_a` | 阿澈 | ……有人吗……顺发号……船进水了…… | 呼救渐近(垫 sfx/static_burst+amb_engine) |
| `amo_b` | 阿澈 | 白角塔!是你吗?求你,回个话! | 通话主干(配 sfx/radio_beep 接通) |
| `p1` | 岸台 | 他的声音在抖。向左滑,先接住这个人。向右滑,先要他的船位。 | 抉择提示(播完即可选) |
| **`p1_k`** | 岸台 | 他的声音在抖。左箭头,先接住这个人。右箭头,先要他的船位。 | 同上(key;首个抉择的键位绑定) |
| `c1_hold` | 守塔人 | 别慌。我在白角,哪儿也不去。慢慢说。 | p1 左 |
| `c1_holdo` | 阿澈 | ……好,好。你在。我听见了。 | p1 左·反应(正反馈:声音稳住) |
| `c1_holde` | 岸台 | 他喘匀了。先接人,再办事。 | p1 左·收(trust+1) |
| `c1_ask` | 守塔人 | 顺发号,报你的方位,报进水的速度。 | p1 右 |
| `c1_asko` | 阿澈 | 方位……仪表进水了,我,我看不清…… | p1 右·反应(慌) |
| `c1_aske` | 岸台 | 他更慌了。人没接住,数字也乱。 | p1 右·收(即时纠偏,非惩罚,不扣分) |
| `amo_c` | 阿澈 | 我爷爷,四十年前也是在这片海没的。他说,白角的灯灭过一下。 | 通话主干(**回澜号伏笔,p9 回环**) |
| `p2` | 岸台 | 他提到四十年前。向左滑,去翻灯座下的暗格。向右滑,先专心守灯。 | 抉择提示 |
| `c1_open` | 守塔人 | 父亲的钥匙,就在抽屉里。灯座第三级,开了。 | p2 左(配 sfx/hatch_open;随后 rev_teach+插叙1) |
| `rev_teach` | 守塔人 | 听到唱针落下、风声退后,是回忆。风声回来,就是现在。 | **时空签名教学句**(首插叙前,全局一次) |
| `rev_g1` | 守塔人 | 唱针落下。四十年前,也是这盏灯下。 | 插叙1·锚入(**配 sfx/memory_in + bgm/memory + amb_vinyl**;首播不可跳) |
| `rev_g2` | 祖父 | 手稳住。灯罩擦到第三遍,才算干净。 | 插叙1(少年父亲为无台词角色——沉默擦灯声由底噪承载) |
| `rev_g3` | 祖父 | 记住,灯下压着的东西,比灯重。守塔人,替它守一辈子。 | 插叙1(层1 秘密:灯下有东西) |
| `rev_g4` | 守塔人 | 风声回来了。爷爷,我听见了。 | 插叙1·锚出(**配 sfx/memory_out + bgm/storm 回切**;首播不可跳) |
| `c1_diary` | 守塔人 | 暗格里是祖父的日志。缺了最后一页。 | 回返后 now 句(truth+1;缺页悬念) |
| `c1_focus` | 守塔人 | 先守住这盏灯。旧账,天亮再算。 | p2 右 |
| `c1_focuse` | 岸台 | 灯转得稳。可那句「灭过一下」,留在了你耳朵里。 | p2 右·收(错过的重量,不扣分) |
| `lull_1` | 岸台 | 岸台通报:风加到十级。第一程,过去了。 | CALM(1) 幕间(配 sfx/foghorn;跨档 tr_* 挂链尾) |
## C2 组 · 幕二·风暴顶(双性别 16 + 阿澈平铺 8 + 父亲平铺 3 = 27)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `c2_back` | 岸台 | 频道又响了。顺发号的引擎,时断时续。 | C2 起始(信号重连,配 sfx/radio_tune+static_burst) |
| `amo_d` | 阿澈 | 塔……听得到吗?水,到膝盖了。 | 通话主干(垫 amb_engine) |
| `p3` | 岸台 | 他快撑不住了。向左滑,用守塔人的口诀带他稳船。向右滑,把船位报给岸台。 | 抉择提示 |
| `c2_song` | 守塔人 | 跟我念:浪头过,船头抬。浪头退,船头落。 | p3 左(家传口诀;随后插叙2) |
| `c2_songo` | 阿澈 | 浪头过,船头抬……真的稳了些!这口诀,谁教你的? | p3 左·反应(trust 铺垫;问父) |
| `rev_f1` | 守塔人 | 唱针又落下了。十二年前,也是这样的风。 | 插叙2·锚入(memory_in+bgm/memory;首播不可跳) |
| `rev_f2` | 父亲 | 白角塔,我是老陈。接驳艇上两个人,都活着。 | 插叙2(父亲最后一次值守·电台腔) |
| `rev_f3` | 父亲 | 守塔人听见了求救,就不能装没听见。等我回来。 | 插叙2(家训,与家规相抵的主题句) |
| `rev_f4` | 父亲 | 塔上的机械上满发条,能自己转一夜。给我留着门。 | 插叙2(**发条知识=rev_teach 型承诺,p7 差分兑现**) |
| `rev_f5` | 守塔人 | 风声回来了。那扇门,留到今天。 | 插叙2·锚出(memory_out+storm 回切;首播不可跳) |
| `c2_key` | 守塔人 | 父亲桌上那支手电,尾盖里卷着一页纸。 | 插叙2 后 now 句(truth+1;缺页线索,p6 钥匙) |
| `c2_shore` | 守塔人 | 岸台,记下他的船位。请渔政天亮前到。 | p3 右 |
| `c2_shoreo` | 岸台 | 船位落在图上了。渔政的船,最快也要天亮。 | p3 右·收(留白:那一夜要他自己撑) |
| `amo_e` | 阿澈 | 守塔人……塔里就你一个人?家里人不拦着你干这行? | 通话主干(问父铺垫) |
| `p4` | 岸台 | 他问起你的人。向左滑,告诉他真话。向右滑,轻轻带过。 | 抉择提示 |
| `c4_true` | 守塔人 | 我父亲也是守塔人。十二年前风暴夜,他出海救人,没有回来。 | p4 左(〔插叙2 未触发 ? 先播插叙2+c2_key : 直进〕) |
| `c4_trueo` | 阿澈 | ……对不起。难怪今晚,你一直都在。 | p4 左·反应(trust+1) |
| `c4_pass` | 守塔人 | 家里人?都在大陆。这行当,习惯了。 | p4 右 |
| `c4_passo` | 阿澈 | 哦……你也是一个人守夜。我们俩,隔着一道海。 | p4 右·反应 |
| `c2_crack` | 岸台 | 听!他那边,船板裂了! | **危机拍1**(sfx/hull_crack 前置 2s 渐强+danger 签名/震同窗) |
| `amo_f` | 阿澈 | 裂了!水进得更快了。塔,告诉我怎么办! | 危机后通话主干 |
| `p5` | 岸台 | 船在漏。向左滑,让他回舱堵漏,守住电台。向右滑,让他穿救生衣,上甲板。 | 抉择提示(双活路) |
| `c5_patch` | 守塔人 | 拿堵漏垫顶住裂缝。人守在电台边,我一直在。 | p5 左 |
| `c5_patcho` | 阿澈 | 顶住了!水慢下来了。我不走,守着电台。 | p5 左·反应(trust+1) |
| `c5_suit` | 守塔人 | 穿上救生衣,带上信号灯,站到甲板上去。 | p5 右 |
| `c5_suito` | 阿澈 | 穿好了。要是船散了,我就抱着它漂。 | p5 右·反应 |
| `lull_2` | 岸台 | 风眼凌晨过境。第二程,到顶了。 | CALM(2) 幕间(配 sfx/foghorn;跨档 tr_* 挂链尾) |
## C3 组 · 幕三·风歇前(双性别 23 + 祖父平铺 3 + 阿澈平铺 4 = 30)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `c3_eye` | 岸台 | 风眼过了。最后的浪墙,就跟在后面。 | C3 起始(amb_storm gain 降至 0.7 档) |
| `c3_page` | 守塔人 | 手电的尾盖旋开了。那页纸,在灯下摊平。 | **条件 rev2=true**(配 sfx/flash_click;随后 p6) |
| `m6_seal` | 岸台 | 那些旧东西,你今晚没碰过。缺页的事,你一无所知。 | **p6 封锁句**(rev2=false:播出后自动走右,不摆假选项) |
| `p6` | 岸台 | 祖父的最后一页。向左滑,今晚就读完它。向右滑,合上,塞回灯底。 | 抉择提示(仅 rev2=true 时播) |
| `rev_c1` | 守塔人 | 唱针落下。缺的那一页,自己开了口。 | 插叙3·锚入(memory_in;首播不可跳) |
| `rev_c2` | 祖父 | 我写下这些,等一个敢看的人。那晚,我的儿子,偷了接驳艇。 | 插叙3(层3 秘密·上) |
| `rev_c3` | 祖父 | 我去追他。灯,离了人。半个时辰,回澜号,七个人。 | 插叙3(层3 秘密·中:**祖父之夜真相**) |
| `rev_c4` | 祖父 | 儿子回来了。这页我撕下来,压进灯底。守塔人,不能离灯。 | 插叙3(层3 秘密·下:家规由来) |
| `rev_c5` | 守塔人 | 风声回来了。原来那道家规,是这么来的。 | 插叙3·锚出(memory_out;首播不可跳) |
| `c6_reade` | 岸台 | 四十年,两代人,一条规矩。今晚,轮到你选了。 | p6 左·收(truth+1,随后 p7) |
| `c6_shut` | 守塔人 | 合上。守塔人的事,守塔人自己扛。 | p6 右 |
| `p7` | 岸台 | 浪墙压过来了。向左滑,给灯上满发条,驾接驳艇去接他。向右滑,守着灯,用声音引他过礁。 | 抉择提示(**核心宿命抉择**;35 字全表最长) |
| `c7_go` | 守塔人 | 机械上满发条,灯能自己转到天亮。等着我。 | p7 左·**rev2=true**(配 sfx/lamp_mech;发条知识兑现) |
| `c7_go2` | 守塔人 | 发条……我只上了半卷。快去,快回。 | p7 左·**rev2=false**(无插叙2 知识,灯灭伏笔) |
| `c7_hold` | 守塔人 | 顺发号,听我的。灯照着的那条道,跟我念,一步一步来。 | p7 右(守灯引渡) |
| `c3_wall` | 岸台 | 浪墙起来了!就是现在! | **危机拍2**(sfx/wave_wall 前置 2s 渐强+danger 签名/震同窗;p7 两路共用) |
| `p8_boat` | 岸台 | 海上没有灯。向左滑,循着他哼的渔歌找他。向右滑,按推算的坐标,直线搜。 | 抉择提示(**p7=左 形态**) |
| `p8_reef` | 岸台 | 礁缝两道口。向左滑,走老航道,稳但绕远。向右滑,钻新缝,近但冒险。 | 抉择提示(**p7=右 形态**) |
| `c8_song` | 守塔人 | 他爷爷传下的渔歌……在哪?再唱一遍! | p8_boat 左 |
| `c8_songo` | 阿澈 | 海风那个吹呀——塔!是你吗?我在这儿! | p8_boat 左·反应(循歌找到) |
| `c8_math` | 守塔人 | 坐标向东两百米。灯光扫过去,看见救生衣了! | p8_boat 右 |
| `c8_matho` | 阿澈 | 塔!你的灯扫到我啦!我在这边! | p8_boat 右·反应 |
| `c8_old` | 守塔人 | 走老航道。多绕半里,绕开所有的暗礁。 | p8_reef 左 |
| `c8_oldo` | 阿澈 | 老航道……我爷爷念叨过这条道!稳了! | p8_reef 左·反应 |
| `c8_new` | 守塔人 | 数三个浪头,借着风的角度,钻新缝! | p8_reef 右 |
| `c8_newo` | 阿澈 | 一个,两个,三——过去了!塔,我过来了! | p8_reef 右·反应 |
| `c9_return` | 岸台 | 接驳艇回来了。两个人,一身水,一盏灯。 | p7 左·汇合 |
| `c3_dark` | 岸台 | 你离塔的时候,发条走到了头。灯,灭过一刻钟。过境的货轮,平安。 | **p7 左 + rev2=false** 插播(复刻祖父之夜;归因真话;800ms 死窗) |
| `c9_land` | 岸台 | 顺发号过了礁缝,搁上背风湾的滩。人,站上了岸。 | p7 右 + trust≥3(自渡成功) |
| `c9_found` | 岸台 | 他在半路改了主意。天亮时,渔队找到了他。活着,湿透了。 | p7 右 + trust<3(克制措辞,零死亡) |
## D9 组 · 签收抉择(心结)(双性别 9 + 阿澈平铺 2 = 11)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `g9_in` | 岸台 | 风,一层一层退下去。天边,有点灰了。 | 签收引入(bgm 淡向 dawn 前的静默拍) |
| `g9_knot` | 守塔人 | 十二年了。这一晚,我总算替父亲,站完了他的班。 | 心结自述(玩家背景) |
| `p9a` | 岸台 | 他问起四十年前的灯。向左滑,把缺页的事,连根说给他。向右滑,就说,那晚风太大。 | 抉择提示(**truth=3 全真相版**) |
| `p9b` | 岸台 | 他问起四十年前的灯。你知道的,只有碎片。向左滑,把碎片给他。向右滑,说风太大。 | 抉择提示(**truth<3 碎片版**,cipher p9_known/blind 先例) |
| `d9_tell_a` | 守塔人 | 四十年前守塔的,是我爷爷。他离灯去救自己的儿子。灯灭那刻,回澜号……对不住。 | p9 左·truth=3 |
| `d9_tell_b` | 守塔人 | 我只知道,那晚守塔的是我爷爷,灯灭过一下。剩下的,我也不敢说全。 | p9 左·truth<3(句句为真:家族常识+阿澈原话回声) |
| `d9_keep` | 守塔人 | 那晚风太大,灯出了点故障。别再问了,孩子,回家吧。 | p9 右 |
| `amo_g` | 阿澈 | ……我爷爷,就在那七个人里。难怪他到死,都念着白角的灯。 | p9 左·反应(**回环闭合:amo_c 伏笔兑现**) |
| `amo_h` | 阿澈 | 风太大……嗯。那晚的风,一定很大。 | p9 右·反应 |
| `d9_telle` | 岸台 | 他听完,沉默了很久。天,亮了。 | p9 左·收(措辞 truth 无关:全真相/碎片两版通用) |
| `d9_keepe` | 岸台 | 这个话题,沉回了海里。天,亮了。 | p9 右·收 |
## EP 组 · 结局与尾声回响(双性别 19;结局 8 + 回响 11)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `e1_a` | 守塔人 | 天亮了。他在门厅睡熟,那页纸攥在手里。灯,亮到了最后一刻。 | 结局 e1(trust≥3 且 p9=左)主句 |
| `e1_b` | 守塔人 | 回澜号的账,翻开了第一页。这座塔,等了四十年。 | e1 收(钩子) |
| `e2_a` | 守塔人 | 他走的时候,天刚亮。我送到码头,什么也没说。 | 结局 e2(trust≥3 且 p9=右)主句 |
| `e2_b` | 守塔人 | 缺页放回灯底。有些东西,再压一代人。灯,还转着。 | e2 收(钩子) |
| `e3_a` | 守塔人 | 我把知道的,都说了。他望着海,半信半疑地点头。 | 结局 e3(trust<3 且 p9=左)主句 |
| `e3_b` | 守塔人 | 碎片也是真话。剩下的,让海自己讲吧。 | e3 收(钩子) |
| `e4_a` | 守塔人 | 天亮,各自归位。他回他的港,我守我的灯。 | 结局 e4(trust<3 且 p9=右)主句 |
| `e4_b` | 守塔人 | 隔着一道海,两座塔,谁也没再提那晚。 | e4 收(钩子) |
| `ep_lead` | 岸台 | 风停了。岸台给你记一笔——这一晚,后来怎样了。 | 结局链后尾声引入 |
| `ep_amo_home` | 岸台 | 阿澈:那晚之后改跑日班。他说,夜里的海,有守塔人听着。 | 尾声(p7=左:被你接进塔) |
| `ep_amo_solo` | 岸台 | 阿澈:自己把船开上了背风湾。船主骂了船,没骂人。 | 尾声(p7=右 且 trust≥3:自渡) |
| `ep_amo_dawn` | 岸台 | 阿澈:抱着冷藏柜漂到天亮。打那以后,出海带两台电台。 | 尾声(p7=右 且 trust<3:渔队找到) |
| `ep_lamp_full` | 岸台 | 灯塔记录簿:你离塔三刻,灯自己转着。父亲的发条,说中了。 | 尾声(p7=左 且 rev2=true;rev_f4 兑现) |
| `ep_lamp_dark` | 岸台 | 灯塔记录簿:凌晨两点,灯灭一刻钟。那一行,你写得格外用力。 | 尾声(p7=左 且 rev2=false;复刻祖父之夜回响) |
| `ep_lamp_hold` | 岸台 | 灯塔记录簿:转灯整夜未停。你一步,也没离开过它。 | 尾声(p7=右) |
| `ep_log_told` | 岸台 | 灯下的旧账,今夜见了光。 | 尾声(p9=左 且 truth≥1) |
| `ep_log_kept` | 岸台 | 灯下的旧账,又压回了黑暗里。 | 尾声(p9=右 且 truth≥1;truth=0 两句皆不播——日志未出场) |
| `ep_dad` | 岸台 | 值班表上,你替十二年前那个班次签了字。老陈,收工了。 | 尾声(rev2=true 选播) |
| `ep_shore` | 岸台 | 岸台晨报:风暴过境,航道平安。白角灯,正常。 | 尾声恒播收尾(**b_goal 货轮承诺闭环**,配 sfx/foghorn) |
---
**合计:148 句**(GPU 预算 ≤160 ✓)
- 双性别 121 句(KEEPER 守塔人 42 + SHORE 岸台/系统 79,含 `_k` 键盘变体 8 对)×2 性别 = 242 文件;
- NPC 平铺 27 句(阿澈 19 / 父亲 3 / 祖父 5)= 27 文件;
- 合计 269 条音频 ×2 格式(ogg+m4a)= **538 文件**。
- 键盘变体 8 对:gd_brief / gd_continue / gd_again / sys_help / sys_menu / sys_skip / sys_continue_ask / p1(成对生成,`check_all_assets` 校验 `_k` 配对与双性别集合一致)。
- 每结局专属台词齐备:e1/e2/e3/e4 各 2 句 + 尾声回响 11 句(p7×trust / p7×rev2 / p9×truth / rev2 条件选播)。
- 每局到达全部 9 个抉择点(p1..p9 及 p8 双形态变体 p8_boat/p8_reef、p9 双变体 p9a/p9b),实选 8-9 个(p6 在 rev2=false 时被 m6_seal 自动走右)。
## R2 增量节 · 26 号深度重构(2026-10)
> 交互重构施工单见 [26-apply-keeper.md](26-apply-keeper.md);台词增量清单见
> `tools/voice_lines_26/keeper.md`(管线路径两表一致铁律)。**系统/交互层新句全部
> SHORE 组**(radio PROD 同型);本表头注的 26 号对齐口径(含「双击重听」的句子
> 停用或重录)在此落地。
### 新增(24 句 × 双性别,SHORE 组)
| id | 台词全文 | 类别 | 触发 |
|---|---|---|---|
| `sys_first_tap` | 点一下屏幕。 | critical | 开场第一句(0~3s 动手,§4.10;抢拍 busy) |
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 _short 档 |
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」状态声首现教学(挂 amo_a 链尾,全局一次) |
| `sys_praise` | 对。 | feedback | 首抉择结果链头肯定句(原则 11) |
| `sys_hint_continue_full` | 单击,继续。 | hint | continue 等待点 full 档 + 上滑状态链动作尾巴 |
| `sys_hint_continue_short` | 单击。 | hint | continue/settle 等待点 _short 档 |
| `sys_hint_choice_short` | 左右滑,选。 | hint | choice 等待点 _short 档 |
| `sys_hint_again_full` | 单击,重新开始。 | hint | settle 等待点 full 档 / 结算滑动解释句 |
| `sys_hint_menu_short` | 左右滑,点一下。 | hint | menu 等待点 _short 档 |
| `sys_only_choice` | 现在,只要左右滑。 | hint | 迷茫 L2 抉择点缩小选择 |
| `sys_demo_continue` | 听我做一次。 | hint | 迷茫 L3 演示前缀(intro/continue 替玩家走一步) |
| `sys_demo_choice` | 左右滑,都可以。现在你来。 | hint | 迷茫 L3 抉择点演示(不替玩家选) |
| `sys_say_again` | 再说一遍: | hint 前缀 | 主动重听(engine/hints.js 播出,全项目一句) |
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content | 手势阶梯阶段 1 教学句(挂首抉择后链尾;engine/novice.js) |
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 手势阶梯阶段 2 教学句(挂首局结局链尾) |
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 手势阶梯阶段 3 教学句 |
| `menu_help` | 左右滑换项,点一下确认。 | content | 菜单说明(menu 等待点 full 档 + 菜单内上滑重听) |
| `status_choice` | 正在抉择。左右滑。 | hint | 抉择等待点上滑「我在哪」 |
| `sys_mem_back` | 听完,自动回到现在。 | hint | MEMORY 上滑状态链动作尾巴(§4「听完就回到现在」拆句兑现) |
| `inv_nosel` | 现在不用选。单击继续。 | feedback | 非抉择点滑动首次解释(原则 7) |
| `inv_mem` | 现在不用选。听完就好。 | feedback | 插叙中滑动首次解释(插叙无选择) |
| `inv_generic` | 这个操作用不上。单击继续。 | feedback | 其余无效格子/长按首次解释 |
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释(管道触发) |
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释(管道触发) |
(含操作词的键盘变体 18 + 1 句照 KEY_LINES["storyline"] 措辞,见清单第四节。)
### 修改(1 句重录,id 不变)
| id | 旧 → 新 | 原因 |
|---|---|---|
| `sys_menu` | 「菜单。单击切换选项,双击确认。」→「菜单。左右滑换项,点一下确认。」 | 菜单改 00 号 §5.4 左右滑换项+单击确认(旧「双击确认」= 26 §7 反模式 5;key 变体重录) |
### 删除(8 句停用,游戏零引用;key 变体随主句下线)
`gd_brief`(开场操作念白,§4.10 零规则念白)、`gd_continue` / `gd_again`(旧看门狗
两档,三档提示取代)、`gd_invalid`(旧无效解释,inv_* 取代)、`gd_prog1` / `gd_prog2`
(旧无进展轨,迷茫检测取代)、`sys_help`(帮助溢出废止,含「双击重新听」旧口径;
手势阶梯取代)、`b_rule`(开场规矩念白,§4.10 砍掉)。
### R2 后总账
148 − 8(删除)+ 24(新增,SHORE 组)= **164 句**(双性别 137 = KEEPER 42 +
SHORE 95;NPC 平铺 27 不变)。键盘变体:新增 19 对 + 修改 1 对(sys_menu)+
既有保留 4 对(sys_menu / sys_skip / sys_continue_ask / p1)= 24 对。
## 多音字 / 发音风险自查注记
| 风险词 | 处理 |
|---|---|
| 重听 | 全表写「重新听」(sys_help / sys_help_k),无「重听」字样;「比灯重」zhòng 为唯一「重」,正确读法保留 |
| 落(luò/là/lào) | 「唱针落下 / 浪头落 / 那扇门留到今天」均为 luò 常用读法,保留,试听确认 |
| 数(shǔ/shù) | 「数三个浪头」(c8_new)为 shǔ 动词正确读法,保留,试听确认 |
| 缝(féng/fèng) | 名词「裂缝 / 礁缝 / 钻新缝」恒 fèng;全表无动词「缝」用法 |
| 卷(juǎn/juàn) | 「尾盖里卷着一页纸」(c2_key)为 juǎn 正确读法,保留 |
| 转(zhuǎn/zhuàn) | 「灯转得稳 / 自己转一夜 / 转灯整夜未停」恒 zhuàn 旋转义,正确;全表无 zhuǎn 用法(「转告/转述」未使用) |
| 塞(sāi/sè) | 「塞回灯底」(p6)为 sāi 口语正确读法,保留,试听确认 |
| 钻(zuān/zuàn) | 「钻新缝」(p8_reef)为 zuān 动词正确读法,保留 |
| 发(fā/fà) | 「发条」fà、「天边发灰」fā,均为固定词正确读法 |
| 长(cháng/zhǎng) | 「两长一短」(b_rain)为 cháng 正确读法;全表无 zhǎng 用法 |
| 教(jiāo/jiào) | 「谁教你的」(c2_songo)为 jiāo 口语正确读法,保留 |
| 壳 / 巷 / 挣 / 血 / 露 / 降(jiàng 外义)/ 率 / 传(zhuàn 义)/ 曾 / 宿 / 泊 | 全表未使用 |
| 了(le/liǎo)、还(hái/huán)、得(de/děi)、着(zhe) | 常规句式常见读法,逐句人工试听项(「我听见了」「风声回来了」未用还 huan 义;「撑不住」「稳但绕远」为常用读法) |
| 数字 | 句内数字全部写死(四十年前/十二年前/第七级/十级/两艘/三个/两百米/一刻钟/半个时辰/七个人/三遍/半里/三刻),幕次/信任/真相用分档整句(prog_m1..3、tr_*、tru_*) |
## 台词侧自查
- 单句 ≤40 字:全表最长 = p7(35 字),次长 p9a/p9b(各 32 字)、d9_tell_a(31 字)、p3(30 字)✓;NPC 句最长 amo_c(25 字)、rev_c2(23 字),平均 ≤20 字(P4 靠短句+逗号停顿,不用 instruct 语速词)✓。
- NPC ≤5 人(3 人)、speaker+instruct 恒定、区分度风险逐个标注(阿澈/父 亲两处「中」均有滤波+语境缓解方案)✓。
- 称呼合规:阿澈对玩家只用「塔 / 守塔人 / 你」,性别化称呼零出现;父亲插叙只对塔台/家人说话 ✓。
- 每个结局(e1..e4)专属主句+钩子各 2 句齐备;尾声按 p7×trust(阿澈三态)/p7×rev2(灯三态)/p9×truth(日志两句+truth=0 不播)/rev2(父亲签字)选播,双线齐备 ✓。
- 归因真话律:负向收尾句(c1_aske / c3_dark / c9_found / d9_tell_b / ep_lamp_dark / ep_amo_dawn / e4_b)全部指向玩家实际选择或真实处境,无「运气不好」类假归因、无惩罚性措辞 ✓。
- 时空签名:插叙锚入/锚出六句(rev_g1/g4、rev_f1/f5、rev_c1/c5)措辞固定成对(「唱针(又)落下……」/「风声回来了……」),教学句 rev_teach 的四要素(唱针落下/风声退后/风声回来/就是现在)逐句兑现 ✓。
- 向导 gd_* 6 句(gd_brief/gd_continue/gd_again 各带 _k 变体,gd_invalid/gd_prog1/gd_prog2 无变体)符合 14 号 §6 台词规范(一句一义、无重复句式、单句 ≤18 字)✓。
- 信任档位句与数值一一对应(tr_deep≥3 / tr_half=1-2 / tr_thin=0);真相度四句逐值为真(tru_zero=0 / tru_one=1 / tru_two=2 / tru_full=3),账目真实 ✓。