interview-reel:Reel de Entrevistas/Palestras (Estilo Fox Hsiao)
Josh 2026-10-12 Aprovado: entrevistas com personalidades no estilo Fox, narração intercalada com trechos originais de 15 a 30 segundos, com créditos de fonte. Skill fixa. Esta skill gera apenas rascunho, não publica. Publicação é sempre feita pelo bot principal após confirmação do Josh.
- Scripts:
<SKILLS_DIR>/interview-reel/scripts/(doravante$S) - Exemplo de spec:
examples/mcp_test.spec.json(entrevista oficial da Anthropic sobre MCP, vídeo de teste) - Resultado de referência:
<YOUR_WORKSPACE>/media-team/03-drafts/interview-reel-test/test.mp4 - Vídeos de referência:
<YOUR_WORKSPACE>/refs/ig-DeWJjxJyoEb/(Fox Hsiao, Musk Terafab, formato a ser seguido),<YOUR_WORKSPACE>/refs/ig-DWVQfDmE41Z/(AI Post, Jensen Huang, apenas áudio original, o mais simples, não seguir nem creditar) - Reutiliza: common.py de stock-footage-reel (fontes, download), synth_music.py (música original), cache do Pexels; venv do OpenMontage (faster-whisper, yt-dlp) e
elevenlabs_tts; capa<YOUR_WORKSPACE>/media-team/00-profile/covers/render.py.
Formato (extraído do vídeo do Fox Hsiao)
| Segmento | Imagem | Áudio |
|---|---|---|
| hook (0 a ~11s) | B-roll 9:16 em tela cheia (escurecido, zoom lento), troca a cada 1 a 2.5s; placa grande no canto superior esquerdo (tag pequena vermelha + duas linhas em negrito, palavras-chave em laranja) | Narração (chinês <YOUR_VOICE_NAME> / inglês Sarah Explains) + música |
| clip (áudio original, 15 a 30s cada, 3 a 4 segmentos) | Vídeo original 16:9 centralizado (y=468), preenchido com o mesmo vídeo desfocado e escurecido; texto pequeno "Vídeo / Canal Original" no canto superior esquerdo; tag vermelha "Áudio Original" abaixo + "Nome em inglês Nome chinês ou cargo" + "Evento|YYYY.MM.DD" | Apenas áudio original, sem narração; música mais baixa (clip_music_db) com sidechain ducking |
| explainer (narração, intercalada entre clipes) | Mesmo do hook, placa substituída por cartão de fato, texto pequeno "Fonte: Quem|Data" na parte inferior; troca de imagem a cada 2 a 3.2s | Narração (chinês <YOUR_VOICE_NAME> / inglês Sarah Explains) + música |
| outro | Pergunta grande centralizada (palavras-chave em amarelo) + marca do canal + @bounce12340 + linha de créditos no rodapé | Narração perguntando ao público (chinês <YOUR_VOICE_NAME> / inglês Sarah Explains) |
Compartilhado em todo o vídeo: barra de título fixa no topo (marca + título, palavras-chave em laranja); legendas centralizadas, chinês tradicional grande (branco, negrito, sombra suave, palavras-chave em amarelo) + linha pequena em inglês abaixo. O inglês na narração é o texto original; o inglês nos clipes é a transcrição da fala original, o chinês é nossa tradução.
Regras da Casa (devem ser seguidas)
- 1080x1920, até 3 minutos, Instagram final até 45 MB (acima disso reduz taxa de bits automaticamente), H.264/AAC.
- Narração: conforme o idioma, escolher voz ElevenLabs. Chinês: "<YOUR_VOICE_NAME>" (
<YOUR_ELEVENLABS_VOICE_ID>); inglês: Sarah Explains (Nhs7eitvQWFTQBsf0yiT). Modeloeleven_multilingual_v2, usandoelevenlabs_ttsdo OpenMontage. Chave é variável de ambienteELEVENLABS_API_KEY(carregada combash -lc), não imprimir ou salvar em arquivo. - Legendas: chinês tradicional principal + inglês pequeno. Terminologia taiwanesa (software, dados, vídeo, internet, recursos computacionais…), aspas "「」", sem travessão (build.py bloqueará).
- Narração deve ser maioria: áudio original total recomendado abaixo de 40%, acima de 50% build.py bloqueia. Cada clipe original no máximo 30s (prep_clips.py bloqueará), recomendado 15 a 30s.
- Clipes originais sem narração sobreposta, sem alterar fala original; tradução chinesa deve ser fiel ao significado, não adicionar conclusão ao palestrante.
- Fiel à fonte: números e datas na narração devem vir da fonte primária, usar
citeno cartão "Fonte: Quem|Data" e registrar em facts.md. - Final deve conter uma pergunta ao público (outro.question deve ter "?").
- Capa usar covers/render.py,
cover.templatepadrão"E"(rosto da pessoa, Josh chama "D Rosto"). Josh 2026-10-12 já definiu: todas as entrevistas com personalidades usam este template.
Fontes de Material e Licenciamento (registrado no credits.json de cada vídeo)
- Priorizar fontes oficiais: canais oficiais das empresas (Anthropic, OpenAI, NVIDIA, Microsoft…), organizadores do evento (GTC, Build, TED…), canal do próprio podcast. O spec deve ter o nome do canal original, prep_clips.py comparará com o campo channel do YouTube, alertando se divergir.
- Nunca usar versões republicadas/com marca d'água de terceiros (ex.: reupload de fã page, clipes editados por outra conta, adicionaram logo de outro). Se não encontrar versão oficial, não fazer este segmento.
- Sempre creditar na tela: abaixo do áudio original "Áudio Original Nome|Evento|Data" + canto superior esquerdo "Vídeo / Canal Original", repetir no rodapé final, na descrição da postagem colar
caption_creditsdocredits.json. - credits.json registra automaticamente: URL da fonte, canal, URL do canal, título do vídeo, data de upload, tempos de corte (source_in/source_out), posição no vídeo final, URLs e autores dos B-roll, narração, música.
- Nota de licenciamento: os direitos autorais dessas imagens de entrevistas pertencem aos canais originais, não temos licença, utilizamos com base no fair use de comentário e citação (artigos 52 e 65 da Lei de Direitos Autorais de Taiwan), área cinzenta. Portanto: cada trecho curto, o vídeo todo com comentário e análise de Josh (transformação), áudio original apenas como evidência; não copiar trechos inteiros, não editar para dar sentido que o palestrante não disse.
- Não sugerir endosso: não escrever "Recomendado por …", "Parceria oficial" etc.; capa e título não devem sugerir que o palestrante apoia Josh ou seus produtos.
- Download: usar apenas yt-dlp para vídeos públicos, sem login, sem cookies, sem contornar paywall ou restrições geográficas. Nesta máquina,
--download-sectionsdo YouTube retorna 403, então prep_clips.py baixa o vídeo inteiro (até 1080p) em cache/sources/ e corta com ffmpeg. - Se o canal original solicitar remoção ou Josh não se sentir confortável, substituir por citação textual sem imagem.
Fluxo
D=<YOUR_WORKSPACE>/media-team/03-drafts/<tema>-interview ; mkdir -p $D/work
cp $S/../examples/mcp_test.spec.json $D/spec.json # alterar para o conteúdo
bash -lc "source <SKILLS_DIR>/OpenMontage/om-env.sh >/dev/null; cd $S; python prep_clips.py --spec $D/spec.json --work $D/work"
- Selecionar trechos: ler os capítulos do vídeo original (yt-dlp
--print description), escolher no vídeo oficial trechos de 15 a 30s onde o palestrante completa um ponto-chave. Transcrição comprep_clips.py; se quiser apenas ouvir, baixar o vídeo inteiro e cortar um trecho com ffmpeg. - prep_clips.py: baixar, cortar, transcrever (faster-whisper
medium, CPU ~20s de clipe em ~10s). Imprime modelo"subs": colar de volta no clip, traduzirzhpara chinês tradicional taiwanês, pode mesclar ou dividir segmentos (té tempo relativo ao início do clipe). Inglês segue a fala original do palestrante, se houver dúvida na transcrição, ouvir novamente ou usar modelo diferente para verificação cruzada (--retranscribe --model small). - tts.py: um arquivo de áudio por linha, texto idêntico enviado apenas uma vez (cacheado por hash em
cache/tts/). Executar--dry-runprimeiro para ver quantos caracteres serão enviados. Plano B em caso de falha: conector user-Elevenlabscreative_generate_speech(generations_count: 1), salvar no caminho de cache impresso. - fetch_broll.py: para cada palavra-chave, buscar 3 vídeos no Pexels (paisagem preferencialmente, palavras-chave mais precisas). Usar termos visuais concretos ("server rack lights", "programmer coding"), não abstratos. Também pode usar
"image"(estática, com zoom lento) ou"file"(ex.: gravação de tela de site). - build.py --check: exibe duração, proporção de áudio original, tempos de cada legenda e avisos de regras.
- build.py: renderiza o vídeo. Ou executa tudo de uma vez:
bash $S/run.sh $D/spec.json $D <name>(subs devem estar traduzidas primeiro).
Campos do Spec
{
"title": "Título fixo no topo, [[destaque]] fica laranja",
"voice": {"voice_id": "Nhs7eitvQWFTQBsf0yiT", "model": "eleven_multilingual_v2"}, // inglês Sarah Explains; para chinês alterar para `<YOUR_ELEVENLABS_VOICE_ID>` (sua voz chinesa)
"music": "synth", // música original sintetizada; ou caminho de arquivo (com music_license); ou "none"
"music_db": -19, // volume base da música
"clip_music_db": -8, // redução adicional em dB durante clipes originais
"gap": 0.28, // pausa após cada linha de narração (segundos), pode ser sobrescrito por line.pause
"max_cut": 3.2, // troca de imagem a cada quantos segundos na narração (hook padrão 2.4, pode ser sobrescrito por seg.max_cut)
"segments": [
{"type": "hook", "broll": ["palavra-chave"], "lines": [
{"en": "Narração inglês", "zh": "Legenda chinês", "card": {"tag": "Tag vermelha pequena", "text": "Primeira linha\nSegunda linha [[destaque]]", "cite": "Fonte: …|YYYY.MM.DD"}}
]},
{"type": "clip", "url": "https://www.youtube.com/watch?v=…", "channel": "Canal Original", "official": true,
"in": 147.1, "out": 166.75, "speaker_en": "David Soria Parra", "speaker_zh": "Cocriador do MCP",
"event": "Entrevista Oficial Anthropic", "date": "2025.12.11", "highlight": ["palavra chinesa que ficará amarela"],
"subs": [{"t": [0.0, 3.56], "en": "Fala original do palestrante", "zh": "Tradução taiwanesa"}]},
{"type": "explainer", "broll": ["…"], "lines": [
{"en": ["Parte um,", "Parte dois."], "zh": ["Legenda um", "Legenda dois"], "broll": ["palavra-chave específica desta linha"], "card": {…}}
]},
{"type": "outro", "tag": "Comente", "question": "Grande pergunta primeira linha\nSegunda linha [[destaque]]?", "broll": ["…"], "lines": [{"en": "…", "zh": "…"}]}
],
"cover": {"template": "E", "ep": "EP.13", "kicker": "…", "title": "…\n[[…]]", "subtitle": "…", "frame": {"clip": 1, "t": 4.0}}
}
en/zhpodem ser string ou lista de mesmo tamanho (lista = mesmo texto de narração dividido em várias legendas, tempo dividido proporcionalmente ao número de caracteres do inglês).cardpersiste dentro do mesmo segmento até ser substituído;"card": falseo remove.- Se
zhfor muito longo, será quebrado automaticamente nas vírgulas ","; quebrar manualmente com\n. Destaques com[[ ]]ou listahl. cover.frame: qual clipe original e qual segundo (quadro 16:9 original) usar na capa. Outros campos do template E (photo_side,visual_pos,brightness,tag) conforme covers/README.md.- Nome chinês: se o palestrante tiver nome traduzido comum (ex.: 黃仁勳, 馬斯克), usar esse; senão, usar cargo (ex.: "Cocriador do MCP"), não criar transliteração.
Saída (OUT)
<name>.mp4, preview_720p.mp4 (para Josh ver no chat), contact_sheet.jpg (um quadro de cada cena), credits.json, timeline.json, cover_reel.png/cover_post.png, cover_spec.json.
Checklist antes de entregar
- Verificar contact_sheet.jpg visualmente: sobreposição de cartões, legendas, tags de áudio original, se estão ocultos pela interface do IG (topo 220px, inferior 380px, direita 130px).
- Legendas dos clipes originais: inglês corresponde à fala original, chinês sem distorcer significado; palavras com transcrição duvidosa marcar para Josh ouvir.
- Usar
ffprobepara verificar duração e tamanho; proporção de áudio original conferir na última linha do build.py. - credits.json: interview_clips cada um tem URL, canal, tempos de início/fim; confirmar que são canais oficiais.
- Reportar ao bot principal: caminho do arquivo, duração, tamanho, fontes do áudio original e nota de licenciamento, decisões que Josh precisa tomar. Não publicar.
Limitações Conhecidas
- Nesta máquina, faster-whisper: modelos
*.en(small.en etc.) produzem caracteres inválidos; usar multilínguemedium/small; incompatibilidade com PyAV, áudio alimentado via numpy (scripts já tratam). O mesmo trecho com modelos diferentes pode omitir palavras; verificar cruzadamente frases-chave. - YouTube
--download-sectionsretorna 403, então baixar vídeo inteiro (entrevistas longas em 1080p podem ter centenas de MB, cache em cache/sources/, pode deletar após uso). - Sem GPU: vídeo de 1 minuto leva cerca de 2 minutos para renderizar, 3 minutos leva 6 a 8 minutos.
- Resultados de palavras-chave no Pexels às vezes imprecisos; verificar contact sheet e trocar palavra-chave ou usar
image/file.