diff --git a/apps/worker/worker_app/tasks/generation.py b/apps/worker/worker_app/tasks/generation.py index 1a3fc6e7e..c876bdce7 100755 --- a/apps/worker/worker_app/tasks/generation.py +++ b/apps/worker/worker_app/tasks/generation.py @@ -473,9 +473,44 @@ def _mux_audio_track(video_path: Path, audio_path: str, output_path: Path) -> No def _download_voice_asset(voice_library_id: str, local_path: Path) -> bool: - """下载配音文件""" + """下载配音文件。 + + 支持两种来源(按优先级): + 1. 配音素材库 asset — 将 voice_library_id 当 asset_id 查 asset 表, + 找到则用 asset.storage_key 下载(用户上传到配音库的音频) + 2. 旧版 voice/{id}.mp3 路径 — 向后兼容 + """ if not voice_library_id: return False + + # 方式1:先尝试当 asset_id 查素材库(用户上传到配音库的音频) + try: + from worker_app.db import SessionLocal + + from packages.adapters.sqlalchemy_impl.asset_repository import ( + SQLAlchemyAssetRepository, + ) + + session = SessionLocal() + try: + repo = SQLAlchemyAssetRepository(session) + asset = repo.find_by_id(voice_library_id) + if asset and asset.storage_key: + # 是素材库的配音 asset,用 storage_key 下载 + logger.info( + "配音素材来自素材库: asset_id=%s storage_key=%s", + voice_library_id, + asset.storage_key, + ) + ok = download_asset(asset.storage_key, local_path) + if ok and local_path.exists() and local_path.stat().st_size > 0: + return True + finally: + session.close() + except Exception as e: + logger.warning("查询配音asset失败,fallback旧路径: %s", e) + + # 方式2:旧版路径(向后兼容) storage_key = f"voice/{voice_library_id}.mp3" return download_asset(storage_key, local_path)