Multilingual Dubbing
- What
- Cost
- Free
- Needs
- Before you start: read this whole install prompt, tell me in a few lines what this skill does and what installing it involves, and wait for my go-ahead before you do anything else.
- Install
- Copy the installer prompt below into your Muse — your agent does the rest.
Localise a finished Chinese ecommerce product video into other-language versions from the same storyboard.json: the voice-over is rewritten for the target market rather than translated literally (local wording and scenarios, units converted with equivalent values, brand spelling kept, length fitted to each shot at about 2.5 words per second for English) into line_<lang> / sub_<lang> / title_<lang> / cta_<lang> fields plus a top-level tag_<lang>, a matching Microsoft Edge voice is picked per market, and one assemble.py --lang render synthesises each localised line through edge-tts, recomputes shot lengths from the real voice durations, and re-renders the same images, transitions, styled subtitles, title text, ducked BGM and loudness-normalised audio into a finished MP4 + SRT per language, each in its own build folder. Unchanged lines are served from a local cache with no new network call.
Version:
Install
Copy the install package below, then paste it into Muse📌 Pinned version: commit 96c49b3The install prompt below already includes the vetting steps: your agent follows the community checklist before installing anything with executable code. Want more?
Before you start: read this whole install prompt, tell me in a few lines what this skill does and what installing it involves, and wait for my go-ahead before you do anything else. Prerequisites: none for the install itself: no account, no API key, no paid service, and nothing else to install first. For using the skill afterwards, read this first: the skill has real dependencies that this install does NOT set up — Python 3, the pip packages pillow, numpy and edge-tts, and ffmpeg (with libass, for burning in the styled subtitles) plus ffprobe on PATH, plus network access to Microsoft's Edge TTS service, plus a font that covers the target language's script (for example Thai or Arabic) for the subtitles. Voice synthesis is not local and not offline: every localised line of text I give it is sent to Microsoft's free Edge online text-to-speech service through the edge-tts library (see the sends disclosed in point 2). There is no key and no account, but there is no offline synthesis either — the only offline voice mode is assemble.py --tts none, which renders a silent preview with estimated timings and synthesises nothing. Localisation itself uses no translation service and no transcription: the rewrite into the target language is done by you, the agent, following the prompt template in SKILL.md, between you and me, and no script in this folder sends a storyboard anywhere to be translated. The repository's root requirements.txt lists pillow>=10, numpy>=1.24 and edge-tts>=6.1 for the repo's whole pipeline, and this skill needs all three: scripts/assemble.py imports numpy and Pillow (PIL) and calls the edge_tts-based scripts/tts_edge.py, scripts/make_bgm.py imports numpy, and SKILL.md's render command is scripts/assemble.py, whose docstring states "Requires: ffmpeg (with libass), pip install pillow numpy edge-tts". Install "multilingual-dubbing" for me. It localises a finished Chinese ecommerce product video into other-language versions (English, Japanese, Korean, Southeast Asian languages — Indonesian / Thai / Vietnamese / Malay / Filipino —, Spanish, Portuguese and more, for TikTok Shop US/UK/SEA and other markets) from the same storyboard.json: first the voice-over is rewritten for the target market, not translated literally (selling points kept, wording and scenarios swapped for local ones — e.g. a Chinese "commute" line becomes "commute / road trip" for the US, Southeast Asia stresses "hot weather / ice" —, units converted to local habits like oz / °F with values kept equivalent, brand names kept in their original spelling, length aligned to the shot: for English about 2.5 words per second, so words per line ≈ shot seconds × 2.5, cut if longer; SKILL.md's rule: never add data or promises that were not in the original), written as per-shot fields line_<lang> (voice), sub_<lang> (subtitles, with **highlight** and | breaks; "" means no subtitle), optional title_<lang> and cta_<lang>, and a top-level tag_<lang>; then a matching edge-tts voice is chosen (for example en-US-AndrewNeural / en-US-AvaNeural / en-US-EmmaNeural for the US, en-GB-SoniaNeural for the UK, id-ID-GadisNeural, th-TH-PremwadeeNeural, vi-VN-HoaiMyNeural, ms-MY-YasminNeural, fil-PH-BlessicaNeural, ja-JP-NanamiNeural, ko-KR-SunHiNeural, es-MX-DaliaNeural, pt-BR-FranciscaNeural), then one command (python scripts/assemble.py storyboard.json --lang en --voice en-US-AndrewNeural --rate "+5%" -o out/video-en.mp4 --build build/en) synthesises each line_<lang> through Microsoft's Edge online TTS via edge-tts, recomputes each shot's length from the real voice durations, reuses the same images, rhythm and transitions, renders the Ken Burns shots, transitions, styled subtitles and title text (花字), a locally generated or supplied BGM with ducking, and two-pass loudness normalisation locally with ffmpeg/Pillow/numpy, and writes the finished MP4 (default 1080x1920) plus a .srt next to it and a timing.json in the per-language build folder. Each language uses its own --build folder (build/en, build/th, …). Unchanged lines are cached locally, so re-running them makes no network call. Repository: https://github.com/xianyu110/ecommerce-video-skills (the skill is the whole skills/multilingual-dubbing/ folder at the pinned commit: SKILL.md plus its scripts/ folder, 5 files) Pinned version: install the code at commit 96c49b349b7d975bda8f05ce6669c1d33500c269 exactly. Do not substitute a newer version. If this commit is unreachable, stop and tell me. 1. Clone https://github.com/xianyu110/ecommerce-video-skills into a temporary folder, check out commit 96c49b349b7d975bda8f05ce6669c1d33500c269, and copy the skills/multilingual-dubbing/ folder from that checkout. Then compare every file in the folder with the fingerprints recorded for this listing on 2026-10-19: [FINGERPRINTS] - SKILL.md: SHA-256 1a6144bb5916832fff51913a615227f6b9b0a480f3d54acca8eb840b9f6c0f06 - scripts/assemble.py: SHA-256 e55ed538d3662133724b9d1154ee8f6f9419253636388fbb9d8a54c280528048 - scripts/make_bgm.py: SHA-256 f02581b6d77422767b839f0c3b8a1475f74e9910e7a5efc817b71ba97eb5783e - scripts/make_subs.py: SHA-256 8c8e9208e5dee5db0f92ed3e5fc9850f99896be5ca02792d79b5f35b26f89cef - scripts/tts_edge.py: SHA-256 f3263ce63fa29e106cc38be0cec2daf564e9609e37c99c3709eef0136c0a9d76 If a file does not match, it changed since the listing was prepared: do not install it yet, tell me what you found and let me decide. 2. Read SKILL.md in full and read all four scripts in scripts/ (assemble.py, make_bgm.py, make_subs.py, tts_edge.py), and tell me in plain words: what the skill does when used, which services it connects to, whether it reads or sends any personal information or keys, and anything that seems unusual. Stop on any red flag and tell me before going further. Confirm these points from the files: - The skill folder holds 5 files only: SKILL.md (4,674 bytes) and four Python scripts in scripts/ (assemble.py, 14,821 bytes; make_bgm.py, 2,909 bytes; make_subs.py, 5,751 bytes; tts_edge.py, 4,628 bytes). All four scripts are byte-identical copies of the same-named scripts at the repository root (scripts/) and of the copies in the ffmpeg-auto-assemble and image-to-video-shots skills (make_subs.py also in subtitles-and-text-effects, tts_edge.py also in ai-voiceover-edge-tts), kept in sync by the repo's tools/sync_scripts.py, whose table assigns exactly these four scripts to multilingual-dubbing: the skill is self-contained in its own folder and needs no file from elsewhere in the repository — not the other 12 skills, not the root scripts/, not the README, not requirements.txt. SKILL.md only ever calls the scripts sitting next to it (scripts/assemble.py --lang <code>, which itself imports make_subs, make_bgm and tts_edge from its own folder, and scripts/tts_edge.py --list LOCALE to list voices). - Nothing is sent anywhere during installation itself; the only download at install time is the skill folder from GitHub at the pinned commit. No script is run during installation, no package is installed, no key is asked for, and there is no telemetry in the folder. - What leaves this machine at use time, disclosed here before it ever happens — using the skill is a separate step that only starts when I ask for a localised version, and the only network path in the four scripts is the edge_tts library, imported lazily inside tts_edge.py's synthesis functions: (a) the normal render (python scripts/assemble.py storyboard.json --lang <code> --voice <voice>, --tts edge being the default): assemble.py calls tts_edge.synth_storyboard, which for each shot calls edge_tts.Communicate(text, voice, rate=rate, pitch=pitch).save(mp3) — sending that shot's exact localised line text (its line_<lang> field, or the base line field if the shot has no line_<lang>), plus the chosen voice name, rate and pitch, to Microsoft's Edge online text-to-speech service (the free online voices behind Microsoft Edge's read-aloud, reached through the community-maintained edge-tts package — rany2/edge-tts, LGPL-3.0; this repository installs it as a dependency and does not bundle its code), and the synthesised MP3 audio comes back and is saved locally. No API key, no account and no other payload: no image files, no video, and no storyboard metadata beyond that line's text and its voice parameters are sent, one request per shot line, retried up to 3 times if the network fails. (b) Using tts_edge.py directly (single line, or --storyboard storyboard.json with --field line_en): the same send, per line, with the text I gave or the named field of each shot. (c) Voice listing (python scripts/tts_edge.py --list LOCALE, or edge_tts.list_voices()): the voice list is fetched from the same Microsoft service and filtered locally by prefix — no script text of mine is sent for a listing. And if a line's WAV already exists locally with a matching cache stamp, the script reuses it and makes NO network call for that line at all. (d) The offline exception: assemble.py --tts none makes NO network call at all — it estimates each shot's voice duration locally (text length / 4.5) and renders a silent preview. - What does NOT leave this machine, checked in the code: there is no translation service, no transcription (no Whisper, local or remote), no other API, no requests/urllib/curl call and no literal service URL anywhere in the folder — the localisation rewrite is done by you, the agent, locally with me, following SKILL.md's prompt template (keep every selling point, add no new data or promises, words per line ≤ shot seconds × 2.5, subtitles may use | breaks and **bold** on one keyword, convert units to local habits with equivalent values, keep brand-name spelling), and the scripts only read the line_<lang> / sub_<lang> / title_<lang> / cta_<lang> / tag_<lang> fields I already put in storyboard.json, falling back to the base Chinese fields when a localised field is missing (a sub_<lang> of "" means no subtitle for that shot). Grep for the imports to confirm: assemble.py imports only the standard library plus numpy and Pillow and its sibling modules make_subs / make_bgm / tts_edge; make_bgm.py imports numpy only; make_subs.py imports the standard library only; tts_edge.py imports the standard library plus edge_tts (lazily). - The local-only parts at use time: Pillow prepares each shot's still (cover crop or blurred-fill fit); ffmpeg renders the Ken Burns motion, the xfade transitions, the audio mix and the final MP4, and ffprobe measures durations; tts_edge.py trims each MP3's leading/trailing silence with ffmpeg (silenceremove at -45dB, applied in both directions) and converts it to a 48 kHz mono WAV (l00.wav, l01.wav, … in <build>/tts/, with durations.json written there); the background music is either generated locally by make_bgm.py (pure numpy synthesis, no download) or read from a local music file named in the storyboard, mixed with ducking under the voice and two-pass loudnorm to about -14 LUFS, all locally; make_subs.py builds the ASS subtitles/title text and the plain SRT locally (its only subprocess besides ffmpeg is a local fc-list font lookup); timing.json (shot starts, durations, voice durations, cues) is written locally in the build folder; the cache stamp is a local .key file next to each WAV holding the first 12 hex characters of the SHA-1 of "text|voice|rate|pitch". - Do not pip install pillow, numpy, edge-tts or anything else during this install, do not install or look for ffmpeg or any font, do not run any of the four scripts, and do not synthesise any audio or render any video: setting up the use-time dependencies is my decision, later, when I actually ask for a localised version. 3. When I say "yes, install", install it as a skill: copy the whole multilingual-dubbing folder into the agent's skills directory, in a folder named "multilingual-dubbing", keeping all 5 files (SKILL.md at its root and the four scripts in its scripts/ subfolder). A manual clone followed by copying the skills/multilingual-dubbing folder into ~/.claude/skills/ is the route described here; any other route is fine only as long as every installed file matches its fingerprint. 4. Verify with no network calls: frontmatter valid (name: multilingual-dubbing), all 5 files in place with matching fingerprints. Do not run any of the scripts to verify. 5. Report what was installed, where, and what I still need to do myself (for example: before any use, install the use-time dependencies myself — Python 3, pip install pillow numpy edge-tts (the root requirements.txt pins pillow>=10, numpy>=1.24, edge-tts>=6.1), and ffmpeg with libass plus ffprobe on PATH — and install a font covering my target language's script and pass it with --font when CJK fonts do not cover it (Thai, Arabic, …), or subtitles render as boxes; provide the finished Chinese storyboard.json myself and do the localisation rewrite with you — a rewrite in local wording, not a literal translation, keeping every selling point and adding no data or promises, with per-shot line_<lang> / sub_<lang> and any title_<lang> / cta_<lang> plus a top-level tag_<lang>; choose the language code, voice and rate myself, with a separate --build folder per language, knowing that each shot's localised line text plus its voice, rate and pitch will be sent to Microsoft's Edge online TTS service when the line is synthesised, and that unchanged cached lines are not re-sent; have a native speaker check at least the hook line, the CTA and brand-name pronunciation, as SKILL.md's checklist requires, and check my target platform's and region's AI-voice and advertising labelling requirements before any commercial use; using the skill is a separate step that only starts when I ask for it, and the use-time sends disclosed above happen only then). GitHub is optional: if I have a GitHub account or the gh CLI, you may use it; otherwise public access is fine. Never require it unless it's in the prerequisites above. Rules: don't touch anything outside the temp folder and the install target. If anything looks off, stop and ask me.
Saved to your recent installs. Find it anytime on /connect.
Questions
How do I install a build?
Every product page includes a copy-paste install prompt. Paste it into your Muse and it sets the build up for you — no manual configuration.
Where does my money go?
Straight to the seller. Skill Harbor never processes payments: checkout happens on the seller’s own page, usually Stripe.
What does the ✓ next to a creator’s name mean?
It means we confirmed the identity of the person behind the listing. It says nothing about the code itself — always check a build before installing it.