test+docs: 「对白没读完」教训固化到框架(引擎回归测试 + 审计工具 + 四处文档)

- web/harness/engine-voice.test.mjs:引擎 voice 句尾保真三不变式(I1 源未耗尽不得结算 /
  I2 耗尽后排空窗才断开 / I3 零消耗走旧路径),可驱动 SPN mock 模拟真实消耗,
  15 断言全绿;防止未来重构回潮
- tools/audit_voice_tails.py:voice 资产尾部静默审计工具入库(含判读口径头注:
  尾静默紧=裁剪工艺≠剪字,句尾完整性验收在引擎层)
- 文档:HANDOVER(§1.4 回归清单 / §5.3 质量手段 / §6 已解决账)、roadmap §4
  新增全游戏「句尾完整性」真机听测项、asset-pipeline QC 口径、methodology §5
  度量盲区教训(媒体播完类问题转写层无效,必须真人耳测+引擎断言)、
  web-engine-api voice 自然结束语义
- 修正:结束判定改用 filter.sourcePosition(SimpleFilter 单调精确计数器);
  10 套件全绿(8 playtest + guide + engine-voice)
This commit is contained in:
xsl
2026-09-06 16:08:18 +08:00
parent da01c2d20b
commit f5eae6d37c
7 changed files with 254 additions and 2 deletions
+1 -1
View File
@@ -497,7 +497,7 @@ export class WebAudioEngine {
*/
_finishVoice(token) {
if (this._voice !== token || token.stopped) return; // 被打断:不回调
const consumedSec = token.filter.sourceSound.position / token.buf.sampleRate;
const consumedSec = token.filter.sourcePosition / token.buf.sampleRate;
if (consumedSec > 0 && consumedSec < token.buf.duration - 0.02) {
// 源未耗尽:墙钟先到/主线程卡顿/后台节流——等真实消耗追上再结算
token.endTimer = setTimeout(() => this._finishVoice(token), 80);