- 程序章程 research/new8/00-program.md(8款概念/回合协议/验收门/进度账) - 设计:docs/design/15-radio.md+voice-ids(132句,6状态9抉择4结局,电话滤波资产侧带通)/16-dungeon.md+voice-ids(125句,脉冲回声/7层seed生成/三档战斗/元进度遗产) - 资产:TTS 970文件(GPU flock串行)+ Mureka BGM 8首 $0.24(台账 mureka_log.md)+ 程序合成 sfx(含预pan侧墙/开口、phone_ring铃声、amb_cave呼吸层、turn_tick)+ 终检 check_all_assets 8游戏全绿 - radio:game.js+playtest 221断言(4结局矩阵/pendingChoice盲玩公平/RING两级看门狗/菜单循环/存档schema) - dungeon:game.js+playtest 1610断言(seed全网格回声一致性/学期零死/格挡80%/死亡归因真话/元进度/菜单冻结/上滑5段状态链) - 引擎修复:audio.js _playVoice 加载竞态补杀 token(R1真机71分钟语音风暴根因)+ 同id 3s窗口≥5次熔断保险丝 + gesture.js 长按boost事件门(+66行,9套件回归全绿) - 大厅:新增 radio/dungeon 卡片 + GAMES 数组 - harness:sessions/radio.mjs+dungeon.mjs(主线+压力双剧本)+ transcribe 注册 + voice_text.json 刷新(8游戏704句)+ 13号文档 §20 登记 - R1 存档:4人设评审×2游戏 + 真机试玩报告×2(radio 5/5愿意玩;dungeon 0/4→确诊风暴)+ synthesis×2 + 转写8份 - R2 修复:radio F1-F5(看门狗补挂/rep_low改词重录/真铃声/ASK续玩语义/链末跳过保护)+ dungeon D0-1..D1-6(风暴根治/回声真实性/密度下限+呼吸层/导航最短路/菜单关闭反馈/金币档同账本)+ 实现核对登记
18 KiB
音频资产清单(R1,2026-08-29)
本文档是 5 个 web 游戏的 voice / sfx / bgm 资产总账,以及双性别语音的音色分配。
目录约定(R1 新增)
- 双性别旁白:
web/<game>/audio/voice/male/<id>.{ogg,m4a}和web/<game>/audio/voice/female/<id>.{ogg,m4a},两个目录内 id 集合完全一致。 - 原有平铺文件
web/<game>/audio/voice/<id>.{ogg,m4a}暂时保留,等引擎切换读取 male/female 子目录后由后续轮次清理。 - 所有 web 音频均为双格式:
.ogg(libvorbis q3,44.1kHz)+.m4a(aac 128k,44.1kHz,iOS 用)。 - 生成管线:
tools/gen_voice_dual.py(台词表内嵌,从各游戏原 gen 脚本只读提取),staging wav 在tools/gen_voice_dual_wav/<game>/<gender>/。
音色分配表(游戏 × 性别 → speaker)
| 游戏 | male | female | 备注 |
|---|---|---|---|
| storyline | Uncle_Fu | Vivian | 仅旁白+系统音双性别;角色音色不动(见下) |
| escape | Uncle_Fu | Serena | male 沿用原旁白音色 |
| simon | Uncle_Fu | Serena | female 沿用原主持人音色 |
| rhythm | Uncle_Fu | Vivian | female 沿用原解说音色 |
| space | Uncle_Fu | Serena | female 沿用原导航音色 |
| rpg | Uncle_Fu | Serena | 旁白;NPC 单音色平铺(见 rpg 章节) |
| radio | Uncle_Fu(HOST)/Dylan(PROD) | Serena(HOST)/Vivian(PROD) | 双性别行同性别双 speaker(VOICE_SPK 逐句覆盖);NPC 单音色平铺 5 音色+逐人带通(见 radio 章节) |
| dungeon | Uncle_Fu | Serena | 旁白全表统一 instruct,无 NPC |
关于 Ryan:冒烟测试样本在 tools/samples/ryan_zh_*.wav(3 条中文句)。Ryan 是英语母语音色(见 env.d/tts.md),项目已有中文发音投诉(反馈⑥),男声统一采用中文母语的 Uncle_Fu;如需换成 Ryan,改 tools/gen_voice_dual.py 的 SPEAKERS 表重跑即可。
instruct 模板(每性别全游戏内一致)
同一游戏的同一类台词,male/female 使用同一 instruct 模板(仅性别描述词不同),数字/短句(≤2 字)一整批同 instruct 连续生成:
- storyline 旁白:male「低沉醇厚的中年男声旁白,冷静、缓慢,带着末世废墟的苍凉感」/ female「冷静低沉的女声旁白,语速缓慢,带着末世废墟的苍凉感」(另有 WARM/COLD/EPIC 三个结局变体,见脚本)
- escape(R2 起,全游戏同一常量):male「低沉平稳的男声,冷静、克制,带一点神秘感」/ female「沉稳平静的女声,冷静、克制,带一点神秘感」
- simon(R2 起,全游戏同一常量,两性别同文):「平静、清晰,像一个耐心的游戏主持人」
- rhythm(R3 起,全表统一):female(Vivian)「活力清晰的年轻女声,像节奏游戏主持人,情绪饱满但不夸张」/ male(Uncle_Fu)「低沉醇厚的男声,像节奏游戏主持人,平稳有力」
- space(R3 起,全表统一):female(Serena)「平静清晰的女声,像飞船领航员,沉稳可信」/ male(Uncle_Fu)「低沉醇厚的男声,像飞船领航员,沉稳有力」
- rpg(R4 起,旁白全表统一):female(Serena)「平静清晰的年轻女声,像在讲武侠故事」/ male(Uncle_Fu)「低沉醇厚的男声,像说书人,平静有韵味」;NPC 各角色 speaker+instruct 恒定(村长 Uncle_Fu·慈祥和缓的老者/老猎人 Eric·沙哑粗犷豪爽中带着暖意/头目 Dylan·凶狠粗鲁大声喝骂/寨主 Uncle_Fu·低沉阴狠慢条斯理)
各游戏资产清单
storyline《声命线》
-
voice 双性别版(male/ 与 female/ 各 37 条(R6 +
skip_hint):旁白 + 系统音 =help menu status1 status2 status3 p1–p8 n00_intro n01_wake n04_exit n05_signal n06_whistle n08_vent n09_dead n10_rain n11_child n13_leave n14_ignore n15_bridge n16_culvert n16b_culvert_c n17_cable n17b_cable_c n20_convoy n22_fight n23_tower e1_dawn e2_price e3_alone e4_static -
voice 角色台词(不做双性别,沿用平铺原文件):
角色 speaker 文件 id 林晚(主角) Serena n02_linwan n03_radio n12_take n19_betray n21_redeem n24_open n25_secure 猎狗(反派) Dylan n07_dog n18_dog 小满(小男孩) Vivian(稚嫩童声 instruct) e1_child 林晨(妹妹,收音机录音) Vivian(收音机 instruct) n03_msg 广播女声 Vivian(机械广播 instruct) n05_bcast 约定:角色台词在两个性别目录下使用同一份文件(由开发复制/链接或引擎回退到平铺目录,见 round1-report)。
-
sfx(12):
footsteps gunshot heartbeat radio_static rubble signal_beep struggle ui_confirm ui_menu water whistle wind -
bgm(2):
dark_drone(剧情)+ R6 新增menu(菜单 pad,-24 LUFS 档)
escape《暗室》(R2 重设计版,最终清单见 round2-voice-ids.md)
- voice 双性别版(male/ 与 female/ 各 75 条(R6 +
skip_hint):引导g0_intro g1_move g1_done g2_wall g3_left g4_down g5_inspect g5_key g6_doubletap g6_done g7_goal、引导纠错guide_wrong_* guide_blunt_* guide_offpath guide_skip reopen_prompt、三级提示stuck_ask stuck_{key,cabinet,box,gate}_{1,2,3}、导航nav_{up,down,left,right}、房间room_{storage,cabinet,power,gate}、用时time_band1–4、保留句wall start_room found_key inspect_* unlock_cabinet box_fixed fix_box escape use_fail inv_* replay again empty_1–3、菜单help_ops menu_* - voice 已删除(R2):
n0–n9 nshi unit_min unit_sec time_prefix intro tutorial hint_key hint_cabinet hint_box hint_gate(整句化替代);平铺voice/旧文件全部移除 - sfx(16):
amb_drip amb_hum amb_wind(保留)+ R2 新增amb_storage amb_cabinet amb_power amb_gate amb_gate_live(Stable Audio 3,6s,统一 -25dB 均值,storage/power 偏左、cabinet 偏右 pan)+door_creak gate_open pickup power_on spark step unlock wall win_chime;已删除ui_deny(反馈改震动) - bgm(2):
drone(探索)+ R6 新增menu(菜单/结算 pad)
simon《音序回响》(R2 重设计版,最终清单见 round2-voice-ids.md)
- voice 双性别版(male/ 与 female/ 各 69 条(R6 +
skip_hint):交互教学t0_welcome t0_goal t1_up–t6_double t_try t_ok t_wrong_* t_blunt_* t7_ready t7_retry t_skip、轮次round_01–round_20 round_more(整句)、成绩score_band1–6(整句)、流程your_turn chances_out retry_use relisten replay rules_prompt rules gameover、反馈correct wrong chance_plus new_record、菜单menu_* - voice 已删除(R2):
di lun num_shi num_0–num_9 score_pre best_pre(拼接件)+intro teach_* listen(旧连播教学);平铺voice/旧文件全部移除 - sfx(7):
gameover tone_doubletap tone_down tone_left tone_right tone_tap tone_up;已删除correct wrong newrecord(反馈改震动) - bgm:游玩无 BGM(用户要求);R6 新增
menu(菜单/结算极轻 pad,volume 0.3,10 文档 §4)
rhythm《节拍行者》(R3 重构版,台词依据 docs/design/03-rhythm-voice-ids.md)
- voice 双性别版(male/ 与 female/ 各 32 条(R6 +
skip_hint):开场流程welcome welcome_back tut_1 tut_2 tut_3 tut_done tut_skip mid_song、教学纠正retry_early retry_late retry_gesture retry_listen retry_skip、选曲解锁select_hint song1_name song2_name song3_name song_locked unlock_song2 unlock_song3、结算grade_s grade_a grade_b grade_c new_best_combo restart、菜单规则rules settings_hint menu_main menu_resume menu_lobby - voice 已删除(R3):
tut_start(平铺旧 id 全部移除,其余旧 id 均在 R2 已替换) - voice 修订(R5):
menu_main改词重录为「菜单。单击切换选项,双击确认。」(对齐 round2-review 裁决②全球菜单约定;选曲界面非模态菜单不受影响) - sfx(7,R3 补齐):
inst_kick inst_snare inst_hat_l inst_hat_r inst_tom_hi inst_tom_lo inst_accent(演奏乐器音,详见 round3-report §7;hat_l 闭合镲极左 / hat_r 开放镲极右,accent 为 A minor 合成亮音);已删除judge_* tick tick_accent(R3)与cue_*(R3 收尾,重构不再使用指令音) - bgm(3,R3 重制):
track90(90.01 BPM,85.33s)track105(104.99 BPM,73.14s)track120(120.00 BPM,72.00s),A minor 电子乐,整数小节无缝循环,loudnorm -20 LUFS;旧groove已删除;R6 新增menu(选曲/结算 pad)
space《盲航》(R3 备产,台词依据 docs/design/04-space-voice-ids.md)
- voice 双性别版(male/ 与 female/ 各 53 条(R6 +
skip_hint):演练drill_*(14)、保护期protect_*(5)、功能引入feat_* shield_ready shield_block(6)、被撞归因hit_*(5)、里程碑ms_10 ms_25 ms_50 ms_100、结算time_1–4 dodge_1–4 new_record restart_hint、菜单系统second_run_ask menu_* help_recap settings_hint paused - voice 修订(R4):
menu_main改词重录为「菜单。单击切换选项,双击确认。」(对齐 round2-review 裁决②全球菜单约定) - voice 已删除(R3):
num0–9 num_shi num_bai n_time n_sec n_dodge n_ge n_milestone intro1–4 hit1 hit2 gameover restart(数字拼接与旧教学弃用);平铺旧文件全部移除 - sfx(12):
alarm boost crash dodge hit shield shield_block whoosh_down whoosh_left whoosh_right whoosh_up - bgm(2):
engine(对局)+ R6 新增menu(菜单/结算 pad)
rpg《剑与声》(R4 新游戏第一章,台词依据 docs/design/05-rpg-ch1-voice-ids.md + 05-rpg-addendum.md)
- voice 旁白双性别版(male/ 与 female/ 各 113 条,male=Uncle_Fu 说书人 / female=Serena 武侠故事):序章
intro_1–3、R6 新增首次战斗教学tut_battle_1–5、系统状态sys_* help_* settings_hint st_*、场景desc_*(16)、选项opt_*(18)、事件evt_*(6)、战斗btl_* cmd_* tut_*(27,含 R5 补录btl_half_bandit)、商店shop_*(7)、敌方档位foe_hp_high/mid/low(addendum §6.2 补录) - voice NPC 单音色平铺(14 条,落
voice/根,引擎平铺回退):村长npc_headman_1–4(Uncle_Fu·慈祥和缓)、老猎人npc_hunter_1–4(Eric·沙哑豪爽)、寨丁头目npc_elite_1/half/die(Dylan·凶狠)、黑风寨主npc_boss1_1/2/die(Uncle_Fu·低沉阴狠,与村长同 speaker 不同 instruct) - sfx(35):前摇
tel_wolf tel_bandit tel_spider tel_elite tel_boss1 tel_croc tel_shaman tel_puppet tel_boss2(1.0s 格挡窗口);战斗atk_swing atk_hit parry skill_slash enemy_die potion+ SYNhurt flee;探索chest drink_water rest door_heavy+ SYNstep coin levelup;环境amb_village amb_path amb_fork amb_chest amb_stream amb_hunter amb_deepwood amb_gate amb_hall amb_swamp amb_peak(5s 无缝循环,均值 -25dB);ui_deny按设计不做 - bgm(6,Mureka):
village battle boss ending(R4)+ R6 新增menu(菜单 pad)与explore(探索轻垫乐,10 文档 §7 恢复,volume 0.35);90s 无缝循环;amb_*由游戏层手动 loop 接 sfx 总线 - 再生成方法见
web/rpg/gen/README.md
radio《不眠频率》(批次 1 新游戏,叙事模式,台词依据 docs/design/15-radio-voice-ids.md)
- voice 双性别版(male/ 与 female/ 各 103 条):HOST 主播 29 条(male=Uncle_Fu「低沉温和的中年男声,深夜电台主播,沉稳亲切,有磁性」/ female=Serena「温暖清晰的年轻女声,深夜电台主播,沉稳亲切,不甜腻」:开场
b_open b_rain、主播句z1_* l1_* k1_* w1_* h1_*主播行、心结d9_face d9_avoid、结局e1–e4_a/b)+ PROD 导播/系统/向导 74 条(male=Dylan / female=Vivian,instruct「贴近耳机的低语男/女声,年轻电台导播,冷静克制」:gd_* sys_* prog_c1–5 rep_*、导播行、抉择提示p1–p9、尾声ep_*)。同性别双 speaker 逐句覆盖见tools/gen_voice_dual.py的VOICE_SPK["radio"](同场景高频对话的两者永不同 speaker)。 - voice NPC 平铺(29 条,落
voice/根,引擎平铺回退;转码带通见下):老周 7 条(z1_,Uncle_Fu·苍老沙哑)、小鹿 4 条(l1_,Serena·哭腔倔强)、糖糖 6 条(k1_,Vivian·稚嫩童声)、陈姐 7 条(w1_,Vivian·疲惫沙哑中年)、老韩 5 条(h1_*,Eric·沙哑粗犷司机)。 - 通话滤波(资产侧,15-radio.md §6.2):convert 转码时按来电者逐档 ffmpeg 带通+轻压缩(老周 500-2800 / 小鹿 400-3400 / 糖糖 450-3000 / 陈姐 420-3100 / 老韩 300-3400 Hz,均
acompressor threshold=-20dB ratio=3);参数在tools/gen_voice_dual.py的NPC_BANDPASS,未滤波原声保留在 stagingtools/gen_voice_dual_wav/radio/npc/可重滤/回退。HOST/PROD 不滤波。待人工试听:滤波句可读性抽检,不可读句按「宁窄勿脏」回退未滤波原声(staging 重转即可)。 - sfx(2,SYN 程序合成):
ui_confirm ui_menu(web/radio/gen/gen_sfx.py,全局 storyline 先例同款双音/软音)。缺失 13 件 SA3(HF token 未配置,本轮跳过):onair_sting phone_ring line_connect line_drop amb_studio amb_rain_city amb_station amb_kid_room arg_muffled amb_street_rain amb_cab brake_screech tape_static。 - bgm(4,Mureka $0.12):
onair bridge ending(-20 LUFS)+menu(menu pad,-24 LUFS,10 文档 §1.2);90.00s 无缝循环;后处理脚本web/radio/gen/gen_bgm.sh。 - 合计 241 ogg + 241 m4a(每游戏音频 = 235 voice + 2 sfx + 4 bgm);台词/生成/终检走
tools/gen_voice_dual.py --game radio与tools/check_all_assets.py。
dungeon《回声地窟》(批次 1 新游戏,Roguelike 模式,台词依据 docs/design/16-dungeon-voice-ids.md)
- voice 双性别版(male/ 与 female/ 各 125 条,无 NPC——怪物不说话):male=Uncle_Fu「低沉醇厚的男声,像探窟向导,沉稳有力」/ female=Serena「平静清晰的女声,像探窟向导,沉稳可信」,两常量全表统一。分组:序章/标题 4、教学 DRILL 19、系统/菜单/状态 35、探索事件 9、战斗 30、卡关/看门狗/纠错 14、结算/元进度 14。
- sfx(19 文件,全 SYN 程序合成,
web/dungeon/gen/gen_sfx.py):pulse(声波脉冲)、材质尾音mat_stone/door/stair/water、预 pan 立体声side_wall_l/r side_open_l/r(mono 源 + ffmpeg pan 派生,能量只在单声道,极性脚本断言)、移动step_own step_turn bump、拾取coin potion gear、战斗atk_swing parry hurt、levelup(D 小调五声上行钟声琶音)。缺失 24 文件 SA3(HF token 未配置,本轮跳过):echo_1–4 stairs_down mob_step_{small,bug,heavy}_l/c/r tel_{small,bug,heavy}(_l/r 派生) atk_hit enemy_die(SA3 单声道源 + pan 派生工艺见 16-dungeon.md §9.2)。 - bgm(4,Mureka $0.12):
menu explore battle boss(全部 -20 LUFS,16-dungeon.md §9.1);90.00s 无缝循环;battle/boss 的 bpm 仅为 prompt 特征词、无节拍网格玩法,未跑 bpm_precise;后处理脚本web/dungeon/gen/gen_bgm.sh。 - 合计 273 ogg + 273 m4a(250 voice + 19 sfx + 4 bgm);台词/生成/终检走
tools/gen_voice_dual.py --game dungeon与tools/check_all_assets.py。
批次 1 资产账(2026-09-01)
- radio 132 句(双性别 103 ×2 + NPC 平铺 29)= 235 voice 资产;dungeon 125 句 ×2 = 250。两游戏合计 970 文件(ogg+m4a)。
- GPU 串行(flock):radio male/female/npc 与 dungeon male/female 共 5 轮,
--check全绿(无时长离群/短句)。 - Mureka 8 任务 $0.24(台账见
tools/mureka_log.md2026-09-01 节),全部一次成功。 - 音色分配表新增:radio(双性别 HOST=Uncle_Fu/Serena + PROD=Dylan/Vivian 双配对 + NPC 平铺 5 音色)、dungeon(Uncle_Fu/Serena)。
- sfx 真峰值(逐声道解码回读)全部 ≤ -3dBFS、|直流| ≤ 0.001、无边界爆豆(源 8ms cos² 淡入淡出 + 垫音 + hp30 工艺,
web/<game>/gen/gen_sfx.py内建 QC)。
响度与爆音标准(R6 起)
- sfx one-shot:峰值归一 -3dBFS(真峰值经 ogg 解码回读校验,见 round6-report §1);首尾 8ms cos² 淡入淡出;去直流。
- loop(amb_*/bgm):首尾交叉淡化保证循环连续,不加淡入淡出;仅做直流/峰值检查。
- voice:沿用 R1 峰值 0.89 归一策略,不动。
- bgm:loudnorm -20 LUFS(主题曲)/ -24 LUFS(menu pad)。
发音质量
本轮已采取的规避措施
- 数字类语音(num_0~9、shi、bai、第、轮、分、秒、颗等)一整批同 instruct 连续生成,减少拼接 prosody 漂移(反馈⑥根因之一)。
- 台词 >40 字按句拆分生成再拼接(句间 0.12s 静音),避免长句吞字。
- 每条 assert 时长 >0.3s、峰值 >0.05,统一峰值归一 0.89;同句两性时长比 >3 判离群并重生成。
多音字/发音风险清单(待人工试听确认)
以下条目为文本层面的已知风险点,本轮生成保留原文;如试听发现误读,建议按右栏换写法重生成(改 tools/gen_voice_dual.py 台词表):
| 位置 | 原文 | 风险 | 建议换写法 |
|---|---|---|---|
| storyline help | 双击:重听刚才的台词 | 「重」可能读 zhòng | 「双击:重新听刚才的台词」 |
| storyline n11_child / n13_leave / n16b | 数到一千、数数 | 「数」shǔ/shù | 误读时写「数一数,数到一千」 |
| storyline n05_bcast / n19_betray | 三、七点、五 | 坐标需逐字读 | 误读时写「三,七,点,五」 |
| storyline n16b | 数到一百七 | 可能读成「一百七十个」 | 写「数到一百七十」 |
| 多处(escape/simon/space/storyline) | 还(hái)在/还有/还能 | 「还」hái/huán | 误读时改写句子避开 |
| rhythm welcome | S / A / B / C 评级 | 字母发音 | 现行文本为「评级,S!」,试听确认字母读音 |
(本表为文本审查结果;时长离群自动检查已通过的部分见 round1-report,最终发音准确性需人工试听把关。)