원클릭으로
podcastcut-content
播客内容剪辑。生成带说话人和时间戳的逐字稿,AI标记建议删除的内容(寒暄、跑题、啰嗦、隐私)。触发词:内容剪辑、剪内容、content edit
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
播客内容剪辑。生成带说话人和时间戳的逐字稿,AI标记建议删除的内容(寒暄、跑题、啰嗦、隐私)。触发词:内容剪辑、剪内容、content edit
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
使用 browser-use CLI 对 PodcastCut webapp 做浏览器验收。始终使用 headed 模式,覆盖打开页面、登录、上传指定音频、触发生成审查稿、刷新审查稿、手动标记删除、确认剪辑、核对 workspace 产物。触发词:browser validation、浏览器验证、用 browser-use 跑流程、上传音频验收
生成播客审查画布数据。根据当前工作区中的音频、转录、QA 报告和剪辑结果, 产出固定格式的 review_data.json,供右侧审查画布直接读取。 触发词:审查画布、review data、审查稿、生成播客审查
语音克隆 + 播客生成完整流程。 上传音频 → 转录 → 修正文稿 → 提取声音样本 → 克隆声音模型 → TTS 合成 → 合并成品音频。 全自动执行,无需用户逐步操作。 触发词:语音克隆、声音克隆、生成播客、克隆声音
音频剪辑。根据 delete_segments.json 删除指定片段,自适应淡入淡出,可选说话人音量对齐。触发词:剪辑、cut、编辑音频
将当前 webapp 发布到 Fly.io,并在发布前后做最小健康检查。 适用于前端或后端改动后的一键上线。触发词:deploy、发布、上线、推到 fly、fly.io
使用 browser-use CLI 对 webapp 做端到端验证。覆盖登录、上传音频、生成 review_data.json、刷新审查稿、手动标记删除、确认剪辑、验证 podcast_cut.mp3。触发词:browser e2e、端到端验证、验证网页剪辑、用浏览器跑流程
| name | podcastcut-content |
| description | 播客内容剪辑。生成带说话人和时间戳的逐字稿,AI标记建议删除的内容(寒暄、跑题、啰嗦、隐私)。触发词:内容剪辑、剪内容、content edit |
生成逐字稿 → 生成审查稿(话题级大纲 + 句子级删除建议)→ 用户审核 → 执行剪辑
用户: 帮我剪掉播客里的废话
用户: 内容剪辑
用户: 生成逐字稿,标记要删的内容
["Maia", "响歌歌", "安安"]注意:不单独输出逐字稿文件,审查稿已包含完整逐字稿
| 层级 | 位置 | 粒度 | 适用场景 |
|---|---|---|---|
| 话题级 | 审查稿 第一部分(内容大纲) | 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 聚焦内容层面:什么该删、什么该留,是语义判断,删除整句。 口误识别是技术层面:需要更精细的规则(重复字、停顿模式),使用字符级时间戳。
为什么这样分工?
| 类型 | 标记 | 示例 |
|---|---|---|
| 片头寒暄 | [删除: 片头寒暄] | "开始了吗?" "能听到吗?" |
| 片尾闲聊 | [删除: 片尾闲聊] | "好,那就这样" "拜拜" |
| 录制相关 | [删除: 录制相关] | "这段重录" "等下剪掉" |
| 跑题内容 | [删除: 跑题] | 与主题无关的讨论 |
| 啰嗦重复 | [删除: 啰嗦] | 大段重复表达同一观点 |
| 隐私-公司 | [删除: 隐私-公司名] | "我在Google工作" |
| 隐私-人名 | [删除: 隐私-人名] | "我同事张三说" |
| 隐私-地点 | [删除: 隐私-地点] | "我住在xxx" |
| 长静音 | 审查稿第二部分单独列出 | 3秒以上的无声片段 |
| 类型 | 说明 |
|---|---|
| 口头禅/语气词 | "嗯"、"就是说"、"然后"、"对对对" |
| 口误 | 说错了重说 |
| 短停顿 | 句中小停顿(< 3秒) |
注意:大段静音(≥3秒)由本 Skill 处理,短停顿由 /podcastcut-transcribe 处理。
为什么口头禅不在这里处理? 口头禅的识别需要更精细的规则(连续重复、停顿模式),属于技术层面而非内容语义。
关键词匹配不够用! 基于规则的方法无法识别:
必须用 Claude 分段分析逐字稿,质量为先。
1. 将逐字稿按15分钟分段
2. 每段发送给 Claude 分析,识别建议删除的内容
3. Claude 返回:句子索引 + 删除类型 + 原因
4. 合并所有段的结果,生成审查稿
对每段逐字稿,使用以下 prompt:
你是播客内容审核助手。分析以下逐字稿,识别建议删除的句子。
## 删除类型
1. **片头寒暄**:正式开场("大家好")之前的闲聊、技术调试
2. **录制讨论**:讨论剪辑、录制状态、技术问题、"这段要不要剪"
3. **隐私-公司名**:提到具体公司名(Google、Meta、字节等)
4. **隐私-学校名**:提到具体学校名(Stanford、清华等)
5. **隐私-地点**:提到具体地点(Palo Alto、硅谷等)
6. **隐私-人名**:提到具体人名(非公众人物)
7. **跑题/闲聊**:与播客主题无关的讨论(个人背景闲聊、地理讨论等)
8. **啰嗦重复**:同一观点反复说、大段重复
## 输出格式
对每个建议删除的句子,输出:
- 句子时间戳
- 删除类型
- 原因(简短说明)
只标记需要删除的句子,不需要标记的跳过。
## 逐字稿
{transcript_segment}
| 类型 | 识别要点 |
|---|---|
| 片头寒暄 | 正式开场前的所有内容,包括技术调试、聊天 |
| 录制讨论 | "剪掉"、"录上了吗"、"这段太敏感"、"回头剪" |
| 隐私信息 | 公司名、学校名、地点、人名 |
| 跑题/闲聊 | 与主题无关:住哪里、哪年来的、学校怎么样 |
| 啰嗦重复 | 同一意思说3遍以上 |
嘉宾介绍后的闲聊特别容易漏检,注意这些信号:
不只在片头! 全程可能出现:
使用 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 # 审查稿(包含完整逐字稿 + 删除标记)
⚠️ 只输出审查稿,不单独输出逐字稿
审查稿第四部分"正文"就是完整逐字稿,无需重复输出。
{
"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},
...
]
}
用户可能直接在审查稿中修改删除标记(添加/移除删除线),此时删除清单会过时。
规则:
podcast_删除清单.json解析方法:扫描审查稿中 ~~删除线~~ 标记的文本,匹配 transcript.json 中的时间戳。
/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 可能不一致 |
启动时创建:
- [ ] 转录音频(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
执行剪辑...
podcast_逐字稿.md,明确只输出审查稿~~删除线~~,然后说「按审查稿剪」sentence_info
model="paraformer-zh" + spk_model="cam++" + sentence_timestamp=True/podcastcut-transcribe(字符级)timestamp_granularity="character" 获取字符级时间戳~~嗯,这个要就是具体为什么...~~,删除清单只有 嗯,~~删除线~~ + [删除: 原因] 内联标记/podcastcut-transcribe 处理/podcastcut-edit