Files
SoundGame/docs/design/05-rpg-ch1-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

211 lines
12 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.
# 05b · 《剑与声》第一章语音台词表(voice ids,R4 录音依据)
> **给音频总监的录制说明**
> - **旁白**(A/S/D/O/E/B/SH 组,104 句):双性别。**female = Serena,male = Uncle_Fu**(新游戏,沿用 R1 分配惯例)。落 `web/rpg/audio/voice/female|male/<id>.{ogg,m4a}`。
> - female instruct 常量:`平静清晰的年轻女声,像在讲武侠故事`
> - male instruct 常量:`低沉醇厚的男声,像说书人,平静有韵味`
> - **NPC**(N 组,16 句):单音色、不做双性别,平铺落 `web/rpg/audio/voice/<id>.{ogg,m4a}`(引擎平铺回退命中,同 storyline 角色台词模式)。同一角色 speaker+instruct 恒定:
> - 村长:`Uncle_Fu` + `慈祥和缓的老者`
> - 老猎人:`Eric` + `沙哑粗犷,豪爽中带着暖意`
> - 寨丁头目:`Dylan` + `凶狠粗鲁,大声喝骂`
> - 黑风寨主:`Uncle_Fu` + `低沉阴狠,慢条斯理`(与村长同 speaker 不同 instruct,参照 storyline 先例;两者从不在同场景出现,请试听确认区分度)
> - 主角沈听澜**无台词**:旁白第二人称("你")叙述,省一套主角音色。
> - 数字规避:等级/血量/金币全部分档整句;价格写死在商店句里;无运行时拼接。
> - 管线:`tools/gen_voice_dual.py` 照录;多音字已规避("重听"写作"重新听")。
## A 组 · 序章(旁白 ×3)
| id | 台词全文 |
|---|---|
| `intro_1` | 你的眼睛看不见了。但你的耳朵,比谁都灵。 |
| `intro_2` | 黑风寨掳走了你唯一的徒弟。追进迷雾林,把他们连根拔起。 |
| `intro_3` | 先记住,怎么用耳朵走路。 |
## S 组 · 系统/菜单/状态(旁白 ×28)
| id | 台词全文 | 触发 |
|---|---|---|
| `sys_continue_ask` | 检测到你的旅程记录。单击继续,右滑开始新的旅程。 | 有存档进游戏 |
| `sys_new_game` | 新的旅程,开始了。 | 新游戏 |
| `sys_saved` | 进度已保存。 | 存档写入后 |
| `sys_rest` | 你在篝火边睡了一觉,状态全满。 | village 休息 |
| `sys_drink` | 溪水清冽,你喝了个饱,伤势尽消。 | stream 饮水 |
| `sys_menu` | 菜单。左右滑选择,单击确认。 | 下滑呼出 |
| `sys_menu_resume` | 继续旅程。 | 菜单项 |
| `sys_menu_save` | 保存并回大厅。 | 菜单项 |
| `sys_menu_help` | 重新听帮助。 | 菜单项 |
| `help_explore` | 左右滑切换选项,单击确认。双击重新听场景,上滑查看状态,下滑打开菜单。 | 帮助 |
| `help_battle` | 战斗中,左右滑选招式,单击出手。听到敌人的前摇,双击格挡。 | 帮助 |
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内 |
| `st_hp_high` | 你状态很好。 | 血量 >70% |
| `st_hp_mid` | 你受了伤。 | 30~70% |
| `st_hp_low` | 你伤势很重,命悬一线。 | <30%(附带 warning 震动) |
| `st_gold_poor` | 口袋空空。 | 金币 <30 |
| `st_gold_some` | 有些积蓄。 | 30~150 |
| `st_gold_rich` | 腰包鼓鼓。 | >150 |
| `st_lv_low` | 你初出茅庐。 | lv 1-2 |
| `st_lv_mid` | 你小有名气。 | lv 3-5 |
| `st_lv_high` | 你已是高手。 | lv 6+ |
| `st_weapon_none` | 你赤手空拳。 | 无武器 |
| `st_weapon_iron` | 你手持铁剑。 | iron_sword |
| `st_weapon_steel` | 你手持青钢剑。 | steel_sword |
| `st_weapon_wind` | 你手持听风剑。 | wind_sword |
| `st_armor_none` | 你身无片甲。 | 无护甲 |
| `st_armor_leather` | 你身着皮甲。 | leather |
| `st_armor_iron` | 你身着铁鳞甲。 | iron_scale |
## D 组 · 场景描述(旁白 ×16)
| id | 台词全文 |
|---|---|
| `desc_village` | 雾口村。篝火噼啪作响,村民低声议论着林子里的土匪。 |
| `desc_village_re` | 你回到了雾口村。 |
| `desc_path` | 林间小路。风穿过树叶,脚下的落叶沙沙作响。 |
| `desc_path_re` | 你回到林间小路。 |
| `desc_fork` | 岔路口。风声在左右两边,听起来不太一样。 |
| `desc_fork_re` | 你回到岔路口。 |
| `desc_chest` | 一个枯树洞。洞里似乎藏着什么。 |
| `desc_chest_re` | 你回到枯树洞前。 |
| `desc_stream` | 溪流。水声潺潺,是个歇脚的好地方。 |
| `desc_stream_re` | 你回到溪流边。 |
| `desc_hunter` | 猎人小屋。柴火正旺,还有磨刀的声音。 |
| `desc_hunter_re` | 你回到猎人小屋。 |
| `desc_deepwood` | 密林深处。虫鸣急促,远处有狼嚎,杀气很重。 |
| `desc_deepwood_re` | 你回到密林深处。 |
| `desc_gate` | 黑风寨门前。火把熊熊,人声嘈杂。 |
| `desc_hall` | 聚义厅。火盆熊熊,大厅空旷,回声冰冷。 |
## O 组 · 选项名(旁白 ×18)
| id | 台词全文 |
|---|---|
| `opt_go_path` | 前进,去林间小路。 |
| `opt_go_fork` | 前进,去岔路口。 |
| `opt_go_chest` | 往左,看看树洞。 |
| `opt_go_stream` | 往右,去溪流。 |
| `opt_go_hunter` | 前进,去猎人小屋。 |
| `opt_go_deepwood` | 前进,进密林深处。 |
| `opt_go_gate` | 前进,去寨门。 |
| `opt_back` | 返回。 |
| `opt_shop` | 去商店。 |
| `opt_rest` | 休息一晚。 |
| `opt_status` | 查看状态。 |
| `opt_investigate` | 调查四周。 |
| `opt_open_chest` | 打开树洞。 |
| `opt_drink` | 饮水休息。 |
| `opt_talk_hunter` | 和老猎人谈谈。 |
| `opt_assault` | 强攻寨门。 |
| `opt_sneak` | 绕行潜入。 |
| `opt_leave` | 离开。 |
## E 组 · 事件(旁白 ×6)
| id | 台词全文 |
|---|---|
| `evt_gold15` | 你在落叶下摸到十五枚金币。 |
| `evt_nothing` | 这里什么都没有了。 |
| `evt_chest` | 树洞里有两瓶金疮药,你收好了。 |
| `evt_hunter_gift` | 老猎人塞给你一瓶金疮药,还说商店会给你算便宜些。 |
| `evt_gate_open` | 寨门缓缓打开。 |
| `evt_ch1_end` | 寨主倒了,但徒弟不在这里。一张字条,指向南方的腐沼。 |
## B 组 · 战斗(旁白 ×26)
| id | 台词全文 | 触发 |
|---|---|---|
| `btl_start_wolf` | 野狼拦路! | 遭遇狼 |
| `btl_start_bandit` | 山贼围上来了! | 遭遇山贼 |
| `btl_start_spider` | 毒蛛从树上垂了下来! | 遭遇毒蛛 |
| `btl_start_elite` | 寨丁头目挡住了去路! | 遭遇头目 |
| `btl_start_boss1` | 黑风寨主,就在你面前。 | Boss 战 |
| `cmd_attack` | 攻击。 | 指令 |
| `cmd_skill` | 破空斩。 | 指令 |
| `cmd_defend` | 防御。 | 指令 |
| `cmd_item` | 金疮药。 | 指令 |
| `btl_nomp` | 内劲不足。 | mp<3 选技能 |
| `btl_noitem` | 没有金疮药了。 | 无药选道具 |
| `btl_flee` | 你抽身退出了战斗。 | 逃跑成功 |
| `btl_noflee` | 避无可避! | Boss/剧情战逃跑 |
| `btl_enemy_die` | 敌人倒下了。 | 击杀 |
| `btl_win` | 战斗胜利。 | 胜利 |
| `btl_loot_small` | 小有收获。 | 战利 exp+gold <15 |
| `btl_loot_mid` | 收获不少。 | 15~40 |
| `btl_loot_big` | 大获全胜,收获颇丰。 | >40 |
| `btl_levelup` | 你的修为精进了。 | 升级(success 震动) |
| `btl_lose` | 你倒下了,黑暗吞没了一切。 | 战败 |
| `btl_lose_hint` | 记住,听清前摇,双击格挡。 | 战败提示 |
| `tut_b1` | 它要扑了,听前摇! | 教学战 |
| `tut_b2` | 就是现在,双击格挡! | 教学战 |
| `tut_b3` | 挡住了!轮到你了。左右滑选攻击,单击出剑。 | 教学战 |
| `tut_b4` | 没挡住也没关系,再来一次。 | 教学战格挡失败 |
| `tut_b5` | 好剑法!接下来,靠你自己了。 | 教学战结束 |
## SH 组 · 商店(旁白 ×7)
| id | 台词全文 |
|---|---|
| `shop_open` | 商店。左右滑看看货,单击购买。 |
| `shop_price_sword` | 铁剑,一百金。 |
| `shop_price_armor` | 皮甲,八十金。 |
| `shop_price_potion` | 金疮药,三十金。 |
| `shop_owned` | 这件你已经有了。 |
| `shop_poor` | 钱不够。 |
| `shop_buy` | 买下了。 |
## N 组 · NPC(单音色平铺 ×16)
| id | 角色 | 台词全文 |
|---|---|---|
| `npc_headman_1` | 村长 | 外乡人,林子里不太平。这五十金,拿着防身。 |
| `npc_headman_2` | 村长 | 商店就在村里,缺什么就去看看。 |
| `npc_headman_3` | 村长 | 听说你是用耳朵走路的剑客?保重啊。 |
| `npc_headman_4` | 村长 | 救救那些被掳走的孩子吧。 |
| `npc_hunter_1` | 老猎人 | 站住。……哦,是个用耳朵的。 |
| `npc_hunter_2` | 老猎人 | 寨子里有我旧识。带上这个,别死在路上。 |
| `npc_hunter_3` | 老猎人 | 黑风寨主的双刀很快,听清他出刀前的动静。 |
| `npc_hunter_4` | 老猎人 | 去吧。让我听听,你的传说。 |
| `npc_elite_1` | 寨丁头目 | 哪儿来的瞎子,敢闯黑风寨! |
| `npc_elite_half` | 寨丁头目 | 你……你到底是什么人! |
| `npc_elite_die` | 寨丁头目 | 寨主……会替我报仇…… |
| `npc_boss1_1` | 黑风寨主 | 盲剑客?正好,省得挖你的眼睛。 |
| `npc_boss1_2` | 黑风寨主 | 有两下子。可惜,你听不懂死期的声音。 |
| `npc_boss1_die` | 黑风寨主 | 白无瞳……会找到你…… |
---
**合计:旁白 104 句 × 2 性别 + NPC 16 句 = 224 条音频**(×2 格式 = 448 文件)。对话功能与语气大纲对照见 [05-rpg.md](05-rpg.md) §5.3,场景/战斗触发逻辑见 [05-rpg-chapter1.md](05-rpg-chapter1.md)。
---
## 键盘变体(key,P1 输入平权路线 a,16 句)
「生效输入模式=键盘」(settings.input=key,或 auto 且键盘在跟/纯桌面初始判定,
web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
`web/rpg/audio/voice/<gender>/key/<id>.{ogg,m4a}`,变体缺失回退主资产——触屏措辞零改动。
>
> 措辞规范(02-input-parity.md §4.3 路线 a + P1 裁定):向左滑→按左方向键(四向同理,
> WASD 不进台词);单击/轻触屏幕→按空格;双击→按回车;按住/长按→按住空格;
> 复合短语(左右滑→左右方向键、滑动→方向键)按语义等价展开;只改操作词,其余
> 内容一字不动,不新增「重」类多音字。本表与 `tools/gen_voice_dual.py` 的
> `KEY_LINES` 逐字一致(两表一致铁律:改一处必改另一处)。
> 资产:×2 性别 = 16×2 条、×2 格式 = 16×4 文件;管线 `gen_voice_dual.py --only-variants`
> 生成 → `--convert` 落盘,终检 `tools/check_all_assets.py`(key 两性别一致且 ⊆ 主集)。
| id | 键盘台词全文(触屏原句见本表上方对应 id) |
|---|---|
| `sys_continue_ask` | 检测到你的旅程记录。按空格继续,按右方向键开始新的旅程。 |
| `sys_menu` | 菜单。左右方向键选择,按空格确认。 |
| `help_explore` | 左右方向键切换选项,按空格确认。按回车重新听场景,按上方向键查看状态,按下方向键打开菜单。 |
| `help_battle` | 战斗中,左右方向键选招式,按空格出手。听到敌人的前摇,按回车格挡。 |
| `btl_lose_hint` | 记住,听清前摇,按回车格挡。 |
| `tut_b2` | 就是现在,按回车格挡! |
| `tut_b3` | 挡住了!轮到你了。左右方向键选攻击,按空格出剑。 |
| `shop_open` | 商店。左右方向键看看货,按空格购买。 |
| `skip_hint` | 按空格可跳过旁白。 |
| `tut_battle_2` | 左右方向键切换招式,攻击、破空斩、防御、金疮药。按空格,出手。 |
| `tut_battle_3` | 敌人出手前有一声前摇。听到前摇,马上按回车,就能格挡。 |
| `tut_battle_5` | 记住:听清前摇,按回车格挡。开始吧! |
| `tut_b0` | 战斗里,左右方向键选招式,按空格出手。听到这个声音,就是你的回合。先按一按方向键,试试。 |
| `tut_b6` | 来不及格挡,就选防御。左右方向键,选防御,按空格。 |
| `gd_parry_miss` | 前摇声起的时候按回车,才能格挡。 |
| `gd_stall` | 想好了吗?左右方向键选择,按空格出手。 |