Skip to content

feat(dubbing): 按角色批量分配音色并支持单句覆盖 #421

Description

@buxuku

背景

PR #414 已让每条字幕携带结构化 speakerIds,当前配音工作台也已支持全局默认音色、单句音色覆盖、单句试听/重生成和会话恢复。现在需要把两者连接起来:让用户只需为每个角色选一次音色,即可完成多人内容的批量配音,同时保留少量特殊句子的精细调整能力。

当前配音会话只解析字幕文件,未读取校对 sidecar 中的角色名册和 cue 归属;如果要求用户逐句选择音色,长视频几乎不可用,也很容易造成同一角色音色不一致。

用户问题

  • 多角色视频需要逐句换音色,操作量随字幕数量增长。
  • 用户看不出某句正在继承全局音色,还是已有单句覆盖。
  • 修改角色音色后,不知道哪些已生成片段需要重新合成。
  • 配音会话恢复后,角色与音色映射如果丢失,会破坏前后声音一致性。
  • 自动分离中的未分配和多人重叠字幕,需要明确而可预测的兜底规则。

产品目标

  1. 多角色项目在批量生成前,通过“一角色选一次音色”完成必要配置。
  2. 默认流程对新手清晰:识别角色 → 选择音色 → 试听 → 开始生成。
  3. 同一角色默认保持同一音色,单句仍可使用现有能力覆盖。
  4. 角色音色变化只影响关联字幕,并清楚提示需要重生成的范围。
  5. 单角色或无角色元数据的项目继续使用当前简洁的全局音色流程。

目标用户与核心故事

  • 作为多人访谈制作者,我希望分别给主持人和嘉宾选音色,然后一键生成整段配音。
  • 作为新手,我希望界面明确告诉我还有哪个角色没选音色,而不是开始后才报错。
  • 作为精细编辑者,我希望某一句可以临时换音色,并能随时恢复为角色默认。
  • 作为返工用户,我希望修改一个角色的音色时,只重新生成该角色受影响的片段。
  • 作为继续上次任务的用户,我希望角色音色和单句覆盖完整恢复。

核心流程

  1. 用户进入配音工作台,系统读取字幕及同源校对 sidecar。
  2. 若检测到多个角色,在现有批量配置区显示“角色与音色”。
  3. 每个角色只展示一行/一张紧凑条目:颜色、角色名、句数/时长、音色选择、试听按钮。
  4. 用户为每个角色选择音色;已选音色可用一段代表性字幕试听。
  5. 所有必要角色配置完成后,“开始生成”可用;生成时每句自动继承所属角色音色。
  6. 用户在字幕列表中检查结果,可对个别句子选择其他音色并重生成。

对只有一个角色、没有 sidecar 或没有有效 speakerIds 的输入,不显示额外角色配置步骤,保持当前全局默认音色体验。

交互方案

1. “角色与音色”配置区

  • 默认按角色首次出现顺序排列,显示角色名、稳定颜色、字幕句数和预计总时长。
  • 音色选择复用当前引擎的 voice 列表;提供现有试听能力,不创造新的音色管理入口。
  • 尚未选择时显示 请选择音色,并在该条目内给出直接操作,不使用全局报错弹窗。
  • 可提供“使用全局默认音色”作为明确选择,但不能让空值含义模糊。
  • 不根据性别、年龄或角色名强制自动匹配音色;未来可增加可解释的可选推荐。
  • 切换 TTS 引擎后,若原音色在新引擎不可用,对应角色应回到待选择状态并保留清晰提示。

2. 字幕列表中的继承与覆盖

  • 每行显示角色标签;多人重叠时显示主要角色和重叠提示。
  • 行级音色选择器默认显示 跟随角色(音色名),而不是当前含义不够具体的 全局
  • 用户给某句单独选音色后,显示 单句覆盖 状态;选择 恢复跟随角色 即删除覆盖值。
  • 未分配字幕显示 未分配 · 使用全局音色,使兜底行为可见。
  • 重叠字幕默认使用主要角色音色,其他角色仍可见,并提示当前仅生成一条语音,避免用户误以为会自动混合多人声音。

3. 修改后重生成

  • 当角色音色被修改时,仅将该角色中已生成且未被单句覆盖的字幕标记为“需要更新”。
  • 配置区显示受影响句数,并提供 重新生成此角色;列表筛选增加 需要更新
  • 批量开始/导出前,如果存在过期音频,应明确提示并提供一键重生成,避免静默导出旧音色。
  • 单句覆盖的修改继续沿用当前“保存并重生成”能力,不影响同角色其他句子。
  • 会话应保留旧音频直至新音频成功生成,失败时用户仍可试听/恢复旧结果。

