在线视频转文字稿
by @vistalyq
Extract transcripts/subtitles from video URLs and deliver as .docx files. Use this skill whenever the user provides a video link (YouTube, Bilibili, or any y...
clawhub install video2txt📖 About This Skill
name: video-transcript version: 1.0.0 description: Extract transcripts/subtitles from video URLs and deliver as .docx files. Use this skill whenever the user provides a video link (YouTube, Bilibili, or any yt-dlp supported platform) and asks for a transcript, subtitles, lecture notes, or spoken content in text form. Also trigger when user says "帮我把这个视频转成文字", "视频讲稿", "字幕文档", "transcript", "lecture notes from video", or pastes a video URL with any request to get the text content. compatibility: tools: - exec dependencies: - name: yt-dlp install: "pip install yt-dlp # or: winget install yt-dlp" check: "yt-dlp --version" - name: node install: "https://nodejs.org" check: "node --version" - name: docx (npm, local) install: "cd ~/.agents/skills/video-transcript/scripts && npm install" check: "node -e \"require('./node_modules/docx')\""
Video Transcript Skill
Extract subtitles from a video URL and deliver clean .docx transcript files. For non-Chinese videos, produce two files: original language + Chinese translation. For Chinese videos, produce one file.
Workflow
Step 0 — First-time setup (once only)
Check if node_modules exists in the scripts directory. If not, run:
$skillScripts = "$env:USERPROFILE\.agents\skills\video-transcript\scripts"
if (-not (Test-Path "$skillScripts\node_modules\docx")) {
Push-Location $skillScripts
npm install
Pop-Location
}
Step 1 — Download subtitles with yt-dlp
Run in a temp directory (use $env:TEMP\vt_ on Windows):
$tmp = "$env:TEMP\vt_$(Get-Random)"
New-Item -ItemType Directory -Force $tmp | Out-Null
YouTube:
# Try manual subs first, fall back to auto-generated
yt-dlp --skip-download --write-subs --write-auto-subs --sub-langs "en,zh-Hans,zh-Hant,zh" --convert-subs srt -o "$tmp\sub" ""
Bilibili:
yt-dlp --skip-download --write-subs --sub-langs "zh-Hans,zh,ai-zh" --convert-subs srt -o "$tmp\sub" ""
Other platforms: Use the same YouTube command — yt-dlp handles most platforms automatically.
After download, list what was fetched:
Get-ChildItem $tmp -Filter "*.srt"
Step 2 — Detect available subtitle files
Pick the best available file:
.en.srt over .en-orig.srt or .en-auto.srt)zh-Hans or ai-zhIf NO subtitle file was downloaded:
Step 3 — Parse SRT to plain text
Read the .srt file and strip all timing/index lines. Keep only the spoken text lines.
SRT format to strip:
1
00:00:01,000 --> 00:00:03,500
This is the spoken text.2
00:00:04,000 --> 00:00:06,000
More text here.
Output: plain text, one paragraph per subtitle block, blank lines between blocks removed (merge into flowing paragraphs). Also strip HTML tags like , , .
Do this parsing yourself by reading the file content — no external tool needed.
Step 4 — Translate if needed
Detect the subtitle language:
Translation guidelines:
Step 5 — Generate .docx files
Use the bundled script. The script path is:
~/.agents/skills/video-transcript/scripts/make_docx.js
Get the video title from yt-dlp output or use a sanitized version of the URL as fallback.
For non-Chinese video (two files):
# Original
node "~/.agents/skills/video-transcript/scripts/make_docx.js" "$tmp\transcript_original.docx" " - Original" ""Chinese translation
node "~/.agents/skills/video-transcript/scripts/make_docx.js" "$tmp\transcript_zh.docx" " - 中文译稿" ""
For Chinese video (one file):
node "~/.agents/skills/video-transcript/scripts/make_docx.js" "$tmp\transcript_zh.docx" " - 讲稿" ""
For long texts, write content to a temp .txt file first and pipe it:
$plain | Out-File -Encoding utf8 "$tmp\content.txt"
Get-Content "$tmp\content.txt" -Raw | node "~/.agents/skills/video-transcript/scripts/make_docx.js" "$tmp\transcript_original.docx" ""
Step 6 — Deliver to user
Tell the user the output file paths clearly:
C:\...\transcript_original.docx"C:\...\transcript_zh.docx"Optionally show a short preview (first 200 chars) of the extracted text so the user can verify quality.
Error handling
| Situation | Action |
|---|---|
| No subtitles found | Inform user, suggest Whisper as alternative |
| yt-dlp not found | yt-dlp --version to check; tell user to install if missing |
| node/docx error | Show error, check if docx npm package is installed globally |
| Private/geo-blocked video | Inform user the video is inaccessible |
Notes
$tmp dir after delivering files, or leave it and tell the user the pathmake_docx.js script resolves docx from global npm automatically📋 Tips & Best Practices
$tmp dir after delivering files, or leave it and tell the user the pathmake_docx.js script resolves docx from global npm automatically