fix(engine): voice 句尾剪字真根因根治(三修:源尾垫静音冲刷 SoundTouch 未冲刷小节)+ onEnd 完成信号 + live 探针适配

- 真根因(live span 8.57s < 文件 8.80s 铁证):SoundTouch Stretch 源结束时不冲刷
  内部最后一个小节(~1 sequence),句尾 0.1-0.25s 从未交付音频图——任何平台皆然,
  ASR 因容错转写仍 sim=1(转写评审盲区的又一实证)。一修固定 300ms 排空窗只是
  把这段不存在的交付空等成静音;二修 onEnd 保证「已交付必播完」但交付不了这段
- 三修:源尾垫 VOICE_TAIL_PAD_SEC(0.25s) 静音把真实句尾推出管线;完成 = onEnd
  (平台无关,disconnect 已交付帧仍播);1.5s 兜底;顶掉复核移至新句数据访问前
  (垫长拷贝的 getChannelData 先于杀旧句会打乱探针时序)
- live 探针适配:尾部垫使 SoundTouch 读未注册 buffer、gcd 抽读信号消失——
  清扫器加「仍有连接中语音 SPN 则不关段」守卫,断开即移出追踪集合
- engine-voice.test:PAD+I1/I2/I2b/I3 五组 19 断言(含垫长存在性、onEnd 结算、
  兜底不早于 1.5s);10 套件全绿
- live 复验(男声 p1):span 8.57→9.04s(≥文件 8.80s),ASR sim=1 verdict=OK
This commit is contained in:
xsl
2026-09-07 23:18:11 +08:00
parent ec248e18da
commit 6f4f167efd
5 changed files with 182 additions and 100 deletions
+1 -1
View File
@@ -277,7 +277,7 @@ source env.d/mureka.sh
|---|---|---|
| ~~引擎无公开 `isVoicePlaying`~~ | **已解决(R7)**:`audio.isVoicePlaying()` 公开,游戏层全部收编 | — |
| ~~长按快进无 per-game 开关~~ | **已解决(R7)**:`audio.setRateBoostEnabled(false)`,rhythm/space 演奏期已豁免 | — |
| ~~voice 句尾剪字(每句末尾音节缺失)~~ | **已根治(2026-09 真机人耳反馈)**:旧结束定时器(墙钟+120ms)< 管线固有延迟 ~190ms,句尾音节尚在 SPN/SoundTouch 缓冲即被 disconnect。现 `_finishVoice` 以源真实消耗位置(`filter.sourcePosition`)判定 + 300ms 排空窗;回归 `web/harness/engine-voice.test.mjs` 三不变式钉死;真机 A/B(同 id 节点存活 +0.02s→+0.33s)验证 | 引擎层已固化,新游戏零改动继承;合成侧经 ASR 抽查排除剪字(尾静默紧是裁剪工艺,判读口径见 `tools/audit_voice_tails.py` 头注) |
| ~~voice 句尾剪字(每句末尾音节缺失)~~ | **已根治(2026-09 真机人耳反馈,三修)**:一修固定排空窗(手机端未交付量浮动,不够);二修 onEnd 完成信号(仍不解决交付缺失);三修定位真根因——**SoundTouch Stretch 源结束不冲刷最后一个小节,句尾 0.1-0.25s 任何平台都不会播出**,根治 = 源尾垫 0.25s 静音推出真实句尾 + onEnd 驱动完成 + 1.5s 兜底。回归 `web/harness/engine-voice.test.mjs`(PAD+I1-I3);live 验证 span 8.57s→9.04s(≥文件时长 8.80s) | 引擎层已固化,新游戏零改动继承;live 探针同步适配(清扫器守卫);合成侧经 ASR 抽查排除剪字(尾静默紧是裁剪工艺,判读口径见 `tools/audit_voice_tails.py` 头注) |
| 向导 earcon 为运行时合成音 | 音色是「可用」级不是「精美」级(正弦/三角/方波包络) | 若升级为录制品 earcon:保持 8 音词表与参数边界不变(14 号文档 §2),只换渲染后端 |
| escape「需要帮助吗」问而不等 | P1 终评唯一「擦边当白痴」时刻 | v2 手势宪法专项:真问答 + PLAY 期目标重听入口 |
| space/simon 无「局」与结算仪式;storyline 链尾无轻量 turn 信号、二周目重播开场教学;rhythm 教学首误先震后教 | round4 终评 P0 全部裁定入 v2(research/04-playtests/round4/synthesis.md §2) | L5 会话层专项 + 微 polish 清单 |