4. 容错与引导

  • 有实际字幕的角色未选择音色时,禁用批量开始,并把焦点/滚动定位到第一个待配置角色。
  • 已删除或不可用的音色显示 音色不可用,请重新选择,不得静默替换成另一个音色。
  • 角色在校对阶段被重命名时,通过稳定 ID 保留原音色映射。
  • 角色被合并后,若出现两个不同映射,首次进入配音时要求用户确认合并后使用哪个音色。
  • sidecar 缺失或版本不支持时,回退到现有字幕解析和全局音色,不阻断配音。

数据与解析规则建议

interface DubbingSpeaker {
  id: number;
  name: string;
  color?: string;
  voiceId?: string;
}

interface DubbingCue {
  speakerIds?: number[];
  voiceId?: string; // 只保存显式的单句覆盖
}

实际音色解析顺序:

cue.voiceId
  ?? speakerVoiceMap[primarySpeakerId]
  ?? config.voice
  • speakerVoiceMap 以稳定角色 ID 为键,随配音会话持久化。
  • 配音创建入口需要同时接收字幕和对应 sidecar,而不是只从导出的字幕正文反推角色。
  • DubbingSessionView、持久化 meta 和恢复流程应保留角色名册、cue speakerIds、角色音色映射及单句覆盖。
  • 流水线从校对/翻译阶段进入配音时,应传递 sidecar 或等价结构化数据。
  • 角色默认音色改变后,根据“解析后的 voice 是否变化”判断 stale,避免错误重生成带单句覆盖的 cue。

验收标准

  • 当输入包含多个有效角色时,系统应在批量生成前显示“角色与音色”,每个角色只需配置一次。
  • 当角色均已配置时,未设置单句覆盖的 cue 应按所属主要角色的音色合成。
  • 当输入没有角色信息或只有单一角色时,系统应保留当前全局音色流程,不增加强制步骤。
  • 当用户为单句选择不同音色时,系统应明确显示 单句覆盖,且可一键恢复为 跟随角色
  • 当用户修改角色音色时,系统应只标记该角色中继承角色设置的已生成 cue 为“需要更新”。
  • 当存在需要更新的音频时,系统应提供按角色/全部重生成,并在导出前明确提示。
  • 当有角色尚未选择音色时,系统应在对应角色条目内说明原因并阻止批量生成。
  • 当 cue 为未分配状态时,系统应明确显示并使用全局音色兜底。
  • 当 cue 包含多个角色时,系统应保留全部角色信息,并明确使用主要角色音色,不自动生成多人混合语音。
  • 当音色在切换引擎后不可用时,系统应要求重新选择,不得静默映射到其他音色。
  • 当关闭并恢复会话时,角色名册、角色音色映射、单句覆盖和 stale 状态应完整恢复。
  • 当角色只发生重命名时,原音色映射应因稳定 ID 而继续生效。
  • 角色配置和字幕行状态应支持键盘操作、可读标签与深浅主题,不得只依赖颜色表达。

实施拆分

  • 扩展配音创建 IPC/流水线,加载校对 sidecar 的角色名册和 cue speakerIds
  • 扩展会话类型和持久化/恢复,保存 speakerVoiceMap、角色信息和 cue 归属。
  • 实现“角色与音色”配置区、缺失映射校验和角色试听。
  • 更新字幕列表:角色标签、跟随角色、单句覆盖、未分配和重叠提示。
  • 实现按角色计算 stale、筛选及批量重生成,并完善导出前检查。
  • 补充旧会话迁移、引擎切换、恢复、流水线和端到端测试。

非目标

  • 不自动判断角色的性别、年龄、真实身份或强制推荐特定音色。
  • 不在本阶段实现同一字幕片段内多人同时配音混音。
  • 不新增音色克隆流程;继续复用现有引擎和已注册音色。
  • 不重做现有字幕时长、重叠策略和音视频导出管线。

依赖与关联

同类产品实践参考

  • ElevenLabs Dubbing Studio:按 speaker track 统一设置音色、clip 继承 track 设置、单 clip 覆盖,以及设置变化后的 stale/批量重生成。
  • ElevenLabs Transcript Editor:稳定角色颜色、片段归属调整和批量移动,为配音前纠错提供一致心智模型。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions