预览视频生成未使用用户选择的配音音频 #1294

Closed
opened 2026-08-08 00:28:35 +08:00 by xiaoxia · 0 comments
Owner

问题描述

用户在前端选择了配音音色(预置音色/克隆音色),但生成的预览视频没有任何配音。

根因分析

配音信息在 Worker 端有三层断裂:

1. _load_task_info 未加载 voice_ids 字段

  • 文件: apps/worker/worker_app/tasks/generation.py 约第1033行
  • _load_task_info 只加载 voice_library_id,完全不加载 voice_ids
  • 预览API传的是 voice_ids(TTS音色ID列表),voice_library_id 传空字符串

2. _build_plan_and_clips_from_task 未将配音配置注入 plan.config

  • 文件: apps/worker/worker_app/tasks/generation.py 约第229行
  • 构建虚拟 plan 时 plan.config 为空 {}
  • 渲染引擎 _maybe_add_voiceover_layer(unified_render_service.py:640)从 plan.configvoice_id / tts 配置来触发TTS配音
  • plan.config 中没有 voice_id,配音图层不会生成

3. _download_voice_asset 无法下载配音

  • 预览API设置 voice_library_id="" 空字符串
  • _download_all_assetsif voice_library_id: 判断为 False,跳过配音下载
  • voice_path 始终为 None

数据流断裂图

前端 voiceIds=["zh-CN-XiaoxiaoNeural"] → API voice_ids 保存 ✅
  → GenerationTask.voice_ids 数据库存储 ✅
  → Worker _load_task_info 只读 voice_library_id(空) ❌ 断裂1
  → _build_plan_and_clips 不注入 voice_id 到 plan.config ❌ 断裂2
  → _maybe_add_voiceover_layer 读不到 voice_id → 跳过配音 ❌ 断裂3

修复方案(Worker端)

文件:apps/worker/worker_app/tasks/generation.py

修复1: _load_task_info 增加 voice_ids 加载

# 约第1033行,增加:
"voice_ids": list(getattr(gen_task, "voice_ids", []) or []),

修复2: _render_video 函数签名增加 voice_ids 参数,构建 virtual_plan 后注入 voice_id

# 在 _render_video 中,构建 virtual_plan 之后、调用 adapter 之前:
if voice_ids:
    plan_cfg = dict(virtual_plan.config or {})
    plan_cfg["voice_id"] = voice_ids[0]  # 取第一个音色ID
    virtual_plan.config = plan_cfg
    logger.info("[task_id=%s] [渲染] voice_id已注入plan.config: %s", task_id, voice_ids[0])

修复3: generate_video 主函数中传递 voice_ids

# 从 task_info 取 voice_ids 传给 _render_video
voice_ids = task_info.get("voice_ids", [])
output_path, render_duration = _render_video(
    ...,
    voice_ids=voice_ids,
    ...
)

注意克隆音色场景

  • 克隆模式下前端传的是 voice_clone_profile_id(不是 voice_id)
  • 需检查克隆音色ID是否可直接作为 voice_id 使用,或需要转换

优先级

P1 — 预览功能核心体验缺失

## 问题描述 用户在前端选择了配音音色(预置音色/克隆音色),但生成的预览视频没有任何配音。 ## 根因分析 配音信息在 Worker 端有三层断裂: ### 1. `_load_task_info` 未加载 `voice_ids` 字段 - **文件**: `apps/worker/worker_app/tasks/generation.py` 约第1033行 - `_load_task_info` 只加载 `voice_library_id`,完全不加载 `voice_ids` - 预览API传的是 `voice_ids`(TTS音色ID列表),`voice_library_id` 传空字符串 ### 2. `_build_plan_and_clips_from_task` 未将配音配置注入 `plan.config` - **文件**: `apps/worker/worker_app/tasks/generation.py` 约第229行 - 构建虚拟 plan 时 `plan.config` 为空 `{}` - 渲染引擎 `_maybe_add_voiceover_layer`(unified_render_service.py:640)从 `plan.config` 读 `voice_id` / `tts` 配置来触发TTS配音 - `plan.config` 中没有 `voice_id`,配音图层不会生成 ### 3. `_download_voice_asset` 无法下载配音 - 预览API设置 `voice_library_id=""` 空字符串 - `_download_all_assets` 中 `if voice_library_id:` 判断为 False,跳过配音下载 - `voice_path` 始终为 None ## 数据流断裂图 ``` 前端 voiceIds=["zh-CN-XiaoxiaoNeural"] → API voice_ids 保存 ✅ → GenerationTask.voice_ids 数据库存储 ✅ → Worker _load_task_info 只读 voice_library_id(空) ❌ 断裂1 → _build_plan_and_clips 不注入 voice_id 到 plan.config ❌ 断裂2 → _maybe_add_voiceover_layer 读不到 voice_id → 跳过配音 ❌ 断裂3 ``` ## 修复方案(Worker端) ### 文件:`apps/worker/worker_app/tasks/generation.py` **修复1**: `_load_task_info` 增加 `voice_ids` 加载 ```python # 约第1033行,增加: "voice_ids": list(getattr(gen_task, "voice_ids", []) or []), ``` **修复2**: `_render_video` 函数签名增加 `voice_ids` 参数,构建 virtual_plan 后注入 `voice_id` ```python # 在 _render_video 中,构建 virtual_plan 之后、调用 adapter 之前: if voice_ids: plan_cfg = dict(virtual_plan.config or {}) plan_cfg["voice_id"] = voice_ids[0] # 取第一个音色ID virtual_plan.config = plan_cfg logger.info("[task_id=%s] [渲染] voice_id已注入plan.config: %s", task_id, voice_ids[0]) ``` **修复3**: `generate_video` 主函数中传递 `voice_ids` ```python # 从 task_info 取 voice_ids 传给 _render_video voice_ids = task_info.get("voice_ids", []) output_path, render_duration = _render_video( ..., voice_ids=voice_ids, ... ) ``` ### 注意克隆音色场景 - 克隆模式下前端传的是 `voice_clone_profile_id`(不是 voice_id) - 需检查克隆音色ID是否可直接作为 `voice_id` 使用,或需要转换 ## 优先级 P1 — 预览功能核心体验缺失
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: xiaoxia/xiaoxia-saas#1294