用 Python AsyncIO 批量转写播客音频,结合语音识别把转写接入内容自动化工作流,节省编辑与运营时间。

用 Python AsyncIO 批量转写播客:省下编辑时间
你可能已经发现了一个现实:播客越做越久,最先爆炸的不是灵感,而是后期流程。每期音频要做转写、提炼亮点、写摘要、出时间戳、给短视频脚本打底——这些事情都不难,但很耗时,而且重复。
我见过不少小团队的“标准操作”是:把 MP3 丢进一个转写工具,等结果出来,再复制到文档里做整理。问题在于,当你从 1 期变成 30 期、从周更变成日更,这套流程就会变成隐形成本:等待时间、人工搬运、遗漏、格式不统一。
这篇文章把一个技术教程(用 Python asyncio 批量循环转写播客音频)改写成更贴近业务的做法:把“语音识别”当成工作流里的一个自动步骤,让转写变成可批处理、可追踪、可接入内容系统的基础能力。它也属于我们「人工智能在媒体与内容产业」系列:用 AI 支持智能创作、内容管理与分发效率提升。
批量转写真正卡住你的,不是 AI,而是流程
直接说结论:语音转文字(speech-to-text)已经成熟,难的是把它放进你的内容生产流水线里。
常见的卡点有三个:
- 输入是“散的”:下载的音频文件分散在不同文件夹、不同命名规则,后来很难管理。
- 处理是“串行的”:一集一集丢进去等,团队成员在“等转写”时无法推进后续工作。
- 输出是“孤岛的”:转写结果只停在某个工具里,没自动写回到 CMS、Notion、工单或素材库。
把它变成工作流的关键,是做两件事:
- 批处理:一次处理一个列表(文件夹、RSS 列表、数据库记录),而不是手工逐集操作。
- 并发/异步:把等待网络/API 响应的时间利用起来,减少“人等机器”。
这就是为什么 Python 的 asyncio 会很适合这类任务:你不是在做重计算,而是在做大量 I/O(上传音频、等待识别结果)。
同步 vs 异步:把“等待”从流程里抠出来
一句能被引用的定义:同步代码的时间消耗来自“排队执行”,异步代码的时间消耗来自“最慢的那几个请求”。
- 同步(Synchronous):你转写完第 1 集才开始第 2 集。每一步都要等上一步结束。
- 异步(Asynchronous):你可以把多个转写请求发出去,在等待第 1 集响应时,同时让第 2、3 集也在路上。
更贴近内容团队的比喻:
- 同步像是只有一个剪辑位,所有素材必须排队进电脑。
- 异步像是你把素材交给多个“外包转写员”,你做的是统一发包与收件,然后进入编辑环节。
注意一点:异步不等于“无限加速”。你会受到 API 并发限制、网络带宽、音频大小 的影响。所以真正专业的做法是:受控并发(比如一次最多同时转写 3–10 个文件)。后面我会给你一个更适合生产环境的写法。
用 Python + 语音识别 SDK 批量转写(核心思路)
这类脚本通常只有三步:
- 找到一批音频文件(比如
speeches/文件夹里所有 MP3) - 循环调用语音识别接口,获取转写 JSON
- 把结果保存成你能用的格式(TXT、SRT、VTT、写入数据库)
RSS 原文示例使用的是 Deepgram 的 Python SDK,并用 async/await 去等待转写结果。原理并不复杂:
async def声明异步函数await等待一个异步调用完成(在等待时,事件循环可以切换去处理别的任务)asyncio.run()启动事件循环
原文代码能跑,但它其实还是“一个文件接一个文件地 await”,并没有充分并发。对于小文件夹 OK;对几十上百集的播客库,就不够爽。
更像“生产环境”的写法:受控并发 + 输出落盘
下面这段代码保留同样的逻辑,但做了三点强化:
- 并发控制:用
asyncio.Semaphore限制同时在跑的转写任务数量 - 结果落盘:每个音频输出一个
.json,避免只打印在终端 - 更清晰的结构:把“枚举文件”“转写单个文件”“批量调度”分开
import os
import json
import asyncio
from deepgram import Deepgram
DEEPGRAM_API_KEY = os.getenv("DEEPGRAM_API_KEY", "YOUR_DEEPGRAM_API_KEY")
AUDIO_DIR = "speeches"
OUT_DIR = "transcripts"
CONCURRENCY = 5 # 小团队常用 3-10,先保守再调大
os.makedirs(OUT_DIR, exist_ok=True)
async def transcribe_one(deepgram: Deepgram, sem: asyncio.Semaphore, path: str):
async with sem:
with open(path, "rb") as audio:
source = {"buffer": audio, "mimetype": "audio/mp3"}
resp = await deepgram.transcription.prerecorded(
source,
{
"punctuate": True,
# 你也可以在这里加: "diarize": True, "language": "zh", "model": "..."
},
)
base = os.path.splitext(os.path.basename(path))[0]
out_path = os.path.join(OUT_DIR, f"{base}.json")
with open(out_path, "w", encoding="utf-8") as f:
json.dump(resp, f, ensure_ascii=False, indent=2)
print(f"OK: {path} -> {out_path}")
async def main(): deepgram = Deepgram(DEEPGRAM_API_KEY) sem = asyncio.Semaphore(CONCURRENCY)
files = [
os.path.join(AUDIO_DIR, fn)
for fn in os.listdir(AUDIO_DIR)
if fn.lower().endswith(".mp3")
]
tasks = [transcribe_one(deepgram, sem, p) for p in files]
await asyncio.gather(*tasks)
if name == "main": asyncio.run(main())
这段脚本带来的业务价值很直接:你把音频丢进文件夹,跑一次脚本,**几十集会并发处理**,并且每集都产生可追踪的转写结果文件。
## 把转写接进“内容自动化工作流”:3 个落地模板
只做转写还不够。内容团队真正想要的是:**转写产物能继续驱动后面的内容生产**。下面给你 3 个小团队能用的模板。
### 1)播客到文章:转写 + 摘要 + 段落标题(半自动写作)
做法:
- 异步批量转写出 JSON
- 解析出纯文本(或带标点段落)
- 把文本丢进你的写作流程:生成文章结构、提炼金句、整理 FAQ
实践建议:
- 每期固定输出三件事:**300 字摘要、5 条要点、10 条可做短视频的金句**
- 每条金句保留“原句时间点”,方便剪辑回跳
### 2)播客到短视频:时间戳 + 片段候选(编辑不再盲剪)
如果你的语音识别支持 *word timestamps*(词级时间戳),你可以进一步做:
- 基于关键词(比如“总结一下”“核心是”)找片段
- 基于语速/停顿做自然切点
- 输出一个“剪辑候选清单”:`[开始时间, 结束时间, 片段文本, 主题标签]`
编辑最喜欢这种输出,因为它把“找素材”变成“选素材”。
### 3)播客到知识库:自动打标签、写入 Notion/CMS
这一步是很多小企业的内容护城河:**音频内容不只是发出去,还要沉淀成可搜索的资产**。
做法思路:
- 转写后抽取:主题、人物、产品名、地点(这就是内容理解/信息抽取)
- 把结构化字段写入你的系统:
- 标题
- 主讲人
- 标签(比如“客户案例/定价/交付”)
- 摘要
- 全文转写
当你积累到 50+ 期,你会明显感觉到:**内容推荐、用户画像、选题复用** 都变得更容易——这正是「人工智能在媒体与内容产业」里常说的“内容资产结构化”。
## 小团队最容易踩的坑(以及我建议的解法)
### 1)你以为异步=更快,但被限流打回原形
解法:从 `CONCURRENCY=3` 开始,观察 API 返回错误率与平均耗时,再逐步调到 5、8、10。**并发要“受控”,不然就是自找麻烦。**
### 2)只保存 JSON,后期同事用不上
解法:在保存 JSON 的同时,再导出一份“人能直接用”的格式:
- `.txt`:给编辑复制粘贴
- `.vtt` / `.srt`:给字幕与剪辑
- `markdown`:直接进入 CMS
### 3)命名混乱导致后期无法回溯
解法:用统一的文件命名规则,例如:
- `2026-02-ep012-guest-name.mp3`
- 输出同名:`2026-02-ep012-guest-name.json`
你会少掉大量“这份转写对应哪期”的沟通成本。
## 常见问题(内容团队视角)
### 转写适合哪些岗位/团队?
**任何产出音频或会议录音的团队**都适合:播客、教育培训、咨询公司、销售团队复盘、客户访谈研究。对小企业来说,最大价值是把“口头表达”变成“可搜索、可复用的文字资产”。
### 为什么要用 Python,而不是只用一个转写网站?
网站工具适合零散任务。Python 脚本适合:
- 批量处理(几十/上百文件)
- 固定输出格式(便于交付/归档)
- 接入自动化工作流(写入 Notion、工单、CMS、对象存储)
当你开始在意“流程稳定”和“节省人力”,脚本会更划算。
### AsyncIO 对内容自动化的意义是什么?
一句话:**它把等待 API 的时间变成可并行处理的时间**。当你的语音识别依赖网络请求时,AsyncIO 往往是最简单、最省资源的并发方案。
## 把语音识别当成“内容流水线”的第一块积木
批量转写播客并不只是节省几个小时,它会改变你后面所有内容环节的成本结构:文章、短视频、知识库、内容推荐和用户画像都能吃到红利。
我更愿意把它理解为:**先把音频变成结构化文本,再谈智能创作与分发**。文本一旦标准化,自动化工作流就能真正跑起来。
接下来你可以做一个很小的行动:挑 10 期历史节目,把音频放进一个文件夹,用受控并发跑完转写,然后观察团队后期(写稿/剪辑/运营)节省了多少时间。你会更清楚下一步要把结果接到哪里:CMS、素材库,还是你的内容推荐系统。
你现在的播客制作流程里,最浪费时间的一步是哪一段——找片段、写摘要,还是做字幕?