This skill should be used when the user wants to "transcribe a YouTube video", "get a transcript of a video", "download and transcribe audio", or needs to convert video/audio content to searchable...
Convert YouTube videos and audio files to searchable, formatted markdown transcripts using AssemblyAI.
Use this skill when you need to:
The skill provides a three-step workflow:
ASSEMBLYAI_API_KEY environment variable)uv runexport ASSEMBLYAI_API_KEY="your_key_here"
cd /path/to/vault
uv run --with=assemblyai ./.claude/skills/youtube-transcription/scripts/transcribe_video.py "https://youtu.be/VIDEO_ID"
export ASSEMBLYAI_API_KEY="your_key_here"
uv run --with=assemblyai ./.claude/skills/youtube-transcription/scripts/transcribe_video.py /path/to/audio.mp3
Output: Full transcript printed to stdout + saved to /tmp/transcript.txt
# 1. Run transcription
export ASSEMBLYAI_API_KEY="your_key_here"
uv run --with=assemblyai ./.claude/skills/youtube-transcription/scripts/transcribe_video.py "https://youtu.be/_gPODg6br5w"
# 2. Copy output to project with metadata
# Edit the transcript file to add:
# - Title
# - Video ID, URL, Date
# - Proper markdown formatting
# 3. Save to your project
cp /tmp/transcript.txt pages/Projects/My-Project/Video-Title-Transcript.md
# Download with Firefox cookies
yt-dlp -x --audio-format mp3 --cookies-from-browser firefox -o "video.mp3" "https://youtu.be/VIDEO_ID"
# Then transcribe the saved file
export ASSEMBLYAI_API_KEY="your_key_here"
uv run --with=assemblyai ./.claude/skills/youtube-transcription/scripts/transcribe_video.py ./video.mp3
Create a simple script to loop through videos:
#!/bin/bash
export ASSEMBLYAI_API_KEY="your_key_here"
SKILL_PATH="./.claude/skills/youtube-transcription/scripts/transcribe_video.py"
for url in \
"https://youtu.be/VIDEO1" \
"https://youtu.be/VIDEO2" \
"https://youtu.be/VIDEO3"
do
echo "Transcribing: $url"
uv run --with=assemblyai $SKILL_PATH "$url"
sleep 5 # Rate limiting
done
YouTube is blocking yt-dlp. This happens with age-restricted or new videos.
Solution: Use Firefox cookies with JavaScript runtime:
yt-dlp -x --audio-format mp3 \
--cookies-from-browser firefox \
--js-runtimes bun \
--remote-components ejs:github \
-o "video.mp3" \
"https://youtu.be/VIDEO_ID"
Script needs the AssemblyAI package at runtime.
Solution: Always use --with=assemblyai flag:
uv run --with=assemblyai ./scripts/transcribe_video.py <input>
AssemblyAI requires valid API key.
Solution: Verify environment variable is set:
echo $ASSEMBLYAI_API_KEY # Should show your key
Set it in your shell profile to persist:
# Add to ~/.bashrc or ~/.zshrc
export ASSEMBLYAI_API_KEY="your_actual_key_here"
The skill outputs raw transcript text. Format it as markdown with metadata:
# Video Title
**Source:** YouTube - Creator Name (@handle)
**Video ID:** VIDEO_ID
**URL:** https://youtu.be/VIDEO_ID
**Date:** YYYY-MM-DD
**Duration:** MM:SS
---
## Full Transcript
[Transcript text...]
---
## Key Sections
- [Timestamp] Section title
- [Timestamp] Another section
Save transcripts following this structure:
pages/Projects/Second Brain/
āāā Nate B Jones - Why 2026 Is the Year to Build a Second Brain - Transcript.md
āāā Nate B Jones - Follow-up Video - Transcript.md
āāā README.md (links to transcripts)
Update the project README to include:
- `[[Title - Transcript]]` - Full video transcript
Create a transcripts folder:
pages/PKB/Video Transcripts/
āāā Topic 1/
ā āāā Video Title - Transcript.md
āāā Topic 2/
ā āāā Another Video - Transcript.md
See references/assemblyai_options.md for:
.claude/skills/youtube-transcription/scripts/transcribe_video.py