Files
SoundGame/research/new8/radio/round1/live-player.md
T
xsl d870a75a26 feat(new8/batch1): 两款新 RPG《不眠频率》radio +《回声地窟》dungeon 全套(多agent流水线:策划→资产→开发→测试→玩家R1→修复→R2)
- 程序章程 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(风暴根治/回声真实性/密度下限+呼吸层/导航最短路/菜单关闭反馈/金币档同账本)+ 实现核对登记
2026-09-02 18:52:37 +08:00

121 lines
18 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.
# 《不眠频率》R1 全拟真试玩报告 — 老墨(失眠的电台制作人)与他闺女墨墨(手比耳朵快的19岁)
## 基本信息
同一台"手机"两个用户,两局都真打完(live harness:真 chromium + SenseVoice ASR 听游戏实况,非 mock)。
**局 A(老墨·新手主线)**
- 身份:45 岁电台制作人人设,第一次玩纯音频游戏,认真听完关键句再动手,全晚走心(多左滑)。
- 设置:`voice=male, speed=1.0, bgm=1.0, guide=full`
- 时长/手势:墙钟 26.5 分钟(含我在幕间发呆的时间),51 个手势(tap 41 / 左滑 8 / 右滑 1 / 上滑 1)
- 结局:**e1「天亮之前」**(rep=12,p9 左滑直面),尾声 5 位来电者全救到版 ep_*_ok 逐条点名
- 报错:非资产类 console.error = 0;无死锁、无状态错乱
**局 B(墨墨·急性子压力)**
- 身份:19 岁女儿抢过手机,语音播一半就戳、不等提示狂按、开菜单就关、四处乱滑,抉择全走克制(右滑)路线。
- 设置:`voice=female, speed=1.7, bgm=1.0, guide=standard`
- 时长/手势:墙钟 18.3 分钟,83 个手势(tap 58 / 右滑 12 / 下滑 4 / 左滑 3 / 上滑 2 / 双击 2 / 长按 2)
- 结局:**e4「静音」**(rep=0,p9 右滑回避),尾声 5 位来电者全错过版 ep_*_no——「有的夜班,谁也接不住谁」
- 报错:非资产类 console.error = 0;18 段语音提前被杀**全部可归因到玩家自己的 tap 跳句**(逐段核对 vend 时长),无一局是游戏自残
- 意外彩蛋:局 B 开局实测了**断点续玩 ASK 流程**(局 A 存档导致,见 P2-3)
---
## 局 A 体验叙述(老墨,第一人称)
解锁遮罩那一指下去,t=5.3s 听到「新的夜晚,开始了」(sys_new_night),紧接着 t=7.4s 一句操作口令「单击屏幕继续,双击重新听……」(gd_brief,full 档专属前置),然后台标口播 b_open——**我后来核对了事件流,解锁那一下 tap 并没有像我在别的游戏里遇到的那样被当成"跳过旁白",开场每一句都足时播完了**。这份"第一指头不吞你的开场白"的克制,让我对它先有了好感。
t=34.8s,第一通热线来了。没有铃声——只有一下短震。我当时愣了三秒:铃呢?10 秒后 t=44.9s 导播耳语补上来「热线在闪。单击,接听。」(gd_ring1)。后来看事件才知道铃声资产(sfx/phone_ring)整个 404 了,RING 状态前 10 秒是纯静默+一下震动(见 P2-1)。作为盲玩者,是向导把我捞起来的。
接通老周(z1_ring_in「一线来电。七十多岁,雨夜,走丢了。」)。抉择点 p1 的选项句我听的是全文:「老人在发抖。向左滑,陪他哼那首老歌。向右滑,冷静问他路口的路牌。」——ASR 转写 similarity **1.0**,一字不差。我当时在句末磨蹭了太久,这句提示被**原句复播了两次**(t=498.0、523.0,25s/50s 两级看门狗),复播的是完整选项句而非干巴巴的"快选啊",这个细节让我不烦;而且复播两级之后彻底安静,我 t=533.1 的左滑照样生效——选择权一直在我这。左滑,t=533.6s 老周跟着我哼起来(z1_song,similarity 0.97),t=674s「对,对!路口修车铺,天天放这首!」(z1_songo)——第一个正反馈到手,他声音真的稳住了。
p2 我继续左滑「留在原地陪他等」。t=745.2s 幕间响起今晚第一句口碑播报:「今晚的口碑,不好不坏。」(rep_mid,1.0)——账是真的(p1 左 +1、p2 左 +2,rep=3,低→中跨档才播)。第二通小鹿,p3 左滑「这趟车值得上」,t=845.1s 那句「你妈等的不是奖杯,是你进门喊的那声妈。」(l1_go,**1.0**)是我整晚最喜欢的一句台词;紧接着 t=865.8s「今晚的口碑,在听众里立住了。」(rep_high)——rep=5,跨高档,播报又对了一次。
第三通糖糖,我在 k1_b 里听到了「家里灯关了。可是楼下,一直有声音。」(similarity 1.0),但设计里说这句下面应该垫着**闷住的争吵声**(arg_muffled)——那层环境音从头到尾没出现(资产缺失,见 P2-2)。我选了右滑「轻轻问她怎么了」,t=959.8s「爸爸妈妈摔门了。是不是……我做错了什么呀。」(k1_asko,1.0)——值了。p5 我左滑说了真话:「大人的事,不是小孩的错。一个字都不是。」(k1_truth,0.97)。但在这里我吃了自己第一次亏:k1_trutho 声明 10.96 秒,我 8.4 秒就点了继续,尾巴「他们明天,会一起给我切蛋糕吗?」被我自己掐了(ASR 如实记 TRUNCATED)——而下一句导播的「蛋糕。记下来——」直接应在了那个我没听到的词上。跳句是设计好的自由,但尾句没保护,急性子会像我一样错过钩子(见 P2-4)。
第四通陈姐是全晚最打动我的验证:p6 左滑「替孩子带话」之后,游戏播的不是泛泛的劝和,而是 t=1140.3s「四十分钟前,有个孩子问我们:爸妈摔门,是不是她的错。」(w1_say 组)——**我在第三通"问出来"的那句话,被原封不动带进了第四通**。heardArgument 条件差分不是写在文档里的,是我亲耳听到的。
第五通老韩,我左滑陪他聊闺女。聊天中途 t=1334.8s 先是一下不寻常的长震(danger 震动签名 [25,40,25,40,25]),2 秒后 t=1336.9s「车道偏了——听!」(h1_danger),然后「嘶——好险!前车急刹,我擦着护栏过去了。彻底醒了!」(h1_dango,0.92)。危机拍是自动流,戏剧自己走完不等人,节奏对。挂电话前老韩补了一句 t=1351.8s「对了。头通电话那位大爷,就是这片被巡逻队找到的。这城市的夜,是接着的。」(h1_echo,**1.0**)——我对老周的陪伴,半晚之后在另一个陌生人嘴里回来了。
签收抉择 p9:「留言机红灯在闪,是老主播三年前没播完的那句晚安。向左滑,替他播出去。」我在句末磨蹭到提示句被原样复播了一次(t=1402.4),复播完又过了 12.8 秒才左滑。t=1425.5s「师父,三年了。这句晚安,我替您播。各位,晚安。」(d9_face,0.85)。结局 e1:t=1435.3s「天亮了,热线灯还亮着。你们的晚安,是这座城市的心跳。」,t=1443.1s「这把话筒,我总算接得住了。明晚零点,接着不眠。」然后导播替我记账(ep_lead),五个人一个一个点名:老周有了老花镜、小鹿上车了、糖糖家的门这个月没再摔过、陈姐家切了蛋糕、老韩后视镜上多了朵小红花(ep_*_ok 五连,similarity 0.90-1.0)。「明晚零点,接着不眠」——我现在就想再值一班。
收尾我顺手验了结算态上滑:sys_help(1.0)→ 重播结局主句 → rep_high,帮助+结局+口碑三件套齐活。
## 局 B 体验叙述(墨墨,第一人称)
我上来就捅了一指头——结果听到的是「检测到你的夜班记录。单击继续上次,右滑开始新的夜晚。」(sys_continue_ask),后半句还没听完就被我下一戳掐了,然后我就被**扔回了昨晚的结局链**,e1_a 一句「太亮了,热线灯还亮着」地又播了一遍。想开新局?右滑。可我一个手比脑子快的急性子,谁听得见那句被掐掉的规则(见 P2-3)。
行吧,那我就在这个结局画面里发泄:左滑——error 震(零静默,可以);双击——居然把结局链给我重播了(合理,重听);下滑——菜单开了,「菜单。单击切换选项,双击确认。回到直播。」,再一下下滑又关上了,节目无缝接回去;长按——引擎里 BOOST 灯闪了一下(我按得太短)。全部有回应,没有一次装死。
终于点到「再来一局」。新夜班 INTRO 我自然是一个字不让它说完:b_open「午夜零点,红灯亮起。欢迎回——」只剩 0.43 秒;b_rule 被我从 1.87 秒处掐断后,转写器把残句听成了「还有优惠券就是要现金」(similarity 0.08,这个是仪器幻听,不算它)。1.7 倍速下的女声干脆利落,倒是很配我。
第一通铃,我先用双击试探(首通没有上一通,正确吃了 error 震,没接起来),上滑听状态:「现在是今晚第一通电话。」「今晚的口碑,有点砸了。」(prog_c1+rep_low,新夜班口碑归零,账对)。然后单击接听,一路狂戳。
规矩我很快摸出来了:**播放中单击=跳句,但抉择提示句(p*)戳不动**。我在 p1 播到一半时戳了一下——只有一下震动,句子照常播完;紧接着右滑「冷静问他路牌」,这一滑在句子里就被记下了,句尾一落 UI 音响起、结果句无缝接上。我前前后后在 p1/p3/p6/p8 四个提示句里都这么干过,**四次 mid-prompt 戳全部无效化、三次 mid-prompt 滑全部缓存生效**——没有一次吞我的选择,也没有一次让我抢跑成功。公平。
p1 右+p2 右的代价来得很快:老周在「说不清……我真是,说不清了……」里崩溃(z1_bad,1.0),然后导播一句**「地址没报清就转接,雨又大。这通砸了。先稳人,再办事。」**(z1_bade)——骂的是我刚才干的事,一个字不冤枉。这游戏的负反馈不甩锅,服。
中途我干过一次真正捞着东西的操作:一句对白播完后我随手左滑,错误震响完,然后……**游戏就没声了**。我以为它死机了,搁了半分多钟,什么"还在吗"都没等到,直到我自己再戳一下才继续(t=445.4→479.6,整整 34.2 秒静默,见 P1-1)。慢性子老墨永远遇不到这个坑,但我保证急性子天天踩。
后面我把五通全用克制路线走完:小鹿「把选择还给她」(她自己走了);糖糖我偷懒选了左滑哄睡——结果结算句直接点名「睡着了。可你没听见,她在怕什么。」(k1_lulle)——又是不冤枉的账;陈姐被我劝回了家;老韩听我的进了服务区,「单子黄了,人齐了」。这次没有危机拍、没有老韩提老周——我这一晚没陪过任何人,游戏就真的什么都不给我回响。
p9 右滑「照常收播」。「今夜不眠,静音收播。有的夜班,谁也接不住谁。」(e4_a)「留言机还在闪。你没看它,它也没怪你。明晚再说吧。」(e4_b)。尾声导播的账本上,五个人全是错过版(ep_*_no)。这个结局憋得我难受——**难受说明它成立**。最后我戳了一下结算画面,「新的夜晚,开始了」——重开正常,我这才心满意足地把手机扔下。
---
## 测量局限与证据口径(先说清楚)
- 转写(ASR)对 ≤6 字短句和大语速是重灾区:局 B(1.7x 女声)103 条有效语音段里 MISMATCH 30 条(29%),最低把 z1_adone 之外的残句听成「还有优惠券就是要现金」(similarity 0.08)。**凡 events 层显示足时播放、仅转写不像的,一律不算游戏问题**。
- 采信为引擎级证据的只有两类:`vend` 提前于 `dur/speed`(TRUNCATED 事件层证据)、应答窗口完全无事件(SILENCE)。本报告所有 TRUNCATED 已逐条归因:**23 段全部由玩家 tap 造成(跳句/接听抢占),0 段由游戏自身造成**。
- 本报告 t= 均为该局"解锁单击后秒数"(事件时基),与 ASR 转写时间轴存在约 5 秒固定偏移,引用转写时只取 heard/expected 文本与 similarity。
## 问题清单
### P0(卡死/死锁/状态混乱/游戏自残截断)
无。两局共 198 段语音全部串行零叠音;菜单开关、上滑状态、双击重听、无效手势、危机拍自动流、重开,全部状态正确;两局各自打到设计表对应的结局(e1:rep=12;e4:rep=0,账目与 §4.2 分毫不差);无一处游戏自身截断在播语音。
### P1(体验断裂)
1. **等待态做一个无效手势,"还在吗"看门狗就被拆掉且不再补挂 → 之后无限期静默**
- 复现:局 B t=440.9 一句话播完进入链末等待(standard 档承诺 13s/30s 两级提示)→ t=445.4 我滑了一个无效的左滑(正确响了 error 震 [60,40,60])→ **此后 34.2 秒(t=445.4→479.6)事件流里除我下一次 tap 外零事件**:本应在 t≈454s 响的 gd_continue 永远没来,本应在 t≈471s 响的 gd_again 也没来。
- 对比证据:同样在等待态,菜单关闭/上滑状态后的等待看门狗都正常补挂(局 B t=502.5 等待后 t=515.6/532.6 两级准点,误差 0.1s);RING 态的上滑/双击分支显式重挂铃看门狗——唯独叙事态的无效手势分支不补。
- 影响:盲玩玩家遇到它的体验就是"游戏死了"。它不是死锁(tap 仍有效),但把"永不静默死局"的承诺打了个洞。代码侧佐证(只读参考,未改动):`web/radio/game.js` `onGesture()` 对任何手势先 `guide.disarm()`,而 ONAIR/INTRO 左右滑无效分支报完 error 即 return,无补挂动作。
### P2(不适/设计意图缺席)
1. **RING 状态前 10 秒几乎全静默**:`sfx/phone_ring` 404(12 个缺失 SFX 之一),铃声循环无声,进入 RING 只有一记短震 [20],要等 10 秒 gd_ring1 才有声音提示。局 A 我这个"新手"在第一通铃前足足愣了 10 秒。资产缺口属已知遗留,但对免视玩家这就是接电话的本体反馈。
2. **"声音即世界"的两处招牌设计因资产缺失缺席**:`arg_muffled`(C3 糖糖家闷住的争吵声,信息层)与 `brake_screech`(C5 危机拍 2 秒前置预警)均 404。后果:①糖糖通里"楼下一直有声音"只剩台词,p4「问她还哄睡」的抉择失去环境音依据;②老韩危机拍只剩危险长震+台词自带预警,设计的"刹车声渐强 2 秒"完全没有。5 个来电者侧环境音(amb_*)同样全缺,五通电话的"地方感"只靠导播一句口播撑着。
3. **断点续玩 ASK 的单击语义陷阱**:有存档时重进,「单击继续上次」会把已打完的玩家直接扔回昨晚的**结局链重播**(局 B t=0→155s 我被迫听完了整段 e1)。要开新局得右滑,而急性子恰恰最可能把那句规则掐掉(我就掐了)。同一个"单击",在结算态是"再来一局(开新)"、在 ASK 是"继续上次(回旧)"——语义相反,全靠一句容易被跳掉的话撑着。
4. **链末最后一句无跳过保护,抢跑必吃关键尾句**:单击身兼"跳过本句"与"继续",无法区分。局 A 我自认是慢性子,仍三次吃掉尾巴:k1_trutho 的「会一起给我切蛋糕吗?」(蛋糕伏笔没了,下句"蛋糕。记下来——"接了个空)、w1_a 尾巴、d9_facee 的点题句「但空着的那一秒,你说满了」;局 B 的 d9_avoide「又多亮了一夜」同样没逃掉。建议对节点末句加 0.5-1s 保护窗或屏蔽末句跳过。
### P3(建议)
1. p* 抉择提示句播放中单击虽不可跳,但每次都给一记 [20] 确认震动(两局共 5 次)——手感上像"点上了",实际什么都没发生。建议改成不震,或播一句极短提示「听完这句再滑」。
2. 看门狗与 tap 存在小竞态:局 A t=462.7 我单击后 0.4s,gd_continue 仍响了一声随即被 p1 提示句掐成 0.01s 的气口。tap 应立即作废已排队的向导句。
3. rep_low 口碑句设计注释带 warning 震,两局 B 在 RING 上滑听到 rep_low 两次(t=198.5、497.5)均未见额外警示震(只有上滑本身的 [10])。若是只在幕间播报时震,建议补齐;否则删注释。
4. (对应 P1-1 的修法)无效手势处理完应重挂当前等待态的看门狗,而不是任其保持静默。
5. harness 侧记录:长按手势固定 600ms,boost 只能体验约 0.1s,快进玩法本轮无法充分压测(工具局限,非游戏问题);字符串 "1.7" 传参会被归一化为 1.0,需传数值或 `faster`。
## 亮点(让我愿意玩下去的东西)
- **零叠音、零状态错乱的执行底盘**:198 段语音严格串行;菜单里乱点循环、关掉后节点完整复述;上滑状态链(sys_help→prog_cN→rep 档)在 RING/ONAIR/ENDING 三态语义都对;双击重听、无效手势零静默(局 B 9 次全有 error 震)。
- **抉择公平性是玩出来的,不是宣传出来的**:p* 播放中单击 4+1 次全部不可跳;mid-prompt 左右滑 3 次全部缓存、播完即生效不丢不重复;选项句等待态复播两级都是完整选项句(合法帮助),复播完仍安静等你,绝不倒计时逼命。
- **账目真实得可怕**:两局 rep 轨迹(0→3 mid→5 high / 0→-1→0)与设计表逐点一致,跨档播报只在真的跨档时出现;heardArgument 让糖糖的话原样出现在陈姐通里;bond_zhou 让老韩替老周谢我;负向选择换来的是指名道姓的归因句(z1_bade、k1_lulle),正向选择不灌一句教程。
- **四结局两头已见其二**:e1 的「明晚零点,接着不眠」和 e4 的「明晚再说吧」是两种真实的夜班——后者的难受恰恰证明这个抉择系统有牙齿。
- **向导节奏可靠**:两局 RING 10s/25s、full 25s/50s、standard 13s/30s、抉择点 25s/50s、结算态两级,实测误差 ≤0.2s,且从不逐字重复(gd_ring1≠gd_ring2、gd_continue≠gd_again)。
- 手势面 6 个从头用到尾零新增学习成本,全程无画面盲玩可通——它对"纯音频游戏"这个承诺是认真的。
## 一句话裁决
**愿意**——两晚零死锁打穿 e1/e4 两个都成立的结局,我想再值一班去把老韩那句「单子黄了,人齐了」换成危机拍版本;但求先把"无效手势吃掉还在吗"这根盲玩保险丝接回去,再把铃声和争吵声还给这个只有耳朵的世界。
---
### 附:产物与证据文件
- 局 A:`/home/xsl/SoundGame/web/harness/live/out/radio-20260902072135/`(events.jsonl 94 语音段/51 手势、verdicts.json 157 行、transcript.md、mix.webm)
- 局 B:`/home/xsl/SoundGame/web/harness/live/out/radio-20260902074921/`(events.jsonl 104 语音段/83 手势、verdicts.json 158 行、transcript.md、mix.webm)
- 引用行为代码(只读):`/home/xsl/SoundGame/web/radio/game.js`(NODES 表 L61-166、onGesture L328-339、_onStoryGesture L404+、enterEnding L744)
- 引擎级 TRUNCATED 全清单:局 A 5 段 / 局 B 18 段,全部由玩家 tap 造成(详见上文口径),本报告未采信任何"游戏自残式截断"叙事。