| name | podcast-transcribe |
| description | 播客音频转逐字稿。作者:Flyinheart。将播客网页 URL 转为完整逐字稿,包含下载、切分、Whisper 转写(Large-V3)、断点续传、合并、LLM 清洗全流程。触发场景:用户发送播客链接并要求转写、生成逐字稿、整理录音内容。处理平台:小宇宙、喜马拉雅等播客网站。 |
播客转逐字稿
将播客音频转为可读的逐字稿,包含完整工作流。
设计目的
这个音频转逐字稿的目的是:
- 保存精彩内容:把播客中很精彩、很有思想内容、很有世界观方法论的内容固定下来。因为播客时间太长(1-2小时),精彩观点可能只集中在某几分钟或几十分钟
- 延续讨论:节目中嘉宾没有讨论到或阐述不清楚的地方,可以把逐字稿喂给 AI,让用户可以继续讨论或深入探讨
工作流
1. 用户提供播客网页 URL + 对话人信息(选填)
2. 解析音频下载地址并下载
3. 音频切分(>1小时切40分钟/段)
4. Whisper Large-V3 逐段转写
5. 断点续传(检测已完成的 part)
6. 合并所有段落
7. 搜索嘉宾及节目信息(区分发言人)
8. LLM 清洗(结合搜索信息,标注发言人)
9. 输出到 podcasts/ 目录
用户输入示例:
用户:帮我转写这个播客 https://xxx.com/episode/xxx 对话人是李继刚和孟岩
Step 1: 下载音频
用户输入
用户需要提供:
- 播客网页 URL(必填)
- 对话人信息(选填,但建议提供)
对话人信息格式
用户:这是李继刚对话孟岩的播客
或者:
对话人:李继刚(也叫继刚)、孟岩(也叫老孟)
作用:Whisper 可能识别错人名,清洗时需要知道正确的人名来修正。
小宇宙
从 URL 提取 episode ID,构造下载链接:
https://www.xiaoyuzhoufm.com/episode/{episode_id}
页面包含音频直链,用 web_fetch 或 exec curl 下载。
其他平台
用 web_fetch 获取页面,找到 audio/m4a/mp3 链接,用 curl 下载。
保存位置
{workspace}/podcasts/{EP编号}_{标题}.m4a
Step 2: 音频切分
规则
- ≤1小时:不分段
-
1小时:切约40分钟/段(2400秒)
命令
ffmpeg -i input.m4a -ss 0 -to 2400 -c copy part1.m4a
ffmpeg -i input.m4a -ss 2400 -to 4800 -c copy part2.m4a
输出
分段保存到 {workspace}/podcasts/split/
Step 3: Whisper 转写
模型
- 必须用:
large-v3(其他模型中文支持差)
- 参数:
language="zh", fp16=False
命令
import whisper
model = whisper.load_model("large-v3", device="cpu")
result = whisper.transcribe(model, audio_file, language="zh", fp16=False)
Step 4: 断点续传
检测逻辑
- 启动时检查每个 part 的输出文件
- 如果文件存在且 >1KB,跳过
- 从第一个未完成的 part 开始
实现
for i in range(1, total_parts + 1):
output_file = f"part{i}.txt"
if os.path.exists(output_file) and os.path.getsize(output_file) > 1024:
print(f"Part {i} 已完成,跳过")
continue
失败处理
如果某个 part 转写失败(进程被 kill):
- 提示用户"进程被系统终止"
- 自动重启脚本,从出问题的 part 继续
Step 5: 合并
所有 part 依次合并为一个文件:
{EP}_{标题}_逐字稿.txt
Step 6: 搜索嘉宾及节目信息(用于区分发言人)
目的:Whisper 无法按音色区分发言人,需要通过搜索节目信息来辅助区分谁说了什么。
搜索来源
- 小宇宙节目页:搜索播客节目主页,获取节目简介、嘉宾介绍
- 小宇宙单集详情:获取单集 description、章节信息、时间轴
- 搜索引擎:搜索节目名称 + 嘉宾名字,获取更多背景信息
搜索关键词模板
根据用户提供的对话人信息,构造搜索词:
搜索词:"{节目名} {嘉宾1} {嘉宾2} 播客 简介"
搜索词:"{节目名} 第{EP编号}期 嘉宾"
搜索词:"{嘉宾1} {嘉宾2} 对话 播客"
信息获取方式
使用 web_fetch 或 web_search 获取以下信息:
| 信息类型 | 来源 | 用途 |
|---|
| 节目简介 | 小宇宙节目页 | 了解节目定位 |
| 嘉宾介绍 | 小宇宙/搜索引擎 | 确认嘉宾身份 |
| 章节/时间轴 | 小宇宙单集详情 | 对照时间戳 |
| 节目官网 | 搜索引擎 | 获取更全信息 |
保存信息
搜索到的信息保存为 {EP}_节目信息.txt,供清洗时使用。
Step 7: LLM 清洗(由 Agent 在对话中完成)
重要:清洗步骤由 Agent 在当前对话中调用自己的模型完成,不需要额外配置。
清洗流程
- 转写和合并完成后,先执行 Step 6 搜索节目信息
- 把以下信息一起发给模型:
- 模型输出清洗后的内容(带发言人标注)
- 保存为
{文件名}_清洗.txt
清洗 Prompt(结合搜索信息的增强版)
你是一个专业的文字编辑,擅长整理对话录音。
请整理以下逐字稿,遵循以下规则:
1. **删除语气助词**:嗯、啊、这个、那个、然后、其实、就是、基本上、大概等
2. **去除口水话**:重复的表述、口齿不清的碎片
3. **完善修正表达**:只保留最终正确的表达
4. **整理逻辑顺序**:重新排列使其符合逻辑
5. **保留核心**:人名、专业术语、关键观点、具体数据必须保留
## 关键:根据节目信息区分发言人
请结合以下搜索到的节目信息,与逐字稿内容进行比对,推断每句话是谁说的,标注在话术前面。
【重要】如果无法确定是谁说的,根据上下文逻辑推断,并用"【推测:XXX】"标注。
节目/嘉宾信息:
[粘贴 Step 6 搜索到的所有节目信息]
逐字稿内容:
[粘贴原始逐字稿]
输出格式示例:
【李继刚】:我们今天来聊聊...
【孟岩】:好啊,我也想听听...
【主持人】:欢迎各位来到...
【推测:嘉宾A】:根据上下文推断...
请直接输出整理后的内容,不要添加任何评论。
分段处理(逐字稿超过 10万字)
如果逐字稿超过 10万字,按以下流程处理:
第一步:分段总结(每 10000 字一段)
请阅读以下逐字稿片段,总结其中的核心观点和关键信息。
结合以下节目信息推断发言人:
[粘贴搜索到的节目信息]
要求:
- 用简洁的语言概括这段内容的要点
- 保留关键数据和核心观点
- 不要口水话
- 根据节目信息自行判断并标注发言人(格式:【名字】:内容)
逐字稿内容:
[粘贴这段的逐字稿]
第二步:合并总结并整体清洗
你是一个专业的文字编辑,擅长整理对话录音。
请整理以下多段总结,遵循以下规则:
1. **删除语气助词**:嗯、啊、这个、那个、然后、其实、就是、基本上、大概等
2. **去除口水话**:重复的表述、口齿不清的碎片
3. **完善修正表达**:只保留最终正确的表达
4. **整理逻辑顺序**:重新排列使其符合逻辑
5. **保留核心**:人名、专业术语、关键观点、具体数据必须保留
请直接输出整理后的内容,不要添加任何评论。
分段总结内容:
[粘贴所有分段总结]
失败处理
如果清洗失败,明确提示用户:"LLM 清洗失败,可查看原始逐字稿"
处理长文本(超长逐字稿)
如果逐字稿超过 10万字,直接清洗会超出模型上下文限制。需要采用分段清洗策略:
- 分段:每 10000 字一段
- 分段总结:每段先单独总结要点
- 合并总结:把所有段的总结合并
- 整体清洗:再对合并后的总结进行清洗
这样可以处理任意长度的逐字稿,不会丢失内容。
输出格式
支持两种格式:
- TXT:
{EP}_{标题}_逐字稿.txt
- Markdown:
{EP}_{标题}_逐字稿.md
额外功能:按时间段提取核心内容
用户可以指定一个时间范围(如 10:30 - 15:00),从逐字稿中提取该时间段的内容,并让 AI 提炼核心观点。
设计目的
- 保存精彩内容:播客时间太长(1-2小时),精彩观点可能只集中在某几分钟或几十分钟,逐字稿把这些内容固定下来
- 延续讨论:节目中嘉宾没有讨论到或阐述不清楚的地方,可以把逐字稿喂给 AI,让用户可以继续讨论或深入探讨
使用方式
- 逐字稿中有时间戳格式:
[0.0s -> 2479.9s] 内容
- 用户指定时间段后,Agent 筛选该时间范围内的内容
- 调用模型提炼核心内容
提取 Prompt
请阅读以下时间范围内的逐字稿内容,然后提炼出核心观点和关键信息。
要求:
- 根据用户需求决定总结的详细程度
- 保留关键数据、核心观点、独特见解
- 不要口水话和重复表达
时间段:[用户指定的时间范围]
逐字稿内容:
[该时间段的文字]
示例
- 用户说:"帮我提取 10:30 到 15:00 这段的核心内容" → 提炼该时间段的核心观点
- 用户说:"我想深入讨论 20:00-25:00 这个观点" → 提取该时间段内容,方便继续交流
错误处理汇总
| 场景 | 处理 |
|---|
| 下载失败 | 让用户提供其他 URL |
| 音频切分失败 | 提示用户检查文件 |
| Whisper 被 kill | 提示"进程被系统终止",自动断点续传 |
| 合并失败 | 提示用户检查各 part 文件 |
| 清洗失败 | 明确提示用户,可查看原始稿 |
依赖