Skip to content

feat(proofread): 在字幕校对台支持角色命名、纠错与批量管理 #420

Description

@buxuku

背景

#352 提出了“区分说话者”的需求,PR #414 已完成说话者分离的基础能力:每条字幕可以携带 speakerIds,角色信息能够在字幕合并、时间调整和重新对齐后保留,并可选择将 [Speaker N] 写入字幕文本。

下一步需要把底层识别结果变成普通用户能理解、能纠错、能持续复用的校对体验。自动说话者分离在串音、短句、噪声和音色相近时难免出错,产品不能把 Speaker 1/2 当作确定身份展示,也不能要求用户直接编辑技术标签。

用户问题

  • 新手看到 Speaker 1 不知道它能否改名,也不知道改名会影响哪些字幕。
  • 自动分离错误时,目前缺少低成本的单句纠正和批量归并能力。
  • 同一角色被拆成多个编号时,逐句修正成本高。
  • 未识别和多人重叠的字幕缺少明确、可检查的状态。
  • 角色名如果直接写入字幕文本,容易污染后续翻译、配音和导出内容。

产品目标

  1. 用户进入校对台后无需配置,即可看懂“谁在说这句”。
  2. 单句纠错在一次点击入口内完成;同类错误可以批量处理。
  3. 角色名称、颜色和字幕归属作为结构化元数据保存,不依赖字幕正文。
  4. 角色调整沿用现有校对台的撤销/重做、保存和未保存提醒。
  5. 为“按角色分配配音音色”提供稳定、向后兼容的数据基础。

目标用户与核心故事

  • 作为第一次使用角色分离的用户,我希望系统自动显示“角色 1、角色 2”,无需先理解说话者 ID。
  • 作为字幕校对者,我希望点击某句的角色标签即可纠正归属,并立即看到结果。
  • 作为长视频编辑者,我希望把误拆的两个角色合并,或把某角色的多句字幕批量移动到另一个角色。
  • 作为内容创作者,我希望把“角色 1”改成“主持人”,且所有关联字幕和后续配音同步使用新名称。
  • 作为审校者,我希望只查看某个角色、未分配或多人重叠的字幕,快速完成检查。

交互方案

1. 默认展示:无需设置即可开始校对

  • 有角色信息的字幕行,在正文附近展示紧凑的颜色标记和角色名,例如 ● 角色 1;不直接向用户展示裸数字 ID 或 [Speaker N]
  • 没有可靠归属的字幕显示 未分配,使用中性色并进入可筛选状态。
  • 多人重叠字幕同时展示多个角色标签;第一个角色标记为主要角色,但不得丢弃其他角色信息。
  • 没有说话者元数据的普通字幕保持当前界面和流程,不增加额外操作负担。

2. 单句纠正:点击角色标签即可分配

  • 点击字幕行的角色标签,打开轻量选择菜单:现有角色、未分配新建角色
  • 选中后立即更新该句;角色操作进入现有撤销/重做栈。
  • 多人重叠字幕可增加或移除角色,并明确哪个是主要角色。
  • 新建角色默认按顺序命名为 角色 N,用户可稍后改名,不在当前动作中强制填写表单。

3. 角色管理:集中处理命名和批量错误

在校对台现有工具区提供“角色”入口,打开侧栏或弹层,按角色列出:颜色、名称、字幕句数。

支持:

  • 重命名:修改后所有关联字幕即时同步。
  • 修改颜色:从有限、可区分且兼顾深浅主题的色板选择;颜色仅作为辅助信息,名称始终可见。
  • 定位/筛选:只看当前角色的字幕。
  • 移动全部字幕:把该角色的所有字幕归到另一个角色。
  • 合并角色:选择目标角色,确认影响的字幕数量后合并;字幕正文和时间轴不变。
  • 删除空角色:仅允许删除没有关联字幕的角色;有字幕时引导先移动或合并。

批量操作必须展示影响范围,并支持撤销;避免把“合并角色”和“合并字幕段”混为一谈。

