# Speaker Labeling

视频里有几个人说话、要区分是谁在说或给说话人标名字时用：没区分说话人的文稿按声纹重新转录并区分，再从文稿与来源信息里找证据给每位起真名，写回转写的...

- Repository: https://github.com/JimLiu/baocut (1645 stars)
- Category: Engineering
- License: see repository
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add JimLiu/baocut --skill speaker-labeling -g -a claude-code -y`
Codex: `npx skills add JimLiu/baocut --skill speaker-labeling -g -a codex -y`
Cursor: `npx skills add JimLiu/baocut --skill speaker-labeling -g -a cursor -y`
Gemini CLI: `npx skills add JimLiu/baocut --skill speaker-labeling -g -a gemini-cli -y`

## Description

视频里有几个人说话、要区分是谁在说或给说话人标名字时用：没区分说话人的文稿按声纹重新转录并区分，再从文稿与来源信息里找证据给每位起真名，写回转写的 speakers。只改说话人，不改正文的字。只有一个人说话、或用户只要校对错字时不用。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 说话人标注

用户要的是：文稿里每句话前面是真名，字幕上看得出谁在说，导出的文稿和配音按人分开。这件事分两步：先分清有几个声音、每句归谁（区分），再给每个声音一个真名（标注）。区分靠语音模型，标注靠证据，两步都不靠猜。

最容易做坏的样子是猜：看到简介里列了两位嘉宾，就把「说话人 1」「说话人 2」按顺序填上去。猜错的名字会出现在每一条字幕和每个导出的文件里，用户往往要看到很后面才发现，比留着「说话人 1」糟得多。

## 1. 先看现状

用 videos_inspect 找到这个视频的转写（kind 为 speech 的文档；有几份时按来源素材对上用户说的那段），再 documents_read 读它：

- 正文的 `speakers[]` 列出每位说话人的 id 和 name，每个词带说话人。
- **已经区分过**（有两位及以上说话人）：跳到第 3 节，只做标注。
- **没区分**（只有一位，或词上没有说话人），但用户说视频里不止一个人：做第 2 节。
- 用户只想换名字、不想重跑时，也只做第 3 节。

## 2. 区分：按声纹重新转录

区分要重新转录，并取代当前文稿，不另建一份。这一步会丢掉用户在文稿里手改过的字，所以先说清楚再做：

1. 先告诉用户：重新转录会取代当前文稿，之后在文稿里手改过的字会被丢掉；译文、字幕与配音会按新文稿结转。用户同意再继续。
2. 用 transcribe 给这个视频、`diarize` 为 true、`target` 为 replace；语言与提示（人名、术语）沿用这份文稿的，用户给了新的就用新的。
3. 模型不能区分时任务照常完成，结果带 `diarization-unavailable` 警告：告诉用户这个模型分不了说话人，要装「说话人区分」模型包或换能区分的模型；不要假装区分好了。
4. 文稿转录之后被用户改过时，取代会以 `TRANSCRIPT_EDITED` 拒绝：把这一点告诉用户，用户确认丢掉那些修改，才加 `acceptEdited` 重来。
5. 任务完成后重新 documents_read，看分出了几位、每位说了多少。

## 3. 标注：给每位起名字

动手前先把每位说话人的证据找齐，再一起定名字：

- **占位名**：转写流程自动起的「说话人 n」及它在别的界面语言里的对应（`Speaker 1`、`Sprecher 1` 这类「说话人 + 编号」）、识别服务给的编号标签（`SPEAKER_00`、`S1`、`spk-1`），以及名字为空或等于 id 的。别的名字是用户起的，不动。
- **证据从哪来**：文稿开头一段；每位说话人第一次开口前后的几句；来源素材的标题、发布者与简介（videos_inspect 的 `assets[].source`）；画面上的姓名条：用 videos_frames 取开头一两分钟和每位首次开口处的几帧看，姓名条要明确标着这一位在说话，画面上随便出现的名字不算。
- **什么算证据**：自我介绍（「我是……」「my name is …」）；对方引介（「今天请到了……」「welcome, …」）；被点名后紧接着这一位的回应；签名式的收尾；来源信息唯一地指明了其中一位。元数据里列出几位嘉宾、但分不出哪个声音是谁时，还要文稿里的证据。发言顺序、说话人编号、话题本身都不算；反过来，标题或简介点出了参与者时更要逐位找证据，把名字对到声音上。
- **名字怎么写**：材料里实际用的形式，通常是全名，没有全名时用出现的那种；保留原来的文字与拼写，不翻译、不音译；不加头衔、敬称、机构、括号、引号或说明；不超过 40 个字符。没有名字、但明确说了角色（主持人、采访者、旁白）时可以用简短的角色标签；不能只凭对话的样子编一个角色。
- **不猜**：拿不准就保留占位名。
- **一人几个 id**：区分可能把同一个人拆成几个 id，或把两个人并成一个。各自有证据时给几个 id 同一个名字，不合并 id；声音差别大、拿不准是不是同一个人时，先问用户。

对比一下（只是示意）：

不好：简介写着「嘉宾：张三、李四」，于是「说话人 1」改成张三、「说话人 2」改成李四。

好：00:12 主持人说「今天请到了张三」，紧接着「说话人 2」答「大家好」，所以「说话人 2」是张三；「说话人 1」一直在提问、没人叫过他的名字，简介也没写主持人是谁，保留占位名，或按用户的意思标成「主持人」。

## 4. 先确认，再写回

The rest: https://github.com/JimLiu/baocut/blob/HEAD/skills/baocut/built-in-skills/speaker-labeling/SKILL.md
