Are you the author? Sign in to claim
🎙️ 本地播客/视频蒸馏工具:贴链接 → 转录·分章·摘要·五类亮点·双语字幕。Local-first (FastAPI + Vue),可插拔多 LLM(DeepSeek / OpenAI / Claude / GLM / 通义 / 豆包
把任意播客 / 视频链接,变成 5 分钟内可决策的结构化知识。
粘贴一个链接 → 自动下载、转录、分章、摘要、提炼亮点 → 双语字幕点击即跳转播放。
本地单用户工具,为中文 PM、研究员、投资人这类「高密度信息消费者」而生。
🌐 简体中文 | English
信息工作者面对一集 2 小时的播客,最大的成本不是「听不懂」,而是**「不知道值不值得听」**。Podcast Digester 把一集音频蒸馏成:
Deep Listen / Skim / Skip 三档,拿不准默认 Skim)决策只要 5 分钟;决定深听时,字幕和亮点帮你跳着听。
| 标签 | 含义 | 例子 |
|---|---|---|
fact 事实 | 可查证的关键数据 / 事实 | 「该公司 2025 年营收增长 40%」 |
insight 洞见 | 观点性的结论或判断 | 「真正护城河是分发,不是模型」 |
quote 金句 | 值得引用的原话 | 「我们没有发明轮子,我们铺了路」 |
contrarian 反共识 | 与主流相反的看法 | 「大家都看多,但供给端已经过剩」 |
story 故事 | 具体的案例 / 叙事 | 「他们头三个月只服务了 7 个用户……」 |
| 节目库 — 粘贴链接、查看处理状态、点击进入 |
![]() |
| 播放器 — 双语字幕 / 章节 / 摘要 / 亮点 / 洞察,点击即跳转 |
![]() |
在播放器视图里找这些:
Deep Listen / Skim / Skip)每集内容按下列阶段顺序处理,可断点续跑(每阶段产出 JSON checkpoint + SQLite 状态):
中文源会自动跳过 translate;已有规范标点的平台字幕会跳过 polish,避免无谓的 LLM 开销。
| 阶段 | 产出 |
|---|---|
download | 音频文件(data/media/ep_*/) |
transcribe | 带时间戳的字幕段(transcript.json) |
polish / translate | 规范标点 + 双语字段(text_zh / text_en) |
chapterize | 章节标题与时间区间 |
summarize | 逐章中文摘要 |
highlight | TL;DR + 值听裁定 + 五类亮点(含引用 / 时间戳) |
product_insights | 产品 / 技术 / 市场洞察 + 提到的公司清单 |
完全本地优先:媒体文件与所有蒸馏产物存在本机磁盘;只有 LLM 调用、平台抓取、(无字幕时的)语音识别走网络。
蒸馏阶段(润色 / 翻译 / 分章 / 摘要 / 亮点 / 洞察)共用一个统一入口 app/llm/client.py::complete(),底层按协议在两种 adapter 间分发:
openai_compatible —— openai.AsyncOpenAI 包装,覆盖 DeepSeek / OpenAI / GLM / 通义 / 豆包 / Kimi 等 OpenAI 兼容端点anthropic_compatible —— anthropic.AsyncAnthropic 包装,覆盖 Claude 系列方式 A · 设置页(推荐,零代码) —— 启动后点右上角齿轮进入「设置」:
**** + 末 4 位回显,永不完整返回)base_url,并一键拉取该端点可用模型;命名厂商端点已锁定,不可改方式 B · 环境变量 —— 见下方切换示例(适合脚本 / 无 UI 部署 / CI)。切换 provider 只改环境变量,不改一行代码。
LLM_PROVIDER | 地区 | 协议 (provider_type) | 默认端点 | 默认模型 | 备注 |
|---|---|---|---|---|---|
deepseek | 国内 | openai_compatible | api.deepseek.com | deepseek-chat | 推荐,性价比高 |
glm | 国内 | openai_compatible | open.bigmodel.cn/api/paas/v4 | glm-4-flash | 智谱标准端点 |
glm-coding | 国内 | openai_compatible | open.bigmodel.cn/api/coding/paas/v4 | (拉取后选) | 智谱 coding plan 专用端点 |
qwen | 国内 | openai_compatible | dashscope.aliyuncs.com/compatible-mode/v1 | qwen-plus | 通义千问 |
doubao | 国内 | openai_compatible | ark.cn-beijing.volces.com/api/v3 | (自填) | 字节豆包,模型 id 实为 endpoint id |
moonshot | 国内 | openai_compatible | api.moonshot.cn/v1 | moonshot-v1-8k | 月之暗面 Kimi |
openai | 国际 | openai_compatible | SDK 官方默认 | gpt-4o-mini | OpenAI 官方 |
anthropic | 国际 | anthropic_compatible | SDK 官方默认 | claude-3-5-sonnet-latest | Claude 系列 |
openai-compatible | — | openai_compatible | 自填 | 自填 | 任意 OpenAI 兼容端点 |
anthropic-compatible | — | anthropic_compatible | 自填 | 自填 | 任意 Anthropic 兼容端点 |
base_url 锁定:命名厂商(上表前 8 个)端点固定为预设值、不可改;底部两个「兼容自定义端点」可自由填
base_url。不同端点 / coding plan 已拆成独立 provider(如 GLM 标准端点 vs coding plan 端点)。
.env)# —— DeepSeek(默认)——
LLM_PROVIDER=deepseek
LLM_API_KEY=sk-xxxxxxxx
LLM_MODEL=deepseek-chat # 可选;留空则用预设默认
# —— Anthropic Claude ——
LLM_PROVIDER=anthropic
LLM_API_KEY=sk-ant-xxxxxxxx
LLM_MODEL=claude-3-5-sonnet-latest
# —— 任意自建 / 第三方 OpenAI 兼容端点 ——
LLM_PROVIDER=openai-compatible
LLM_PROVIDER_TYPE=openai_compatible # 通用兜底需显式指定协议
LLM_BASE_URL=https://your-endpoint.com/v1
LLM_API_KEY=xxxxxxxx
LLM_MODEL=your-model
配置优先级:设置页(运行时覆写)>
LLM_*>DEEPSEEK_*(向后兼容别名)>PROVIDERS[provider]预设默认。安全:设置页填入的
base_url经 SSRF 守卫(必须https://,禁内网 / 本机 / 云元数据 / CGNAT),且 SDK 关闭重定向跟随以防密钥经跳转泄露;密钥仅从环境变量 / 设置页读取、永不完整回传。LLM_BASE_URL环境变量作为运维逃生舱(企业代理 / 镜像网关,可为内网地址)视为可信、不经守卫。详见app/llm/config.py。
| 来源 | 说明 |
|---|---|
| YouTube | 优先用平台字幕(manual / auto CC),无字幕时 fail-fast 探测后回退 ASR |
| Bilibili | 反爬需 cookie:自动用浏览器(Chrome 等)登录态鉴权 |
| 小宇宙 | 中文播客平台 |
| 抖音 | 含反爬绕过(curl-cffi / Playwright CDP,可选) |
| 本地文件 | 直接喂已下载的音视频文件 |
鉴权平台的 cookie 解析与下载路径统一复用同一套策略(浏览器优先,cookies.txt 兜底),下载与标题抓取都走它,不会再出现「下了音频却抓不到标题」的错位。
clone 项目后,B 站、部分 YouTube(年龄 / 地区限制)等需要登录态。浏览器优先、cookies.txt 兜底,任选其一:
方式 A · 浏览器自动读取(推荐,零配置)
在本机浏览器里登录过该平台即可——程序自动读取 Chrome / Edge / Firefox / Safari 的登录态,无需导出任何文件。下载前在该浏览器登录一次就行。
方式 B · cookies.txt(兜底,服务器 / 无 GUI 环境)
podcast-digester/cookies.txt(随项目走,推荐)~/.config/yt-dlp/cookies.txt(全局共享)两种方式都不用改代码或环境变量,
app/utils/cookie_helper.py自动按「浏览器 →cookies.txt」顺序探测。
brew install ffmpeg / Linux sudo apt install ffmpegsetup.sh 会自动做)git clone https://github.com/Alliskyline2020/podcast-digester.git
cd podcast-digester
./setup.sh
setup.sh 自动完成:Python 版本检查(挑 3.11–3.13)→ 后端 venv + 依赖 → Playwright 浏览器 →(macOS)AFM 3 桥接编译 → 前端依赖 → 从模板创建 .env。可重复运行(幂等)。
# 后端
cd backend
python3.12 -m venv venv # 用 3.11–3.13,不要用 3.14
source venv/bin/activate
pip install -r requirements.txt
python -m playwright install chromium # pip 只装 Python 绑定,浏览器要单独装
# macOS 还需编译 ASR 桥接:
cd tools && ./build_apple_asr.sh && cd ..
# 前端
cd ../frontend && npm install
两种方式(任选其一):
.env。backend/.env,至少填入密钥(默认 provider=deepseek),想换厂商见上方「可插拔 LLM」。LLM_API_KEY=sk-xxxxxxxx # 走环境变量方式时填;你的 DeepSeek / OpenAI / Claude / GLM … 密钥
# 想换 provider 见上方「可插拔 LLM」的切换示例
./start.sh # 终端 1:启动 API + 前端
⚠️
start.sh只起 API + 前端,不启动 Worker。Pipeline 由 Worker 跑,必须另开终端单独启动,否则粘贴链接后不会处理:
cd backend && source venv/bin/activate && python worker.py # 终端 2:Worker
打开 http://localhost:5173/ ,粘贴一个播客 / 视频链接即可。
验证部署:粘贴任意一条 YouTube 链接(多数带自动字幕,最省事),1–2 分钟内出现「摘要 + 亮点」即说明部署成功。
start.sh 不含 Worker,需另开终端 python worker.py。pip install 报 Failed building wheel for av / pydantic-core → 多半是 Python 3.14(缺预编译 wheel)。改用 3.11–3.13:brew install python@3.12 后重跑 ./setup.sh。npm install 后 vite: command not found → 机器全局设了 NODE_ENV=production,npm 跳过了 devDependencies。用 npm install --include=dev,或 unset NODE_ENV 后重装(setup.sh 已自带该兜底)。Another Worker is already running → 有 Worker 在跑,或上次崩溃留了锁。删锁再起:rm /tmp/podcast_worker.pid。HTTPS_PROXY=http://127.0.0.1:7897(按你的代理改)。cd backend/tools && ./build_apple_asr.sh(或 ./setup.sh)。macOS 下推荐用 launchd 常驻托管 API 与 Worker(参考根目录
start.sh/stop.sh,或自行编写~/Library/LaunchAgents/*.plist),终端关闭也不会中断长任务。
核心配置走环境变量(见 backend/.env.example):
| 变量 | 必填 | 默认 | 说明 |
|---|---|---|---|
LLM_PROVIDER | deepseek | provider 预设名(见上方预设表) | |
LLM_API_KEY | ✅ | — | LLM 密钥(旧名 DEEPSEEK_API_KEY 等价) |
LLM_MODEL | 按预设 | 模型名(旧名 DEEPSEEK_MODEL) | |
LLM_PROVIDER_TYPE | 按 provider 推断 | 显式指定协议:openai_compatible / anthropic_compatible | |
LLM_BASE_URL | 按预设 | 端点;留空用 SDK 官方默认(旧名 DEEPSEEK_BASE_URL) | |
LLM_TEMPERATURE | 0.3 | 采样温度 | |
LLM_MAX_TOKENS | 空 | 单次生成上限;留空用 provider 默认 | |
LLM_TIMEOUT | 60 | 单次请求超时(秒) | |
PODCAST_DIGESTER_HOST / _PORT | 127.0.0.1 / 8000 | 绑定地址 / 端口 | |
PODCAST_DIGESTER_ADMIN_TOKEN | 空 | 管理接口鉴权(本地单用户可留空) | |
PODCAST_DIGESTER_MAX_LLM_COST | 5.0 | 单集 LLM 花费上限(美元),超过则中止 | |
PODCAST_DIGESTER_MAX_EPISODE_HOURS | 5.0 | 单集时长上限(小时) | |
HTTPS_PROXY / HTTP_PROXY | 空 | 访问 YouTube 等需要的代理 |
字幕质量、分章窗口、亮点条数、ASR 轮询等都有细粒度可调参数,详见 backend/app/config.py。
podcast-digester/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI 入口 + 路由聚合
│ │ ├── config.py # 环境变量驱动的配置
│ │ ├── pipeline.py # 8 阶段 Pipeline 编排(可断点续跑)
│ │ ├── database.py # SQLite 异步仓储 + 状态机
│ │ ├── asr_afm3.py # Apple AFM 3 语音识别封装
│ │ ├── routers/ # FastAPI 路由层(含设置页 LLM 配置端点)
│ │ ├── llm/ # 多 Provider 适配层(complete() 统一入口)
│ │ │ ├── client.py # 统一分发:按 provider_type 选 adapter
│ │ │ ├── protocols.py # OpenAI / Anthropic adapter
│ │ │ ├── config.py # PROVIDERS 预设 + get_config + SSRF 守卫(按来源分流信任)
│ │ │ └── cost.py # 按 provider/模型 的价格表(成本估算)
│ │ ├── sources/ # 各平台解析器(youtube/bilibili/douyin/xiaoyuzhou/local)
│ │ ├── services/ # 字幕对齐 / 润色 / 段落映射等业务
│ │ ├── llm_pipeline/ # LLM 蒸馏任务:分章 / 摘要 / 翻译 / 亮点 / 洞察
│ │ └── utils/ # cookie / 视频标题 / 校验等工具
│ ├── tests/ # pytest(单元 + 集成 + 冒烟,530+ 用例)
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── views/ # LibraryView(节目库)/ PlayerView(播放器)/ SettingsView(设置)
│ │ ├── components/ # UI 组件
│ │ └── utils/ # 阶段进度 / 格式化等
│ └── tests/ # Vitest(119 用例)
├── data/ # SQLite + media/ep_*(gitignore,不入库)
├── docs/ # 字幕校正指南
└── start.sh / stop.sh # 一键启停
CI(GitHub Actions)会在每次推送时跑后端 pytest + 前端 vitest + 前端构建冒烟。
# 后端(530+ 用例,含 unit / integration / api / database / llm 标记)
cd backend && source venv/bin/activate && pytest tests
# 只跑单元测试(快、无网络)
pytest tests -m unit
# 覆盖率(实测约 50%,CI 闸门 fail-under=45)
pytest --cov=app --cov-report=term-missing
# 前端(119 用例)
cd frontend && npm test
PODCAST_DIGESTER_MAX_LLM_COST(默认 $5)自动中止;app/llm/cost.py 按 provider / 模型估算每次调用成本。**** + 末 4 位);设置页填入的 base_url 经 SSRF 守卫(禁 http / 内网 / 本机 / 云元数据),SDK 关闭重定向跟随防泄露。text_zh / text_en)与点击跳转docs/transcript-correction-guide.md — 字幕校正指南CONTRIBUTING.md — 贡献指南MIT License © 2026 Al Li
本项目仅供个人学习与研究使用。请遵守各内容平台的使用条款与当地版权法,下载 / 转录的内容版权归原作者所有。
⚠️ Experimentelle Skill-Sammlung für deutsches Recht (Arbeits-, Gesellschafts-, Insolvenz-, Datenschutz-, Prozessrecht u
Manage multiple Claude Code agents from TUI or Web with tmux and git worktrees
Project management using GitHub Issues + Git worktrees for parallel agent execution
Core skills library for Claude Code with 20+ battle-tested skills including TDD, debugging, and brainstorming