From ff7a2f628481032edf8cec6cf271372ea5fc0773 Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Sat, 6 Jun 2026 22:53:05 +0800 Subject: [PATCH] fix: delay wooden fish audio upload --- ...】敲木鱼音频延迟上传与本地标准化-2026-06-06.md | 81 +++++ ...】server-rs与SpacetimeDB数据契约-2026-05-15.md | 2 +- ...玩法创作】平台入口与玩法链路-2026-05-15.md | 2 +- server-rs/crates/api-server/src/app.rs | 84 ++++- .../api-server/src/modules/wooden_fish.rs | 51 +-- .../common/CreativeAudioInputPanel.test.tsx | 300 ++++++++++++++++ .../common/CreativeAudioInputPanel.tsx | 17 +- .../common/creativeAudioProcessing.test.ts | 241 +++++++++++++ .../common/creativeAudioProcessing.ts | 308 ++++++++++++++++ .../WoodenFishCreationWorkspace.test.tsx | 334 +++++++++++++++++- .../WoodenFishCreationWorkspace.tsx | 36 +- .../wooden-fish/woodenFishAssetClient.test.ts | 212 +++++++++++ .../wooden-fish/woodenFishAssetClient.ts | 141 ++++++++ 13 files changed, 1771 insertions(+), 38 deletions(-) create mode 100644 docs/test-cases/【测试用例】敲木鱼音频延迟上传与本地标准化-2026-06-06.md create mode 100644 src/components/common/CreativeAudioInputPanel.test.tsx create mode 100644 src/components/common/creativeAudioProcessing.test.ts create mode 100644 src/components/common/creativeAudioProcessing.ts create mode 100644 src/services/wooden-fish/woodenFishAssetClient.test.ts create mode 100644 src/services/wooden-fish/woodenFishAssetClient.ts diff --git a/docs/test-cases/【测试用例】敲木鱼音频延迟上传与本地标准化-2026-06-06.md b/docs/test-cases/【测试用例】敲木鱼音频延迟上传与本地标准化-2026-06-06.md new file mode 100644 index 00000000..0df29319 --- /dev/null +++ b/docs/test-cases/【测试用例】敲木鱼音频延迟上传与本地标准化-2026-06-06.md @@ -0,0 +1,81 @@ +# 敲木鱼音频延迟上传与本地标准化测试用例 + +## 覆盖目标 + +- 选择上传或录音结束后只在浏览器本地处理,不请求 OSS 上传凭证。 +- 用户点击 `生成` 时才上传处理后的音频 Blob/File,并把确认后的 `WoodenFishAudioAsset` 放入创建 session payload。 +- 上传和录音统一执行前后声音过小片段裁切、最长 1 秒限制、近似 `-15 LKFS` 响度平衡和峰值保护。 +- 音频面板明确显示 `最长 1 秒`,并正确处理上传、录音、重置、禁用和错误状态。 +- OSS 上传 client 只接收 Blob/File,不接受 Data URL,并覆盖上传凭证、OSS POST、资产确认和错误分支。 + +## 音频处理 helper + +- 空文件:`size=0`,报 `音频文件为空,请重新选择。` +- 非音频 MIME:`text/plain`,报 `请选择音频文件。` +- 浏览器没有 `AudioContext`:报 `当前浏览器不支持音频处理。` +- `decodeAudioData` 失败:报 `音频解码失败,请重新选择。` +- 全静音或声音全低于阈值:报 `音频声音过小,请重新录制或上传。` +- 前后静音裁切:低于阈值的头尾帧被裁掉,`startFrame` 和 `frameCount` 正确。 +- 裁切后刚好 `1000ms`:允许通过。 +- 裁切后超过 `1000ms`:报 `音频最长 1 秒。` +- 上传来源 `uploaded` 与录音来源 `recorded`:返回 pending asset 保留对应 source。 +- 原文件名有扩展名:输出 `.wav` 文件名;无扩展名补 `.wav`;空白文件名输出 `creative-audio.wav`。 +- `URL.createObjectURL` 存在:`audioSrc` / `previewUrl` 为 blob URL;不存在时返回空字符串且不阻断处理。 +- 近似响度平衡:低 RMS 样本被拉向 `-15 LKFS` 目标。 +- 峰值保护:高峰值样本增益后不超过 `peakCeiling`。 +- 零能量 section:归一化阶段报声音过小。 +- WAV 编码:写入 RIFF/WAVE/data header、PCM16 数据长度和采样值。 + +## 音频输入面板 + +- 传入 `limitLabel` 时显示 `最长 1 秒`;未传入时不显示限制标签。 +- 无资产时显示默认音效文案。 +- 有资产且 `audioSrc` 存在时渲染 `