podcastcut-content

📁 luoyuweidu1/podcastcut-skills 📅 7 days ago
2
总安装量
2
周安装量
#73646
全站排名
安装命令
npx skills add https://github.com/luoyuweidu1/podcastcut-skills --skill podcastcut-content

Agent 安装分布

amp 2
gemini-cli 2
antigravity 2
codex 2
kimi-cli 2

Skill 文档

内容剪辑

生成逐字稿 → 生成审查稿(话题级大纲 + 句子级删除建议)→ 用户审核 → 执行剪辑

快速使用

用户: 帮我剪掉播客里的废话
用户: 内容剪辑
用户: 生成逐字稿,标记要删的内容

输入

  • 音频/视频文件
  • (可选)说话人名字列表,如 ["Maia", "响歌歌", "安安"]

输出

  1. 审查稿 – 一个文件包含:内容大纲 + 完整逐字稿 + 删除标记
  2. 确认后 – 执行剪辑

注意:不单独输出逐字稿文件,审查稿已包含完整逐字稿

两个层级配合使用

层级 位置 粒度 适用场景
话题级 审查稿 第一部分(内容大纲) 5-30分钟/块 快速粗剪,删除整段跑题/闲聊
句子级 审查稿 第三部分(正文) 逐句内联标记 精细调整,查看上下文

流程

1. 转录音频(FunASR + 句子级时间戳 + 说话人分离)
    ↓
2. 静音检测(FFmpeg silencedetect,识别大段空白)
    ↓
3. 生成逐字稿(带说话人标签)
    ↓
4. AI分析:识别话题结构 + 标记建议删除
    ↓
5. 输出审查稿(内容大纲 + 静音片段 + 删除建议)
    ↓
【用户在审查稿上直接修改删除标记】
    ↓
6. 执行剪辑 → /podcastcut-edit(从审查稿解析删除标记)

技术说明

功能 实现
转录 FunASR(必须用完整模型路径,见下方代码)
时间戳 句子级(自动返回 sentence_info)
说话人分离 FunASR 内置 CAM++ 模型
静音检测 FFmpeg silencedetect(阈值 -40dB,最小时长 3s)

⚠️ 转录必须使用脚本

不要自己写代码,直接调用现成脚本:

# 转录(输出 podcast_transcript.json)
python ~/.claude/skills/podcastcut-content/scripts/transcribe.py <音频文件> <输出目录>

# 生成逐字稿(输出 podcast_逐字稿.md)
python ~/.claude/skills/podcastcut-content/scripts/generate_transcript.py \
    <transcript.json> <输出.md> '{"0":"响歌歌","1":"麦雅","2":"安安"}'

为什么不能自己写? FunASR 必须使用完整模型路径 + VAD + Punc + Speaker 四个模型才能获取 sentence_info。简化写法(如 model="paraformer-zh")会导致转录失败。

性能参考、常见问题见 tips/转录最佳实践.md

为什么用句子级而非字符级? 字符级 + 说话人分离在长音频上不稳定(OOM、对齐错误)

本 Skill 只删除整句,更精细的删除(半句、语气词)留给 /podcastcut-transcribe


逐字稿格式

**Maia** 00:05
开始了。

**响歌歌** 00:06
是吗?

**Maia** 00:08
开心的OK。Hello,大家好,欢迎来到今天的5点1刻,我是主播Maia。今天我们聊点开心的话题。

**响歌歌** 00:20
我是主播响歌歌。好的,那我们开始吧。

格式规则

元素 格式
说话人 **名字** 加粗
时间戳 MM:SS 或 HH:MM:SS(说话人开始时间)
内容 同一说话人的内容连在一起,不逐句换行
换人 空一行

审查稿格式

审查稿整合了话题级大纲和句子级删除建议,一个文件完成审核。

# 播客审查稿

**文件**: podcast.mp3
**总时长**: 2:08:07

---

## 一、内容大纲(话题级)

| # | 话题 | 时间 | 时长 | AI建议 | 原因 |
|---|------|------|------|--------|------|
| 1 | 片头寒暄 + 技术调试 | 00:00 - 04:45 | 04:45 | 🗑️ 删除 | 录制准备、技术问题 |
| 2 | 正式开场 + 嘉宾介绍 | 04:45 - 07:00 | 02:15 | ✅ 保留 | 播客正式开始 |
| 3 | 闲聊:嘉宾背景 | 05:48 - 07:01 | 01:13 | 🗑️ 删除 | 与主题无关 |
| 4 | 主题讨论 | 07:01 - 40:00 | 32:59 | ✅ 保留 | 核心内容 |
| 5 | 录制讨论(中间) | 49:59 - 51:13 | 01:14 | 🗑️ 删除 | 讨论剪辑事宜 |

**统计**: 建议保留 2:03:21 | 建议删除 08:12

**操作**: `删除话题 1, 3, 5` 或 `只保留话题 2, 4`

---

## 二、静音片段

| # | 时间 | 时长 | 位置说明 |
|---|------|------|----------|
| 1 | 12:34 - 12:48 | 00:14 | 话题2和话题3之间 |
| 2 | 35:20 - 35:58 | 00:38 | 嘉宾思考停顿 |
| 3 | 1:02:15 - 1:02:45 | 00:30 | 中途断线/静音 |

**统计**: 共 3 处静音,总时长 01:22

**操作**: `删除所有静音` 或 `删除静音 1, 3`(保留2,可能是有意停顿)

---

## 三、统计

- 总句子数: 3390
- 建议删除: 377 处
- 静音片段: 3 处(01:22)

### 按类型

- 片头寒暄: 31处
- 闲聊-个人背景: 23处
- 技术调试: 15处
- 录制讨论: 6处
- 隐私-公司名: 5处
- 隐私-地点: 4处
- 隐私-学校名: 3处

---

## 四、正文(逐字稿 + 删除标记)

**⚠️ 必须包含完整逐字稿,从第一句到最后一句,不能省略任何内容!**

错误做法:`(后续内容为主题讨论,保留...)` ← 不允许!
正确做法:输出所有句子,无论是否标记删除

完整逐字稿,AI建议删除的内容用 ~~删除线~~ 标记并注明原因。同一说话人的内容连在一起,不逐句换行。

**响歌歌** 00:00
~~行呗,对,你们应该没有听到噪音吧。因为我记得好像上一上,上次我们是用这个是有噪音的,就跟那个心理心理咨询那那那次嗯,对,那这次应该好了。~~ `[删除: 片头寒暄]`

**麦雅** 00:23
~~我把这个这个 dog 打开好哦,~~ `[删除: 片头寒暄]`

**安安** 00:27
~~我也打开一下自我介绍。~~ `[删除: 片头寒暄]`

...

**麦雅** 04:50
Hello,大家好,欢迎来到今天的五点一刻,我是主播麦雅。

**响歌歌** 04:58
我是主播响歌歌。

**麦雅** 05:02
今天我们请到了一位特别的嘉宾安安。

**安安** 05:08
大家好,我是安安。

...

**安安** 15:32
~~我之前在Google工作的时候~~ `[删除: 隐私-公司名]` 我之前工作的时候,遇到过类似的情况。

...

**麦雅** 49:59
~~这段要不要剪掉?~~ `[删除: 录制讨论]`

**响歌歌** 50:02
~~嗯,回头看看吧。~~ `[删除: 录制讨论]`

**安安** 50:05
~~我觉得可以保留。~~ `[删除: 录制讨论]`

...

(完整逐字稿继续...)

结构说明

部分 内容 用途
一、内容大纲 话题级表格 快速了解结构,整块删除
二、静音片段 大段空白列表 删除无声段落
三、统计 删除数量按类型汇总 一眼看出删除规模
四、正文 完整逐字稿 + 内联删除标记 查看上下文,逐句审核

话题识别规则

话题类型 识别方式
片头寒暄 正式开场(”大家好”)之前的内容
正式开场 “Hello/大家好” 开始的段落
闲聊 与主题无关的个人背景讨论
主题讨论 围绕播客主题的核心内容
录制讨论 讨论剪辑、内容取舍的段落
片尾 “好,那今天就到这” 等收尾语

删除类型

⚠️ 分工原则

