Files
SoundGame/docs/design/16-dungeon-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

220 lines
15 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.
# 16b · 《回声地窟》语音台词表(voice ids,录音依据)
> **给音频总监的录制说明**
> - **全部旁白,无 NPC**:本作怪物不说话,无角色音(主设计 §1/§9.3)。125 句双性别。**female = Serena,male = Uncle_Fu**(沿用 R1 分配惯例)。落 `web/dungeon/audio/voice/female|male/<id>.{ogg,m4a}`。
> - female instruct 常量:`平静清晰的女声,像探窟向导,沉稳可信`
> - male instruct 常量:`低沉醇厚的男声,像探窟向导,沉稳有力`
> - 两常量全表统一(含教学/战斗/结算),禁止句级变体。
> - 数字规避:层数(7 句)/血量(4 档)/金币(4 档)/面朝(4 句)/威胁(4 句)/战利(3 档)/死因(3 档)/元进度(3 档)全部分档整句,无运行时拼接。
> - 多音字自查:全表无「血」「重(chóng/zhòng 歧义句)」「爪」「挨」「壳」「栅」;「重听」一律写「重新听」;「重新」为规范 sanctioned 常用词(sys_menu_help / sys_menu_restart)保留。「回声回来越快」已去掉助词「得」。余留风险 2 处已标注:`btl_bat` 的「蝠」(读 fú,试听异常则整句改「盲眼蝙蝠扑了过来」);`unlock_potion` 的「行囊」(xíng náng 固定词,试听确认)。R3 新句自查:`gold_some`(带回来一点,不多——无多音字风险);`tut_flee_hold`(想逃跑,按住别松手——无风险)。
> - 向导/卡关通道句(gd_*、stair_*、nav_*):trigger 见表;接线纪律按 14 号文档——watchdog/纠错句 idle-only、onceKey 同局限次、向导插播一律 queue:true;开发轮次须将本表 gd_* 条目登记进 14 号文档增补。
> - 管线:`tools/gen_voice_dual.py` 照录(--game dungeon);生成后 `--convert` 落盘 + `tools/check_all_assets.py` 终检(双格式配对、双性别集合一致)。
## A 组 · 序章/标题(旁白 ×4)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `intro_1` | 你在黑暗中醒来。这里是回声地窟。 | 新周目开场 1 |
| `intro_2` | 伸手不见五指,声音就是你的眼睛。 | 新周目开场 2 |
| `sys_continue_ask` | 检测到探窟记录。单击继续,右滑重新开始。 | 有存档进游戏(TITLE) |
| `sys_new_run` | 新的探窟,开始了。 | 新周目开始 |
## T 组 · 教学演练 DRILL(旁白 ×20)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `tut_d0` | 先学会用耳朵看。单击,发出声波脉冲。 | D1 前(首次脉冲引导) |
| `tut_echo_come` | 听,回声回来了。 | D1 首次回声后 |
| `tut_front_rule` | 回声回来越快,墙就越近。 | D2(正前距离规则) |
| `tut_side_rule` | 两侧的回声,发闷是墙,空旷是通路。 | D3(侧向规则) |
| `tut_walk` | 按住屏幕不放,你就往前走。 | D4 |
| `tut_turn` | 左滑右滑,可以转身。 | D5 |
| `tut_replay` | 双击,再发一次脉冲,不要钱。 | D6(重发免费) |
| `tut_status` | 上滑,随时听自己的状态。 | D7 |
| `tut_menu` | 下滑,打开菜单。 | D7 |
| `tut_mob` | 前面有东西!放心,它伤不到你。 | D8 遭遇教学怪前(真话:ATK0) |
| `tut_parry` | 听到它的动静,双击格挡。 | D8 前摇前 |
| `tut_parry_ok` | 挡住了! | D8 格挡成功(成功只给新短句) |
| `tut_parry_miss` | 没挡住也别怕,它伤不到你。 | D8 格挡失败 |
| `tut_attack` | 现在单击,挥拳打它。 | D8 你的回合 |
| `tut_kill` | 打中了,就是这样。 | D8 击杀 |
| `tut_flee_hold` | 想逃跑,按住别松手。 | R3:战斗长按未满 900ms 松手(取消逃跑)时的区分提示,每场 1 次 |
| `tut_stairs` | 铁器的回声,就是下潜的楼梯。 | D9 |
| `tut_stairs_on` | 楼梯就在脚下。单击,下潜。 | 首次踏上楼梯格 |
| `tut_done` | 教学完了。地窟很深,小心走。 | DRILL 完成 |
| `tut_skip` | 已跳过教学。单击脉冲,先听听四周。 | 下滑跳过教学 |
## S 组 · 系统/菜单/状态(旁白 ×36)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `sys_saved` | 进度已保存。 | 存档写入后 |
| `sys_menu` | 菜单。单击切换,双击确认。 | 下滑呼出菜单 |
| `sys_menu_resume` | 返回探索。 | 菜单项 |
| `sys_menu_save` | 保存并回大厅。 | 菜单项 |
| `sys_menu_help` | 重新听帮助。 | 菜单项 |
| `sys_menu_restart` | 重新开始本周目。 | 菜单项 |
| `help_explore` | 单击脉冲,按住前进,左右滑转身。双击再听,上滑状态,下滑菜单。 | 帮助(探索) |
| `help_battle` | 敌人前摇声响时双击格挡,单击挥击。打不过就按住屏幕逃跑。 | 帮助(战斗) |
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内 |
| `st_floor_1` | 这是第一层。 | 上滑状态链 / 进层 |
| `st_floor_2` | 这是第二层。 | 同上 |
| `st_floor_3` | 这是第三层。 | 同上 |
| `st_floor_4` | 这是第四层。 | 同上 |
| `st_floor_5` | 这是第五层。 | 同上 |
| `st_floor_6` | 这是第六层。 | 同上 |
| `st_floor_7` | 这是第七层。 | 同上 |
| `st_hp_1` | 你毫发无损。 | 血量 >75% |
| `st_hp_2` | 你受了点伤。 | 50~75% |
| `st_hp_3` | 你伤势不轻。 | 25~50% |
| `st_hp_4` | 你命悬一线。 | ≤25%(danger earcon + warning 震,降档才播) |
| `st_gold_1` | 口袋空空。 | 元进度总金币 =0(R3 起 band0 专用:真的一枚没有) |
| `gold_some` | 带回来一点,不多。 | R3 E1-2:金币档 1(0<金<50)真话句——上滑状态链 / SETTLE / TITLE 三处共用(修「捡到金币→口袋空空」谎报) |
| `st_gold_2` | 有些积蓄。 | 50~200 |
| `st_gold_3` | 收获可观。 | 200~600 |
| `st_gold_4` | 腰包鼓鼓。 | >600 |
| `st_face_e` | 你面朝东。 | 上滑状态链(绝对方位) |
| `st_face_s` | 你面朝南。 | 同上 |
| `st_face_w` | 你面朝西。 | 同上 |
| `st_face_n` | 你面朝北。 | 同上 |
| `st_threat_none` | 附近很安静。 | 上滑威胁段(相对方位,只报左右) |
| `st_threat_left` | 左边有脚步声。 | 左侧 5 格内有怪 |
| `st_threat_right` | 右边有脚步声。 | 右侧 5 格内有怪 |
| `st_threat_both` | 两边都有动静。 | 两侧皆有 |
| `st_best_1` | 你还没到过第三层。 | TITLE 元进度·最深层数档 1 |
| `st_best_2` | 你最远到过中层。 | 档 2(最深 3-5 层;R3 措辞加「最远」——live P3:防误读为"本局到过",已重录) |
| `st_best_3` | 你到过最深层。 | 档 3(最深 ≥6 层) |
## E 组 · 探索事件(旁白 ×9)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `evt_coin_1` | 捡到几枚金币。 | 金币堆·小 |
| `evt_coin_2` | 捡到一小把金币。 | 金币堆·中 |
| `evt_coin_3` | 捡到一大袋金币。 | 金币堆·大 |
| `evt_potion` | 一瓶药水,收进腰带。 | 拾取药水(腰带空) |
| `evt_potion_full` | 腰带满了,药水留在原地。 | 已有药再拾(药不消失) |
| `evt_weapon` | 捡到更快的短刃,出手更狠了。 | 武器掉落(自动装备) |
| `evt_armor` | 换上更硬的护甲,更抗打了。 | 护甲掉落(自动装备) |
| `evt_stairs_lock` | 楼梯被大东西堵住了,先赢它。 | 窟主未清时踏上楼梯格 |
| `evt_descend` | 你顺着楼梯,往下潜。 | 下潜(DESCEND) |
## B 组 · 战斗(旁白 ×30)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `btl_bat` | 盲眼蝠扑了过来! | 遭遇盲眼蝠 |
| `btl_rat` | 窟鼠窜了出来! | 遭遇窟鼠 |
| `btl_mush` | 蘑菇怪拦住了你! | 遭遇蘑菇怪 |
| `btl_crab` | 窟主石甲蟹,就在你面前。 | 遭遇窟主(L3) |
| `btl_crawler` | 绕行者贴上来了,小心背后! | 遭遇绕行者(教学绕位威胁) |
| `btl_spider` | 洞蛛落地了! | 遭遇洞蛛 |
| `btl_leech` | 窟主腐沼蟒,挡住了楼梯。 | 遭遇窟主(L6) |
| `btl_guard` | 石像卫醒了! | 遭遇石像卫 |
| `btl_king` | 窟中之王,就在深处。 | 遭遇终 Boss(L7) |
| `btl_parried` | 挡下了大半! | 格挡成功(减伤 80%) |
| `btl_behind` | 它在你背后,转身再挡。 | 未面对攻击源挨打(归因真话) |
| `btl_swish` | 挥空了,它不在你面前。 | 挥击落空(归因真话) |
| `btl_no_turn` | 它贴着你不放,不用转身。 | 缠斗怪时转身(每场 1 次,之后仅 error 震) |
| `btl_kill` | 它倒下了。 | 击杀 |
| `btl_loot_1` | 战利不多。 | 战利档 1 |
| `btl_loot_2` | 小有收获。 | 战利档 2 |
| `btl_loot_3` | 大有收获。 | 战利档 3 |
| `btl_lvup` | 你的拳脚更利落了。 | 每击杀 4 只攻击升档 |
| `btl_flee` | 你甩掉了它,被抓了一下。 | 逃跑成功(真话:撤退挨一下) |
| `btl_flee_boss` | 退路塌了,跑不掉! | Boss 战逃跑拒绝(真话) |
| `btl_half_crab` | 石甲蟹的甲裂了! | 窟主半血(阶段转换信号) |
| `btl_half_leech` | 腐沼蟒暴怒了! | 窟主半血 |
| `btl_half_king` | 王怒了,脚步更重了! | 终 Boss 半血(二阶段) |
| `die_intro` | 你倒下了。 | 死亡链首句 |
| `die_cause_1` | 你被小怪拖垮了。 | 死因:普通怪连续失血(真话) |
| `die_cause_2` | 你没挡住那记重击。 | 死因:重击未格挡(真话) |
| `die_cause_3` | 你背后的偷袭,要了命。 | 死因:背刺(真话) |
| `die_adv_1` | 下次,前摇声响时就双击。 | 建议:全程格挡数为 0 |
| `die_adv_2` | 打不过,就按住屏幕逃跑。 | 建议:逃跑 0 次且死于连续战 |
| `die_adv_3` | 身后有动静,先转身。 | 建议:死于背刺 |
## G 组 · 卡关/看门狗/纠错(旁白 ×14)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `gd_pulse` | 单击脉冲,听听四周。 | 探索看门狗第 1 级(10s,full 档,idle-only) |
| `gd_turn` | 轮到你了。单击挥击。 | 战斗回合看门狗第 1 级(15s) |
| `gd_invalid` | 这个操作在这里用不上。 | 无效手势纠错(onceKey 同局限 1 次,之后仅 error 震) |
| `stair_hint_a` | 找找铁器的回声,那是楼梯。 | 卡关 L1 暗示(60s,楼梯未找到) |
| `stair_hint_b` | 楼梯有大东西守着,先赢它。 | 卡关 L1 暗示(窟主未清) |
| `stair_dir_e` | 楼梯在东边。 | 卡关 L2 明示(120s,绝对方位) |
| `stair_dir_s` | 楼梯在南边。 | 同上 |
| `stair_dir_w` | 楼梯在西边。 | 同上 |
| `stair_dir_n` | 楼梯在北边。 | 同上 |
| `nav_e` | 往东。 | 卡关 L3 带路(180s,导航模式逐步播) |
| `nav_s` | 往南。 | 同上 |
| `nav_w` | 往西。 | 同上 |
| `nav_n` | 往北。 | 同上 |
| `nav_done` | 到了,就是这里。 | 带路抵达楼梯 |
## M 组 · 结算/元进度(旁白 ×14)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `meta_gold_1` | 这趟没带回什么。 | 死亡/通关结算·金币入账档 1 |
| `meta_gold_2` | 这趟带回一些金币。 | 档 2 |
| `meta_gold_3` | 这趟满载而归。 | 档 3 |
| `settle_stronger` | 下个周目,你会更强。 | 结算钩子句(开环) |
| `settle_win_1` | 你捧起了地窟之心,通关了! | 通关 1 |
| `settle_win_2` | 黑暗的尽头,是光。 | 通关 2 |
| `settle_again` | 单击,再探一次。 | 结算尾(重开入口 ≤2s) |
| `unlock_lead` | 攒够了新的遗产。 | 新周目开场·有新解锁时 |
| `unlock_potion` | 解锁行囊药,开局自带一瓶。 | 遗产播报(90 金) |
| `unlock_vigor` | 解锁体魄,起始更强壮。 | 遗产播报(150 金) |
| `unlock_veil` | 解锁护符,每层头一下减半。 | 遗产播报(220 金) |
| `unlock_echo` | 解锁回声强化,侧向听得更远。 | 遗产播报(300 金) |
| `unlock_blade` | 解锁武器,开局带着短刃。 | 遗产播报(450 金) |
| `unlock_none` | 金币还不够,继续攒。 | TITLE 元进度·距下一解锁尚远 |
---
**合计:127 句 ×2 性别 = 254 条音频**(×2 格式 = 508 文件;无 NPC 平铺件。R3:125 + `gold_some` + `tut_flee_hold`;`st_best_2` 措辞重录不加句)。
死亡结算链 = `die_intro → die_cause_X → die_adv_Y → st_floor_N(复用)→ meta_gold_X(band1 且金>0 时为 gold_some)→ settle_stronger → settle_again`;
通关链 = `settle_win_1 → settle_win_2 → meta_gold_X(同上)→ unlock 段 → settle_again`;
上滑局面复述链 = `st_floor_N → st_hp_X → st_gold_X(band1 且金>0 时为 gold_some)→ st_face_X → st_threat_X`。
主设计触发逻辑对照 [16-dungeon.md](16-dungeon.md) §4-§11;资产规模核对见其 §9。
---
## 键盘变体(key,P1 输入平权路线 a,20 句)
「生效输入模式=键盘」(settings.input=key,或 auto 且键盘在跟/纯桌面初始判定,
web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
`web/dungeon/audio/voice/<gender>/key/<id>.{ogg,m4a}`,变体缺失回退主资产——触屏措辞零改动。
>
> 措辞规范(02-input-parity.md §4.3 路线 a + P1 裁定):向左滑→按左方向键(四向同理,
> WASD 不进台词);单击/轻触屏幕→按空格;双击→按回车;按住/长按→按住空格;
> 复合短语(左右滑→左右方向键、滑动→方向键)按语义等价展开;只改操作词,其余
> 内容一字不动,不新增「重」类多音字。本表与 `tools/gen_voice_dual.py` 的
> `KEY_LINES` 逐字一致(两表一致铁律:改一处必改另一处)。
> 资产:×2 性别 = 20×2 条、×2 格式 = 20×4 文件;管线 `gen_voice_dual.py --only-variants`
> 生成 → `--convert` 落盘,终检 `tools/check_all_assets.py`(key 两性别一致且 ⊆ 主集)。
| id | 键盘台词全文(触屏原句见本表上方对应 id) |
|---|---|
| `sys_continue_ask` | 检测到探窟记录。按空格继续,按右方向键重新开始。 |
| `tut_d0` | 先学会用耳朵看。按空格,发出声波脉冲。 |
| `tut_walk` | 按住空格不放,你就往前走。 |
| `tut_turn` | 按左右方向键,可以转身。 |
| `tut_replay` | 按回车,再发一次脉冲,不要钱。 |
| `tut_status` | 按上方向键,随时听自己的状态。 |
| `tut_menu` | 按下方向键,打开菜单。 |
| `tut_parry` | 听到它的动静,按回车格挡。 |
| `tut_attack` | 现在按空格,挥拳打它。 |
| `tut_flee_hold` | 想逃跑,按住空格别松手。 |
| `tut_stairs_on` | 楼梯就在脚下。按空格,下潜。 |
| `tut_skip` | 已跳过教学。按空格发脉冲,先听听四周。 |
| `sys_menu` | 菜单。按空格切换,按回车确认。 |
| `help_explore` | 按空格发脉冲,按住空格前进,左右方向键转身。按回车再听,上方向键查状态,下方向键开菜单。 |
| `help_battle` | 敌人前摇声响时按回车格挡,按空格挥击。打不过就按住空格逃跑。 |
| `die_adv_1` | 下次,前摇声响时就按回车。 |
| `die_adv_2` | 打不过,就按住空格逃跑。 |
| `gd_pulse` | 按空格发脉冲,听听四周。 |
| `gd_turn` | 轮到你了。按空格挥击。 |
| `settle_again` | 按空格,再探一次。 |