fix(1978): GPU lipsync 结果 URL 签 7 天 + 外部 TTS 音频转存自家 OSS #1993

Merged
xiaoxia merged 1 commits from fix/1978-gpu-lipsync-sign-and-persist-audio into develop 2026-09-20 00:07:36 +08:00
Owner

背景

GPU 业务侧 E2E 发现两个上线阻断 bug。

Bug1:GPU 成功时 output_video_url 未签名,前端播不了

  • _submit_to_gpu_sign_media_url() 签结果 URL,但 final_task.result_url 是裸 OSS key(gpu-lipsync/results/{task_id}.mp4,无 host),_sign_media_url 仅对 host 等于自家 bucket 的 URL 签名,裸 key 被原样返回。
  • 修复:直接调 storage.get_download_url(result_key, expires_seconds=MEDIAKIT_URL_TTL_SECONDS)(7 天 = 604800s)签预签名 URL 再写回;签名异常回退原 key 不阻断。

Bug2:预合成 TTS 音频是 dashscope 临时 URL,Worker 家庭网络拉不到

  • tts-preview 主路径提交时 audio_url 为 dashscope-result-bj.oss-cn-beijing.aliyuncs.com 临时地址,RTX2060 家庭网络访问不通,快速失败 3 次回退 MediaKit。
  • 修复:新增 _persist_external_audio_for_gpu,创建 GPU 任务前用 _is_own_oss_url(裸 key/自家 host 判定)识别外部音频,safe_download_bytes 下载后转存 lipsync-tts/{user_id}/{job_id}.mp3(参考 _synthesize_and_persist_audio 模式),用自家 URL 建任务;转存失败回退原 URL 不阻断业务;自家对象不重复转存。

测试

  • test_lipsync_gpu_integration.py 新增 3 用例:外部音频转存(断言 key/content_type/create_task 入参)、自家音频不转存、转存失败用原 URL;成功路径改为断言 get_download_url(key, expires_seconds=604800)
  • lipsync/gpu 相关 183 个测试全绿;black/isort/ruff 通过。
## 背景 GPU 业务侧 E2E 发现两个上线阻断 bug。 ## Bug1:GPU 成功时 output_video_url 未签名,前端播不了 - `_submit_to_gpu` 用 `_sign_media_url()` 签结果 URL,但 `final_task.result_url` 是裸 OSS key(`gpu-lipsync/results/{task_id}.mp4`,无 host),`_sign_media_url` 仅对 host 等于自家 bucket 的 URL 签名,裸 key 被原样返回。 - 修复:直接调 `storage.get_download_url(result_key, expires_seconds=MEDIAKIT_URL_TTL_SECONDS)`(7 天 = 604800s)签预签名 URL 再写回;签名异常回退原 key 不阻断。 ## Bug2:预合成 TTS 音频是 dashscope 临时 URL,Worker 家庭网络拉不到 - tts-preview 主路径提交时 audio_url 为 `dashscope-result-bj.oss-cn-beijing.aliyuncs.com` 临时地址,RTX2060 家庭网络访问不通,快速失败 3 次回退 MediaKit。 - 修复:新增 `_persist_external_audio_for_gpu`,创建 GPU 任务前用 `_is_own_oss_url`(裸 key/自家 host 判定)识别外部音频,`safe_download_bytes` 下载后转存 `lipsync-tts/{user_id}/{job_id}.mp3`(参考 `_synthesize_and_persist_audio` 模式),用自家 URL 建任务;转存失败回退原 URL 不阻断业务;自家对象不重复转存。 ## 测试 - test_lipsync_gpu_integration.py 新增 3 用例:外部音频转存(断言 key/content_type/create_task 入参)、自家音频不转存、转存失败用原 URL;成功路径改为断言 `get_download_url(key, expires_seconds=604800)`。 - lipsync/gpu 相关 183 个测试全绿;black/isort/ruff 通过。
xiaoxia added 1 commit 2026-09-19 23:46:33 +08:00
fix(1978): GPU lipsync 结果 URL 签 7 天 + 外部 TTS 音频转存自家 OSS
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m50s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m58s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m3s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m35s
AI Code Review / AI Code Review (pull_request) Successful in 6m47s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 10m55s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 11m24s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 11m35s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m37s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 14m7s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 20m26s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 20s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 35s
d5a4a40f2a
Bug1: _submit_to_gpu 用 _sign_media_url 签 GPU 结果,但 result_url 是裸
OSS key(gpu-lipsync/results/{task}.mp4,无 host),_sign_media_url 只对
自家 host 的 URL 签名,裸 key 原样返回导致前端无法播放。改为直接调
storage.get_download_url(key, expires_seconds=MEDIAKIT_URL_TTL_SECONDS=7天)。

Bug2: 预合成 TTS 音频 audio_url 是 dashscope-result 第三方临时 OSS 地址,
RTX2060 家庭网络拉不到,3 次失败后回退 MediaKit。创建 GPU 任务前新增
_persist_external_audio_for_gpu:非自家 OSS 域名音频下载转存
lipsync-tts/{user_id}/{job_id}.mp3,用自家 URL 建任务;转存失败回退原
URL 不阻断;自家 key/URL 不重复转存。

测试:test_lipsync_gpu_integration 新增 3 用例(外部音频转存/自家不转存/
转存失败兜底),成功路径断言 7 天签名。

🚀 预览环境已部署

项目 详情
PR号 #1993
预览链接 https://pr-1993.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1993 | | 预览链接 | [https://pr-1993.preview.xiaoxiajianji.com](https://pr-1993.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia merged commit 4a449ae496 into develop 2026-09-20 00:07:36 +08:00

🗑️ 预览环境已清理

PR #1993 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1993 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.