Skill 关注点 处理内容 时间戳粒度
/podcastcut-content 内容语义 片头、跑题、隐私、啰嗦、大段静音 句子级
/podcastcut-transcribe 口误技术 语气词、口误、短停顿、半句删除 字符级

本 Skill 聚焦内容层面:什么该删、什么该留,是语义判断,删除整句。 口误识别是技术层面:需要更精细的规则(重复字、停顿模式),使用字符级时间戳。

为什么这样分工?

  • 句子级转录 + 说话人分离 = 说话人准确
  • 字符级转录 + 说话人分离 = 说话人容易错位(长音频 OOM,分段后合并对齐困难)
  • 先删大段内容(句子级),再精细处理剩余部分(字符级)

内容删除类型(本 Skill 处理)

类型 标记 示例
片头寒暄 [删除: 片头寒暄] “开始了吗?” “能听到吗?”
片尾闲聊 [删除: 片尾闲聊] “好,那就这样” “拜拜”
录制相关 [删除: 录制相关] “这段重录” “等下剪掉”
跑题内容 [删除: 跑题] 与主题无关的讨论
啰嗦重复 [删除: 啰嗦] 大段重复表达同一观点
隐私-公司 [删除: 隐私-公司名] “我在Google工作”
隐私-人名 [删除: 隐私-人名] “我同事张三说”
隐私-地点 [删除: 隐私-地点] “我住在xxx”
长静音 审查稿第二部分单独列出 3秒以上的无声片段

口误删除类型(由 /podcastcut-transcribe 处理)

类型 说明
口头禅/语气词 “嗯”、”就是说”、”然后”、”对对对”
口误 说错了重说
短停顿 句中小停顿(< 3秒)

注意:大段静音(≥3秒)由本 Skill 处理,短停顿由 /podcastcut-transcribe 处理。

为什么口头禅不在这里处理? 口头禅的识别需要更精细的规则(连续重复、停顿模式),属于技术层面而非内容语义。


AI分析方法

⚠️ 必须使用 Claude 做语义分析

关键词匹配不够用! 基于规则的方法无法识别:

  • 语义层面的跑题/闲聊(没有明显关键词)
  • 嘉宾背景介绍后的闲聊(住在哪里、哪年毕业、学校怎么样)
  • 隐藏的录制讨论(没有”剪掉”等关键词)

必须用 Claude 分段分析逐字稿,质量为先。

分析流程

1. 将逐字稿按15分钟分段
2. 每段发送给 Claude 分析,识别建议删除的内容
3. Claude 返回:句子索引 + 删除类型 + 原因
4. 合并所有段的结果,生成审查稿

Claude 分析 Prompt

对每段逐字稿,使用以下 prompt:

你是播客内容审核助手。分析以下逐字稿,识别建议删除的句子。

## 删除类型

1. **片头寒暄**:正式开场("大家好")之前的闲聊、技术调试
2. **录制讨论**:讨论剪辑、录制状态、技术问题、"这段要不要剪"
3. **隐私-公司名**:提到具体公司名(Google、Meta、字节等)
4. **隐私-学校名**:提到具体学校名(Stanford、清华等)
5. **隐私-地点**:提到具体地点(Palo Alto、硅谷等)
6. **隐私-人名**:提到具体人名(非公众人物)
7. **跑题/闲聊**:与播客主题无关的讨论(个人背景闲聊、地理讨论等)
8. **啰嗦重复**:同一观点反复说、大段重复

## 输出格式

对每个建议删除的句子,输出:
- 句子时间戳
- 删除类型
- 原因(简短说明)

只标记需要删除的句子,不需要标记的跳过。

## 逐字稿

{transcript_segment}

删除类型详解

类型 识别要点
片头寒暄 正式开场前的所有内容,包括技术调试、聊天
录制讨论 “剪掉”、”录上了吗”、”这段太敏感”、”回头剪”
隐私信息 公司名、学校名、地点、人名
跑题/闲聊 与主题无关:住哪里、哪年来的、学校怎么样
啰嗦重复 同一意思说3遍以上

闲聊检测重点

嘉宾介绍后的闲聊特别容易漏检,注意这些信号:

  • 突然出现地名、学校名、年份
  • “你在哪个area” “你是哪年来的” “那边怎么样”
  • 连续多句讨论非主题内容(地理、学校、城市比较)

