Wjs Localizing Video logo

Wjs Localizing Video

Community
jianshuo
wjs-localizing-video

Thin orchestrator for the end-to-end video localization pipeline. Routes to the four focused sub-skills — /wjs-transcribing-audio, /wjs-translating-subtitles, /wjs-dubbing-video, /wjs-burning-subtitles. Use when the user asks for full localization in one go ("帮我把这个西班牙语视频做成中文字幕+配音", "translate and dub this video", "做完整的本地化"). For any individual step (just transcribe, just translate, just dub, just burn), invoke the sub-skill directly — it's faster and the boundary is cleaner.

Overview

Publisherjianshuo
Repositoryclaude-skills
Skill namewjs-localizing-video
Stars
137
Forks
22
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by jianshuo on GitHub. Read the source before you install it.

Installation

Install the Wjs Localizing Video AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/jianshuo/claude-skills/tree/main/wjs-localizing-video
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/jianshuo/claude-skills.git /tmp/claude-skills
mkdir -p .claude/skills
cp -r /tmp/claude-skills/wjs-localizing-video .claude/skills/wjs-localizing-video
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Wjs Localizing Video in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Wjs Localizing Video on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Wjs Localizing Video is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

wjs-localizing-video (orchestrator)

This skill was split. What used to be one 1300-line catch-all is now 4 focused sub-skills. Use this orchestrator only when the user asks for the full pipeline in one request. For any individual step, route directly to the sub-skill.

The four sub-skills

StepSkillINOUT
1. ASR/wjs-transcribing-audioaudio / video + source languagesource-language SRT
2. Translate/wjs-translating-subtitlessource SRT + target languagetarget SRT (punct-bounded)
3. Dub (optional)/wjs-dubbing-videovideo + target SRT + voice*_<lang>_dub.mp4 (TTS audio swapped in)
4. Burn / mix (optional)/wjs-burning-subtitlesvideo + SRT + (optional dub)final MP4 (one encode)

Steps 3 and 4 are optional and independent — most "subtitle-only" jobs stop after step 2 + soft-mux via /wjs-burning-subtitles. Most "dub-only" jobs stop after step 3.

When to invoke this orchestrator vs a sub-skill directly

Invoke this skill (wjs-localizing-video) when the user asks for the whole chain in one go:

  • "帮我把这个西班牙语视频做成中文字幕和中文配音"
  • "translate this Spanish video to English with dubbing"
  • "全套:转写、翻译、烧字幕、配音、混音"

Invoke a sub-skill directly when the user asks for one step:

  • "转写一下这个音频" → /wjs-transcribing-audio
  • "把这个 SRT 翻译成中文" → /wjs-translating-subtitles
  • "给这个视频配个中文音" → /wjs-dubbing-video
  • "把字幕烧进视频" → /wjs-burning-subtitles

The sub-skills are more focused and document their input/output contracts tighter. Don't route through this orchestrator when a single step is the whole ask — you'll just be reading docs you don't need.

Progress checklist (do this FIRST, before any sub-skill)

The pipeline has up to four steps and runs for several minutes. The user wants to see live progress, not a wall of silence followed by a finished file. Before invoking the first sub-skill, lay out the planned steps as a TaskCreate checklist. As you start each step, update its task to in_progress; when it finishes, mark completed. Claude Code renders this as a checklist in the UI that ticks off in real time.

Which tasks to create

Decide from the user's ask which subset of the 4 steps will run:

User asked forTasks to create
Full localization (subs + dub + final mix)① 转写 ② 翻译 ③ 配音 ④ 烧字幕 + 混音
Subtitles only (no voice change)① 转写 ② 翻译 ③ 烧字幕 (or soft-mux)
Dub only (no burn)① 转写 ② 翻译 ③ 配音
User already has source SRTskip ①; create only the remaining steps
User already has target SRTskip ① and ②; create only the remaining

Don't create tasks for steps you won't run — an unchecked item at the end reads as "we forgot," not "we skipped."

How to phrase the task subjects

Use the same labels you'll use in the "Final response template" below, so the in-flight checklist and the completion summary read as the same artifact:

  • 转写 <source-lang> (e.g., 转写 西班牙语)
  • 翻译 → <target-lang> (e.g., 翻译 → 中文)
  • 配音 <target-lang> (e.g., 配音 中文 (高冷御姐 -8%))
  • 烧字幕 + 原声底层 <bed> (e.g., 烧字幕 + 原声底层 0.18)

For activeForm, use the present-continuous variant (转写中…, 翻译中…, 配音中…, 合成中…).

State discipline

  • Mark in_progress only the task currently running (one at a time).
  • Mark completed immediately when the sub-skill returns its output file — don't batch.
  • If a step surfaces a clarifying question or fails, leave it as in_progress so the user can see exactly where the pipeline stopped. Don't mark a half-finished step as completed.
  • If the user redirects mid-pipeline (e.g., "skip the dub"), update the remaining tasks: delete the ones no longer applicable, keep the rest. Don't silently drop them.

Canonical end-to-end pipeline (Spanish → Chinese, with dub + bed + burn)

This is the original "validation scenario" — Spanish yoga/spiritual content into Chinese for 微信视频号 / 小红书. Walks through all 4 sub-skills.

Step 1 — Transcribe the Spanish source

Invoke /wjs-transcribing-audio with the video and `--language es`.

The sub-skill handles: chunking, word-level timestamps, cue assembly at punctuation boundaries, loop guard, retry. Output: entrevista.srt (Spanish, source-language).