4. 快速检查与导出

  • 在现有字幕筛选能力上增加:全部、具体角色、未分配多人重叠
  • 保存时将角色名/颜色/归属写入 sidecar 元数据,默认不修改字幕正文。
  • 导出字幕时提供明确选项:不写入角色名(默认)在字幕中写入角色名。后者使用用户可见名称,不再以技术性的 [Speaker N] 作为唯一表达。
  • 翻译、AI 优化和 TTS 处理正文时不得把角色标签当作需处理/朗读的内容。

数据与兼容性建议

在现有 speakerIds 上增加独立的角色名册,保持“不可变 ID”和“可编辑名称”分离:

interface SpeakerInfo {
  id: number;
  displayName: string; // 默认“角色 1”
  color?: string;      // 稳定的语义色标识
}

interface ProofreadDataFileV2 {
  version: 2;
  meta: ProofreadDataMeta;
  speakers: SpeakerInfo[];
  cues: ProofreadDataCue[]; // 继续使用 speakerIds
}
  • 读取 v1 sidecar 时,根据全部 cue 的 speakerIds 自动生成名册,不要求用户手工迁移。
  • 保存后可升级为 v2;角色重命名不得改写 cue 的稳定 ID。
  • 未分配 是产品状态,不应伪造为一个真实说话者 ID。
  • 多角色 cue 保留完整 speakerIds;主要角色用于列表主展示及后续默认配音。
  • 角色数据需要在拆分、合并、删除、时间调整、重新对齐、保存和恢复后保持一致。

验收标准

  • 当校对数据包含 speakerIds 时,系统应在对应字幕行显示稳定颜色和用户可读角色名。
  • 当用户首次打开只有数字 ID 的旧数据时,系统应自动生成 角色 N 名称且不要求额外设置。
  • 当用户从字幕行修改角色时,系统应立即更新该句,并允许通过撤销/重做恢复。
  • 当用户重命名角色时,系统应更新所有关联行的展示和持久化名册,不修改字幕正文。
  • 当用户合并角色或移动全部字幕时,系统应先显示目标角色及影响句数,确认后保留原字幕文本和时间。
  • 当 cue 包含多个 speakerIds 时,系统应展示全部角色并允许修改主要角色,不静默丢失重叠信息。
  • 当字幕没有角色归属时,系统应显示并可筛选 未分配,且用户可从该状态直接完成分配。
  • 当输入没有 sidecar 或任何说话者信息时,校对台应保持现有单角色体验。
  • 当保存并重新打开项目时,角色名称、颜色、字幕归属和多人重叠信息应完整恢复。
  • 当导出选择“不写入角色名”时,字幕正文不得出现角色前缀;选择写入时应使用当前显示名称。
  • 所有新增操作均应支持键盘焦点、可读标签和深浅主题,不得只依赖颜色传达角色。

实施拆分

  • 定义 SpeakerInfo 和 sidecar v2,并实现 v1 兼容读取/迁移测试。
  • 在校对字幕行增加角色标签、未分配和多人重叠状态。
  • 实现单句角色选择、新建角色及主要角色调整,并接入撤销/重做。
  • 实现角色管理入口:重命名、颜色、筛选、移动全部、合并和删除空角色。
  • 完善保存/恢复、字幕导出和下游正文清洗逻辑。
  • 补充组件交互、数据迁移、批量操作和端到端回归测试。

非目标

  • 不做声纹注册、真实人物身份识别或自动猜测人物姓名。
  • 不做人脸识别或通过画面绑定角色。
  • 不在本阶段重做完整多轨时间线或增加角色统计仪表盘。
  • 不要求用户预先填写准确说话者数量;识别结果始终允许纠正。

依赖与关联

同类产品实践参考

  • ElevenLabs Transcript Editor:角色颜色、单段重新分配、批量 Move Segments To、角色增删和撤销。
  • AssemblyAI Speaker Diarization:短句、串音、噪声和相似音色会影响准确率;不确定时应提供低成本纠错,而非把自动标签包装成确定身份。

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