录制讨论检测重点

不只在片头! 全程可能出现:

  • 技术问题:”能听见吗”、”断了”、”耳机没电”
  • 内容顾虑:”太低调了”、”不想share”、”细节不说”
  • 剪辑讨论:”回头剪掉”、”这段要不要”

静音检测方法

使用 FFmpeg 的 silencedetect 滤镜检测大段空白。

检测命令

ffmpeg -i video.mp4 -af "silencedetect=noise=-40dB:d=3" -f null - 2>&1 | grep silencedetect
参数 说明 推荐值
noise 静音阈值(低于此音量视为静音) -40dB
d 最小静音时长(秒) 3(内容剪辑关注大段空白)

输出解析

[silencedetect @ 0x...] silence_start: 752.341
[silencedetect @ 0x...] silence_end: 766.512 | silence_duration: 14.171

解析 silence_start 和 silence_end 生成静音片段列表。

阈值选择

场景 noise d(最小时长)
内容剪辑(本Skill) -40dB 3秒
口误识别(精细) -50dB 0.5秒

为什么用 3 秒? 短于 3 秒的停顿可能是自然的思考间隙,不建议删除。


输出文件

podcast_transcript.json        # 句子级时间戳 + 说话人(供剪辑使用)
podcast_审查稿.md              # 审查稿(包含完整逐字稿 + 删除标记)

⚠️ 只输出审查稿,不单独输出逐字稿

审查稿第四部分”正文”就是完整逐字稿,无需重复输出。

句子级 JSON 格式

{
  "file": "podcast.mp3",
  "duration": 3600.5,
  "sentences": [
    {"text": "大家好,", "start": 0.50, "end": 1.20, "spk": 0},
    {"text": "欢迎来到今天的播客。", "start": 1.20, "end": 2.80, "spk": 0},
    {"text": "我是主播小明。", "start": 2.80, "end": 3.90, "spk": 1},
    ...
  ]
}

⚠️ 审查稿和删除清单必须同步

用户可能直接在审查稿中修改删除标记(添加/移除删除线),此时删除清单会过时。

规则:

  1. 审查稿是用户审核的最终来源
  2. 执行剪辑前,从审查稿重新解析删除标记
  3. 不要依赖可能过时的 podcast_删除清单.json

解析方法:扫描审查稿中 ~~删除线~~ 标记的文本,匹配 transcript.json 中的时间戳。


与其他 Skill 的关系

/podcastcut-content     → 内容剪辑(语义层面)← 本 Skill
/podcastcut-edit        → 执行剪辑
/podcastcut-transcribe  → 口误识别(技术层面,可选)
/podcastcut-subtitle    → 生成字幕

推荐流程:

原始视频
    ↓
/podcastcut-content  ← 标记大段内容(寒暄、跑题、啰嗦、隐私)
    ↓
/podcastcut-edit     ← 执行删除,输出 v2
    ↓
【可选】还需要处理口误?
    ↓ 是
/podcastcut-transcribe  ← 识别口误、语气词、静音
    ↓
/podcastcut-edit        ← 执行删除,输出 v3
    ↓
完成

为什么先删内容再处理口误?

  • 大段内容删除后,视频变短
  • 口误识别的转录更快,审查范围更小
  • 被删掉的大段里的口误不用处理了

说话人分离

FunASR 内置说话人分离功能(spk_model="cam++"),自动输出说话人ID。

流程

FunASR 转录(启用 spk_model)
    ↓
输出带说话人ID的句子(说话人0、说话人1...)
    ↓
搜索自我介绍确认 ID 对应的真实人名
    ↓
生成审查稿时替换为真实名字

⚠️ 说话人映射确认方法

不要直接用用户提供的顺序! 必须在转录结果中搜索自我介绍短语确认:

# 搜索关键短语确定说话人映射
key_phrases = ["我是主播", "我是xxx", "大家好我是"]
for s in sentences:
    for phrase in key_phrases:
        if phrase in s['text']:
            print(f"spk{s['spk']}: {s['text']}")  # 确认 spk ID 对应谁

