CommunityCoding & Developmentgithub.com

bounce12340/josh-video-skills

Creates vertical Reels for celebrity interviews/speeches in Fox Hsiao style: narration in the selected language (Chinese using <YOUR_VOICE_NAME> <YOUR_ELEVENLABS_VOICE_ID>; English using Sarah Explains) with Traditional Chinese subtitles, interspersed with 15–30s original audio clips (centered 16:9 with blurred background, source tags, and attribution), ending with a question for the audience. A JSON spec drives the entire process to final video, 720p preview, contact sheet, credits.json, and cover.

What is josh-video-skills?

This skill automates the production of vertical (9:16) Reels featuring excerpts from celebrity interviews or speeches, following the visual and narrative style popularized by creator Fox Hsiao. It generates a narrated explainer video that interleaves 15–30 second original audio/video clips (from official sources) with custom voiceover commentary, all presented with Traditional Chinese subtitles and English captions. The skill supports a full automated pipeline: it reads a JSON specification, downloads and trims clips via yt-dlp, generates TTS narration using ElevenLabs (with voice selection per language), fetches B-roll from Pexels, composes the video with custom titling and effect templates, and outputs the final MP4 along with a 720p preview, contact sheet, credits, and cover images. It enforces strict rules for fair use, source attribution, and duration limits (total original audio less than 40%), and is designed for use within the bounce12340/Josh media production environment (e.g., OpenMontage, stock-footage-reel).

Works with✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/bounce12340/josh-video-skills/tree/HEAD/interview-reel

Installed? Explore more Coding & Development skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

interview-reel: Celebrity Interview / Speech Reel (Fox Hsiao Style)

