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)
| Segment | Visuals | Audio |
|---|---|---|
| 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" + "Event | YYYY.MM.DD" |
| explainer (narration, interspersed between clips) | Same as hook, text cards switch to fact cards, small text below marks "Source: Who | Date"; change visuals every 2 to 3.2 seconds |
| outro | Centered large question (key words in yellow) + brand mark + @bounce12340 + bottom line small source text | Voiceover 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). Modeleleven_multilingual_v2, using OpenMontage'selevenlabs_tts. API key is machine environment variableELEVENLABS_API_KEY(only carried withbash -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
citeto 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.templateis"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)
- Priority official sources: Company official channels (Anthropic, OpenAI, NVIDIA, Microsoft...), event organizers (GTC, Build, TED...), Podcast's own channel. Spec's
channelmust write the original channel name, prep_clips.py will compare with YouTube's channel field; warning if mismatch. - 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.
- 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'scaption_credits. - 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.
- 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.
- 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.
- Downloading: Only use yt-dlp to download public videos, no login, no cookies, no bypassing paywalls or regional restrictions. YouTube's
--download-sectionsreturns 403 on this machine, so prep_clips.py will download the entire video (1080p or lower) cached incache/sources/, then cut with ffmpeg. - 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"
- 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 withprep_clips.py; if you just want to preview, download the full video first and cut a short segment with ffmpeg to listen. - 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'ssubs, translatezhto Taiwan Traditional Chinese; can merge or split segments (tis 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). - tts.py: One audio file per line, same text sent only once (cached by text hash in
cache/tts/). First run--dry-runto see number of characters to be sent. Fallback on failure: user-Elevenlabs connectorcreative_generate_speech(generations_count: 1), save to the cache path it prints. - 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. - build.py --check: Print video length, original audio percentage, subtitle timing per segment, and rule warnings.
- 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/zhcan be a string or equal-length list (list = same voiceover line split into multiple subtitles; timing divided proportionally by English character count).cardwithin the same segment persists to the next line until a new card replaces it;"card": falseclears it.- If
zhis too long, it will automatically split at Chinese comma into two lines; to force splits use\n. Key words use[[ ]]orhllist. 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
- 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).
- 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.
- Use
ffprobeto check video length and file size; check original audio percentage from build.py's last line. - credits.json interview_clips: each has URL, channel, start/end time; verify it's the official channel.
- 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:
*.enmodels (small.en etc.) produce garbled text; use multilingualmedium/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-sectionsreturns 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.