Files
SoundGame/docs/design/18-detective-voice-ids.md
T
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

358 lines
30 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.
# 18b · 《雨夜专案》语音台词表(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` 在游戏正文设计单里点名,补进本表后再进生成脚本。
> **R2 修订(2026-09-13)**:总句数 158→**171**(旁白基表 96→104、V 组键盘变体 10→14、NPC 52→53),上限裁定 160→176;改词 2 句(fin_who_confirm/tut_skip);新增 13 个录制单位(基表 8:fin_pre、st_wrong、recap_cf、gd_board_cf、item_who_w1..w4;NPC 1:z_react_w;V 组 4 对)。逐条修订理由见主设计文末「R2 修订记录」(research/new8/detective/round1/synthesis.md F1-F11)。
> **实测句长登记**(F1 配套):male/intro_1 8.80s、male/sys_help 9.28s、male/key/sys_help 10.48s、female/key/sys_help 9.52s 四句超 8s——游戏侧兜底已升 15s(§4.3),证词链全部 ≤7.4s 不受影响;如重录这 4 句请保持内容不变。
> **给音频总监的录制说明**
> - **旁白双性别组**(基表 104 句 + V 组键盘变体 14 句):旁白只做系统/指引/教学/状态/现场勘验(探长自勘)/裁决宣读,**不念证词**。落 `web/detective/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
> - female = `Serena`,instruct 常量:`沉稳清晰的女声,专案组探长,冷静克制,像在雨夜读卷宗`
> - male = `Uncle_Fu`,instruct 常量:`低沉沉稳的男声,专案组探长,冷静克制,像在雨夜读卷宗`
> - 两常量全表统一(含教学/指证/结案/结算),禁止句级变体、禁语速词(引擎 SoundTouch 变速)。
> - **NPC 平铺组**(53 句):证词=证人 NPC 平铺单音色、**不做双性别**,落 `web/detective/audio/voice/<id>.{ogg,m4a}`(引擎平铺回退命中)。NPC ≤5;同一角色 speaker+instruct 恒定;**不加电话滤波**(区别于 radio——本作区分度靠 speaker+instruct+游戏侧签名 earcon `sig_*` 前缀,见主设计 §8.2/§3.7)。区分度风险逐个标注:
> | 角色 | speaker | instruct 常量 | 区分度风险 |
> |---|---|---|---|
> | 老葛(62 岁门卫) | `Eric` | `苍老沙哑的男声,守夜人,慢悠悠,带倦意` | 低 |
> | 小顺(19 岁学徒) | `Dylan` | `年轻清亮的男声,学徒,怯生生的,慌张诚实` | 低 |
> | 周先生(45 岁账房,pack A 真凶) | `Uncle_Fu` | `平板谨慎的男声,账房,字斟句酌,被追问时渐慌` | **中**:与 male 旁白同 speaker——sig_zhou 前缀+账房腔+证词链内零旁白插话,试听确认 |
> | 温太太(50 岁房东) | `Vivian` | `快嘴泼辣的中年女声,房东太太,嗓门亮,热心肠` | 低 |
> | 秦法医 | `Serena` | `冷静干练的女声,验尸官,临床腔,短句平直` | **中**:与 female 旁白同 speaker——sig_fore 前缀+报告固定语境,试听确认 |
> - **声音演技核心**:周先生 z_react_1..4(记岔→支吾→拒答→想走)与 z_break_1..3(认罪三段)、pack B 的 b_shun_react/b_shun_break——情绪全部写在句内文本(省略号/破折号引导),instruct 恒定不变。
> - **数字规避**:进度/疑点/冗余指证全部分档整句(st_asked 7 档 / st_doubt 5 档 / st_miss 3 档);**句序号一律不播**(指证选句用重播该句代替报「第几句」,交互侧落实拼接禁令);句内时刻数字写死在整句里(十点二十、九点四十)。
> - **称呼中性**:旁白称玩家「你」,不出现性别化称呼(旁白性别随设置变化不影响证词内容)。
> - **多音字自查**:全表无「血」「爪」「挨」「壳」;「重新听」统一写法(不用「重听」);已排雷:「当废铜卖了」→「卖给收废品的了」(当 dāng/dàng 歧义)。低风险 3 处标注:「记得真真的」「账算得比谁都精」的「得」(de,助词)、「微驼背」的「背」(bèi)、「疑点,一处」的「处」(chù)——试听异常再改写。
> - **键盘变体(V 组)**:操作提示句在 `gesture.inputMode()==='key'` 时改播 `_k` 变体(touch 回基础句);变体与基础句 id 一一对应、集中登记见文末 V 组。
> - 管线:`tools/gen_voice_dual.py` 照录(SPEAKERS 需新增 detective 行 + DETECTIVE_NPC 平铺表);生成后 `--convert` 落盘 + `tools/check_all_assets.py` 终检(双格式配对、双性别集合一致)。
## G0 组 · 系统/菜单/帮助(旁白 ×11)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `sys_menu` | 菜单。单击切换,双击确认。 | 下滑呼出模态菜单 |
| `sys_menu_resume` | 回到证词板。 | 菜单项 |
| `sys_menu_cf` | 去指证。 | 菜单项(长按捷径的冗余入口,P4) |
| `sys_menu_save` | 保存并回大厅。 | 菜单项 |
| `sys_menu_help` | 重新听帮助。 | 菜单项 |
| `sys_menu_restart` | 重新查这桩案子。 | 菜单项 |
| `sys_saved` | 进度已保存。 | 存档写入后 |
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内设置提示 |
| `sys_help` | 左右滑换卷宗,单击听取,双击重新听。长按指证,上滑状态,下滑菜单。 | 菜单内上滑 / 帮助项 |
| `sys_continue_ask` | 检测到未结的案子。单击继续,右滑换一桩新案。 | 有存档进游戏(TITLE) |
| `sys_new_case` | 新案开卷。 | 新案开始 / 菜单重开 |
## G1 组 · 开场/教学(旁白 ×12)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `intro_1` | 雨下了一整夜。清晨,聚宝斋后院,古董商沈万川死了。 | 开场链 1(TITLE 上滑重听) |
| `intro_2` | 你是专案组探长。这桩案子,归你。 | 开场链 2 |
| `intro_3` | 卷宗六份:四位证人的证词,现场勘验,法医报告。 | 开场链 3 |
| `tut_d0` | 先熟悉证词板。左右滑,换卷宗。 | D0 前 |
| `tut_listen` | 单击,听取当前卷宗。 | D1 前 |
| `tut_replay` | 双击,重新听这一句。 | D2 前 |
| `tut_status` | 上滑,随时听进度:问了几份,疑点几处。 | D3 前 |
| `tut_confront` | 按住屏幕,进入指证。去找两句对不上的证词。 | D4 前(豁免 E2 教学) |
| `tut_cf_try` | 练习一次。选一份证词,单击确认;再选一份,任意一句。 | D5(判定被教学截获) |
| `tut_cf_ok` | 指证就是这样。练习不算数,真矛盾要靠耳朵找。 | D5 完成(success 震) |
| `tut_done` | 教学完了。开始查案。 | D6(进 BOARD) |
| `tut_skip` | 已跳过教学。左右滑换卷宗,单击听取;按住屏幕,指证矛盾。 | 下滑跳过教学(**R2 F10 改词**:补「按住=指证」核心动词;旧词「已跳过教学。左右滑换卷宗,单击听取。」作废) |
## G2 组 · 状态/条目(旁白 ×20)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `st_asked_0` | 六份卷宗,一份都没听。 | 上滑状态链(已听条目数 0) |
| `st_asked_1` | 已听一份,还有五份。 | 已听 1 |
| `st_asked_2` | 已听两份,还有四份。 | 已听 2 |
| `st_asked_3` | 已听三份,还有三份。 | 已听 3 |
| `st_asked_4` | 已听四份,还有两份。 | 已听 4 |
| `st_asked_5` | 已听五份,还有一份。 | 已听 5 |
| `st_asked_6` | 六份都听完了。 | 已听 6 |
| `st_doubt_0` | 疑点,还没有。 | 状态链第 2 段(疑点 0) |
| `st_doubt_1` | 疑点,一处。 | 疑点 1 |
| `st_doubt_2` | 疑点,两处。 | 疑点 2 |
| `st_doubt_3` | 疑点,三处。 | 疑点 3 |
| `st_doubt_4` | 疑点,四处,齐了。 | 疑点 4(齐时追加 hint_fin 一次) |
| `item_w1` | 门卫老葛的证词。 | 条目切换(前缀 sig_ge) |
| `item_w2` | 学徒小顺的证词。 | 条目切换(sig_shun) |
| `item_w3` | 账房周先生的证词。 | 条目切换(sig_zhou) |
| `item_w4` | 房东温太太的证词。 | 条目切换(sig_wen) |
| `item_scene` | 现场勘验。 | 条目切换(sig_scene) |
| `item_fore` | 法医报告。 | 条目切换(sig_fore) |
| `item_case` | 结案陈词。 | 条目切换(无签名,turn earcon);单击进 FINISH |
| `intro_w3` | 周先生,管了十年的账,见人三分笑。 | 周证词链首(旁白报名,防与 male 旁白混淆的强化锚点) |
## G3 组 · 现场勘验(旁白 ×6,探长自勘,sig_scene 前缀链播)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `sc_0` | 你打伞进了后院。雨水顺着瓦檐,淌成一道帘子。 | 现场链 1(无轴) |
| `sc_1` | 柴房门口,沈万川面朝下倒着。后脑一处伤,现场没有凶器。 | struggle=none |
| `sc_2` | 后门门闩完好,是死者自己开的门。生人叫不开这扇门。 | door=victim_opened |
| `sc_3` | 泥地上只有进来的脚印,没有出去的。墙根的花盆,翻了一个。 | wall=climbed |
| `sc_4` | 库房铜秤立在架上,秤砣不见了。 | scale=present(M4 对立端) |
| `sc_5` | 柴房墙上,挂钥匙的铜钩,空着。 | 无轴(叙事佐证,不参与判定) |
## G4 组 · 指证(旁白 ×8)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `cf_start` | 指证矛盾。先选第一份证词。左右滑换,单击确认。 | 进 CONFROST(turn earcon 同点) |
| `cf_pick_line` | 左右滑,一句一句听。 | 选句相位入口(首次) |
| `cf_confirm` | 就这句?单击,定下来。 | 选句两段确认(重播该句后接播) |
| `cf_second` | 再选与它矛盾的那份证词。 | 第一份定下(自动重播所选句一次) |
| `cf_self` | 同一句证词,和自己比不出矛盾。 | 判定:同一句(真话) |
| `cf_same` | 这两句说得一致,不矛盾。 | 判定:同轴同值(真话) |
| `cf_diff` | 这两句,说的不是一件事。 | 判定:无共享轴(真话) |
| `cf_hit` | 对不上!矛盾成立,记入疑点。 | 判定:命中(contra_hit 音先响) |
## G5 组 · 结案三问(旁白 ×24,R2 起 +fin_pre/item_who×4/st_wrong)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `fin_start` | 结案陈词。先指认真凶:四位证人,选一个。 | 进 FINISH(choice earcon;R2 F5 起经 fin_pre 闸) |
| `fin_pre` | 证据在手,就此结案?单击,定下来;滑走,继续查。 | **R2 F5 新增**:结案确认闸(证词板停「结案陈词」首击播,闸内再击进三问;键盘态播 fin_pre_k) |
| `item_who_w1` | 门卫老葛。 | **R2 F4 新增**:真凶问选项=纯人名(原念卷宗名「门卫老葛的证词。」语义错位) |
| `item_who_w2` | 学徒小顺。 | 同上 |
| `item_who_w3` | 账房周先生。 | 同上 |
| `item_who_w4` | 房东温太太。 | 同上 |
| `fin_who_confirm` | 就指认这位?单击,定下来。 | 真凶问两段确认(重播人名后接播;**R2 F4 改词中性化**:旧词「就指认他?」对温太太为假,作废;键盘态播 fin_who_confirm_k,R2 补登记) |
| `fin_clear` | 不在场证明成立。证据放人,回到证词板。 | 指认错(acc_NPC 句后接播;无限再机会) |
| `st_wrong` | 错指一回,记档。 | **R2 F9 新增**:错指链尾当场记账(fin_clear 后接;评级账目当场可闻) |
| `fin_right` | 证据链闭合。周先生,你还有什么话说? | pack A 指认对 → 认罪链起(rain_swell 同点) |
| `fin_right_b` | 证据链闭合。小顺,你还有什么话说? | pack B 指认对 |
| `fin_ask_weapon` | 第二问:凶器是什么? | 凶器问入口 |
| `wp_1` | 松木劈柴。 | 凶器选项(顺序由 seed 洗牌) |
| `wp_2` | 铜秤砣。 | 凶器选项(正确答案,两包共用) |
| `wp_3` | 铁门闩。 | 凶器选项 |
| `wp_4` | 青瓷花盆。 | 凶器选项 |
| `fin_wp_right` | 对。创口的铜屑,不见了的秤砣,都指向它。 | 凶器答对 |
| `fin_wp_wrong` | 不对。铜屑不答应。记下了。 | 凶器答错(真话归因,不重答) |
| `fin_ask_motive` | 第三问:动机是什么? | 动机问入口 |
| `mv_1` | 监守自盗。 | 动机选项(正确答案,两包共用) |
| `mv_2` | 寻仇泄愤。 | 动机选项 |
| `mv_3` | 劫财入户。 | 动机选项 |
| `fin_mv_right` | 对。库里短的东西,就是引线。 | 动机答对 |
| `fin_mv_wrong` | 不对。账上短的东西,才是引线。记下了。 | 动机答错(真话归因) |
## G6 组 · 结算(旁白 ×9)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `settle_open` | 案件归档。雨,停了。 | 结算链首句(gavel 后) |
| `rate_s` | 教科书结案。四处疑点,一击即中。 | S 档(条件见主设计 §7.2,措辞=账目) |
| `rate_a` | 干净利落的结案。 | A 档 |
| `rate_b` | 案子结了,卷宗上有疏漏。 | B 档 |
| `rate_c` | 案子是结了,卷宗上补丁不少。 | C 档(保底/多错) |
| `st_miss_0` | 指证,一次没错。 | 冗余指证 0 次 |
| `st_miss_1` | 指证,错过一两回。 | 1-2 次 |
| `st_miss_2` | 指证,错了不少。 | ≥3 次 |
| `settle_hook` | 同一场雨里,还有别的案子。单击,接新案。 | 结算尾(链锁解除后单击生效;键盘态播 settle_hook_k) |
## G7 组 · 看门狗/卡关/纠错(旁白 ×14,R2 起 +gd_board_cf/recap_cf)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `gd_board` | 还在证词板。左右滑,换卷宗。 | BOARD 无操作轨第 1 级(10s,full,idle-only;未听齐时用) |
| `gd_board_cf` | 都听过了。按住屏幕,去指证。 | **R2 F6 新增**:六份听齐且疑点未齐时的 BOARD 一级提示(此情「换卷宗」是错指令;键盘态播 gd_board_cf_k) |
| `gd_cf` | 还在选证词。左右滑,单击确认。 | CONFRONT 无操作轨第 1 级(15s) |
| `gd_fin` | 在想?左右滑选,单击定。 | FINISH 三问无操作轨第 1 级(20s) |
| `gd_invalid` | 这个操作,这里用不上。 | 无效手势纠错(onceKey 同局 1 次) |
| `hint_a` | 探长,还没听的卷宗,先过一遍耳朵。 | 无进展轨 L2(90s,有未听条目时) |
| `hint_b` | 探长,证词里有对不上的地方,逐句比对。 | 无进展轨 L2(90s,条目听齐但疑点未齐) |
| `hint_c1` | 试试指证:周先生说熄了灯,温太太说灯还亮着。 | 无进展轨 L3(150s,M1 保底,每句全局限 2 次) |
| `hint_c2` | 试试指证:周先生说铜秤卖了,现场铜秤还在。 | L3(M4 保底) |
| `b_hint_c1` | 试试指证:小顺说熄了灯,温太太说灯还亮着。 | pack B L3(M1b 保底) |
| `b_hint_c2` | 试试指证:小顺说铜秤卖了,现场铜秤还在。 | pack B L3(M4b 保底) |
| `hint_fin` | 疑点齐了。去结案陈词。 | 4 疑点齐(一次)/ 无进展轨 L3(疑点齐时)/ R2 F11 起 L2 疑点齐时同用 / R2 F6 起状态链尾(疑点齐时)同用 |
| `recap_go` | 接着查。 | 中断复述链尾(未听齐时) |
| `recap_cf` | 卷宗都在耳朵里了。挑一句你不信的,按住指证。 | **R2 F6 新增**:状态链/复述链尾(六份听齐且疑点未齐时替换 recap_go;键盘态播 recap_cf_k) |
## V 组 · 键盘变体(旁白 ×14;`gesture.inputMode()==='key'` 时替代同名基础句)
| id | 替代基础句 | 台词全文 |
|---|---|---|
| `sys_help_k` | sys_help | 方向键换卷宗,空格听取,回车重新听。按住空格指证,上键状态,下键菜单。 |
| `tut_d0_k` | tut_d0 | 先熟悉证词板。左右方向键,换卷宗。 |
| `tut_listen_k` | tut_listen | 空格,听取当前卷宗。 |
| `tut_replay_k` | tut_replay | 回车,重新听这一句。 |
| `tut_confront_k` | tut_confront | 按住空格,进入指证。 |
| `gd_board_k` | gd_board | 还在证词板。左右方向键,换卷宗。 |
| `gd_cf_k` | gd_cf | 还在选证词。左右方向键,空格确认。 |
| `cf_pick_line_k` | cf_pick_line | 左右方向键,一句一句听。 |
| `cf_confirm_k` | cf_confirm | 就这句?空格,定下来。 |
| `settle_hook_k` | settle_hook | 同一场雨里,还有别的案子。按空格,接新案。 |
| `fin_pre_k` | fin_pre | 证据在手,就此结案?空格,定下来;方向键,继续查。 |
| `fin_who_confirm_k` | fin_who_confirm | 就指认这位?空格,定下来。 |
| `recap_cf_k` | recap_cf | 卷宗都在耳朵里了。挑一句你不信的,按住空格指证。 |
| `gd_board_cf_k` | gd_board_cf | 都听过了。按住空格,去指证。 |
## N1 组 · 老葛证词(NPC Eric 平铺 ×6,sig_ge 前缀,链播句间 0.8s)
| id | 台词全文 | 线索标签 |
|---|---|---|
| `w1_1` | 昨儿夜里雨大,我守着街门,一步没敢挪窝。 | 无 |
| `w1_2` | 九点四十,雨点子刚砸下来,小顺打着伞出的街门。 | rain=2140, dep_s=2140 |
| `w1_3` | 十点一刻,一位先生收着黑伞进了后巷。个儿高,微驼背。 | visitor=male_tall_hunched |
| `w1_4` | 九点五十,周账房出的街门,跟我说了声,回家。 | dep_z=2150 |
| `w1_5` | 后半夜,温太太还来门房借过一回热水。 | 无 |
| `w1_6` | 听说店里账上短了银子,沈老板撂了话,月底清账。 | motive=short |
## N2 组 · 小顺证词(NPC Dylan 平铺 ×6,sig_shun 前缀)
| id | 台词全文 | 线索标签 |
|---|---|---|
| `w2_1` | 夜里,师父打发我去城南,给刘掌柜送匣子。 | away_s=south |
| `w2_2` | 雨太大,刘掌柜留我住的,今早才回店。 | away_s=south |
| `w2_3` | 库房钥匙?师父嫌沉,平日就挂在柴房墙上的铜钩。 | key=hook |
| `w2_4` | 师父的账,向来只信周先生一个人。 | 无 |
| `w2_5` | 后门那闩,生人叫不开。熟人来了,师父才亲自去开。 | door=victim_opened |
| `w2_6` | 周先生常念叨,账房的活,越到夜里越清静。 | 无 |
## N3 组 · 周先生证词(NPC Uncle_Fu 平铺 ×6,sig_zhou 前缀;pack A 真凶,4 句谎)
| id | 台词全文 | 线索标签 |
|---|---|---|
| `z_1` | 我七点进店上夜账。九点五十对完,锁了前门回家。 | dep_z=2150 |
| `z_2` | 临走,我顺手熄了店堂的灯。那会儿,店里就剩老板。 | lamp=off(谎①,M1) |
| `z_3` | 库房钥匙?沈老板贴身带着,从不离身。 | key=body(谎②,M2) |
| `z_4` | 那伤,是松木劈柴砸的。铜秤?上个月卖给收废品的了。 | weapon=wood, scale=sold(谎③④,M3/M4) |
| `z_5` | 我到家倒头就睡,夜里的事,一概不知。 | 无 |
| `z_6` | 你们要是不信,去问我家婆娘。 | 无 |
## N4 组 · 温太太证词(NPC Vivian 平铺 ×6,sig_wen 前缀)
| id | 台词全文 | 线索标签 |
|---|---|---|
| `wen_1` | 雨是九点四十下的。我正收晾的衣裳,记得真真的。 | rain=2140 |
| `wen_2` | 十点二十,我出门倒垃圾。聚宝斋店堂的灯,亮着呢。 | lamp=on_2220(M1 对立端) |
| `wen_3` | 刚回屋,柴房后墙咯噔一响,有人爬墙!花盆翻了一个。 | wall=climbed |
| `wen_4` | 吓得我蒙头半宿没睡着,天亮才敢吱声。 | 无 |
| `wen_5` | 店里短银子的事,街坊都有耳闻。上礼拜他还摔了账本。 | motive=short |
| `wen_6` | 周账房那人,见人三分笑,账算得比谁都精。 | 无 |
## N5 组 · 法医报告(NPC Serena 平铺 ×5,sig_fore 前缀)
| id | 台词全文 | 线索标签 |
|---|---|---|
| `fo_1` | 验尸报告,念给你听。 | 无 |
| `fo_2` | 死亡时间,昨夜十点到十点半。 | death=2200_2230 |
| `fo_3` | 后脑单次钝器伤,一击毙命。创口嵌有铜屑,凶器是铜器。 | weapon=bronze(M3 对立端) |
| `fo_4` | 死者双手干净,没有搏斗痕迹。 | struggle=none |
| `fo_5` | 鞋底是干的。当夜,死者没出过后门。 | 无 |
## N6 组 · 反应/被指认/认罪(NPC 平铺 ×12)
> **R2 F3 修订**:hit 反应句**按所坐实矛盾的轴取句**(原「按累计次数递进」作废——换顺序坐实会答非所问)。pack A 映射:lamp→z_react_1 / key→z_react_2 / weapon→z_react_w(新增)/ scale→z_react_3;疑点 4/4 的一发在轴句后追加收官句 z_react_4。pack B:lamp→b_shun_react_1、其余轴→b_shun_react_2。
| id | 声部 | 台词全文 | 触发/语境 |
|---|---|---|---|
| `z_react_1` | 周先生 | 灯?……许是我记岔了。人上了岁数,记性不济。 | lamp 轴矛盾坐实(M1) |
| `z_react_2` | 周先生 | 钥匙的事……他、他有时候,也贴身带着的…… | key 轴(M2) |
| `z_react_w` | 周先生 | 铜器?……我那是顺口猜的。凶器的事,我怎么会知道。 | **R2 F3 新增**:weapon 轴(M3)——慌在刚戳中的凶器上(他本不该知道凶器什么样) |
| `z_react_3` | 周先生 | 秤!秤的事,你们别再问了…… | scale 轴(M4) |
| `z_react_4` | 周先生 | ……随你们怎么问。我要回去了。 | 疑点 4/4 收官句(轴句后追加) |
| `acc_ge` | 老葛 | 我守了一夜门!温太太来借热水,她能作证! | 错指老葛 |
| `acc_shun` | 小顺 | 我宿在城南刘掌柜家,他全家都能作证! | 错指小顺(pack A) |
| `acc_wen` | 温太太 | 我这把年纪翻墙?先问问那墙答不答应! | 错指温太太 |
| `acc_zhou` | 周先生 | 我十点就到家了!我家婆娘能作证! | 错指周先生(pack B) |
| `z_break_1` | 周先生 | 别念了……我说。库房短的三件货,是我抵了赌债。 | pack A 认罪 1 |
| `z_break_2` | 周先生 | 他说月底清账,要报官。我求他,他不肯。 | 认罪 2 |
| `z_break_3` | 周先生 | 我只想把钥匙放回去,把被盗做真。抡起秤砣的时候,他认出了我。 | 认罪 3 |
## N7 组 · 变体包 B fork(NPC 平铺 ×12;pack B 真凶=小顺)
| id | 声部 | 台词全文 | 线索标签/用途 |
|---|---|---|---|
| `b_zhou_1` | 周先生 | 我对完账就回家了,夜里雨大,路上没停。 | 无(替换 z_2 槽位) |
| `b_zhou_2` | 周先生 | 钥匙?平时就挂在柴房铜钩上,十年了。 | key=hook(M2b 对立端) |
| `b_zhou_3` | 周先生 | 柴房我常去,没什么不对劲的。 | 无 |
| `b_shun_1` | 小顺 | 我走的时候,顺手熄了店堂的灯。 | lamp=off(谎①,M1b) |
| `b_shun_2` | 小顺 | 钥匙,师父贴身带着,从不离身。 | key=body(谎②,M2b) |
| `b_shun_3` | 小顺 | 那伤,八成是柴房劈柴砸的。铜秤早卖给收废品的了。 | weapon=wood, scale=sold(谎③④,M3b/M4b) |
| `b_shun_4` | 小顺 | 库房的货,我一件都没碰过。 | 无(欲盖弥彰 filler) |
| `b_shun_react_1` | 小顺 | 灯?我、我走的时候明明熄了…… | 第 1 处矛盾坐实 |
| `b_shun_react_2` | 小顺 | 别问了……别问了…… | 第 2-4 处(复用) |
| `b_shun_break_1` | 小顺 | 匣子是我送的,可我半路折回来了…… | 认罪 1 |
| `b_shun_break_2` | 小顺 | 我把棉袄反穿,弓着背,葛大爷没认出我。 | 认罪 2(解释 w1_3 访客描述) |
| `b_shun_break_3` | 小顺 | 库房的货,我拿过三件换了钱。他说要对账……秤砣下去的时候,他看着我。 | 认罪 3 |
---
**合计:171 句 ≤176 上限(R2 修订,原 158 ≤160 作废)**(旁白基表 104 句 ×2 性别 = 208 条 + 键盘变体 V 组 14 句 ×2 性别 = 28 条 + NPC 平铺 53 条 = **289 条音频** ×2 格式 = 578 文件)。
分组账:旁白基表 104 = G0 11 + G1 12 + G2 20 + G3 6 + G4 8 + G5 24(18 + fin_pre + item_who×4 + st_wrong)+ G6 9 + G7 14(12 + gd_board_cf + recap_cf);V 组 14(10 + fin_pre_k + fin_who_confirm_k + recap_cf_k + gd_board_cf_k);NPC 53 = N1-N5 29 + N6 12(11 + z_react_w)+ N7 12。
指证命中链 = `contra_hit(sfx)→ cf_hit → react_按轴(4/4 追加 reactFinal,R2 F3)`;miss 链 = `contra_miss(sfx)→ cf_same/cf_diff/cf_self`;
认罪链(pack A)= `fin_right → z_break_1..3 → gavel → settle_open → rate_X → st_doubt_n → st_miss_档 → settle_hook`;
状态链 = `st_asked_n → st_doubt_m →(尾句:recap_go / recap_cf(听齐未破,R2 F6)/ hint_fin(疑点齐,R2 F6))`;中断复述链 = `st_asked_n →(未听 ≤3 时)item_* 名链 → st_doubt_m → 同尾句`;
错指链 = `acc_NPC → fin_clear → st_wrong(R2 F9)`;结案入口 = `fin_pre 闸(R2 F5)→ fin_start`。
矩阵验算与触发逻辑对照 [18-detective.md](18-detective.md) §3-§7;资产规模核对见其 §8。
## R3 · 26 号深度重构(设计单 26-apply-detective.md;施工台词清单 `tools/voice_lines_26/detective.md`)
> 交互权威 26 号手册。本轮开场第一句改 critical 指令「点一下屏幕。」(DRILL 七步
> 跟练废除,教学嵌真实案卷)、等待点三档提示 hint_board/cf_item/fin/tap 统一
> `_full`/`_short`、主动重听「再说一遍:」前缀、手势阶梯三阶段教学句、指证=案卷
> 列表项(「按住屏幕指证」「双击重听」口径全部废止)、菜单改左右滑换项+单击确认
> (00 §5.4)。增量清单原文 = `tools/voice_lines_26/detective.md`(生成并表时逐字
> 并入 `tools/gen_voice_dual.py` DETECTIVE_LINES;并入后重跑 `tools/extract_voice_text.py`
> 刷新 harness 转写表)。类别:critical / content / hint / feedback。全部走
> **`_DET` 探长组**;DETECTIVE_NPC 平铺 53 句不动。上方 G0/G1/G7 组表及 V 组中
> 被本节点名废止的行按本节口径为准。
**新增(18 句 × 双性别,`_DET` 组;其中 4 条由引擎播出但资产照落本目录)**:
| id | 台词全文 | 类别 | 触发 |
|---|---|---|---|
| `sys_first_tap` | 点一下屏幕。 | critical | 冷启动第一句(≤3s,不可打断;与 storyline 同文案) |
| `sys_first_tap_short` | 点一下。 | hint | title 等待点 `_short` 档 |
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」状态声首现教学(挂开场链尾,全局一次) |
| `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) |
| `tut_next_full` | 向右滑,下一份。 | content | 教学·换卷宗步(§4.10 第 10~25 秒,嵌真实案卷) |
| `item_cf` | 指证。 | content | 「指证」案卷条目名(列表第 7 项,无签名音) |
| `st_confront` | 正在指证。左右滑。 | hint | 指证选条目/选句相位上滑「我在哪」(附录 C §4) |
| `hint_board_full` | 左右滑换卷宗。单击听取。 | hint | board 等待点 full 档(18s) |
| `hint_board_short` | 左右滑。 | hint | board/cf_item 等待点 `_short` 档(共用) |
| `hint_cf_item_full` | 左右滑,选一份证词。 | hint | cf_item 等待点 full 档 |
| `hint_fin_short` | 左右滑,选。 | hint | finish 等待点 `_short` 档 |
| `hint_tap_short` | 单击。 | hint | cf_line/cf_confirm/caseGate/settle 等待点 `_short` 档(共用) |
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释(原则 7) |
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释 |
| `inv_longpress` | 长按用不上。单击继续。 | feedback | 长按首次解释(18 号 §3:长按不绑指证) |
**修改(4 句,id 不变重录)**:`tut_confront`「滑到指证,点一下。」(原「按住屏幕,
进入指证……」;指证=案卷列表项)、`recap_cf`「滑到指证,去比对。」(原「……按住
指证」;状态链尾指路句)、`sys_help`「左右滑换卷宗,单击听取。上滑问状态,下滑
菜单。」(原句含「双击重新听/长按指证」废止口径,整句重写)、`sys_menu`「菜单。
左右滑换项,单击确认。」(原「单击切换,双击确认」= 旧菜单口径,00 §5.4 废止)。
**删除(11 句)**:`sys_menu_cf`(指证入口=案卷列表项,菜单三项制)、`tut_d0` /
`tut_replay` / `tut_status` / `tut_done` / `tut_skip`(DRILL 七步教学废止,教学嵌
真实案卷;双击=阶段 3 由 sys_unlock_dt 统一教)、`gd_board` / `gd_board_cf` /
`gd_cf` / `gd_fin`(看门狗句让位等待点三档提示,原则 9)、`gd_invalid`(让位
inv_* 首次解释,原则 7)。合计 104 − 11 + 18 = **111 句**双性别(≤176 上限内),
NPC 53 平铺不动。
**键盘变体**:新增 15 条(sys_first_tap「按空格。」/ sys_first_tap_short「按一下
空格。」/ sys_unlock_up「想知道自己在哪,就按上方向键。」/ sys_unlock_down
「按下方向键,可以打开菜单。」/ sys_unlock_dt「没听清,就按回车,再听一遍。」/
tut_next_full「右方向键,下一份。」/ st_confront「正在指证。左右方向键。」/
hint_board_full「左右方向键换卷宗。按空格听取。」/ hint_board_short「左右方向键。」/
hint_cf_item_full「左右方向键,选一份证词。」/ hint_fin_short「左右方向键,选。」/
hint_tap_short「按空格。」/ inv_up_locked / inv_down_locked / inv_longpress 同
storyline 措辞)+ 重录 4 条(tut_confront「方向键到指证,按空格。」/ recap_cf
「方向键到指证,去比对。」/ sys_help「左右方向键换卷宗,空格听取。上键状态,
下键菜单。」/ sys_menu「菜单。左右方向键换项,按空格确认。」);删除 5 条变体
随主句停用(tut_d0_k / tut_replay_k / gd_board_k / gd_cf_k / gd_board_cf_k)。
V 组合计 14 − 5 + 15 = 24 对。多音字口径维持全表无「重听」(一律「重新听」/
「再听一遍」)。