Files
SoundGame/docs/design/15-radio-voice-ids.md
T
xsl 566241e05d feat(platform/P1): 配对码跨设备 + 认领打磨 + 键盘语音双套资产(两 agent 并行 + 集成收口)
配对码与认领(B):
- POST /api/pair/start|join:6 位码 10 分钟单次有效、仅存内存零泄露面、5 连错 per-IP 封锁 10 分钟;join=新设备档案按桶 LWW 并入老档案+token 改绑(复用 claim-merge);日志脱敏
- 大厅:生成配对码(speechSynthesis 逐位朗读+aria-live+重听)/从其他设备转入(one-time-code 输入框)/从本机移除/401 过期自愈引导/aria 补全/玩家名可听化
- api-smoke 12/12(配对全流程/频控/封锁/过期自愈/移除/digitsToCn)+ CDP 真浏览器 E2E 22/22

键盘语音双套资产(A,路线 a):
- 164 变体句(8 游戏 grep 实测,超出调研预估 153:含轻触/点两下/按住变体)×2 性别=328 生成 656 文件 36.9 分钟;触屏主资产零字节改动(PCM 逐样本比对后还原)
- 引擎 _candidates 三跳路由 key→gender→平铺(inputMode 跟随);缓存键 mode|gender|id;engine-input 新增 K9 路由断言(72 条)
- check_all_assets 增 key 列(两性别一致且 ⊆ 主集)8 游戏全绿;voice_text.json 增 __key__ 表;live control.mjs key 会话对照键盘措辞验收(集成)
- voice-ids 文档:8 游戏键盘变体小节由 KEY_LINES 程序化生成(与台词表逐字断言一致);补齐 storyline/escape/simon 三个历史缺失文档;design README 增 new8 索引
- mock 适配:playtest persona 加 maxTouchPoints=1 保持触屏链断言语义零改动

回归:12 套件全绿(8 playtest + guide 122 + engine-voice 19 + engine-input 72 + api-smoke 12/12)
同批入库:批次 2/3 已完稿设计文档(17-abyss/18-detective/19-cipher 全套,20-22 在途)
2026-09-10 00:43:23 +08:00

267 lines
24 KiB
Markdown
Raw 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,录音依据)
> **给音频总监的录制说明**
> - **双性别组**(主播 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` | 留言机红灯在闪,是老主播三年前没播完的那句晚安。按左方向键,替他播出去。按右方向键,照常收播。 |