← 返回爱琴海个人主页

抖音链接转口播文字

抖音链接转口播文字(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),拿到后尽快下载
抖音链接转口播文字 · 由 sync_homepage.py 自动生成