Step 2 — Translate to Simplified Chinese

Invoke /wjs-translating-subtitles with the Spanish SRT and target `zh-CN`.

The sub-skill handles: re-segmenting cues at punctuation, minimizing filler demonstratives, capping line length, preserving speaker tone. Output: entrevista.zh-CN.srt.

Step 3 — (Optional) Dub into Chinese

Invoke /wjs-dubbing-video with the video + entrevista.zh-CN.srt + a voice ID.

Default for mature contemplative female: zh_female_gaolengyujie_moon_bigtts (Volcano 高冷御姐, --rate -8% +0Hz). If no Volcano credentials: zh-CN-XiaoxiaoNeural --rate -8% --pitch -10Hz. The sub-skill samples first, then commits.

Output: entrevista_zh_dub.mp4.

Step 4 — Burn subs + mix dub over original-as-bed

Invoke /wjs-burning-subtitles with --video entrevista.mp4 --srt entrevista.zh-CN.srt --dub entrevista_zh_dub.mp4

The sub-skill handles: libass availability check, evermeet static-build fallback, Fontsize calibration, frame-check before full render, audio bed mix at 0.18.

Output: entrevista_zh_final.mp4 (ship-ready).

Defaults the user has standardized

These apply across the pipeline; each sub-skill enforces its own slice:

  • Chinese ASR routes to 豆包 (Volcano) first; Whisper is fallback. Enforced in /wjs-transcribing-audio.
  • Single voice for the whole dub unless the user explicitly mentions multiple speakers. Enforced in /wjs-dubbing-video.
  • Original audio kept as a low-volume bed (0.15–0.25) under any dub. Enforced in /wjs-burning-subtitles.
  • Burn-in for 微信视频号 / 抖音; soft-mux for everything else by default. Enforced in /wjs-burning-subtitles.
  • Channel CTA name (if added to description): 王建硕 — never a guest's name. (Global rule from ~/.claude/CLAUDE.md; applies when this pipeline is followed by /wjs-uploading-video.)

File naming convention (preserved from the original skill)

text
input:                       entrevista.mp4

Chinese pipeline:
  source SRT                 entrevista.srt
  Chinese SRT                entrevista.zh-CN.srt
  Chinese dub (audio only)   entrevista_zh_dub.mp4
  Chinese final (subs+dub)   entrevista_zh_final.mp4

English pipeline:
  English SRT                entrevista.en.srt
  English dub                entrevista_en_dub.mp4
  English final              entrevista_en_final.mp4

Bilingual subtitles:
  Spanish + Chinese          entrevista.es-zh.srt
  Spanish + English          entrevista.es-en.srt
  three-language             entrevista.es-zh-en.srt

BCP-47-style suffixes keep multiple target-language outputs side-by-side and make the target obvious at a glance.

What this orchestrator does NOT do

  • It does not re-implement anything. Every step delegates to a sub-skill.
  • It does not bundle the scripts. dub.py lives in /wjs-dubbing-video/scripts/, render.py lives in /wjs-burning-subtitles/scripts/, visual_diarize.py lives in /wjs-dubbing-video/scripts/. If you see stale copies under wjs-localizing-video/scripts/, prefer the canonical sub-skill locations.

Final response template

When the full pipeline completes, respond briefly in the user's language. Match the original "Done" template the user is used to:

text
已完成:
- 西班牙语转写  (/wjs-transcribing-audio)
- 中文翻译     (/wjs-translating-subtitles)
- 中文配音     (/wjs-dubbing-video, voice: 高冷御姐 -8%)
- 烧入字幕 + 原声底层 0.18  (/wjs-burning-subtitles)

输出:
- entrevista.srt
- entrevista.zh-CN.srt
- entrevista_zh_dub.mp4
- entrevista_zh_final.mp4

不确定片段:
- 00:01:23–00:01:26 背景噪音较大,原文可能不完全准确。

If there are no uncertain parts, drop the second list.

See also

  • /wjs-segmenting-video — cut long-form video into stand-alone short clips (uses its own SRT slicer; orthogonal to this pipeline).
  • /wjs-overlaying-video — HTML/CSS captions on a clip via HyperFrames. Don't combine with /wjs-burning-subtitles — pick one caption system per output.
  • /wjs-uploading-video — push the final MP4 to YouTube.
  • /lark-minutes — alternate Chinese-only transcript path via 飞书妙记 when local 豆包 ASR isn't wired up.

Frequently asked questions

What does the Wjs Localizing Video AI skill do?

Thin orchestrator for the end-to-end video localization pipeline. Routes to the four focused sub-skills — /wjs-transcribing-audio, /wjs-translating-subtitles, /wjs-dubbing-video, /wjs-burning-subtitles. Use when the user asks for full localization in one go ("帮我把这个西班牙语视频做成中文字幕+配音", "translate and dub this video", "做完整的本地化"). For any individual step (just transcribe, just translate, just dub, just burn), invoke the sub-skill directly — it's faster and the boundary is cleaner.

Why use Wjs Localizing Video on TypingMind?

Because you install it once and use it with any model. Wjs Localizing Video is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Wjs Localizing Video in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/jianshuo/claude-skills/tree/main/wjs-localizing-video. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Wjs Localizing Video?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Wjs Localizing Video?

As many as you like. As long as a model supports skills, you can use Wjs Localizing Video with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Wjs Localizing Video AI skill free?

Yes. It is published on GitHub by jianshuo under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