v2.0.0 to v2.0.0

2 added, 1 removed. Audit A to A.

---
name: xiaohongshu-downloader
- description: 下载小红书视频,自动转录口播文案保存为本地 Markdown。中文视频直接保存中文逐字稿,英文视频翻译后保存。从 xiaohongshu.com / xhslink.com 链接提取视频,生成完整文件夹结构。
+ description: |
+ Download a Xiaohongshu (小红书 / RedNote) video from a xiaohongshu.com or xhslink.com link and transcribe its voice-over with Whisper into a local Markdown transcript (Chinese kept verbatim, English translated to Chinese), saved in a complete folder structure. Use when the user shares a Xiaohongshu video link and wants the spoken content as text for analysis, summary or translation, or says 下载小红书, 小红书视频转文字, 小红书口播稿, 提取口播, xiaohongshu transcript, RedNote video to text.
version: 2.0.0
author: doing
metadata:
hermes:
tags: [小红书, xiaohongshu, 下载, 视频, 转录, Whisper, Markdown, 逐字稿]
category: media
---
# 小红书视频下载器 + 口播文案转录
将小红书视频下载到本地,自动用 Whisper 转录口播内容,生成 Markdown 逐字稿。中文视频直接保存中文,英文视频翻译成中文后保存。
## 触发条件
- 用户发送 `xiaohongshu.com/discovery/item/xxx` 或 `xhslink.com/xxx` 链接
- 用户说"下载这个小红书视频"、"扒一下这个文案"、"存下来"且链接是小红书的
## 前置依赖
| 工具 | 用途 | 安装检查 |
|------|------|---------|
| yt-dlp | 视频下载 | `which yt-dlp` |
| whisper (openai-whisper) | 语音转文字 | `which whisper` |
| ffmpeg | 音频处理 | `which ffmpeg` |
## 工作流程
### 阶段 A:下载视频
#### 第 1 步:用脚本下载视频
```bash
SKILL_DIR="$(cd "$(dirname "$0")" && pwd)"
bash "${SKILL_DIR}/scripts/download_xiaohongshu.sh" '<XIAOHONGSHU_URL>' '<OUTPUT_DIR>'
```
脚本会输出下载的文件路径。
#### 第 2 步:确认下载成功
验证文件存在且大小 > 0。记录文件路径和视频标题(如果 yt-dlp 能提取到)。
### 阶段 B:视频转录
#### 第 3 步:创建目录结构
```
<OUTPUT_DIR>/小红书-{视频标题或简短描述}/
├── transcript.md ← 格式化的逐字稿 Markdown
├── videos/
│ └── video.mp4 ← 原始视频
└── transcripts/
├── audio.srt ← SRT 字幕文件
└── audio.txt ← 纯文本逐字稿
```
标题来源优先级:
1. yt-dlp 提取的标题
2. 视频前几句口播内容的概括
3. 默认用 `小红书-视频`
#### 第 4 步:移动视频到目录结构中
```bash
mv {下载的mp4} {output_dir}/videos/video.mp4
```
#### 第 5 步:Whisper 转录
```bash
whisper "{output_dir}/videos/video.mp4" \
--model medium \
--output_format srt \
--output_dir /tmp/xhs_transcribe
```
**语言检测策略**:
- 先不指定 `--language`,让 Whisper 自动检测
- 如果自动检测为中文 → 中文视频,直接保存
- 如果自动检测为英文 → 英文视频,转录后翻译成中文
**模型选择**:
- `base`:快速但准确率差,不推荐
- `medium`:平衡选择,中文效果好(推荐)
- `large`:最佳效果但很慢,长视频慎用
**注意**:
- ~8 分钟视频用 medium 模型约需 15-20 分钟
- 用 `background=true` + `notify_on_complete=true` 后台运行
- 转录完成后继续后续步骤
#### 第 6 步:整理转录文件
```bash
# 移动 SRT
cp /tmp/xhs_transcribe/*.srt "{output_dir}/transcripts/audio.srt"
# 从 SRT 提取纯文本
awk '!/^[0-9]+$/ && !/^[0-9]{2}:[0-9]{2}/ && !/^$/' \
"{output_dir}/transcripts/audio.srt" > "{output_dir}/transcripts/audio.txt"
```
#### 第 7 步:检测语言 + 翻译(如需)
**中文视频**(绝大多数小红书视频):
- 直接使用 Whisper 转录的中文文本
- 无需翻译
**英文视频**(少数情况):
1. 读取 `transcripts/audio.txt` 英文逐字稿
2. 分段用 LLM 翻译成中文(每段不超过 2000 字)
3. 生成 `transcripts/audio-zh.md` 中文翻译逐字稿
翻译提示词:
```
将以下英文视频逐字稿翻译为中文,保持口语化风格,专业术语保留英文原文并加括号注释:
{segment}
```
### 阶段 C:组装最终输出
#### 第 8 步:生成 transcript.md
中文视频模板:
```markdown
# 小红书视频逐字稿 - {标题}
> **来源**: 小红书
> **类型**: 视频
> **语言**: 中文
> **时长**: {时长}
> **视频文件**: [video.mp4](videos/video.mp4)
---
## 逐字稿
{纯文本逐字稿}
---
*Generated by xiaohongshu-downloader skill · Whisper medium model*
```
英文视频模板(额外包含中文翻译):
```markdown
# 小红书视频逐字稿 - {标题}
> **来源**: 小红书
> **类型**: 视频
> **语言**: English → 中文翻译
> **时长**: {时长}
> **视频文件**: [video.mp4](videos/video.mp4)
---
## 中文翻译
{翻译后的中文文本}
---
## English Transcript
{英文原文}
---
*Generated by xiaohongshu-downloader skill · Whisper medium model*
```
#### 第 9 步:清理临时文件
```bash
rm -rf /tmp/xhs_transcribe
```
#### 第 10 步:向用户报告
报告:
- 视频标题
- 目录路径
- transcript.md 路径
- 语言(中文/英文→中文翻译)
## 输出示例
### 中文视频
```
<OUTPUT_DIR>/小红书-Obsidian加CloudCode打造个人生活操作系统/
├── transcript.md
├── videos/
│ └── video.mp4
└── transcripts/
├── audio.srt
└── audio.txt
```
### 英文视频(含翻译)
```
<OUTPUT_DIR>/小红书-Some English Video/
├── transcript.md
├── videos/
│ └── video.mp4
└── transcripts/
├── audio.srt
├── audio.txt
└── audio-zh.md
```
## 已验证有效的路径
| 步骤 | 方法 | 状态 |
|------|------|------|
| 下载视频 | yt-dlp + bundled script | ✅ 有效 |
| 转录中文 | whisper --model medium | ✅ 有效,质量好 |
| 提取纯文本 | awk 过滤 SRT | ✅ 有效 |
| 组装 Markdown | heredoc 模板 | ✅ 有效 |
## 无效的方法(不要再试)
| 方法 | 为什么不行 |
|------|-----------|
| yt-dlp --print title 获取小红书标题 | 经常失败,Extractor 不稳定 |
| whisper base 模型做中文 | 准确率太差,至少用 medium |
| whisper --task translate 做英→中 | translate 只输出英文,不支持中文翻译 |
| whisper --language zh 对英文视频 | 会把英文识别成乱码 |
## 与 x-article-download skill 的复用关系
本 skill 的转录+Markdown生成逻辑与 x-article-download 的阶段 B/C 高度一致:
- 相同的 Whisper 模型和参数
- 相同的 SRT → 纯文本提取方式
- 相同的目录结构规范
- 相同的语言检测 + 条件翻译逻辑
主要差异:
- 小红书视频大多为中文,不需要翻译(x 的视频多为英文需要翻译)
- 标题获取方式不同(yt-dlp 对小红书不稳定)
- 视频下载方式不同(使用 bundled script 而非直接 yt-dlp)
## 边界情况
- 如果 yt-dlp 下载失败 → 报错,尝试 browser fallback
- 如果视频很短(<30s)→ 转录很快,但可能只有几句话
- 如果视频无语音 → Whisper 会输出空文本,报告"无语音内容"
- 如果是图文笔记(非视频)→ 只下载图片,不做转录
- 如果标题获取失败 → 用口播前几句概括作为标题
## Notes
- 默认保存到 `<OUTPUT_DIR>`(默认为 `~/Downloads`)
- 如果用户指定其他路径,使用用户指定的路径
- 适合单条链接处理,不适合批量爬取
- 图片笔记暂不支持转录(无语音内容)