Josh 2026-10-12 Approved: Celebrity interviews use the Fox style, narration interspersed with 15 to 30 second original audio clips, with source attribution, made into a fixed skill. This skill only creates drafts, it does not publish. Publishing is always handled by the main bot after Josh confirms.

  • Scripts: <SKILLS_DIR>/interview-reel/scripts/ (hereafter abbreviated as $S)
  • Example spec: examples/mcp_test.spec.json (Anthropic official MCP interview, test video)
  • Reference finished product: <YOUR_WORKSPACE>/media-team/03-drafts/interview-reel-test/test.mp4
  • Reference videos: <YOUR_WORKSPACE>/refs/ig-DeWJjxJyoEb/ (Fox Hsiao, Musk Terafab, learn the format), <YOUR_WORKSPACE>/refs/ig-DWVQfDmE41Z/ (AI Post, Jensen Huang, only original audio, simplest, don't learn it, no attribution)
  • Reuses: common.py from stock-footage-reel (fonts, downloads), synth_music.py (original music), Pexels cache; OpenMontage's venv (faster-whisper, yt-dlp) and elevenlabs_tts; cover <YOUR_WORKSPACE>/media-team/00-profile/covers/render.py.

Format (Derived from Fox Hsiao's video)

SegmentVisualsAudio
hook (0 to ~11 sec)Full-frame 9:16 B-roll (darkened, slow zoom), changing every 1 to 2.5 seconds; top-left large text card (small red category label + two bold large lines, key words in orange)Voiceover (Chinese <YOUR_VOICE_NAME> / English Sarah Explains) + music
clip (original audio, 15 to 30 sec each, 3 to 4 segments)16:9 original video centered (y=468), with the same frame blurred and darkened filling the top/bottom gap; top-left small text "Video / Original Channel"; below original video, red "Original Audio" label + "English Name Chinese Name or Identity" + "EventYYYY.MM.DD"
explainer (narration, interspersed between clips)Same as hook, text cards switch to fact cards, small text below marks "Source: WhoDate"; change visuals every 2 to 3.2 seconds
outroCentered large question (key words in yellow) + brand mark + @bounce12340 + bottom line small source textVoiceover asking audience (Chinese <YOUR_VOICE_NAME> / English Sarah Explains)

Shared throughout video: Fixed top title bar (brand mark + one-line title, key words orange); centered subtitles, large Traditional Chinese text (white, bold, light shadow, key words yellow) + one small English line below. The English in the explainer is the original voiceover text; the English in the original audio segment is a transcript of the speaker's original words, the Chinese is our translation.

House Rules (Must Follow)

  • 1080x1920, under 3 minutes, IG final file under 45 MB (will auto lower bitrate and re-encode if exceeded), H.264/AAC.
  • Voiceover: Choose ElevenLabs voice based on language. Chinese uses "<YOUR_VOICE_NAME>" (<YOUR_ELEVENLABS_VOICE_ID>); English uses Sarah Explains (Nhs7eitvQWFTQBsf0yiT). Model eleven_multilingual_v2, using OpenMontage's elevenlabs_tts. API key is machine environment variable ELEVENLABS_API_KEY (only carried with bash -lc), do not print or write to file.
  • Subtitles: Traditional Chinese main subtitles + small English text. Use Taiwanese terminology (software, data, video, internet, computing resources...), use「」for quotes, no em dashes (build.py will reject).
  • Narration must be majority: Total original audio should be below 40%; over 50% build.py will directly reject. Maximum 30 seconds per original audio segment (prep_clips.py will reject), recommended 15 to 30 seconds.
  • Original audio segments: no overlaying voiceover, no altering speaker's original words; Chinese translation must be faithful to meaning, do not add conclusions for the speaker.
  • Faithful to original: Numbers and dates in narration must go back to primary source; text cards use cite to mark "Source: Who | Date", and write into facts.md.
  • End must include a question for the audience (outro.question must contain "?").
  • Cover: Use covers/render.py, default cover.template is "E" (person headshot, Josh calls it "D person headshot"). Josh decided 2026-10-12: Celebrity interviews always use this template.

Source Material and Licensing (Write into each video's credits.json)

  1. Priority official sources: Company official channels (Anthropic, OpenAI, NVIDIA, Microsoft...), event organizers (GTC, Build, TED...), Podcast's own channel. Spec's channel must write the original channel name, prep_clips.py will compare with YouTube's channel field; warning if mismatch.
  2. Never use reposts / versions with someone else's watermark (e.g., fan page re-uploads, clips cut by other accounts, videos with someone else's logo). If an official version cannot be found, skip that segment.
  3. Must show source on screen: Below original audio "Original Audio Name | Event | Date" + top-left "Video / Original Channel", credit again at end in small text, post description paste credits.json's caption_credits.
  4. credits.json will auto record: source URL, channel, channel URL, video title, upload date, used start/end time (source_in/source_out), position in final video, each B-roll URL and author, voiceover, music.
  5. Licensing Statement: The copyright of these interview visuals belongs to the original channel; we have not obtained a license, relying on "commentary, quotation" fair use (Taiwan Copyright Act Articles 52, 65), this is a gray area. Therefore: keep each segment short, the entire video is mostly Josh's commentary and analysis (transformative), original audio is only supporting evidence; do not copy entire segments, do not cut to make the speaker say something they didn't mean.
  6. Do not imply endorsement: Do not write phrases like "Recommended by X" or "Official Collaboration"; cover and title should not make people think the speaker endorses Josh or his products.
  7. Downloading: Only use yt-dlp to download public videos, no login, no cookies, no bypassing paywalls or regional restrictions. YouTube's --download-sections returns 403 on this machine, so prep_clips.py will download the entire video (1080p or lower) cached in cache/sources/, then cut with ffmpeg.
  8. If the original channel requests takedown or Josh is uncomfortable, switch to text-only quotation, no visuals.

Workflow

D=<YOUR_WORKSPACE>/media-team/03-drafts/<topic>-interview ; mkdir -p $D/work
cp $S/../examples/mcp_test.spec.json $D/spec.json      # Change to current content
bash -lc "source <SKILLS_DIR>/OpenMontage/om-env.sh >/dev/null; cd $S; python prep_clips.py --spec $D/spec.json --work $D/work"
  1. Select clips: First read the original video's chapters (yt-dlp --print description), pick a 15 to 30 second segment in the official video where the speaker fully explains the key point. Transcribe with prep_clips.py; if you just want to preview, download the full video first and cut a short segment with ffmpeg to listen.
  2. prep_clips.py: Download, slice, transcribe (faster-whisper medium, CPU ~10 seconds for a 20 second segment). Will print "subs" template: paste it back into this clip's subs, translate zh to Taiwan Traditional Chinese; can merge or split segments (t is seconds relative to segment start). English follows speaker's original words; if transcription is uncertain, listen again or switch model for cross-check (--retranscribe --model small).
  3. tts.py: One audio file per line, same text sent only once (cached by text hash in cache/tts/). First run --dry-run to see number of characters to be sent. Fallback on failure: user-Elevenlabs connector creative_generate_speech (generations_count: 1), save to the cache path it prints.
  4. fetch_broll.py: For each keyword, fetch 3 clips from Pexels (landscape preferred, keyword accuracy better). Write concrete visuals ("server rack lights", "programmer coding"), avoid abstract terms. Can also give "image" (static image, will slowly zoom) or "file" (e.g., screen-recorded web page) in the line.
  5. build.py --check: Print video length, original audio percentage, subtitle timing per segment, and rule warnings.
  6. build.py: Produce video. Or run whole pipeline at once: bash $S/run.sh $D/spec.json $D <name> (must have subs translated first).

Spec Fields

{
  "title": "Fixed top title, [[key]] turns orange",
  "voice": {"voice_id": "Nhs7eitvQWFTQBsf0yiT", "model": "eleven_multilingual_v2"},  // English Sarah Explains; Chinese video change to <YOUR_ELEVENLABS_VOICE_ID> (your Chinese voice)
  "music": "synth",            // Original synthetic music; or audio file path (must include music_license); or "none"
  "music_db": -19,             // Music baseline volume
  "clip_music_db": -8,         // Original audio segment music lowered by this many dB
  "gap": 0.28,                 // Pause after each voiceover line (seconds); single line can override with line.pause
  "max_cut": 3.2,              // Max seconds between visual changes in explainer (hook default 2.4; segment can override with seg.max_cut)
  "segments": [
    {"type": "hook", "broll": ["keywords"], "lines": [
      {"en": "narration English", "zh": "subtitle Chinese", "card": {"tag": "small red label", "text": "first line\nsecond line [[key]]", "cite": "Source: ... | YYYY.MM.DD"}}
    ]},
    {"type": "clip", "url": "https://www.youtube.com/watch?v=...", "channel": "original channel", "official": true,
     "in": 147.1, "out": 166.75, "speaker_en": "David Soria Parra", "speaker_zh": "MCP Co-creator",
     "event": "Anthropic Official Interview", "date": "2025.12.11", "highlight": ["Chinese words to turn yellow"],
     "subs": [{"t": [0.0, 3.56], "en": "speaker's original words", "zh": "Taiwan Traditional Chinese translation"}]},
    {"type": "explainer", "broll": ["..."], "lines": [
      {"en": ["segment one,", "segment two."], "zh": ["subtitle one", "subtitle two"], "broll": ["keyword for this line"], "card": {...}}
    ]},
    {"type": "outro", "tag": "leave a comment", "question": "big question first line\nsecond line [[key]]?", "broll": ["..."], "lines": [{"en": "...", "zh": "..."}]}
  ],
  "cover": {"template": "E", "ep": "EP.13", "kicker": "...", "title": "...\n[[...]]", "subtitle": "...", "frame": {"clip": 1, "t": 4.0}}
}
  • en / zh can be a string or equal-length list (list = same voiceover line split into multiple subtitles; timing divided proportionally by English character count).
  • card within the same segment persists to the next line until a new card replaces it; "card": false clears it.
  • If zh is too long, it will automatically split at Chinese comma into two lines; to force splits use \n. Key words use [[ ]] or hl list.
  • cover.frame: Which original audio segment and time (in the original 16:9 video) to use for the cover. Other fields for template E (photo_side, visual_pos, brightness, tag) follow covers/README.md.
  • Chinese names: If the speaker has a commonly used Chinese translation, write that (e.g., Jensen Huang, Elon Musk); if not, write their identity (e.g., "MCP Co-creator"), do not transliterate yourself.

Output (OUT)

<name>.mp4, preview_720p.mp4 (for Josh to view in chat), contact_sheet.jpg (middle frame of each shot), credits.json, timeline.json, cover_reel.png / cover_post.png, cover_spec.json.

Self-Check Before Delivery

  1. Read contact_sheet.jpg: Check if text cards, subtitles, original audio labels overlap or are hidden by IG interface (top 220px, bottom 380px, right 130px).
  2. Original audio subtitles: English matches speaker's original words, Chinese does not distort meaning; if any transcription uncertainty remains, flag it for Josh to listen.
  3. Use ffprobe to check video length and file size; check original audio percentage from build.py's last line.
  4. credits.json interview_clips: each has URL, channel, start/end time; verify it's the official channel.
  5. Report to main bot: file path, length, size, original audio source and licensing statement, decisions needed from Josh. Do not publish.

Known Limitations

  • This machine's faster-whisper: *.en models (small.en etc.) produce garbled text; use multilingual medium / small; PyAV version is incompatible, audio must be fed using numpy (script handles this). Different models occasionally drop words for the same segment; cross-check key sentences.
  • YouTube --download-sections returns 403; can only download full video (long interview 1080p may be hundreds of MB, cached in cache/sources/, can delete after use).
  • No GPU: 1-minute video takes about 2 minutes to render; 3-minute video takes 6 to 8 minutes.
  • Pexels keyword results sometimes inaccurate; check contact sheet and change keywords or use image / file.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

bounce12340/josh-video-skills

收到「做一支影片/Reel」時先用:判斷影片類型、轉給對應的影片 skill,套用共用本家規則並交給事實編輯。只做草稿,不發文。

bounce12340/josh-video-skills

用 OpenMontage(開源 AI 影片製作流水線,<SKILLS_DIR>/OpenMontage)做 Josh 的影片時的「本家規則」轉接層。適用:長片剪成多支短片(clip-factory)、真實螢幕錄製教學(screen-demo)、翻譯配音(localization-dub)、Podcast 轉影片(podcast-repurpose)、「照這支參考影片做」(reference video 分析)、無旁白紀錄片蒙太奇(documentary-montage),以及幫 stock-footage-reel 加抓 NASA/國會圖書館/NARA/Archive.org 老片。觸發語:「用 OpenMontage」、「長片切短片」、「照這支 Reel 做」、「翻譯配音」、「螢幕教學影片」。

bounce12340/josh-video-skills

用 Playwright 錄「公開網頁」的操作畫面(捲動、滑過、點連結、高亮重點、章節卡),輸出 1080x1920 直式 mp4,當 Reel 的工具/網站導覽素材。觸發語:「錄一段網頁操作」「網站導覽素材」「螢幕錄影素材」「screen record」。只錄公開頁面,不登入、不發文。

bounce12340/josh-video-skills

「真實素材剪輯」直式短影音(AYi @ayi_ainotes 那種紀錄片風):照口播稿每一句,自動搜尋並下載免費可商用素材(Pexels、Mixkit Free、Wikimedia Commons),加上洋紅調的 1950 到 70 年代 Prelinger 公有領域老片,硬切剪輯,燒上雙語字幕(繁中+英文,重點字金色),左上固定標題,ElevenLabs 配音,暗色合成器配樂,片尾金句卡加出處小字,再用 B 剪報 Vox 樣板出封面。觸發語:「做一支真實素材剪輯」、「stock footage reel」、「AYi 風格」、「素材庫剪輯」。

Related Skills