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

18 KiB
Raw Blame History

《不眠频率》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 造成(详见上文口径),本报告未采信任何"游戏自残式截断"叙事。