Files
SoundGame/docs/design/15-radio-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

330 lines
30 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.
# 15b · 《不眠频率》(radio) 语音台词表(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` 在游戏正文设计单里点名,补进本表后再进生成脚本。
> **给音频总监的录制说明**
> - **双性别组**(主播 HOST + 导播/系统 PROD,103 句):落 `web/radio/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
> - **HOST(主播=玩家)**:female = `Serena`,instruct 常量 `温暖清晰的年轻女声,深夜电台主播,沉稳亲切,不甜腻`;male = `Uncle_Fu`,instruct 常量 `低沉温和的中年男声,深夜电台主播,沉稳亲切,有磁性`。
> - **PROD(导播/系统音/向导 gd_*)**:female = `Vivian`,instruct 常量 `贴近耳机的低语女声,年轻电台导播,冷静克制`;male = `Dylan`,instruct 常量 `贴近耳机的低语男声,年轻电台导播,冷静克制`。
> - 区分度设计:主播(播音腔,对外广播)与导播(贴耳低语,只进你耳机)共用 speaker 池但**不同 speaker 配对**——female 侧主播 Serena / 导播 Vivian、male 侧主播 Uncle_Fu / 导播 Dylan,同场景高频对话的两者永不同 speaker。
> - **NPC 平铺组**(29 句):单音色、**不做双性别**,平铺落 `web/radio/audio/voice/<id>.{ogg,m4a}`(引擎平铺回退命中),转码时按 §通话滤波 加带通。NPC 共 5 人(≤5 约束),同一角色 speaker+instruct 恒定,区分度风险逐个标注:
> | 角色 | speaker | instruct 常量 | 区分度风险 |
> |---|---|---|---|
> | 老周(75 岁走丢老人) | `Uncle_Fu` | `苍老沙哑的男声,七十五岁,疲惫害怕,带着雨夜的颤抖` | **中**:与 male 主播同 speaker,靠年龄感 instruct + 电话滤波(500-2800Hz)区分,请试听确认 |
> | 小鹿(想退票的年轻人) | `Serena` | `年轻女声,倔强,带着哭腔,疲惫` | **中**:与 female 主播同 speaker,靠哭腔 instruct + 电话滤波区分,请试听确认 |
> | 糖糖(失眠的孩子) | `Vivian` | `稚嫩童声,八岁小女孩,困倦,胆怯` | **低**:与 female 导播同 speaker,童声 vs 成年低语,且从不同场 |
> | 陈姐(争吵的夫妻·妻) | `Vivian` | `疲惫沙哑的中年女声,四十五岁,强撑着平静` | **低**:与糖糖/导播同 speaker 不同 instruct,三者从不同场,请试听确认 |
> | 老韩(雨夜司机) | `Eric` | `沙哑粗犷的中年男声,货车司机,困倦强撑` | **低**:male 侧唯一 Eric |
> - **通话滤波(转码侧)**:NPC 全部走带通(参数见 15-radio.md §6.2:老周 500-2800 / 小鹿 400-3400 / 糖糖 450-3000 / 陈姐 420-3100 / 老韩 300-3400,均 + 轻压缩);HOST/PROD 不滤波。试听不可读的句子回退未滤波原声(宁窄勿脏)。
> - **称呼规则**:来电者对主播的称呼一律中性(「主播」「您」),**全表禁用**「闺女/小哥/叔叔/阿姨/大姐头」类性别化称呼(主播性别随用户设置变化);「大姐/姑娘」仅可作来电者的**自称或被导播描述**。
> - **数字规避**:序号/口碑全部分档整句(prog_c1..c5、rep_*);句内数字(十一点半、三公里、四十分钟前)写死在整句里,禁止运行时拼接。
> - **禁语速词**:instruct 不含任何语速描述(引擎 SoundTouch 变速);NPC 句靠短句+逗号停顿实现「语速放缓」听感。
> - 管线:`tools/gen_voice_dual.py` 照录(SPEAKERS 表需新增 radio 行);多音字自查见文末注记。
## G0 组 · 系统/向导/状态(PROD 双性别 ×24)
| id | 台词全文 | 触发 |
|---|---|---|
| `gd_brief` | 单击继续节目。请选择的时候,向左或向右滑。 | 开场链最前(full 档,F8 先例) |
| `gd_continue` | 单击屏幕,继续。 | 叙事链末静默看门狗第 1 级(full 25s / standard 13s) |
| `gd_again` | 还在吗?单击继续。 | 看门狗第 2 级(50s / 30s),新句不逐字重播 |
| `gd_invalid` | 这个手势,直播间里用不上。 | 无效手势(error 震,idle-only,同局限次) |
| `gd_ring1` | 热线在闪。单击,接听。 | RING 静默 10s(第 1 级) |
| `gd_ring2` | 灯还亮着,听众在等。单击,接听。 | RING 静默 25s(第 2 级,**必须与第 1 级不同句**) |
| `sys_help` | 单击继续,双击重新听。上滑听状态,下滑开菜单。请选择时,左右滑。 | 上滑帮助 / 菜单内上滑 |
| `sys_menu` | 菜单。单击切换选项,双击确认。 | 下滑呼出模态菜单 |
| `sys_menu_resume` | 回到直播。 | 菜单项 |
| `sys_menu_restart` | 重新开始今晚。 | 菜单项 |
| `sys_menu_lobby` | 保存并回大厅。 | 菜单项(确认后跳转前播) |
| `sys_settings` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内设置提示 |
| `sys_skip` | 想跳过这句,单击就行。 | 开场每局一次(skip_hint 先例) |
| `sys_continue_ask` | 检测到你的夜班记录。单击继续上次,右滑开始新的夜晚。 | 有存档进游戏 |
| `sys_new_night` | 新的夜晚,开始了。 | 新夜班开始 / 菜单重开 |
| `sys_saved` | 进度已保存。 | 存档写入后 |
| `prog_c1` | 现在是今晚第一通电话。 | 上滑状态链(按当前通号选播) |
| `prog_c2` | 现在是今晚第二通电话。 | 同上 |
| `prog_c3` | 现在是今晚第三通电话。 | 同上 |
| `prog_c4` | 现在是今晚第四通电话。 | 同上 |
| `prog_c5` | 现在是今晚第五通电话。 | 同上 |
| `rep_high` | 今晚的口碑,在听众里立住了。 | 口碑跨入 ≥5 档(BRIDGE 被动播报) |
| `rep_mid` | 今晚的口碑,不好不坏。 | 口碑回落 1-4 档 |
| `rep_low` | 今晚的口碑,还没立起来。 | 口碑 ≤0 档(零起步语义,R2 F2 改词:rep=0 开播前不再读成「砸了」;附 warning 震动) |
## G1 组 · 开场(双性别 ×4)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `b_open` | 主播 | 午夜零点,红灯亮起。欢迎回到《今夜不眠》。 | INTRO(配 sfx/onair_sting) |
| `b_rain` | 主播 | 雨下了一整晚。热线灯,马上就要亮了。 | INTRO |
| `b_rule` | 导播 | 台里的规矩就一条:先接住人,再接电话。 | INTRO(一句规矩,P4) |
| `b_goal` | 导播 | 今晚五通电话。说什么话,由你决定。 | INTRO,随后第一声铃 |
## C1 组 · 第一通·老周(走丢的老人)(双性别 13 + 老周平铺 7 = 20)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `z1_ring_in` | 导播 | 一线来电。七十多岁,雨夜,走丢了。 | 接听后线路引入(配 line_connect) |
| `z1_a` | 老周 | 主播……我,我找不到回家的路了。 | 通话主干 |
| `z1_b` | 老周 | 雨太大了。我本来,只想买副老花镜。 | 通话主干(垫 amb_rain_city) |
| `p1` | 导播 | 老人在发抖。向左滑,陪他哼那首老歌。向右滑,冷静问他路口的路牌。 | 抉择提示(播完即可选) |
| `z1_song` | 主播 | 大爷别急,这首歌我也会。咱们一句一句来。 | p1 左(称呼「大爷」指对方,中性合规) |
| `z1_songo` | 老周 | 对,对!路口修车铺,天天放这首! | p1 左·反应(正反馈:声音稳住) |
| `z1_sdone` | 导播 | 他稳住了。老歌,比路牌管用。 | p1 左·收 |
| `z1_ask` | 主播 | 大爷,路口有什么招牌?念一个给我听听。 | p1 右 |
| `z1_asko` | 老周 | 招牌……雨糊住了,我眼花,看不清啊…… | p1 右·反应(慌) |
| `z1_adone` | 导播 | 他慌了。先接住情绪,再走流程。 | p1 右·收(即时纠偏,非归因) |
| `p2` | 导播 | 雨声更密了。向左滑,留在原地陪他等巡逻队。向右滑,转接派出所。 | 抉择提示 |
| `z1_stay` | 主播 | 哪儿也不去。我陪你,这首歌还长着呢。 | p2 左 |
| `z1_stayo` | 老周 | 好,好。有人说话,我就不怕了。 | p2 左·反应 |
| `z1_staye` | 导播 | 十五分钟后,巡逻灯停在路口。全城听见老人笑了。 | p2 左·收(数字整句内嵌) |
| `z1_pol` | 主播 | 大爷,我把您转给派出所,他们马上就到。 | p2 右(p1=左 时) |
| `z1_polo` | 老周 | 好,好。谢谢你啊,谢谢。 | p2 右·反应 |
| `z1_pole` | 导播 | 转接完成,地址报得清。干净利落。 | p2 右·收(p1=左 时) |
| `z1_bad` | 老周 | 说不清……我真是,说不清了…… | p2 右(仅 p1=右 时,替代 z1_polo/z1_pole 前段) |
| `z1_bade` | 导播 | 地址没报清就转接,雨又大。这通砸了。先稳人,再办事。 | 归因句(真话律:指向玩家实际两连选) |
| `z1_ok1` | 导播 | 就这么接。记住这个手感。 | 首通成功收尾确认(全局一次,成功后无其他教学) |
## C2 组 · 第二通·小鹿(想退票的年轻人)(双性别 6 + 小鹿平铺 4 = 10)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `l1_in` | 导播 | 二线来电。姑娘,声音很轻,像怕吵到谁。 | 接听引入(「姑娘」描述来电者,合规) |
| `l1_a` | 小鹿 | 主播,退票窗口十一点半就关了。我站这儿半小时了。 | 通话主干(垫 amb_station) |
| `l1_b` | 小鹿 | 票是回去看我妈的。可我试镜又黄了,两手空空…… | 通话主干 |
| `p3` | 导播 | 向左滑,告诉她这趟车值得上。向右滑,把选择还给她。 | 抉择提示 |
| `l1_go` | 主播 | 你妈等的不是奖杯,是你进门喊的那声妈。 | p3 左 |
| `l1_goo` | 小鹿 | 呜……嗯。不退了,我现在就去检票。谢谢您。 | p3 左·反应 |
| `l1_goe` | 导播 | 二线收工。这句话,值一个头条。 | p3 左·收 |
| `l1_free` | 主播 | 退不退,都是你的自由。夜还长,慢慢想。 | p3 右 |
| `l1_freeo` | 小鹿 | 嗯……我再想想。窗口要关了,我先过去了。 | p3 右·反应 |
| `l1_freee` | 导播 | 她走了。没上车,也没退票。年轻人的夜,长了点。 | p3 右·收 |
## C3 组 · 第三通·糖糖(失眠的孩子)(双性别 10 + 糖糖平铺 6 = 16)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `k1_in` | 导播 | 三线来电。听呼吸,是个小孩。 | 接听引入 |
| `k1_a` | 糖糖 | 喂……有人吗?我睡不着。 | 通话主干(垫 amb_kid_room) |
| `k1_b` | 糖糖 | 家里灯关了。可是楼下,一直有声音。 | 通话主干(**配 sfx/arg_muffled 线索音**) |
| `p4` | 导播 | 向左滑,唱一段摇篮曲哄她睡。向右滑,轻轻问她怎么了。 | 抉择提示 |
| `k1_lull` | 主播 | 闭上眼睛。风把云朵盖在被子上,月亮替你值夜班。 | p4 左(错过线索路线) |
| `k1_lullo` | 糖糖 | 月亮也睡了……那我也睡。 | p4 左·反应 |
| `k1_lulle` | 导播 | 睡着了。可你没听见,她在怕什么。 | p4 左·收(诚实复盘,非惩罚) |
| `k1_ask` | 主播 | 睡不着的时候,心里是不是装着事?说给我听听。 | p4 右(置 heardArgument=true) |
| `k1_asko` | 糖糖 | 爸爸妈妈摔门了。是不是……我做错了什么呀。 | p4 右·反应 |
| `p5` | 导播 | 孩子的声音在抖。向左滑,告诉她这不是她的错。向右滑,答应她明天都会好。 | 抉择提示(仅 p4=右 可达) |
| `k1_truth` | 主播 | 糖糖,记住,大人的事,不是小孩的错。一个字都不是。 | p5 左 |
| `k1_trutho` | 糖糖 | 嗯……那我睡了。他们明天,会一起给我切蛋糕吗? | p5 左·反应 |
| `k1_truthe` | 导播 | 蛋糕。记下来——四线的来电,可能跟这个家有关。 | p5 左·收(flag 预告) |
| `k1_lie` | 主播 | 睡吧。明天一睁眼,什么都会好起来的。 | p5 右(善意谎言) |
| `k1_lieo` | 糖糖 | 真的吗?拉钩。晚安…… | p5 右·反应 |
| `k1_liee` | 导播 | 你许了个兑不了的现。孩子睡了,谎留下了。 | p5 右·收(诚实复盘) |
## C4 组 · 第四通·陈姐(争吵的夫妻)(双性别 13 + 陈姐平铺 7 = 20)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `w1_in` | 导播 | 四线来电。户外风声大,是位大姐。 | 接听引入(垫 amb_street_rain) |
| `w1_a` | 陈姐 | 主播,我就想找个人说说。我家那口子,今晚要出远门的活儿。 | 通话主干 |
| `w1_b` | 陈姐 | 明天孩子生日!蛋糕都订好了,他人要今晚走! | 通话主干 |
| `p6` | 导播 | 摔门声你听见了。向左滑,替孩子给她带句话。向右滑,劝她回家把话说开。 | 抉择提示(固定文本,两条件路线共用) |
| `w1_say` | 主播 | 四十分钟前,有个孩子问我们:爸妈摔门,是不是她的错。 | p6 左·**条件 heardArgument=true** |
| `w1_sayo` | 陈姐 | 什么?她还没睡?这么晚了,她还醒着? | w1_say·反应 |
| `w1_saye` | 导播 | 她攥着电话,很久没出声。风都停了。 | w1_say·收 |
| `w1_say2` | 主播 | 今天有位小朋友,还在等爸妈回家切蛋糕。 | p6 左·**条件 heardArgument=false** |
| `w1_say2o` | 陈姐 | 蛋糕……是他订的。他嘴上不说,心里都记着。 | w1_say2·反应 |
| `w1_say2e` | 导播 | 话递到了。就差最后一脚。 | w1_say2·收 |
| `p7` | 导播 | 她的呼吸平了。向左滑,留在直播里,让全城等这个门铃。向右滑,换垫乐,私下陪她说完。 | 抉择提示(仅 p6=左 可达) |
| `w1_air` | 主播 | 陈姐,别挂。让他接电话——全城都在听。 | p7 左(留在直播) |
| `w1_airo` | 陈姐 | 喂!回来吧!蛋糕要化了,孩子等着呢! | p7 左·反应(对电话那头喊) |
| `w1_aire` | 导播 | 电话那头,传来跑步声。今晚的高光时刻。 | p7 左·收 |
| `w1_priv` | 主播 | 这里只有我们俩了。想说就说,想哭就哭。 | p7 右(换垫乐私聊) |
| `w1_privq` | 陈姐 | 呜……其实他订完蛋糕就跟我道歉了。是我,把门摔得太响。 | p7 右·反应 |
| `w1_prive` | 导播 | 灯牌是你亲手关的,故事还是完整的。稳。 | p7 右·收 |
| `w1_home` | 主播 | 吵架隔着电话吵不赢。回家吧,蛋糕别放到坏了。 | p6 右(本通结束,无 p7) |
| `w1_homeo` | 陈姐 | 嗯……我这就往回走。谢谢你,听我瞎嚷嚷。 | p6 右·反应 |
| `w1_homee` | 导播 | 她往回走了。成不成,看他们自己的了。 | p6 右·收 |
## C5 组 · 第五通·老韩(雨夜司机·高潮)(双性别 8 + 老韩平铺 5 = 13)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `h1_in` | 导播 | 五线来电。引擎声没停过——他在开车! | 接听引入(垫 amb_cab) |
| `h1_a` | 老韩 | 主播,别挂。陪我说话,我的眼皮,沉得很。 | 通话主干 |
| `h1_b` | 老韩 | 跑完这趟,闺女的学费就齐了。雨刷都快刮不动了。 | 通话主干(「闺女」指其女儿,合规) |
| `p8` | 导播 | 方向盘比话筒危险。向左滑,陪他聊聊闺女。向右滑,让他立刻进服务区。 | 抉择提示 |
| `h1_talk` | 主播 | 说说她。开学第一天,她跟你说的头一句话,是什么? | p8 左 |
| `h1_talko` | 老韩 | 她说,爸,我在学校给你赚了朵小红花。哈哈,哈哈…… | p8 左·反应 |
| `h1_danger` | 导播 | 车道偏了——听! | 危机拍(**前 2s 起 brake_screech 渐强 + danger 签名同窗**) |
| `h1_dango` | 老韩 | 嘶——好险!前车急刹,我擦着护栏过去了。彻底醒了! | 危机拍·化解 |
| `h1_talke` | 导播 | 吓醒的,也算醒。这一趟,聊到家。 | p8 左·收 |
| `h1_stop` | 主播 | 听我的,前面三公里有服务区。学费急,命更急。 | p8 右 |
| `h1_stopo` | 老韩 | 行,听你的。进了服务区,我给你们放首歌听。 | p8 右·反应 |
| `h1_stope` | 导播 | 他下了高速。单子黄了,人齐了。 | p8 右·收 |
| `h1_echo` | 导播 | 对了。头通电话那位大爷,就是这片被巡逻队找到的。这城市的夜,是接着的。 | 插播回响(**条件 bond_zhou=true**,queue) |
## D9 组 · 签收抉择(心结)(双性别 6)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `g9_in` | 导播 | 五线收工。垫乐起——零点档,还剩最后一段。 | C5 后 BRIDGE→签收(配 bgm/bridge) |
| `p9` | 导播 | 留言机红灯在闪,是老主播三年前没播完的那句晚安。向左滑,替他播出去。向右滑,照常收播。 | 抉择提示(39 字,全表最长句) |
| `d9_face` | 主播 | 师父,三年了。这句晚安,我替您播。各位,晚安。 | p9 左(knot=解;配 tape_static) |
| `d9_facee` | 导播 | 带子里其实只有电流声。但空着的那一秒,你说满了。 | p9 左·收(老主播不配音,电流声留白) |
| `d9_avoid` | 主播 | 各位,今晚到这里。明晚零点,今夜不眠,不见不散。 | p9 右 |
| `d9_avoide` | 导播 | 留言机的红灯,又多亮了一夜。 | p9 右·收(开环钩子) |
## EP 组 · 结局与尾声回响(双性别 19;结局 8 + 回响 11)
| id | 声部 | 台词全文 | 触发 |
|---|---|---|---|
| `e1_a` | 主播 | 天亮了,热线灯还亮着。你们的晚安,是这座城市的心跳。 | 结局 e1(rep≥5 且直面)主句 |
| `e1_b` | 主播 | 这把话筒,我总算接得住了。明晚零点,接着不眠。 | e1 收(钩子) |
| `e2_a` | 主播 | 今晚的热线烧得发烫。全城的失眠者,都被接住了。 | 结局 e2(rep≥5 且回避)主句 |
| `e2_b` | 主播 | 只是路过留言机的时候,你还是没敢看它。红灯灭得很慢。 | e2 收(钩子) |
| `e3_a` | 主播 | 口碑掉了一夜。可那句迟到三年的晚安,今晚说出去了。 | 结局 e3(rep<5 且直面)主句 |
| `e3_b` | 主播 | 一个人的频道,也是频道。师父,收到了吗? | e3 收(钩子) |
| `e4_a` | 主播 | 今夜不眠,静音收播。有的夜班,谁也接不住谁。 | 结局 e4(rep<5 且回避)主句 |
| `e4_b` | 主播 | 留言机还在闪。你没看它,它也没怪你。明晚再说吧。 | e4 收(钩子;含 e4 复盘,不另配归因句) |
| `ep_lead` | 导播 | 收播了。导播间替你记了一笔账——今晚的人都怎样了。 | 结局链后尾声引入 |
| `ep_zhou_ok` | 导播 | 老周:孙子替他买了老花镜。回信说,谢谢那首歌。 | 尾声(bond_zhou=1) |
| `ep_zhou_no` | 导播 | 老周在便利店屋檐下坐到天亮。没出事,也没人听见他的歌。 | 尾声(bond_zhou=0) |
| `ep_deer_ok` | 导播 | 小鹿上车了。她妈后来打电话说,那声妈,比奖杯值钱。 | 尾声(bond_deer=1) |
| `ep_deer_no` | 导播 | 小鹿退了票。检票口的灯,记得那趟没上成的车。 | 尾声(bond_deer=0) |
| `ep_kid_ok` | 导播 | 糖糖家的门,这个月没再摔过。她说这是主播魔法。 | 尾声(bond_kid=1) |
| `ep_kid_no` | 导播 | 糖糖后来又打来过一次。还是那句:楼下在吵。 | 尾声(bond_kid=0) |
| `ep_wife_ok` | 导播 | 陈姐家切了蛋糕。那句「回来吧」,是我这晚听过最好的声音。 | 尾声(bond_wife=1) |
| `ep_wife_no` | 导播 | 陈姐在公车站坐到了末班车。那通电话,成了没寄出的信。 | 尾声(bond_wife=0) |
| `ep_han_ok` | 导播 | 老韩到家了。后视镜上,多了朵小红花。 | 尾声(bond_han=1) |
| `ep_han_no` | 导播 | 老韩在服务区睡了一觉。学费齐了,那首歌没放成。 | 尾声(bond_han=0) |
---
**合计:132 句**(GPU 预算 ≤170 ✓)
- 双性别 103 句(HOST 21 + PROD 82)×2 性别 = 206 文件;
- NPC 平铺 29 句(老周 7 / 小鹿 4 / 糖糖 6 / 陈姐 7 / 老韩 5)= 29 文件;
- 合计 235 条音频 ×2 格式(ogg+m4a)= **470 文件**。
- 每结局专属台词齐备:e1/e2/e3/e4 各 2 句(ep 组前 8 行)+ 尾声回响 11 句共用。
- 每局实走抉择 8-9 个(p5 仅 p4=右、p7 仅 p6=左 可达),抉择提示 p1..p9 共 9 个。
## 多音字 / 发音风险自查注记
| 风险词 | 处理 |
|---|---|
| 重听 | 全表写「重新听」(sys_help),无「重听」字样 |
| 切(qiē/qiè) | 「切垫乐」写「换垫乐」(p7);「切蛋糕」「切了蛋糕」为正确常用读法,保留 |
| 挣(zhēng/zhèng) | 「挣钱」写「赚了朵小红花」(h1_talko) |
| 巷(xiàng/hàng) | 全表不用「巷」,写「路口」 |
| 答录机(dā lù jī) | 全表用「留言机」,规避 |
| 颤(chàn) | 台词侧用「发抖」(z1_a 触发/语境、instruct 描述不受影响,instruct 不进语音) |
| 哄(hōng/hǒng) | 「哄她睡」为 hǒng 常用读法,保留,试听确认 |
| 宿/血/露/降/率/传(zhuàn 义) | 全表未使用 |
| 了(le/liǎo)、还(hái/huán)、得(de/děi) | 常规句式常见读法,逐句人工试听项(z1_staye「听见了」、l1_goe 等) |
| 数字 | 句内数字全部写死(十一点半/十五分钟/三公里/四十分钟前/零点),序号用分档整句(prog_c1..c5) |
## 台词侧自查
- 单句 ≤40 字:全表最长 = p9(37 字),次长 sys_help(26 字)✓;NPC 句平均 ≤18 字(P4 语速感靠短句+逗号,不用 instruct 语速词)✓。
- NPC ≤5 人、speaker+instruct 恒定、区分度风险逐个标注 ✓。
- 称呼合规:来电者对主播只用「主播/您/谢谢你」,性别化称呼仅指向来电者自身或第三方 ✓。
- 每个结局(e1..e4)专属主句+钩子各 2 句齐备,尾声救/错过双线齐备 ✓。
- 归因真话律:负向收尾句(z1_bade/k1_lulle/k1_liee/ep_*_no/e4_b)全部指向玩家实际选择,无假归因句 ✓。
- 向导 gd_* 6 句(gd_brief/gd_continue/gd_again/gd_invalid/gd_ring1/gd_ring2)符合 14 号 §6 台词规范(一句一义、无重复句式、单句 ≤15 字)✓。
---
## 键盘变体(key,P1 输入平权路线 a,18 句)
「生效输入模式=键盘」(settings.input=key,或 auto 且键盘在跟/纯桌面初始判定,
web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
`web/radio/audio/voice/<gender>/key/<id>.{ogg,m4a}`,变体缺失回退主资产——触屏措辞零改动。
>
> 措辞规范(02-input-parity.md §4.3 路线 a + P1 裁定):向左滑→按左方向键(四向同理,
> WASD 不进台词);单击/轻触屏幕→按空格;双击→按回车;按住/长按→按住空格;
> 复合短语(左右滑→左右方向键、滑动→方向键)按语义等价展开;只改操作词,其余
> 内容一字不动,不新增「重」类多音字。本表与 `tools/gen_voice_dual.py` 的
> `KEY_LINES` 逐字一致(两表一致铁律:改一处必改另一处)。
> 资产:×2 性别 = 18×2 条、×2 格式 = 18×4 文件;管线 `gen_voice_dual.py --only-variants`
> 生成 → `--convert` 落盘,终检 `tools/check_all_assets.py`(key 两性别一致且 ⊆ 主集)。
| id | 键盘台词全文(触屏原句见本表上方对应 id) |
|---|---|
| `gd_brief` | 按空格继续节目。请选择的时候,按左或右方向键。 |
| `gd_continue` | 按空格,继续。 |
| `gd_again` | 还在吗?按空格继续。 |
| `gd_ring1` | 热线在闪。按空格,接听。 |
| `gd_ring2` | 灯还亮着,听众在等。按空格,接听。 |
| `sys_help` | 按空格继续,按回车重新听。按上方向键听状态,按下方向键开菜单。请选择时,左右方向键。 |
| `sys_menu` | 菜单。按空格切换选项,按回车确认。 |
| `sys_skip` | 想跳过这句,按空格就行。 |
| `sys_continue_ask` | 检测到你的夜班记录。按空格继续上次,按右方向键开始新的夜晚。 |
| `p1` | 老人在发抖。按左方向键,陪他哼那首老歌。按右方向键,冷静问他路口的路牌。 |
| `p2` | 雨声更密了。按左方向键,留在原地陪他等巡逻队。按右方向键,转接派出所。 |
| `p3` | 按左方向键,告诉她这趟车值得上。按右方向键,把选择还给她。 |
| `p4` | 按左方向键,唱一段摇篮曲哄她睡。按右方向键,轻轻问她怎么了。 |
| `p5` | 孩子的声音在抖。按左方向键,告诉她这不是她的错。按右方向键,答应她明天都会好。 |
| `p6` | 摔门声你听见了。按左方向键,替孩子给她带句话。按右方向键,劝她回家把话说开。 |
| `p7` | 她的呼吸平了。按左方向键,留在直播里,让全城等这个门铃。按右方向键,换垫乐,私下陪她说完。 |
| `p8` | 方向盘比话筒危险。按左方向键,陪他聊聊闺女。按右方向键,让他立刻进服务区。 |
| `p9` | 留言机红灯在闪,是老主播三年前没播完的那句晚安。按左方向键,替他播出去。按右方向键,照常收播。 |
## R4 · 26 号深度重构(设计单 26-apply-radio.md;施工台词清单 `tools/voice_lines_26/radio.md`)
> 交互权威 26 号手册。本轮开场第一句改 critical 指令「点一下屏幕。」(b_rule/gd_brief
> 规矩念白废除)、等待点三档提示统一 sys_hint_* / 主动重听「再说一遍:」前缀、
> 手势阶梯三阶段教学句、菜单改左右滑换项 + 单击确认(00 §5.4)、旧「双击重听 /
> 单击循环菜单」口径全部废止。增量清单原文 = `tools/voice_lines_26/radio.md`
>(生成并表时逐字并入 `tools/gen_voice_dual.py` RADIO_PROD_LINES,两表一致铁律;
> `web/harness/voice_text.json` radio 主表已同步,149 条)。类别:critical / content /
> hint / feedback。系统/交互层句子全部走 **PROD 导播组**(与既有 sys_skip 一致)。
**新增(25 句 × 双性别,PROD 组;其中 4 条由引擎播出但资产照落本目录)**:
| id | 台词全文 | 类别 | 触发 |
|---|---|---|---|
| `sys_first_tap` | 点一下屏幕。 | critical | 冷启动第一句(≤3s,不可打断) |
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 `_short` 档 |
| `sys_ring_teach` | 热线灯亮了。点一下,接听。 | content | RING 状态声首现教学(全局一次) |
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」状态声首现教学(挂 z1_a 链尾,全局一次;与 storyline 同文案) |
| `sys_praise` | 对。 | feedback | 首抉择链头肯定句(原则 11,≤4 字) |
| `sys_hint_continue_full` | 单击,继续。 | hint | continue 等待点 full 档 |
| `sys_hint_continue_short` | 单击。 | hint | continue/settle 等待点 `_short` 档 |
| `sys_hint_choice_short` | 左右滑,选。 | hint | choice 等待点 `_short` 档 |
| `sys_hint_ring_short` | 点一下,接听。 | hint | ring 等待点 `_short` 档(18s) |
| `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/ring/continue) |
| `sys_demo_choice` | 左右滑,都可以。现在你来。 | hint | 迷茫 L3 抉择点演示(不替玩家选) |
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(engine/hints.js 播出,全项目一句) |
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content | 手势阶梯阶段 1 教学句(挂首抉择后链尾;engine/novice.js teachLine 播出) |
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 阶段 2 教学句(挂首局结局链尾;engine/novice.js) |
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 阶段 3 教学句(engine/novice.js) |
| `menu_help` | 左右滑换项,点一下确认。 | content | 菜单说明(menu 等待点 full 档 + 菜单内上滑重听) |
| `status_choice` | 正在抉择。左右滑。 | hint | 抉择等待点上滑「我在哪」 |
| `inv_nosel` | 现在不用选。单击继续。 | feedback | 非抉择点滑动首次解释(原则 7) |
| `inv_ring` | 现在不用选。点一下,接听。 | feedback | RING 滑动首次解释 |
| `inv_generic` | 这个操作用不上。单击继续。 | feedback | 其余无效格子 / 新手期长按首次解释 |
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释 |
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释 |
**修改(2 句,id 不变重录)**:`gd_ring1`「热线在闪。点一下,接听。」(原「单击,接听」,
动作词与 sys_ring_teach 统一);`sys_menu`「菜单。左右滑换项,点一下确认。」(原
「单击切换选项,双击确认」= 旧菜单口径,00 §5.4 废止)。
**删除(8 句)**:`gd_brief` / `gd_continue` / `gd_again` / `gd_invalid` / `gd_ring2`
(向导层让位三档提示 + inv_* 首次解释,原则 7/9)、`sys_help`(全局帮助溢出废止,
「双击重新听」旧口径)、`b_rule`(开场规矩念白,§4.10 零规则念白)、`sys_saved`
(「保存并回大厅」由 sys_menu_lobby 一句承担)。上方 G0 / G1 组表中对应行按本节
口径废止;合计 132 − 8 + 25 = **149 句**(双性别 120 ×2 + NPC 29)。
**键盘变体**:新增 21 条 + `sys_menu` 重录(「菜单。左右方向键换项,按空格确认。」);
`gd_ring1` 变体沿用不重录(现变体不含「单击」字样);`gd_brief` / `gd_continue` /
`gd_again` / `gd_ring2` / `sys_help` 变体随主句停用。多音字口径维持全表无「重听」
(一律「重新听」/「再听一遍」)。