fix(lipsync, P0): TTS异步任务改用@shared_task,解决Worker不注册任务导致卡tts_processing #1851

Merged
auto-approve-bot merged 1 commits from fix/lipsync-shared-task into develop 2026-09-11 01:07:09 +08:00
Owner

P0 Bug 描述

对口型TTS异步化上线后,任务一直卡在 tts_processing 不执行。

根本原因lipsync_tts.pyapp.core.celery_app 导入 celery_app 并用 @celery_app.task 装饰,task 被注册到 API 侧 celery_app 实例,但 Worker 进程运行的是 Worker 侧 celery_app(xiaoxia-saas-worker)。Worker imports 里虽然写了 apps.api.app.tasks.lipsync_tts,但装饰器把 task 注册到了 API 的 celery_app 上,Worker 的 celery_app 不知道这个 task 的存在,消息被消费后路由不到处理函数。

修复

  1. 改为 @shared_task:使用 from celery import shared_task + @shared_task(name="lipsync_tts.synthesize_and_submit", ...),任务会自动注册到当前活跃的 celery_app(Worker 启动时正确注册),API 侧 tts_synthesize_and_submit.apply_async(...) 调用方式不变。
  2. 清理冗余 import:删除函数体开头重复的 get_shared_storage_service 懒导入,改为在 OSS 上传段按需懒导入,保持 task 注册阶段无副作用。_sign_media_url 保持模块内独立函数(不反射调用 LipsyncService,避免跨容器问题)。
  3. 前端轮询超时apps/web/src/pages/ai-avatar/api/aiAvatar.tsgetLipsyncJob 接口加上 { timeout: 60000 },跟其他接口保持一致,避免轮询时 10s 默认超时导致前端状态刷新失败。

不影响

  • TTS 同步模式(直接传 audio_url)逻辑完全不动
  • FFmpeg veryfast preset 改动不动
  • Worker imports 配置不动(保留 apps.api.app.tasks.lipsync_tts

测试

  • 56 个单元测试全部通过
  • lipsync_tts.py 覆盖率 79%,lipsync_service.py 67%
  • ruff/black/isort 均通过
## P0 Bug 描述 对口型TTS异步化上线后,任务一直卡在 tts_processing 不执行。 **根本原因**:`lipsync_tts.py` 从 `app.core.celery_app` 导入 celery_app 并用 `@celery_app.task` 装饰,task 被注册到 API 侧 celery_app 实例,但 Worker 进程运行的是 Worker 侧 celery_app(xiaoxia-saas-worker)。Worker imports 里虽然写了 `apps.api.app.tasks.lipsync_tts`,但装饰器把 task 注册到了 API 的 celery_app 上,Worker 的 celery_app 不知道这个 task 的存在,消息被消费后路由不到处理函数。 ## 修复 1. **改为 `@shared_task`**:使用 `from celery import shared_task` + `@shared_task(name="lipsync_tts.synthesize_and_submit", ...)`,任务会自动注册到当前活跃的 celery_app(Worker 启动时正确注册),API 侧 `tts_synthesize_and_submit.apply_async(...)` 调用方式不变。 2. **清理冗余 import**:删除函数体开头重复的 `get_shared_storage_service` 懒导入,改为在 OSS 上传段按需懒导入,保持 task 注册阶段无副作用。`_sign_media_url` 保持模块内独立函数(不反射调用 LipsyncService,避免跨容器问题)。 3. **前端轮询超时**:`apps/web/src/pages/ai-avatar/api/aiAvatar.ts` 的 `getLipsyncJob` 接口加上 `{ timeout: 60000 }`,跟其他接口保持一致,避免轮询时 10s 默认超时导致前端状态刷新失败。 ## 不影响 - TTS 同步模式(直接传 audio_url)逻辑完全不动 - FFmpeg veryfast preset 改动不动 - Worker imports 配置不动(保留 `apps.api.app.tasks.lipsync_tts`) ## 测试 - 56 个单元测试全部通过 - lipsync_tts.py 覆盖率 79%,lipsync_service.py 67% - ruff/black/isort 均通过

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1851 | | 预览链接 | [https://pr-1851.preview.xiaoxiajianji.com](https://pr-1851.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia force-pushed fix/lipsync-shared-task from e85626dc69 to df0416c80a 2026-09-11 00:49:54 +08:00 Compare
xiaoxia added 1 commit 2026-09-11 01:00:39 +08:00
fix(lipsync): TTS异步任务改用@shared_task,解决Worker侧celery_app不注册任务导致卡tts_processing
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
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 Web Image (pull_request) Successful in 40s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 43s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m28s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m40s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m40s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 1m43s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m51s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m50s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m43s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m59s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m53s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m41s
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 / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 3s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 6m20s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m36s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 8s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 26s
11ee0b3a03
P0: lipsync_tts.py 原从 app.core.celery_app 导入 celery_app 并 @celery_app.task 装饰,
task 被注册到 API 侧 celery_app 实例上,但 Worker 进程使用的是 Worker 侧 celery_app,
导致 Worker 消费消息后找不到处理函数,对口型任务永远卡在 tts_processing 状态。

修复:
1. 改为 @shared_task(name="lipsync_tts.synthesize_and_submit") 装饰器,
   任务自动注册到当前活跃的 celery_app(Worker 启动时会正确注册),
   API 侧 apply_async 调用方式不变。
2. _sign_media_url 保持为模块内独立函数(不依赖 LipsyncService 反射),
   删除函数体开头冗余的 get_shared_storage_service 重复 import,
   仅在 OSS 上传段按需懒导入,保持 task 注册阶段无副作用。
3. 前端 aiAvatar.ts 的 getLipsyncJob 接口加 { timeout: 60000 },
   避免轮询时 10s 默认超时导致前端状态刷新失败。

测试:56 passed,lipsync_tts.py 覆盖率 79%。
xiaoxia force-pushed fix/lipsync-shared-task from df0416c80a to 11ee0b3a03 2026-09-11 01:00:39 +08:00 Compare
auto-approve-bot merged commit 0ad33d429d into develop 2026-09-11 01:07:09 +08:00
auto-approve-bot deleted branch fix/lipsync-shared-task 2026-09-11 01:07:10 +08:00

🗑️ 预览环境已清理

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

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

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