Translate Video End-to-end video translation pipeline: transcribe → translate → refine subtitles → embed. Usage - — video file path (required) - — target language code (default: ). See references/languages.md - — (TikTok/Reels) or (YouTube/tutorials). If omitted, ask the user. --- Pipeline Step 1: Transcribe If audio 25MB, extract first: Transcribe with word-level JSON (always include ): Produces: , , Step 2: Translate Read for full context. Translate the — preserve all timestamps and index numbers exactly. See translation rules in references/modes.md. Step 3: Refine Subtitles Read references…

, stripped)\n and not re.match(r'\\d{2}:\\d{2}:\\d{2}', stripped)):\n clean = line.strip('\\u202b\\u202c\\u200f\\u200e')\n line = '\\u200F\\u202B' + clean\n result.append(line)\n\nwith open(SRT_FILE, 'w', encoding='utf-8') as f:\n f.write('\\n'.join(result))\n\nprint(f'RTL fix applied to {SRT_FILE}')\n","content_type":"text/x-python; charset=utf-8","language":"python","size":955,"content_sha256":"5699aeb4f410fbbb9968889fad7a9e766abd5ab892862016870590772e4947bc"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Translate Video","type":"text"}]},{"type":"paragraph","content":[{"text":"End-to-end video translation pipeline: transcribe → translate → refine subtitles → embed.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Usage","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"/translate-video /path/to/video.mp4 he --regular\n/translate-video /path/to/video.mp4 he --shorts","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"$1","type":"text","marks":[{"type":"code_inline"}]},{"text":" — video file path (required)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"$2","type":"text","marks":[{"type":"code_inline"}]},{"text":" — target language code (default: ","type":"text"},{"text":"he","type":"text","marks":[{"type":"code_inline"}]},{"text":"). See ","type":"text"},{"text":"references/languages.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/languages.md","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"$3","type":"text","marks":[{"type":"code_inline"}]},{"text":" — ","type":"text"},{"text":"--shorts","type":"text","marks":[{"type":"code_inline"}]},{"text":" (TikTok/Reels) or ","type":"text"},{"text":"--regular","type":"text","marks":[{"type":"code_inline"}]},{"text":" (YouTube/tutorials). ","type":"text"},{"text":"If omitted, ask the user.","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Pipeline","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Transcribe","type":"text"}]},{"type":"paragraph","content":[{"text":"If audio > 25MB, extract first:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"ffmpeg -i \"$VIDEO\" -vn -acodec libmp3lame -ab 128k \"$AUDIO.mp3\" -y","type":"text"}]},{"type":"paragraph","content":[{"text":"Transcribe with word-level JSON (always include ","type":"text"},{"text":"--json","type":"text","marks":[{"type":"code_inline"}]},{"text":"):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cd ~/.claude/skills/transcribe/scripts && [ -d node_modules ] || npm install --silent\nnpx ts-node transcribe.ts -i \"$INPUT\" -o \"$BASENAME.srt\" --json","type":"text"}]},{"type":"paragraph","content":[{"text":"Produces: ","type":"text"},{"text":"{basename}.srt","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"{basename}.md","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"{basename}_transcript.json","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Translate","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":".md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for full context. Translate the ","type":"text"},{"text":".srt","type":"text","marks":[{"type":"code_inline"}]},{"text":" — preserve all timestamps and index numbers exactly. See translation rules in ","type":"text"},{"text":"references/modes.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/modes.md","title":null}}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Refine Subtitles","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/modes.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/modes.md","title":null}}]},{"text":" for full rules.","type":"text"}]},{"type":"paragraph","content":[{"text":"--shorts:","type":"text","marks":[{"type":"strong"}]},{"text":" Fix text only, preserve all timestamps. No merging.","type":"text"}]},{"type":"paragraph","content":[{"text":"--regular:","type":"text","marks":[{"type":"strong"}]},{"text":" Merge into full sentences using word-level timestamps.","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plan subtitle groups from ","type":"text"},{"text":".md","type":"text","marks":[{"type":"code_inline"}]},{"text":" (word counts per group)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fill ","type":"text"},{"text":"GROUP_SIZES","type":"text","marks":[{"type":"code_inline"}]},{"text":" in ","type":"text"},{"text":"scripts/build-timestamps.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/build-timestamps.py","title":null}}]},{"text":" and run it","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Replace English text in output SRT with translated text","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: Post-process (both modes)","type":"text"}]},{"type":"paragraph","content":[{"text":"Enforces MAX 2 lines, MAX chars/line (38 for --shorts, 42 for --regular):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 ~/.claude/skills/translate-video/scripts/postprocess.py \"$SRT\" 42","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5: RTL Fix (Hebrew / Arabic / Farsi only)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 ~/.claude/skills/translate-video/scripts/rtl-fix.py \"$SRT\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 6: Embed & Open","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"~/.local/bin/ffmpeg-ass -i \"$VIDEO\" \\\n -vf \"subtitles=$SRT:force_style='FontSize=24,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,Shadow=1,Alignment=2,MarginV=30'\" \\\n -c:v libx264 -preset fast -crf 23 -c:a copy \"$OUTPUT\" -y\nopen \"$OUTPUT\"","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ Do NOT use Docker ffmpeg for long videos on ARM Mac — x86 emulation is ~100x slower.","type":"text"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Files","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{name}.srt","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Original language SRT","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{name}.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Readable transcript","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{name}_transcript.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Word-level timestamps","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{name}_{lang}.srt","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Translated + refined SRT","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{name}_{lang}_subtitled.mp4","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Final video","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Supporting Files","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purpose","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/modes.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/modes.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Detailed --shorts and --regular rules","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/languages.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/languages.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Language codes + RTL flags","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/build-timestamps.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/build-timestamps.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Word-index cursor for --regular timestamps","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/postprocess.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/postprocess.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enforce line limits on any SRT","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/rtl-fix.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/rtl-fix.py","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Apply RTL Unicode markers","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"translate-video","author":"@skillopedia","source":{"stars":39,"repo_name":"claude-skills-library","origin_url":"https://github.com/aviz85/claude-skills-library/blob/HEAD/skills/translate-video/SKILL.md","repo_owner":"aviz85","body_sha256":"b5a6430467a67d42aa06b65aff5f3a81d33bbbb7d966fc3ac38ad0d503c9b82e","cluster_key":"9fe83a310b2016d154835cc458517014bb8c846d407dfdb7df7d01e83dcf3c15","clean_bundle":{"format":"clean-skill-bundle-v1","source":"aviz85/claude-skills-library/skills/translate-video/SKILL.md","attachments":[{"id":"f5957174-231c-52cb-83ed-592662ee1b1f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f5957174-231c-52cb-83ed-592662ee1b1f/attachment.md","path":"DEPENDENCIES.md","size":1155,"sha256":"723609db2a98c2ae08ef68fb373002fe5efcbf78daca432a2897e4dbdaf6b4db","contentType":"text/markdown; charset=utf-8"},{"id":"40246b97-3a0d-5b7d-b75d-07ef5d70a939","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/40246b97-3a0d-5b7d-b75d-07ef5d70a939/attachment.md","path":"references/languages.md","size":645,"sha256":"cb85a533cc3fb0c7e5da640a2f15c1091d2bf7040f987ca0371455921a4a8fd1","contentType":"text/markdown; charset=utf-8"},{"id":"0f79c317-f1cc-5380-9a46-ab7bb46054d7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0f79c317-f1cc-5380-9a46-ab7bb46054d7/attachment.md","path":"references/modes.md","size":2212,"sha256":"f52f6676016a7e35077b457743966b33e636e955f0a3665b8259ee3e0e8598f4","contentType":"text/markdown; charset=utf-8"},{"id":"63d7771a-936e-50be-88b5-6d4ec49b838f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/63d7771a-936e-50be-88b5-6d4ec49b838f/attachment.py","path":"scripts/build-timestamps.py","size":2190,"sha256":"500399a387a68eacc2335f3275deed70379d39306f30a8d6e07b5c2b7435388e","contentType":"text/x-python; charset=utf-8"},{"id":"779c007d-e276-5aaa-af9d-61ab8533603d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/779c007d-e276-5aaa-af9d-61ab8533603d/attachment.py","path":"scripts/postprocess.py","size":2666,"sha256":"3a26f470badaf251c3c9fd0cc303a9b7c0be18be5e3ef268cf5adb578488156d","contentType":"text/x-python; charset=utf-8"},{"id":"a0886d0f-69c2-52a8-bc96-6144ed49eccd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a0886d0f-69c2-52a8-bc96-6144ed49eccd/attachment.py","path":"scripts/rtl-fix.py","size":955,"sha256":"5699aeb4f410fbbb9968889fad7a9e766abd5ab892862016870590772e4947bc","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"bbc90ce687406a248767fdc1c71db83de978fa9db0df75be5f43f32946c1901d","attachment_count":6,"text_attachments":6,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/translate-video/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"media-content","category_label":"Media"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"media-content","import_tag":"clean-skills-v1","description":"Translate video subtitles to any language with native-quality refinement. Full pipeline: transcribe → translate → refine → embed RTL-safe subtitles. Use for: translate video, תרגם סרטון, video translation, foreign subtitles, Hebrew subtitles, translated captions.","argument-hint":"[video-path] [target-language] [--shorts|--regular]"}},"renderedAt":1782988363628}

Translate Video End-to-end video translation pipeline: transcribe → translate → refine subtitles → embed. Usage - — video file path (required) - — target language code (default: ). See references/languages.md - — (TikTok/Reels) or (YouTube/tutorials). If omitted, ask the user. --- Pipeline Step 1: Transcribe If audio 25MB, extract first: Transcribe with word-level JSON (always include ): Produces: , , Step 2: Translate Read for full context. Translate the — preserve all timestamps and index numbers exactly. See translation rules in references/modes.md. Step 3: Refine Subtitles Read references…