Files
SoundGame/docs/design/23-hunt-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

248 lines
18 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.
# 23b · 《围猎》语音台词表(voice ids,录音依据)
> **26 号对齐(资产清单,不是交互宪法)**
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准。
> - **26 号重构修订(施工单 [26-apply-hunt.md](26-apply-hunt.md),台词增量
> `tools/voice_lines_26/hunt.md`)**:教学重排 T0 点一下→T1 滑砍→T2 呼喊→T3 长按
> (tut_hit/call/help 三对 _full/_short 新增;tut_rule/tut_attack/tut_callout/
> tut_skill/tut_skill_cd/tut_status/tut_breach/tut_skip/settings_hint 删除);
> 新增 L 组系统/等待点/帮助/归因 15 句;room_wait/sys_menu/help_main/gd_idle/
> net_back/tut_kill_ok/tut_done 改写;键盘变体 V 组换 13 对。主表 60→76 句。
> - 本表仍是 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` 在游戏正文设计单里点名,补进本表后再进生成脚本。
> **给音频总监的录制说明**
> - **旁白/系统音双性别组(60 句,预算打满)**:落 `web/hunt/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
> - female = `Serena`,instruct 常量:`清亮沉稳的女声,像守夜猎人的领队,冷静中带着鼓舞`
> - male = `Uncle_Fu`,instruct 常量:`低沉醇厚的男声,像守夜猎人的领队,沉稳有力`
> - 两常量全表统一(含教学/警报/结算),禁止句级变体、禁语速词(引擎 SoundTouch 变速)。
> - **bot 喊话组(N 组,24 句 = 3 角色 × 8 句)**:固定单音色平铺、**不做双性别**。因喊话经 **sfx 层 + opts.pan 空间化播放**(引擎按 id 前缀分发,主设计 §8 R2 / §15 裁决 7),资产**落盘 `web/hunt/audio/sfx/npc_<char>_<line>.{ogg,m4a}`**——这是 NPC 平铺惯例的异例:生成仍走 voice 管线(TTS、峰值归一 0.89 沿用 voice 策略),仅落盘目录不同。角色 speaker+instruct 恒定:
>
> | 角色 | char | speaker | instruct 常量 | 区分度风险 |
> |---|---|---|---|---|
> | 阿岩 | yan | `Uncle_Fu` | `憨厚壮实的中年男声,猎户,话少踏实` | **中**:与 male 旁白同 speaker——缓解:sfx 层 pan 空间分离 + 1-2s 短喊话语境 + instruct 差异(abyss 先例口径) |
> | 小筝 | zheng | `Serena` | `轻快爽利的年轻女声,猎手,干脆利落` | **中**:与 female 旁白同 speaker——缓解同上 |
> | 老周 | zhou | `Eric` | `沙哑沉稳的老年男声,老猎手,带点调侃` | 低:与两侧旁白零重叠 |
>
> - **数字规避**:耐久 4 档 / 波次 3 档(st_wave_*)+ 5 整句(wave_band1-5)/ 在场猎人 2 句 / 击杀 3 档 / 威胁 3 档 / 评级 4 整句——全部分档整句,无运行时拼接。「八秒冷却」「五波」等数字写死在整句内(一次生成,非拼接)。
> - **称呼中性**:旁白称「你/你们」,无性别化称呼;bot 句不含绝对方位(方位由 pan 承载,主设计 §15 裁决 3/7——任务书示例句"东侧交给我!"据此落地为"这边交给我")。
> - **多音字自查**:全表无「血」「爪」「挨」「壳」「弹」「重(chóng/zhòng 歧义句)」;「重听」一律写「重新听」(tut_skill_cd)。已标注风险 3 处:「还」(hái:营地还在/守得还行/还没开张——asset-manifest 既有风险项,三处均 hái 语境,试听确认);「啧」(zé,npc_zhou_breach 叹词,试听异常则整句改「哼,溜进去一只。」);评级字母 S/A/B/C(rhythm「评级,S!」先例,试听确认字母读音)。
> - **触发纪律**(开发轮次对照主设计):警报类(breach/breach_heavy/danger_low)可顶掉状态/播报类,教学/结算链不可顶;skill_ready 与状态链一律 `queue:true`;gd_* idle-only + onceKey;bot 喊话调度上限见主设计 §7.4/§8 R2。
> - **键盘变体(V 组,11 对)**:操作提示句在 `gesture.inputMode()==='key'` 时改播 `voice/<gender>/key/<id>.*` 变体,变体缺失回退主资产;与 `tools/gen_voice_dual.py` 的 `KEY_LINES` 逐字一致(两表一致铁律:改一处必改另一处)。
> - 管线:`tools/gen_voice_dual.py` 照录(SPEAKERS 新增 hunt 行 + HUNT_NPC 平铺表);生成后 `--convert` 落盘 + `tools/check_all_assets.py` 终检(双格式配对、双性别集合一致、key 变体 ⊆ 主集)。
## A 组 · 开场/房间(旁白 ×4)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `intro_1` | 夜幕降临,野兽在山林里游荡。 | 开场 1(TITLE 单击后/教学房 T0) |
| `intro_2` | 你们是守夜的猎人,营地就在身后。 | 开场 2 |
| `room_wait` | 等同伴到齐。点一下,开局。 | LOBBY 进入(lobby 等待点 full;12s 倒计时自动开局) |
| `room_wait_short` | 单击。 | lobby 等待点 short(26 号) |
| `room_start` | 狩猎开始,先听声音的方向。 | 开局(ev wave 1 前) |
## B 组 · 教学 TEACH(旁白 ×9;26 号重排 T0 点一下→T1 滑砍→T2 呼喊→T3 长按问路;教学波突入不扣耐久,学期零惩罚;旋风斩口头不出现)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `tut_hit_full` | 朝叫声,滑。 | T1(teach_hit 等待点 full;教学狼 1 放出后,critical) |
| `tut_hit_short` | 滑一下。 | teach_hit 等待点 short / 迷茫接管档 |
| `tut_kill_ok` | 对,就是这样。 | T1 首杀(肯定 ≤4 字口径) |
| `tut_call_full` | 点一下,喊人。 | T2(teach_call 等待点 full,critical) |
| `tut_call_short` | 点一下。 | teach_call 等待点 short |
| `tut_callout_ok` | 听到没,同伴回应你了。 | T2(bot help_ack 播完后,呼喊-响应闭环点明) |
| `tut_help_full` | 按住屏幕,听营地。 | T3(teach_help 等待点 full,critical;阶段 1 长按教学) |
| `tut_help_short` | 按住。 | teach_help 等待点 short |
| `tut_done` | 教学完了。围猎开始。 | T3 长按作答后 → 等 ev WAVE 1 |
> 26 号删除:tut_rule(规则总述,做中学)、tut_attack / tut_callout(长指令 →
> 上方 _full/_short 对替换)、tut_skill / tut_skill_cd(新手期旋风斩口头不出现,
> 阶段 4 改 G 组 skill_teach 大厅专属教学)、tut_status(状态查询移长按)、
> tut_breach(breach 警报句自带归因)、tut_skip(每步 L3 演示兜底,无手动跳过)。
## C 组 · 波次(旁白 ×6)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `wave_band1` | 第一波来了,别慌。 | ev wave 1 |
| `wave_band2` | 第二波,比刚才多。 | ev wave 2 |
| `wave_band3` | 第三波,有大家伙混在里面。 | ev wave 3(首只暴熊) |
| `wave_band4` | 第四波,更快,更多。 | ev wave 4 |
| `wave_band5` | 最后一波,全来了! | ev wave 5 |
| `wave_clear` | 这一波,守住了。 | ev waveclear(波间休整 8s 开场) |
## D 组 · 状态链(旁白 ×12;上滑 4 段链播:耐久档 → 波次档 → 猎人数 → 击杀档)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `hp_band1` | 营地固若金汤。 | 耐久 >75%(10 制:≥8) |
| `hp_band2` | 营地受了些损伤。 | 50~75%(5-7) |
| `hp_band3` | 营地损毁过半。 | 25~50%(3-4) |
| `hp_band4` | 营地快守不住了。 | ≤25%(≤2) |
| `st_wave_a` | 还在头几波。 | 波次档:第 1-2 波 |
| `st_wave_b` | 打到中段了。 | 第 3-4 波 |
| `st_wave_c` | 最后一波了。 | 第 5 波 |
| `team_3` | 三名猎人在守。 | 在场 3 猎人(含 bot) |
| `team_4` | 四名猎人全在。 | 在场 4 猎人 |
| `kill_band0` | 你还没开张。 | 个人击杀 0 |
| `kill_band1` | 你小有斩获。 | 1-9 |
| `kill_band2` | 你战果累累。 | ≥10 |
## E 组 · 威胁重听(旁白 ×3;冷却中双击 = 重听;只报数量档,方位由声像承载)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `threat_none` | 近处暂时没有野兽。 | 内圈(eta≤4s)0 只 |
| `threat_few` | 有野兽贴近了,听方向出手。 | 内圈 1-2 只 |
| `threat_many` | 四周全是动静,快出手! | 内圈 ≥3 只 |
## F 组 · 警报(旁白 ×3;警报类,可顶状态/播报类)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `breach` | 有野兽冲进营地了! | ev breach(狼,-1);节流 ≥3.5s |
| `breach_heavy` | 巨兽撞进营地,损伤很重! | ev breach(熊,-2);节流同上 |
| `danger_low` | 营地危险了,一只都不能再漏! | 耐久首次 ≤2(每局 1 次,配 danger 震) |
## G 组 · 技能(旁白 ×2)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `skill_ready` | 旋风斩准备好了。 | 旋风斩冷却完成(§4.6 hint 通道:只在空闲时播,每轮冷却 1 次) |
| `skill_teach` | 双击,放出旋风斩。 | 阶段 4 专属教学:首次以已识别双击进入大厅(附录 C §3) |
## H 组 · 结算(旁白 ×9;进 END 盖 800ms 手势死窗)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `end_win` | 天亮了,营地还在。 | 胜利结算链首句 |
| `end_lose` | 营地守不住了,撤退! | 失守结算首句(耐久归零) |
| `grade_s` | 评级,S!完美的围猎。 | 胜利评级 S(耐久 ≥9) |
| `grade_a` | 评级,A。漂亮。 | 评级 A(7-8) |
| `grade_b` | 评级,B。守得还行。 | 评级 B(4-6) |
| `grade_c` | 评级,C。险胜。 | 评级 C(1-3) |
| `end_rank` | 成绩已记入猎手榜。 | 胜利局排行榜写入后(失守局不播) |
| `end_again` | 单击,再猎一局。 | 结算链尾句(critical;重开入口) |
| `end_again_short` | 单击。 | end 等待点 short(26 号) |
结算链:胜利 = `end_win → grade_* → kill_band_*(自己击杀档)→ end_rank → end_again`;失守 = `end_lose → kill_band_* → end_again`。
## I 组 · 断线/重连(旁白 ×4)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `net_lost` | 与营地断了联系,正在重连。 | WS 断开(本地静默重连开始,≤30s) |
| `net_back` | 你回来了。朝叫声滑。 | resume 回槽成功(§4.12 复述句,23 号 §9 原文) |
| `net_to_bot` | 有猎人离队,老猎手顶上。 | roster 变更:他人槽位转 bot(非自己) |
| `net_gone` | 回不去那场围猎了,回大厅。 | 重连失败/房已灭(err room_gone 或 30s 超时)→ LOST |
## J 组 · 菜单/帮助(旁白 ×6;菜单不暂停 E3 豁免;26 号:左右滑换项、单击确认)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `sys_menu` | 菜单。左右滑换项,单击确认。 | 下滑呼出模态菜单(menu 等待点 full) |
| `sys_menu_short` | 左右滑,单击。 | menu 等待点 short(26 号) |
| `sys_menu_resume` | 回到猎场。 | 菜单项 1 |
| `sys_menu_help` | 重新听帮助。 | 菜单项 2 |
| `sys_menu_home` | 退出房间,回大厅。 | 菜单项 3(= 发 leave;二次确认 sys_home_check) |
| `sys_home_check` | 再点一下,确认退出。 | 回大厅破坏性操作二次确认(原则 6,26 号) |
| `help_main` | 朝声音的方向滑,就是出击。点一下呼喊,按住听状态。 | 菜单「重新听帮助」项 |
> 26 号删除:settings_hint(菜单上滑帮助组合废止;设置只在大厅改,00 §1.2)。
## K 组 · 向导/纠错(旁白 ×2;§4.6 feedback,每「状态×手势」一次 + 30s 台账)
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `gd_invalid` | 这个操作现在用不上。 | 无效手势通用解释(原则 7) |
| `gd_idle` | 朝最响的滑。 | WAVE 迷茫接管 L1(附录 C §7) |
## L 组 · 26 号新增(旁白 ×14;系统句 / 等待点三档 / 长按帮助 / 失败归因)
| id | 台词全文 | 类别 | 触发/语境 |
|---|---|---|---|
| `sys_first_tap` | 点一下屏幕。 | critical | 教学 T0 第一句(首句动手,§4.10) |
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 short |
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(全项目同文案) |
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 第 1 局 END 解锁教学(ladder.onGameDone) |
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 第 3 局 END 解锁教学 |
| `sys_recap` | 上次那局没打完。点一下,重新匹配。 | content | 断点复述(§4.12,一局内退出后回 TITLE) |
| `lp_act` | 朝叫声滑。 | hint | 长按帮助链尾「一个动作」(原则 3) |
| `lp_title` | 围猎。点一下,进入匹配。 | hint | TITLE 长按帮助(+ 有 best 追评级/击杀档) |
| `atk_cd` | 出刀还在冷却。 | feedback | 出击冷却首拦解释(附录 C §7) |
| `call_cd` | 呼喊要有间隔。 | feedback | 呼喊节流首拦解释 |
| `inv_swipe` | 先朝声音滑。 | feedback | T1 期点按(附录 C §6 做错列) |
| `inv_rest` | 下一波马上来。 | feedback | 波间休整窗滑/点(无可打目标) |
| `miss_side` | 在另一边。 | feedback | 挥空归因(30s 台账去重,之后只 swish+回执) |
| `wave_only` | 只朝声音那边滑。 | hint | WAVE 迷茫接管 L2(只放行该弧) |
---
**旁白合计(26 号后):76 句 ×2 性别 = 152 条音频**(×2 格式 = 304 文件;原 60 − 删 9 + 增 25)。
## N 组 · bot 喊话(24 句 = 3 角色 × 8;固定单音色,落盘 `audio/sfx/`,见头注)
> 触发映射(服务端纪律见主设计 §7.4:全局 10s ≤2 条,每 bot 20s 节流,help_call/help_ack 优先):
> `greet`=开局补位完成逐只间隔 ≥1.5s;`help_call`=bot 防区压力呼救 / **真人单击呼喊(用其座位角色声)**;
> `help_ack`=响应呼喊(空闲 bot 一只);`cover`=补位落定 / 转 bot 接管;`kill`=杀熊或三连杀(15s 节流);
> `breach`=本防区漏怪(20s 节流);`skill`=bot 放旋风斩;`wave`=第 2 波起轮转一只鼓劲。
| id | 台词全文 | 触发/语境 |
|---|---|---|
| `npc_yan_greet` | 我来了,这边有我。 | 阿岩 · 开局/补位 |
| `npc_yan_help_call` | 我这侧吃紧,来个人搭把手! | 阿岩 · 呼救(或座 0 真人呼喊) |
| `npc_yan_help_ack` | 撑住,我来了。 | 阿岩 · 响应呼喊 |
| `npc_yan_cover` | 这边交给我。 | 阿岩 · 补位/接管 |
| `npc_yan_kill` | 拿下! | 阿岩 · 杀熊/三连杀 |
| `npc_yan_breach` | 漏了一个,都小心。 | 阿岩 · 本防区突入 |
| `npc_yan_skill` | 都闪开,看我的! | 阿岩 · 旋风斩 |
| `npc_yan_wave` | 新一波,稳住。 | 阿岩 · 波次鼓劲 |
| `npc_zheng_greet` | 小筝到位,开工啦。 | 小筝 · 开局/补位 |
| `npc_zheng_help_call` | 这边太多了,谁来帮一下! | 小筝 · 呼救(或座 1 真人呼喊) |
| `npc_zheng_help_ack` | 别慌,我来了! | 小筝 · 响应呼喊 |
| `npc_zheng_cover` | 这边我罩着。 | 小筝 · 补位/接管 |
| `npc_zheng_kill` | 搞定! | 小筝 · 杀熊/三连杀 |
| `npc_zheng_breach` | 哎呀,漏了一个! | 小筝 · 本防区突入 |
| `npc_zheng_skill` | 看我清场! | 小筝 · 旋风斩 |
| `npc_zheng_wave` | 又来一波,打起精神。 | 小筝 · 波次鼓劲 |
| `npc_zhou_greet` | 老周我守着,放心。 | 老周 · 开局/补位 |
| `npc_zhou_help_call` | 我这边压不住了,来人。 | 老周 · 呼救(或座 2 真人呼喊) |
| `npc_zhou_help_ack` | 听见了,这就到。 | 老周 · 响应呼喊 |
| `npc_zhou_cover` | 这边交给我吧。 | 老周 · 补位/接管 |
| `npc_zhou_kill` | 嗯,解决了。 | 老周 · 杀熊/三连杀 |
| `npc_zhou_breach` | 啧,溜进去一只。 | 老周 · 本防区突入(「啧」风险见头注) |
| `npc_zhou_skill` | 让让,老骨头活动活动。 | 老周 · 旋风斩 |
| `npc_zhou_wave` | 听,又来了。 | 老周 · 波次鼓劲 |
**bot 喊话合计:24 条单音色音频**(×2 格式 = 48 文件;座 3 真人呼喊无角色声,用 `sfx/call_whistle` 哨音,主设计 §15 裁决 6)。
---
## V 组 · 键盘变体(key,13 对;`gesture.inputMode()==='key'` 时选播,措辞规范同 dungeon/bridge)
| id | 键盘台词全文(触屏原句见上方对应 id) |
|---|---|
| `sys_first_tap` | 按空格。 |
| `tut_hit_full` | 朝叫声,按方向键。 |
| `tut_hit_short` | 按方向键。 |
| `tut_call_full` | 按空格,喊人。 |
| `tut_call_short` | 按空格。 |
| `tut_help_full` | 按住空格,听营地。 |
| `tut_help_short` | 按住空格。 |
| `room_wait` | 等同伴到齐。按空格,开局。 |
| `sys_menu` | 菜单。左右方向键换项,按空格确认。 |
| `help_main` | 朝声音的方向按方向键,就是出击。按空格呼喊,按住空格听状态。 |
| `skill_teach` | 按回车,放出旋风斩。 |
| `end_again` | 按空格,再猎一局。 |
| `gd_idle` | 朝最响的,按方向键。 |
**变体合计:13 对 ×2 性别 = 26 条**(×2 格式 = 52 文件;落 `voice/<gender>/key/`)。
---
**全集账目(26 号后)**:旁白 76×2 + bot 24 + key 变体 13×2 = **190 条音频**(×2 格式 = 380 文件)。
主设计触发逻辑对照 [23-hunt.md](23-hunt.md) §2/§5/§7/§8/§11/§12;协议事件(ev 种类 → 播报映射)对照其 §6.3。