常见问题

问题 原因 解决
同一人被分成多个 ID FunASR 识别不稳定 将多个 ID 映射到同一人名
ID 数量多于实际人数 如上 根据自我介绍合并多余 ID
分段转录后 ID 错位 每段 ID 独立重置 优先用整体转录,避免分段

限制

条件 效果
2-10人对话 效果好
音频 < 30s 效果下降
超过10人 效果下降
分段转录 说话人 ID 可能不一致

进度 TodoList

启动时创建:

- [ ] 转录音频(FunASR,句子级 + 说话人分离)
- [ ] 静音检测(FFmpeg silencedetect)
- [ ] 生成逐字稿
- [ ] AI分析:识别话题结构 + 标记建议删除
- [ ] 输出审查稿(含静音片段)
- [ ] 等待用户确认

示例对话

用户: 帮我剪掉播客里的废话,说话人是 Maia 和响歌歌

AI: 好的,我来处理这个播客。
    1. 转录音频...
    2. 静音检测...
    3. 生成逐字稿...
    4. 分析内容...

    已生成审查稿:podcast_审查稿.md

    === 内容大纲(话题级)===
    | # | 话题 | 时长 | AI建议 |
    |---|------|------|--------|
    | 1 | 片头寒暄 | 04:45 | 🗑️ 删除 |
    | 2 | 正式开场 | 02:15 | ✅ 保留 |
    | 3 | 闲聊:嘉宾背景 | 01:13 | 🗑️ 删除 |
    | 4 | 主题讨论 | 32:59 | ✅ 保留 |

    === 句子级统计(按类型)===
    - 片头寒暄:12处
    - 录制讨论:8处
    - 隐私信息:5处
    - 跑题闲聊:3处

    请在审查稿中检查删除标记,调整后告诉我执行剪辑。

用户: [在审查稿中添加/移除了一些删除标记] 好了,按审查稿剪

AI: 好的,从审查稿解析删除标记...
    - 找到 25 处删除标记
    - 删除总时长:06:32
    执行剪辑...

反馈记录

2026-01-31 (深夜)

  • 分段转录导致说话人 ID 错位:分段转录时每段的说话人 ID 独立重置,合并后同一人可能有不同 ID
    • 原因:为避免 OOM 将 2 小时音频分成 13 段,每段说话人 ID 从 0 开始
    • 解决:优先使用整体转录(2 小时音频约 16 分钟,不会 OOM)
    • 已更新:tips/转录最佳实践.md 新增「分段 vs 整体转录」章节
  • FunASR 可能把同一人识别为多个 ID:3 人对话识别出 4 个说话人 ID
    • 表现:响歌歌被分成 spk1(60 句)和 spk3(560 句)
    • 解决:搜索自我介绍短语(”我是主播xxx”)确认映射,将多个 ID 合并
    • 已更新:SKILL.md「说话人分离」章节新增确认方法和常见问题
  • 性能数据更新:2 小时播客实测 16 分钟,3390 句(之前估算 12 分钟、800 句偏低)
    • 已更新:tips/转录最佳实践.md 性能参考表

2026-01-31 (晚上)

  • 审查稿内容不完整:AI 偷懒写了 “(后续内容为主题讨论,保留…)” 而不是完整逐字稿
    • 已更新:在审查稿格式”第四部分”明确标注必须输出完整内容,不允许省略
  • 输出了多余的逐字稿文件:用户只需要一个审查稿(已包含完整逐字稿)
    • 已更新:输出文件章节移除 podcast_逐字稿.md,明确只输出审查稿

2026-01-31

  • 删除”用户确认方式”章节:用户实际操作是直接在审查稿上修改删除标记,不需要命令式操作
    • 旧流程:用户输入「删除话题 1, 3」「删除所有静音」等命令
    • 实际流程:用户在审查稿中添加/移除 ~~删除线~~,然后说「按审查稿剪」
    • 已更新:流程图、示例对话,移除命令式操作说明
  • FunASR 调用参数错误导致转录失败:使用简化模型名无法获取 sentence_info
    • 错误写法:model="paraformer-zh" + spk_model="cam++" + sentence_timestamp=True
    • 正确写法:必须使用完整模型路径 + VAD + Punc 四个模型
    • 原因:SKILL.md 只写了简化参数,实际执行时”自由发挥”用了错误的 API
    • 已更新:在 SKILL.md 中直接包含完整的调用代码,标注错误写法和正确写法对比
    • 教训:可执行的代码必须完整写在 SKILL.md 中,不能只写参数名让 AI 自己拼

