Tiktok transcript
Fetch TikTok transcripts/captions into cached local files, for a single video or all videos of a channel/user, falling back to local mlx-whisper transcription when a video has no native captions. Use when the user provides a TikTok URL, video ID, or @handle and asks to get, fetch, download, search, excerpt, summarize, or otherwise use TikTok transcripts/captions/subtitles.From its SKILL.md
npx -y skills add dedene/skills --skill tiktok-transcriptAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 13 stars13 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.8 KB, as published. Nobody here has run it
TikTok Transcript
Fetch TikTok captions with yt-dlp, save durable transcript artifacts, and keep the full transcript out of context unless the user explicitly asks to inspect it. Videos without native captions are transcribed locally with mlx-whisper (Apple Silicon).
This skill mirrors the workflow shape of the sibling youtube-transcript skill.
Workflow
- Resolve this skill directory and run the bundled script. Always single-quote TikTok URLs in zsh because
?can be treated as a glob. - Fetch to local artifacts with
fetch(one video) orchannel(a user's videos). Do not readtranscript.mdortranscript.jsoninto context by default. - Use
transcript.txtfor summaries or other content-only work; it removes timestamps and is cheaper to read thantranscript.md. - Use
preview,search,excerpt, or boundedtextoutput when later work needs only a small portion. - Read the full transcript only when the task truly requires full-document reasoning and no smaller excerpt/search path is enough.
Commands
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py list 'https://www.tiktok.com/@user/video/VIDEO_ID'
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py fetch 'https://www.tiktok.com/@user/video/VIDEO_ID' \
--output-dir tiktok-transcripts
# All (or the N most recent) videos of a channel:
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py channel @user --limit 20
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py preview tiktok-transcripts/VIDEO_ID
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py search tiktok-transcripts/VIDEO_ID 'topic or phrase'
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py excerpt tiktok-transcripts/VIDEO_ID \
--start 00:00:30 \
--end 00:01:10
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py text tiktok-transcripts/VIDEO_ID --max-chars 4000
The fetch command prints a compact result with the video title, transcript source, cue count, and a short preview. It intentionally does not print the full transcript. The channel command prints one status line per video plus a summary, and writes channel.index.json.
Whisper fallback
- Not every TikTok video has captions; it depends on whether the creator enabled them.
--whisper auto(default) transcribes locally withmlx-whisperonly when no native captions exist: audio is downloaded viayt-dlp -xand transcribed on-device.--whisper alwaysforces Whisper even when captions exist;--whisper neverskips it (caption-less videos are then reported asno-captions).- Requires Apple Silicon. The script uses an installed
mlx_whisperbinary or falls back touvx --from mlx-whisper mlx_whisper(needsuv). - Default model is
mlx-community/whisper-large-v3-turbo(good speed/quality; ~1.5 GB download on first use). Override with--whisper-model, e.g.mlx-community/whisper-tinyfor quick tests. Use--whisper-language nletc. when autodetection picks wrong. - For bulk channel runs, a cheap first pass is
channel @user --whisper never, then rerun with--whisper autoto fill in only the caption-less videos (artifacts are cached; nothing is re-fetched). transcript_sourceinmetadata.compact.jsonand the fetch output records whether the transcript came fromtiktok-captionsormlx-whisper:<model>.
Artifacts
Default output:
tiktok-transcripts/
├── channel.index.json # channel mode only: per-video status
└── VIDEO_ID/
├── metadata.compact.json
├── source.info.json
├── VIDEO_ID.audio.m4a # whisper fallback only
├── transcript.whisper.vtt # whisper fallback only
├── transcript.json
├── transcript.md
├── transcript.txt
└── transcript.vtt
transcript.jsoncontains timestamped cue objects for programmatic search/excerpt.transcript.txtcontains timestamp-free plain text for summarization and other content-only tasks.metadata.compact.jsonis the small metadata file to read into context when needed.
Fallbacks
If yt-dlp reports rate limiting, bot detection, login walls, or region errors:
-
Retry with browser cookies (Peter is logged in to TikTok in his browsers):
python3 <this-skill-dir>/scripts/fetch-tiktok-transcript.py fetch 'URL' --cookies-from-browser chromechrome,chrome:Profile 1,firefox, andsafariare common values. The script also honorsTIKTOK_TRANSCRIPT_COOKIES_FROM_BROWSER. -
If yt-dlp warns about impersonation and requests start failing, install the impersonation dependency it suggests (curl_cffi) per https://github.com/yt-dlp/yt-dlp#impersonation.
-
If
channelundercounts a large profile (known yt-dlp TikTok pagination flakiness), harvest video links by scrolling the profile page in a real logged-in browser session (Aside or agent-browser), thenfetcheach URL individually.
Notes
yt-dlpis the only required external binary for captioned videos;uv(orpip install mlx-whisper) enables the Whisper fallback.- TikTok caption info is missing from yt-dlp's JSON metadata even when captions exist — only
list/fetch(which use--list-subs/--write-subs) can see them. Do not conclude "no captions" fromsource.info.json. - Use
--refreshto re-download captions/audio and re-transcribe. - Private accounts fail even with valid cookies (open yt-dlp issue as of 2026).