抖音链接转口播文字(2026-09-08 本机实测唯一走通方案)。Playwright 拦截 aweme/detail 接口取一手数据 → 直下 play_addr → whisper small 转写 → AI 整理版。触发词:抖音转文字、抖音视频转文案、提取抖音口播、扒抖音文案、抖音链接转文字、抖音视频下载转写。
---
name: douyin-video-to-text
description: 抖音链接转口播文字(2026-09-08 本机实测唯一走通方案)。Playwright 拦截 aweme/detail 接口取一手数据 → 直下 play_addr → whisper small 转写 → AI 整理版。触发词:抖音转文字、抖音视频转文案、提取抖音口播、扒抖音文案、抖音链接转文字、抖音视频下载转写。
agent_created: true
---
# 抖音视频转文字(本机验证可用)
一条从「抖音链接」到「可用口播文字稿」的完整链路。2026-09-08 在强哥本机实测跑通。
## 为什么不用 yt-dlp / cookie 解密
**Chromium 系(Chrome / Edge)的 cookie 在 Windows 上已经彻底读不出来了**,别再浪费时间:
| 试过的路 | 结果 |
|---|---|
| `yt-dlp --cookies-from-browser chrome/edge` | `Failed to decrypt with DPAPI`(v20 App-Bound Encryption) |
| 关浏览器拷 Cookies 库 + DPAPI 解密 | master key 能解出,但 cookie value 前缀是 `v20`,全解不开 |
| Win32 API 强读被锁的 Cookies 文件 | `err=32 ERROR_SHARING_VIOLATION` |
| 自造 ttwid / s_v_web_id / __ac_nonce | detail API 仍 403,要 a_bogus 签名(`Blocked by ArgusSecurityPlugin Uifid Not Found`) |
| 裸 API `iesdouyin.com/.../iteminfo/` | 返回空 |
| SSR 解析 `window._ROUTER_DATA` | 只含 itemId,不含 desc / play_addr |
| headless 浏览器 | 被识别,页面变 `about:blank` |
> ⛔ **绝对禁止**:用 `--remote-debugging-port` 指向 Chrome **默认 profile** 启动。
> Chrome 152 会判为劫持并**清空全部 cookies**(2026-09-08 真事故,丢了 545 个 cookie)。
## 正解:让浏览器自己把数据吐出来
### 第 1 步:拦截 detail 接口拿一手数据
```bash
python <skill>/scripts/capture_api.py <video_id> <输出目录> [等待登录秒数]
```
- Playwright `launch_persistent_context`,**独立 profile 目录**,绝不碰用户默认 profile
- 默认用 Edge(`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe`),`headless=False`
- `page.on("response")` 拦截 `aweme/v1/web/aweme/detail`,直接 `resp.json()`
- **headed 模式下浏览器自带 `__ac_signature`,通常不需要登录**(实测 42 秒拿到)
- 产出:`detail.json`(原始)、`result.json`(提取的 desc / author / duration / video_urls / subtitles)
### 第 2 步:下载视频
```bash
curl -s -L -A "<正常Chrome UA>" -H "Referer: https://www.douyin.com/" \
"<result.json 里的 play_addr,选 br=621 高码率>" -o video.mp4
```
`result.json` 的 `video_urls` 一般有 6 个,优先选 `douyinvod.com` 且 `br=621` 的。
### 第 3 步:转写 —— **一律用 whisper small**
```bash
whisper video.mp4 --model small --language Chinese --output_format txt --output_dir <目录>
```
| 方案 | 耗时(216s 音频) | 质量 |
|---|---|---|
| Vosk 小模型 | 16 分 | **几乎不可用**,术语全歪 |
| **whisper small** | 27 分 | **完全可读**,少量术语修正即可 |
> 模型已缓存:`~/.cache\whisper\` 有 `base.pt` + `small.pt`,不用重下。
> 机器负载高时会更慢(本机 CPU,约 13 frames/s)。
### 第 4 步:AI 整理版(必须做)
whisper 稿仍需修正品牌/术语(实测:`workbody`→WorkBuddy、`苏简`→粗剪、`门板`→蒙版、
`拍板`→排版、`投降`→头像)。整理时:
- 按口语停顿断句,保持原意,不增不改事实
- **明确标注「整理版为非逐字、语义重建」,原始稿留底备查**
- 若视频含教程/清单性质内容,顺带提取结构化速查表
## 依赖
- Python 包:`playwright`(本机已装,不下载浏览器,用 `executable_path` 指向本机 Edge)
- 命令:`yt-dlp`、`ffmpeg`/`ffprobe`、`whisper`(托管 venv 的 Scripts 目录)
- 独立 profile:`~/.workbuddy/cache/dy/edge-dl-profile`(一次登录长期复用)
## 输出规范
```
<输出目录>/
├── 口播文字稿_整理版.md ← 主交付(含元信息、分段正文、结构化速查)
├── video.txt ← whisper 原始稿(逐字,留底)
├── detail.json ← 接口原始 JSON
├── result.json ← 提取后的关键字段
└── video.mp4 ← 源视频
```
## 复用提示
- 这套路的本质是「**接口拦截 > cookie 解密**」,对其它强风控站点同样适用
- 若 `subtitle_infos` 有内容,直接拿字幕比 ASR 准得多,优先用
- 抖音的 play_addr 有时效性(URL 带 token),拿到后尽快下载