jianshuo/wjs-teaching-english
Use when the user wants to teach / learn an English word as a video — turn a single English word into a self-contained HLS "supercut" lesson built from the mira video base. Stitches every season2 clip where the word is spoken (via the search-app API) into one .m3u8, prepended with a Claude-written bilingual word-intro card (word + IPA + 中文 gloss + usage, Volcano TTS) and appended with a 关注王建硕 CTA card. No MP4 burn. Triggers — "teach <word>", "讲讲 <word>", "学英语 <word>", "把 <word> 做成视频", "/wjs-teaching-english <word>".
npx skills add https://github.com/jianshuo/claude-skills --skill wjs-teaching-english
Turn one English word into a self-contained HLS lesson:
intro.ts (word /IPA/ · 中文 gloss · usage + Volcano TTS)
⋯ EXT-X-DISCONTINUITY
[supercut] every season2 clip where the word is spoken (search-app /api/playlist, COS URLs)
⋯ EXT-X-DISCONTINUITY
cta.ts (关注王建硕 + Volcano TTS)
= search-app/out/<word>.m3u8
No MP4 is burned — only the two cards are rendered as tiny .ts, re-encoded to
match the supercut's codec so they play in any HLS player.
ffmpeg / ffprobe on PATH (Homebrew).volcengine SDK (declared in mira requirements.txt, used for TTS):python3 -c "import volcengine". If missing, ask the user to allow
pip3 install volcengine==1.0.58 (it's a pinned repo dependency).
https://search-app-three-kappa.vercel.app(default). Override with SEARCH_APP_BASE=http://localhost:3000 if running
locally (needs Node ≥ 23.6 + npm start).
a sentence, pick the target word.
Keep it accurate and concise. Save to a temp file, e.g. /tmp/lesson.json:
{
"word": "love",
"ipa": "/lʌv/",
"pos": "v. / n.",
"gloss": "爱,热爱",
"usage": "下面是它在真实电影里的说法",
"tts_text": "love. 爱。"
}
tts_text is read aloud over the intro card — keep it to the word + ashort 中文 gloss (Volcano reads mixed English/中文 fine).
usage is one short line shown on the card (≤ ~20 chars renders best atlow resolutions).
cd /Users/jianshuo/code/mira/search-app
python3 scripts/build_lesson.py --word love --lesson /tmp/lesson.json
Useful flags: --speaker zh_female_qingxin (default), --limit 300 (max
clips), --no-tts (silent cards), --base <url>, --out <dir>.
search-app/out/<word>.m3u8) and theclip count. The .m3u8 plus its sibling <word>.intro.ts / <word>.cta.ts
are the deliverable; out/ is git-ignored.
nothing — tell the user and suggest a more common word.
the first discontinuity needs no decoder re-init (avoids bufferAppendError).
ffplay search-app/out/<word>.m3u8, or serve the out/folder over HTTP and open in any HLS player (Safari plays .m3u8 natively).
Take jianshuo/wjs-teaching-english from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip.
Without those the skill loads but fails at the first command.