2026-01-25

  • 回退到句子级时间戳:字符级 + 说话人分离在长音频上不稳定
    • 问题:字符级转录后合并说话人信息,说话人对齐出错(”是主播麦雅” 被归到响歌歌名下)
    • 原因:
      1. 长音频说话人分离 OOM(2小时音频 → 234MB WAV)
      2. 分段说话人分离返回 0 句子(API 格式问题)
      3. 字符级转录没有标点,句子边界不自然
    • 已更新:回退到句子级时间戳,本 Skill 只删整句
    • 半句删除留给 /podcastcut-transcribe(字符级)

2026-01-24 (晚上)

  • 尝试升级到字符级时间戳:解决句子级无法精确删除部分句子的问题
    • 问题:删除 “嗯,我可以讲一下对” 会连带删除后半句 “这期嘉宾其实想哥哥邀请的”
    • 尝试:使用 30s 分段 + timestamp_granularity="character" 获取字符级时间戳
    • 结果:字符级转录成功,但说话人分离失败,导致说话人对齐错误
    • 最终决定:回退到句子级(见 2026-01-25 反馈)

2026-01-24

  • 新增静音检测功能:使用 FFmpeg silencedetect 识别大段空白(≥3秒),在审查稿中单独列出供用户确认删除
  • 审查稿标记删除但实际没剪掉:审查稿中整句标记删除,但删除清单只有部分内容
    • 案例:审查稿 ~~嗯,这个要就是具体为什么...~~,删除清单只有 嗯,
    • 已更新:强调审查稿和删除清单必须同步,执行剪辑前从审查稿重新解析

2026-01-18 (下午)

  • 逐字稿/审查稿格式调整:同一说话人的内容连在一起,不逐句换行
    • 原格式:每句一行
    • 新格式:同一说话人的所有句子连在一段里
    • 优点:更紧凑,阅读体验更好

2026-01-18

  • 必须使用 Claude 做语义分析:基于规则的关键词匹配质量不够
    • 问题:无法识别语义层面的跑题/闲聊、隐藏的录制讨论
    • 已更新:新增「AI分析方法」章节,明确必须用 Claude 分段分析逐字稿
    • 包含:分析流程、Claude prompt 模板、删除类型详解

2026-01-17 (晚上)

  • 审查稿第二部分格式调整:改为完整逐字稿 + 内联删除标记
    • 原格式:按话题分组 → 每个话题下列出删除建议(表格形式)
    • 新格式:完整逐字稿(正文),删除内容用 ~~删除线~~ + [删除: 原因] 内联标记
    • 优点:保留完整上下文,用户可以看到前后文再决定是否删除

2026-01-17 (下午)

  • 大块删除剪不干净:连续句子都标记删除,但剪辑时逐句删除,保留了句间空白
    • 原因:每句独立处理,没有合并连续同理由的删除
    • 已更新:明确分工,本 Skill 聚焦句子级,语气词/口头禅由 /podcastcut-transcribe 处理
    • 剪辑规则已同步更新到 /podcastcut-edit
  • 不要在句子级标记语气词:句子级时间戳不够精确,删语气词容易误删
    • 已更新:删除类型分为「句子级」和「字符级」,明确分工

2026-01-17 (上午)

  • 录制讨论和技术调试可能出现在播客任何位置,不只是片头
    • 已更新:录制相关检测改为全程检测,增加技术问题关键词和连续段落检测
  • 嘉宾介绍后的闲聊(住在哪、哪年来的、学校怎么样)容易漏检
    • 已更新:跑题/闲聊检测增加信号模式(地名、学校名、年份相关对话)
  • 逐句审核效率低,用户希望能看到全局结构、整块删除
    • 已新增:审查稿整合话题级大纲和句子级删除建议,一个文件完成审核