{"id":"27085c7c-255c-4239-9cc8-9ef0e709751c","shortId":"MVANLv","kind":"skill","title":"transcribe-video","tagline":"Generate subtitles (SRT/VTT) and plain text transcripts from video or audio files using AWS Transcribe. Use when creating captions, extracting spoken content, generating transcripts for notes, or making video content searchable.","description":"# Video Transcription Skill\n\nGenerate subtitles and transcripts from `$ARGUMENTS` (a video or audio file path, optionally followed by a language code like `en-US` or `es-ES`) using AWS Transcribe.\n\nOutputs `.srt`, `.vtt`, and `.txt` files next to the source file.\n\n## Process\n\n1. **Verify prerequisites** - check `ffmpeg` and `aws` CLI are installed and configured\n2. **Extract audio** from the video as MP3 using ffmpeg\n3. **Create temporary S3 bucket**, upload audio\n4. **Run AWS Transcribe** job with SRT and VTT subtitle output\n5. **Download results** and generate plain text transcript\n6. **Clean up all AWS resources** - delete S3 bucket, Transcribe job, and temp files. No recurring costs.\n\n## Prerequisites\n\n- `ffmpeg` installed (`brew install ffmpeg`)\n- `aws` CLI installed and configured with valid credentials (`brew install awscli && aws configure`)\n- AWS credentials need permissions for: `s3:*` (create/delete buckets), `transcribe:*` (start/delete jobs)\n\n## Step-by-Step\n\n### Step 1: Extract audio\n\n```bash\nffmpeg -i \"input.mp4\" -vn -acodec mp3 -q:a 2 \"/tmp/transcribe-audio.mp3\" -y\n```\n\n### Step 2: Create temp S3 bucket and upload\n\n```bash\nBUCKET=\"tmp-transcribe-$(date +%s)\"\naws s3 mb \"s3://$BUCKET\" --region us-east-1\naws s3 cp \"/tmp/transcribe-audio.mp3\" \"s3://$BUCKET/audio.mp3\"\n```\n\n### Step 3: Start transcription job\n\n```bash\nJOB_NAME=\"tmp-job-$(date +%s)\"\naws transcribe start-transcription-job \\\n  --transcription-job-name \"$JOB_NAME\" \\\n  --language-code en-US \\\n  --media-format mp3 \\\n  --media \"MediaFileUri=s3://$BUCKET/audio.mp3\" \\\n  --subtitles \"Formats=srt,vtt\" \\\n  --output-bucket-name \"$BUCKET\" \\\n  --region us-east-1\n```\n\n**Language codes:** `en-US`, `es-ES`, `fr-FR`, `de-DE`, `pt-BR`, `ja-JP`, `zh-CN`, `it-IT`, `ko-KR`, etc. Default to `en-US` if not specified.\n\n### Step 4: Poll until complete\n\n```bash\nwhile true; do\n  STATUS=$(aws transcribe get-transcription-job \\\n    --transcription-job-name \"$JOB_NAME\" \\\n    --region us-east-1 \\\n    --query 'TranscriptionJob.TranscriptionJobStatus' \\\n    --output text)\n  if [ \"$STATUS\" = \"COMPLETED\" ] || [ \"$STATUS\" = \"FAILED\" ]; then break; fi\n  sleep 5\ndone\n```\n\n### Step 5: Download subtitle files\n\nSave `.srt` and `.vtt` next to the original file:\n\n```bash\naws s3 cp \"s3://$BUCKET/$JOB_NAME.srt\" \"/path/to/input.srt\"\naws s3 cp \"s3://$BUCKET/$JOB_NAME.vtt\" \"/path/to/input.vtt\"\n```\n\n### Step 6: Generate plain text transcript\n\nDownload the JSON result and extract the full transcript text:\n\n```bash\naws s3 cp \"s3://$BUCKET/$JOB_NAME.json\" \"/tmp/transcribe-result.json\"\n```\n\nThen use a tool to extract the `.results.transcripts[0].transcript` field from the JSON and save it as a `.txt` file next to the original.\n\n### Step 7: Clean up everything\n\n**IMPORTANT:** Always clean up to avoid recurring S3 storage costs.\n\n```bash\n# Delete S3 bucket and all contents\naws s3 rb \"s3://$BUCKET\" --force --region us-east-1\n\n# Delete the transcription job\naws transcribe delete-transcription-job --transcription-job-name \"$JOB_NAME\" --region us-east-1\n\n# Delete temp audio file\nrm -f \"/tmp/transcribe-audio.mp3\" \"/tmp/transcribe-result.json\"\n```\n\n## Real-World Results (Reference)\n\nFrom actual transcription runs:\n\n| Video | Duration | Audio Size | Transcribe Time | Subtitle Segments |\n|-------|----------|------------|-----------------|-------------------|\n| X/Twitter clip | 2:40 | 2.5 MB | ~20 seconds | 83 |\n| Screen recording | 18:45 | 11.4 MB | ~60 seconds | 500+ |\n\n### Key Insights\n\n1. **AWS Transcribe is fast** - even 19-minute videos complete in about a minute\n2. **Short-form content** (tweets, reels) transcribes almost instantly\n3. **Cost is negligible** - AWS Transcribe charges ~$0.024/min, so a 19-min video costs ~$0.46\n4. **Cleanup is critical** - always delete the S3 bucket to avoid storage charges\n5. **SRT is most compatible** - works with most video players and editors; VTT is better for web\n\n## Output Files\n\n```\noriginal-video.mp4\noriginal-video.srt          # Subtitles with timestamps (most compatible)\noriginal-video.vtt          # Web-optimized subtitles (for HTML5 <track>)\noriginal-video.txt          # Plain text transcript (no timestamps)\n```\n\n## After Transcription\n\n1. **Verify all output files exist**: `ls -lh /path/to/original-video.{srt,vtt,txt}`\n2. Report the number of subtitle segments and total duration\n3. Confirm all AWS resources have been cleaned up (no S3 buckets, no Transcribe jobs remaining)","tags":["transcribe","video","claude","code","startup","skills","rameerez","agent","agent-skills","agentic-ai","agentic-workflow","ai-agents"],"capabilities":["skill","source-rameerez","skill-transcribe-video","topic-agent","topic-agent-skills","topic-agentic-ai","topic-agentic-workflow","topic-ai-agents","topic-ai-tools","topic-anthropic","topic-anthropic-claude","topic-claude","topic-claude-ai","topic-claude-api","topic-claude-code"],"categories":["claude-code-startup-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/rameerez/claude-code-startup-skills/transcribe-video","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add rameerez/claude-code-startup-skills","source_repo":"https://github.com/rameerez/claude-code-startup-skills","install_from":"skills.sh"}},"qualityScore":"0.460","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 21 github stars · SKILL.md body (4,418 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T13:02:41.395Z","embedding":null,"createdAt":"2026-04-18T23:05:41.393Z","updatedAt":"2026-04-23T13:02:41.395Z","lastSeenAt":"2026-04-23T13:02:41.395Z","tsv":"'/min':567 '/path/to/input.srt':379 '/path/to/input.vtt':386 '/path/to/original-video':640 '/tmp/transcribe-audio.mp3':192,222,496 '/tmp/transcribe-result.json':410,497 '0':419 '0.024':566 '0.46':574 '1':79,179,218,277,342,468,489,535,632 '11.4':528 '18':526 '19':541,570 '2':91,191,195,517,549,644 '2.5':519 '20':521 '3':101,226,559,654 '4':108,317,575 '40':518 '45':527 '5':119,356,359,588 '500':532 '6':127,388 '60':530 '7':437 '83':523 'acodec':187 'actual':504 'almost':557 'alway':442,579 'argument':43 'audio':14,47,93,107,181,492,509 'avoid':446,585 'aw':17,65,85,110,131,150,161,163,209,219,238,326,373,380,404,458,473,536,563,657 'awsc':160 'bash':182,202,230,321,372,403,451 'better':602 'br':294 'break':353 'brew':147,158 'bucket':105,135,170,199,203,213,270,272,377,384,408,454,462,583,665 'bucket/audio.mp3':224,263 'caption':22 'charg':565,587 'check':82 'clean':128,438,443,661 'cleanup':576 'cli':86,151 'clip':516 'cn':300 'code':55,252,279 'compat':592,616 'complet':320,349,544 'configur':90,154,162 'confirm':655 'content':25,33,457,553 'cost':143,450,560,573 'cp':221,375,382,406 'creat':21,102,196 'create/delete':169 'credenti':157,164 'critic':578 'date':207,236 'de':290,291 'de-d':289 'default':308 'delet':133,452,469,476,490,580 'delete-transcription-job':475 'done':357 'download':120,360,393 'durat':508,653 'east':217,276,341,467,488 'editor':599 'en':58,254,281,311 'en-us':57,253,280,310 'es':62,63,284,285 'es-':61,283 'etc':307 'even':540 'everyth':440 'exist':637 'extract':23,92,180,398,416 'f':495 'fail':351 'fast':539 'ffmpeg':83,100,145,149,183 'fi':354 'field':421 'file':15,48,72,77,140,362,371,431,493,606,636 'follow':51 'forc':463 'form':552 'format':258,265 'fr':287,288 'fr-fr':286 'full':400 'generat':4,26,38,123,389 'get':329 'get-transcription-job':328 'html5':623 'import':441 'input.mp4':185 'insight':534 'instal':88,146,148,152,159 'instant':558 'it-it':301 'ja':296 'ja-jp':295 'job':112,137,173,229,231,235,243,246,248,331,334,336,472,478,481,483,668 'job_name.json':409 'job_name.srt':378 'job_name.vtt':385 'jp':297 'json':395,424 'key':533 'ko':305 'ko-kr':304 'kr':306 'languag':54,251,278 'language-cod':250 'lh':639 'like':56 'ls':638 'make':31 'mb':211,520,529 'media':257,260 'media-format':256 'mediafileuri':261 'min':571 'minut':542,548 'mp3':98,188,259 'mp4':610 'name':232,247,249,271,335,337,482,484 'need':165 'neglig':562 'next':73,367,432 'note':29 'number':647 'optim':620 'option':50 'origin':370,435,608 'original-video':607 'original-video.srt':611 'original-video.txt':624 'original-video.vtt':617 'output':67,118,269,345,605,635 'output-bucket-nam':268 'path':49 'permiss':166 'plain':8,124,390,625 'player':597 'poll':318 'prerequisit':81,144 'process':78 'pt':293 'pt-br':292 'q':189 'queri':343 'rb':460 'real':499 'real-world':498 'record':525 'recur':142,447 'reel':555 'refer':502 'region':214,273,338,464,485 'remain':669 'report':645 'resourc':132,658 'result':121,396,501 'results.transcripts':418 'rm':494 'run':109,506 's3':104,134,168,198,210,212,220,223,262,374,376,381,383,405,407,448,453,459,461,582,664 'save':363,426 'screen':524 'searchabl':34 'second':522,531 'segment':514,650 'short':551 'short-form':550 'size':510 'skill':37 'skill-transcribe-video' 'sleep':355 'sourc':76 'source-rameerez' 'specifi':315 'spoken':24 'srt':68,114,266,364,589,641 'srt/vtt':6 'start':227,241 'start-transcription-job':240 'start/delete':172 'status':325,348,350 'step':175,177,178,194,225,316,358,387,436 'step-by-step':174 'storag':449,586 'subtitl':5,39,117,264,361,513,612,621,649 'temp':139,197,491 'temporari':103 'text':9,125,346,391,402,626 'time':512 'timestamp':614,629 'tmp':205,234 'tmp-job':233 'tmp-transcrib':204 'tool':414 'topic-agent' 'topic-agent-skills' 'topic-agentic-ai' 'topic-agentic-workflow' 'topic-ai-agents' 'topic-ai-tools' 'topic-anthropic' 'topic-anthropic-claude' 'topic-claude' 'topic-claude-ai' 'topic-claude-api' 'topic-claude-code' 'total':652 'transcrib':2,18,66,111,136,171,206,239,327,474,511,537,556,564,667 'transcribe-video':1 'transcript':10,27,36,41,126,228,242,245,330,333,392,401,420,471,477,480,505,627,631 'transcription-job-nam':244,332,479 'transcriptionjob.transcriptionjobstatus':344 'true':323 'tweet':554 'txt':71,430,643 'upload':106,201 'us':59,216,255,275,282,312,340,466,487 'us-east':215,274,339,465,486 'use':16,19,64,99,412 'valid':156 'verifi':80,633 'video':3,12,32,35,45,96,507,543,572,596,609 'vn':186 'vtt':69,116,267,366,600,642 'web':604,619 'web-optim':618 'work':593 'world':500 'x/twitter':515 'y':193 'zh':299 'zh-cn':298","prices":[{"id":"c66feaf4-57e4-41ff-8770-8349695ffffb","listingId":"27085c7c-255c-4239-9cc8-9ef0e709751c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"rameerez","category":"claude-code-startup-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:05:41.393Z"}],"sources":[{"listingId":"27085c7c-255c-4239-9cc8-9ef0e709751c","source":"github","sourceId":"rameerez/claude-code-startup-skills/transcribe-video","sourceUrl":"https://github.com/rameerez/claude-code-startup-skills/tree/main/skills/transcribe-video","isPrimary":false,"firstSeenAt":"2026-04-18T23:05:41.393Z","lastSeenAt":"2026-04-23T13:02:41.395Z"}],"details":{"listingId":"27085c7c-255c-4239-9cc8-9ef0e709751c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"rameerez","slug":"transcribe-video","github":{"repo":"rameerez/claude-code-startup-skills","stars":21,"topics":["agent","agent-skills","agentic-ai","agentic-workflow","ai","ai-agents","ai-tools","anthropic","anthropic-claude","claude","claude-ai","claude-api","claude-code","claude-skills","cursor","cursor-ai"],"license":"mit","html_url":"https://github.com/rameerez/claude-code-startup-skills","pushed_at":"2026-02-23T17:18:34Z","description":"Claude Code skills for building and running actual software startups, apps, SaaS, and businesses","skill_md_sha":"8fd1aaddcd5f6aaae146188cb53c3f5d7b1a4335","skill_md_path":"skills/transcribe-video/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/rameerez/claude-code-startup-skills/tree/main/skills/transcribe-video"},"layout":"multi","source":"github","category":"claude-code-startup-skills","frontmatter":{"name":"transcribe-video","description":"Generate subtitles (SRT/VTT) and plain text transcripts from video or audio files using AWS Transcribe. Use when creating captions, extracting spoken content, generating transcripts for notes, or making video content searchable."},"skills_sh_url":"https://skills.sh/rameerez/claude-code-startup-skills/transcribe-video"},"updatedAt":"2026-04-23T13:02:41.395Z"}}