Files
SoundGame/research/new8/radio/round2/live-player.md
T
xsl 24c526af68 feat(assets): SA3 音效补齐 radio 11+1 与 dungeon 13源+15pan(token 走 hf-mirror 实测可用)
- 模型 17/17 文件经镜像全量缓存(gated+token,直连本机不通;sfx.md/setup.md/asset-pipeline.md 镜像结论同步更新)
- 修复迁移遗留:stable_audio_3/models/ 源码子包被 .gitignore models/ 规则误伤丢失,从上游恢复并加白名单
- radio:arg_muffled/brake_screech 等叙事件落地(接线原有 L111/L154 零改动)+ phone_ring SYN→SA3 升级;dungeon 13 源 A/B 对齐(RMS 偏差 ≤0.3dB)全量同名替换,SYN 原版备份 tools/asset_fix_backup/sa3_ab_20260902/
- 关键玩法语义达标:echo 距离档 0.83<1.43<2.18<2.98s 严格递增;one-shot 真峰值全 ≤-3dBFS(解码回读法)
- check_all_assets 8 游戏全绿(radio 254/254、dungeon 303/303);playtest radio 221/dungeon 1610 全绿
2026-09-02 19:35:38 +08:00

139 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.
# 《不眠频率》R2 修复验证轮 · 全拟真试玩报告 — 老墨与他闺女墨墨
## 基本信息
同一台"手机"两个用户(live harness:真 chromium + SenseVoice ASR 听游戏实况,非 mock)。本轮为 **R1 五项修复(F1-F5)的现场验证轮**:R1 修了没有、有没有修出新问题。
**局 A(老墨·新手主线,走心局)**
- 身份:45 岁电台制作人,认真听完关键句再动手,全程左滑走心,故意在链末等待态做无效手势复现 R1 头号坑。
- 设置:`voice=male, speed=1.0, bgm=1.0, guide=full`
- 手势:65 个(tap 53 / 左滑 9 / 上滑 2 / 右滑 1),语音 106 段
- 结局:**e1「天亮之前」**(rep=12 与设计表分毫不差),尾声五人全救版 ep_*_ok 逐条点名
- 报错:非资产类 console.error = 0;**零叠音、零死锁、零游戏自残截断**
**局 B(墨墨·急性子压力,负线)**
- 身份:19 岁女儿,1.7 倍速女声,抢答乱戳,走克制/回避路线,专测断点续玩与 1.7x 韧性。
- 设置:`voice=female, speed=1.7(数值), bgm=1.0, guide=standard`
- 手势:57 个(tap 42 / 右滑 6 / 左滑 4 / 上滑 1 / 下滑 2 / 长按 1 / 双击 1),语音 102 段
- 结局:**e3「一个人的频道」**(rep=0 + p9 左滑直面;R1 现场没打出的第三个结局),尾声五人全错过版 ep_*_no
- 报错:非资产类 console.error = 0;3 处提前截断**全部可归因到玩家自己的 tap**(两处引导句、一处 INTRO 链中段句,均属可跳范围)
**加测(会话 C,只为一件事)**:利用局 B 存档再续玩一次,验证 F4 的"跳句锁在首句播完后释放"。
---
## R1→R2 五项修复 · 逐条现场验证结论
> t= 均为该局"解锁后秒数"(events 时基 ta)。判"修好"标准:R1 的复现步骤做出同样操作,坏结果不再出现,且修复后的新行为被事件/音频双重证据锁定。
### F1 链末等待态无效手势吞看门狗 → **修好**(证据最硬的一项)
- R1 复现步骤:一句话播完进链末等待 → 做一个无效手势 → 此后"还在吗"永不来(34.2s 死寂)。
- 局 A t=354.7 我在 z1_ring_in 播完后的链末等待里**故意左滑**:[10]+[60,40,60] error 震 + gd_invalid(full 档同局一次),**撒手后 t=380.2 gd_continue 准点回来(=手势后 25.5s),t=405.2 gd_again 再+25.0s**——两级全来了,R1 的死寂没有复现。
- 局 B 同款压到 standard 档:t=397.3 我在 k1_b **播放中**左滑(无效)→ error 震 → gd_continue t=410.8(=+13.0s)、gd_again t=427.8(=+30.0s),**重挂基准就是手势那一刻,分秒不差**。
- 佐证:局 A 我中途挂机 2.5 分钟,t=198.2/223.2 两级也准点(等待态基线本身没坏);RING 态无效分支、ASK 态无效分支、长按分支的重挂在代码里各有落点(game.js L383/L411/L458/L581,只读参考未改动)。
- **结论:修好。无效手势"零静默"承诺重新闭环。**
### F2 rep=0 档播「有点砸了」账目不符 → **修好**
- 局 A t=102.0 第一通铃前上滑听状态,实测 rep_low:heard「今晚的口碑还没力气」,sim **0.7368 OK**——harness 登记的 expected 已是**「今晚的口碑,还没立起来。」**,若游戏仍在播旧词「有点砸了」,相似度不可能到 0.74。"还没力气"是 ASR 对"还没立起来"的同音幻听(≤6 字短句重灾区口径,见下)。
- 旁证:R2 离线压力转写里 rep_low 全部为「还没立起来」(transcript-stress.md 9 处)。
- **结论:修好。0 档账目与文案对齐。**
### F3 RING 态铃声静默 → **修好**(接听即停也验了)
- 资产层:`audio/sfx/phone_ring.ogg` 预载 **fetch 200**(R1 是 404,缺 12 件 SFX 之首)。
- 行为层:局 A RING 入口 t=29.65 事件 `start sid=2 layer=sfx dur=5.2 loop=true`——程序合成铃声循环垫起播。
- 可闻层:ASR 听窗 t=29.6-39.7 与 42.4-54.7 两段判 SFX_BGM_ONLY(非语音声持续存在);对 mix.webm 的 30-39s 窗做 ffmpeg astats:**Peak -1.5 dB / RMS -15.4 dB**(R1 同窗口是数字静默)——铃声是真的听得到了。
- 接听即停:我 t=169.0 单击接听 → `stop sid=2` t=169.4 → 通话首句 z1_ring_in t=169.5 起播——**铃声停得比人声早,零叠音**。
- **结论:修好。「只响一下短震然后静默 10 秒」的 R1 体验不复存在。**
### F4 断点续玩恢复链首句可被单击跳掉 → **修好**(连"锁的释放"也验了)
- 局 B 重进命中存档询问(sys_continue_ask t=0.1,局 A 的存档从 localStorage 活了过来)。t=19.5 单击"继续上次"→ 恢复链首句 e1_a t=20.0 起播;**我在 1.5s 处(t=21.5)单击 → 只有 [20] 确认震,首句足时播完**(3.0s = 声明 5.04/1.7 倍速),R1"一戳就把恢复链戳乱"没有复现。
- 加测(会话 C):再续玩一次,首句 e3_a 播放中 tap 被吞;**同一节拍的 tap 紧接着把第二句 e3_b 在 0.2s 处跳掉**(事件 t=6.6→6.8 kill)——跳句锁只护恢复链第一句,播完即释放,不会变成"永远不可跳"。
- **结论:修好,且释放行为正确。**
### F5 链末句无跳过保护 → **修好**(保护范围比 R1 建议更彻底)
- R1 的痛:k1_trutho 尾巴「会一起给我切蛋糕吗?」等点题句被抢跑吃掉。
- 现场:局 A k1_trutho(11s 长句)完整播出;d9_facee「但空着的那一秒,你说满了」**两局两次都完整落地**(局 A 5.28s 足时;局 B 3.69s = 6.24/1.7 足时)。句中/句尾单击一律只给 [20]:z1_sdone t=597.8(句尾前 0.5s)、k1_ask t=1320.7、k1_truth t=1398.0、h1_talke t=1794.8、局 B g9_in t=713.6(auto 链直入抉择的尾句)——**全部无效化,无一例外**。
- 没有矫枉过正:链中段句子照常可跳(w1_say t=1559.8、h1_danger t=1784.3、e1_a t=1862.8 三处被我跳掉,均按设计生效)。
- **结论:修好。尾句保护 + 中段跳句自由两头都在。**
### 整体回归
- 两局完整打到结局:**e1(rep=12)与 e3(rep=0,新结局)**。账目逐点核对:局 A p1L+1/p2L+2/p3L+2/p4R+1/p5L+1/p6L+2/p7L+2/p8L+1=12;局 B 负线 -1→0,跨档播报只在 3→5 时出现一次(rep_high t=1179.6),低→低不播——**账没多也没少**。
- 条件差分照常:局 A heardArgument 命中(w1_say 组 t=1556.7)、bond_zhou=1 时 h1_echo t=1797.5 在 h1_talke 后 0.1s 接入;局 B bond_zhou=0 时 h1_echo **确实缺席**(h1_stope t=708.8 → 直接幕间)——回响不撒谎,两个方向都验了。
- 危机拍自动流:danger 长震 [25,40,25,40,25] t=1780.9 → 2.1s 前置 → h1_danger → 自动接 dango/talke,不等单击(我跳了 danger 中段,链条照走完)。
- 1.7x 压力下菜单开合(结算态 swipedown 打断结局复播 → 再 swipedown 无缝从头复播)、双击重听、长按 boost、无效手势零静默,全部状态正确。
- **零叠音(A 106 段 / B 102 段,vstart 全部晚于上一 vend)、零死锁、非资产 console.error=0。**
---
## 局 A 体验叙述(老墨,第一人称)
解锁那一指下去,先听见「新的夜晚,开始了」和 full 档专属的操作口令,然后台标口播——**开局 t=0.011s 预载清单里 phone_ring 直接 200**,我特地在第一通铃前竖起耳朵:t=29.7 起,"铃——铃——"的双音循环垫真的在响,中间还留着电话铃该有的那口气口。10 秒和 25 秒的两句导播提醒照旧准点,但这次它们是叠在铃声上的提醒,不是替铃声还债。上滑听状态,导播说「今晚的口碑,还没立起来」——新词,账对(零起步就该这么说,R1 那句"有点砸了"冤枉人)。
第一通老周,我按老墨的慢性子听完就点。播完 z1_ring_in 我故意使坏:链末等待里来了个左滑——error 震,导播说了句「这个手势,直播间里用不上」,然后我把手拿开掐表:25.5 秒,"单击屏幕,继续"来了;再 25 秒,"还在吗"也来了。R1 我闺女踩的那个 34 秒深坑,填平了。
后面一路走心:老歌、原地陪等、小鹿上车、糖糖我问了她(mid-prompt 右滑照旧缓存生效)、真话、带话、陪聊。老韩的危机拍这回带着 danger 长震和 2 秒前置来的,dango 一气呵成;挂电话前 t=1797.5 老韩那句「头通电话那位大爷……这城市的夜,是接着的」又是 0.1s 不差地接进来。签收 p9 左滑,「师父,三年了」足时播完,点题句「但空着的那一秒,你说满了」这回一个字没少——R1 我三次吃掉别人尾巴,这次轮到我护着它了。e1 收播,导播账本五个人全救,rep=12,分毫不差。结尾我又手贱跳了 e1_a 一半——那是我自己的手,重听双击就还回来了。
## 局 B 体验叙述(墨墨,第一人称)
我抢过手机就看见「检测到你的夜班记录」——哥的存档。这次我学乖了听完规则:单击继续。结果它把我扔回哥的 e1 结局链,我不服,首句播到 1.5 秒就戳——**戳不动**。行,是护着哥的句子。播完第二句我就跳了(锁只锁一句,讲武德)。我不想了,狂戳穿越结局链,结算画面点一下,新的夜晚 1.7 倍速开跑。
这把我全走渣男路线:老周问路牌、转接派出所——「说不清,我真是说不清了」和导播那句指名道姓的「这通砸了」一样不少;小鹿还她自由;糖糖我直接哄睡(结算句照样点我「你没听见她在怕什么」);陈姐劝回家;老韩进服务区「单子黄了」。没有陪过任何人的夜,老韩没替老周谢我——**回响这东西不播就是不播,账清楚**。p9 我倒是大着胆子左滑了一次:e3「一个人的频道也是频道」——这是 R1 我没见过的结局,憋得跟 e4 不一样,是一种"没救成但说出口了"的体面。尾声五个人全是错过版。
1.7 倍速里我照旧乱来:k1_b 播放中左滑(error 震,13 秒后"还在吗"准点来)、空点乱戳(只有震)、开菜单又关(结局链从头无缝复播)、双击重听、长按 boost。唯一让我嘀咕的是糖糖开口的前两句(「喂?有人吗?」)声音跟同通话后头的不像一个源——后来查了是那两句没有男声部资产、回退到了中性版,能听,但同一通电话里换了个人捏嗓子。
---
## 测量局限与证据口径(先说清楚)
- 1.7x 女声的 ASR 是重灾区:局 B 145 行听写里 MISMATCH 率明显偏高(最低把 b_rule 残句听成 0.08)。**凡 events 层足时播放、仅转写不像的,一律不算游戏问题**;局 B 的"提前截断"已按 dur/1.7 重审,真实截断仅 3 处且全为玩家 tap。
- 局 A 与加测会话按 1.0 速审计:4 处提前截断(p6 复播句/w1_say/h1_danger/e1_a)全部为我的 mid-prompt 缓存滑或链中段跳句,**0 处游戏自残**。
- 采信引擎级证据的两类口径同 R1:vend 提前于 dur/speed(TRUNCATED)、应答窗口零事件(SILENCE)。
- t= 均为解锁后秒数(events ta),与 ASR 转写时间轴有约 5 秒固定偏移,引用转写只取文本与 similarity。
- 仪器侧一次怪癖:局 A t=650-698 有两个 harness 发出的 tap 未抵达页面(curl 响应被脚本丢弃无法溯源),游戏无责(页面零事件零震动,符合"没收到就是没收到");此后所有手势均校验响应。
## 问题清单
### P0(卡死/死锁/状态混乱/游戏自残截断)
无。两局加测共 210+ 段语音零叠音、零死锁;TRUNCATED 全清单 7 处(A4/B3)逐条归因为玩家 tap。
### P1(体验断裂)
无。R1 唯一的 P1(F1)已修复并双档位复验。
### P2(不适/设计意图缺席)
无新增。R1 的 P2-1(铃声)/P2-3(续玩单击陷阱)/P2-4(尾句)已由 F3/F4/F5 修复;R1 P2-2(arg_muffled/brake_screech 及环境音)仍为 SA3 资产缺口(V3,等 HF token),本轮维持已知遗留,不重复计数。
### P3(建议,6 条)
1. **rep_low 的 warning 震仍未出现**(R1 P3-3 遗留):局 A t=99.6-102.0 RING 上滑听 rep_low,只有上滑自身的 [10],无附加警示震。代码注释称 rep_low 附 warning 震——要么补齐,要么删注释。
2. **k1_a/k1_b 缺 male 声部资产,静默回退中性路径**(新发现):局 A/局 B 糖糖通前两句 fetch `audio/voice/male/k1_a.*` 全 404 → 回退 `audio/voice/k1_a.ogg` 200 播出。功能无损(回退链路工作正常),但同一通电话内可能存在声线跳变,建议补齐渲染或确认音色衔接。
3. **一次性的提示句复播晚点**:局 A p2 首次复播 t=740.1 比基准晚 ~7.6s(其后所有复播/看门狗首拍均精确到 ±0.2s:1281.1/1383.0/1550.4 等)。仅一次观测,建议加断言盯一下。
4. **ASK 空点单击的确认震手感**(R1 P3-1 遗留):p9 后空点两连戳各给一记 [20],像"点上了"实则什么都没发生。
5. **harness:POST /gesture 响应未校验时会静默丢手势**(仪器侧):建议脚本侧始终检查 `{"ok":true}`;长按固定 600ms 仍只能体验 ~0.1s boost(遗留工具局限)。
6. **mid-prompt 滑动生效会掐掉选项句尾巴**(设计备注,对应 R1 V1 观察):局 A p6 复播 6.23/8.64 处被缓存滑终止立即生效——"零插播"契约的一部分,玩家侧无感知损失,但与"选项句听全文"的期望有张力,人设复审时可议。
## 亮点(让我愿意玩下去的东西)
- **五项修复全是真修**:F1 的看门狗重挂以手势时刻为基准、两种 guide 档位四组实测分秒不差;F3 连"接听即停早于人声"都做对了;F4 连锁的释放都验得出;F5 护尾不废跳。修得干净,没有修出新坑。
- **账目依旧真实得可怕**:rep 12/0 两条线与设计表吻合;跨档播报只在真跨档时出现;h1_echo 有 bond 则来、无 bond 则绝不剧透;尾声全 ok/全 no 两版都亲耳听过。
- **e3 是个新收获**:「一个人的频道也是频道」——没救成但把话说出口的夜班,和 e4 的「明晚再说吧」是两种不同的难受。四结局现场已见其三(e1/e3/e4)。
- **1.7 倍速下的底盘纹丝不动**:乱序手势 57 连发、菜单打断恢复、双击重听、看门狗 13/30 秒准点,零状态错乱。
- 铃声终于响了。这个只有耳朵的世界,的第一声"叮铃",等了一整个 R1。
## 一句话裁决
**愿意**——五项修复逐一现场坐实、两局零死锁打出 e1/e3、账目分毫不差,radio 可以进 R3 全员复评;剩下的都是资产位(SA3 的 13 件声音)和打磨键,我等着把铃声、争吵声和刹车声凑齐的那班夜车。
---
### 附:产物与证据文件
- 局 A:`/home/xsl/SoundGame/web/harness/live/out/radio-20260902103345/`(events.jsonl 106 语音段/65 手势、verdicts.json、transcript.md、mix.webm)
- 局 B:`/home/xsl/SoundGame/web/harness/live/out/radio-20260902110919/`(events.jsonl 102 语音段/57 手势)
- 加测(F4 释放):`/home/xsl/SoundGame/web/harness/live/out/radio-20260902112548/`
- 引用代码(只读,未改动):`/home/xsl/SoundGame/web/radio/game.js`(F1 重挂 L364/L383/L411/L458/L581、F3 铃声 L755-783、F4 跳句锁 L1024-1027、F5 尾句判定 L495-511、看门狗常量 L227-234)
- 铃声响度证据:局 A mix.webm 30-39s 窗,ffmpeg astats Peak -1.5 dB / RMS -15.4 dB
- 离线旁证:`/home/xsl/SoundGame/research/new8/radio/round2/transcript-stress.md`(rep_low 新词 9 处)