**🇩🇿 wailzenz-video-dz — a camada argelina. Estas regras prevalecem sobre qualquer outra abaixo: **
- Dialeto = Darija Argelina (الدارجة الجزائرية). Cada palavra árabe escrita ou corrigida (legendas, ganchos, CTAs, capas, mensagens para o usuário) segue
references/dialect-dz.md. O skill original foi escrito em Árabe do Golfo: leia suas instruções, mas nunca use suas listas de palavras do Kuwaiti ou exemplos em qualquer coisa que o espectador veja. Vídeo em inglês → escreva em inglês. Vídeo em francês → escreva em francês.- Termos em francês/inglês permanecem em letras latinas com uma glosa em árabe entre aspas depois deles — «هادي حاجة normal "عادية"» — via
"gloss"emfixes.json(passo 5). Cada termo latino recebe uma.- Ambiente: inicie cada comando de shell com
source "${CLAUDE_SKILL_DIR}/../../setup/env.sh"(Python 3.12 env, ffmpeg-full, modelos em~/.wailzenz-video-dz). Primeira vez numa máquina? Executebash "${CLAUDE_SKILL_DIR}/../../setup/setup-mac.sh"(pergunte primeiro ao usuário — baixa ~4 GB). Nuncapip installno Python do sistema.- Transcrição (passo 4) usa
scripts/02a_transcribe_dz.py: whisper.cpp large-v3 na GPU do Mac, ou--engine hadra(modelo argelino) /--engine whisper(qualquer SO). Nuncapython3 -m whisper --model medium.- Atualizações apenas pelo gerenciador de plugins (
00_setup.shmostra o comando). Nunca sobrescreva os arquivos do skill.🎬 Estilo da casa — todo vídeo, sem exceções: 6. Passo 7 completo, sempre. Telas divididas, painéis explicativos, movimentos do banco, transições, pelo menos um momento de profundidade (atrás da cabeça, texto em vídeo estilo «الخلاصة», SFX, cartão final. Um reel com apenas legendas sobre o rosto nunca é aceitável. 7. Nunca duplicar a legenda. O painel não deve mostrar as palavras sendo legendadas naquele momento — sem texto cinético da frase atual, sem "legenda grande" em cima. Painéis são visuais: ícones, diagramas, maquetes de interface (terminal, linha do tempo), metáforas, quadros comparativos, factos de
facts.md. Comandos de terminal, rótulos de linha do tempo e títulos de cartões também não devem repetir a legenda. Se uma frase realmente precisar de suas palavras grandes na tela, usenocap:true. 8. Corte com cuidado.01_cut_plan.pysó corta pausas ≥ 0,55 s, mede o silêncio contra o próprio piso de ruído do clipe, mantém mais espaço depois de uma palavra do que antes, e termina com uma auto-verificação — qualquer «⚠️» significa corrigir o corte primeiro. Cada corte começa e termina em silêncio. Uma hesitação («الـ…», «اممم») vai inteira, com silêncio em ambos os lados; um reinício («اللي تحتاج… تحتاج») mantém a segunda tomada. Após o render final, execute19_seam_check.py <work> <final.mp4>e corrija qualquer palavra repetida ou quebrada (ele ouve mal termos em inglês no modo árabe — verifique-os com-l en). 9. Alterne a posição do painel. MistureR_DOWN(animação em cima, rosto abaixo) comR_UP(rosto em cima, animação em baixo —panelInmove-se sozinho para lá), mais momentosR_LOWER(painel grande, rosto pequeno) eR_FULL. Nunca mais de duas cenas explicativas seguidas na mesma posição. 10. Amarre cada cena aos tempos das palavras (caps.jsonpalavras), nunca segundos fixos — um recorte não deve quebrar as cenas. 11. Enquadramento close-up: o cartão de rosto corta destudio.json→cardTop; se a boca cair abaixo de y ≈ 1600 (zona de legenda do Instagram) levante-a (≈ 0,3).R_UPmostra um pouco mais acima da cabeça automaticamente.
Reel a partir de vídeo de fala — sem programa de edição
A edição é toda em código:
- ffmpeg corta.
- Whisper transcreve com tempo de palavra.
- Um motor de renderização monta as legendas e motion graphics sobre o vídeo.
Saída: Um MP4 pronto para publicação.
Caminhos: Todos scripts/, references/ e motion/ estão na pasta deste skill:
${CLAUDE_SKILL_DIR}
Não é vídeo de fala? Vá para o modo correto
| Entrada | Modo | Leia |
|---|---|---|
| Pasta de clipes sem fala (café, viagem, produto) | Montagem no ritmo | references/montage.md |
| Duas ou mais câmeras da mesma sessão | Podcast → Reels | references/podcast.md |
| Episódio completo "horizontal" ou "para o YouTube" | Podcast 16:9 | references/podcast.md (seção "Episódio completo horizontal") |
| Episódio de 1h → vários Reels | Reels de episódio | references/landscape.md (seção "Episódio completo") |
| Texto ou ideia, sem pessoa | Explicação em motion | references/motion-mode.md |
| Link de site ou "explique o aplicativo" | Explicação de site/app | references/motion-mode.md |
Se houver um skill separado para este modo instalado (dz-motion, dz-podcast ou dz-montage), ele tem prioridade.
⛔ Não pergunte "Qual modo você quer?" — Diga a ele em uma frase o que entendeu e continue.
O motor: Sempre o leve (04_render_frames.js), sem mencionar a palavra "motor".
- Ele quer ajustar sozinho? Abra o estúdio →
references/studio.md - Tela Remotion apenas se solicitada pelo nome →
references/remotion.md
🎬 DaVinci: Pediu "faz no DaVinci"? Este skill não tem edição dentro do DaVinci Resolve. Diga a ele em uma frase e continue com nosso motor (ou exporte um arquivo SRT/FCPXML se ele quiser continuar sozinho).
🎞️ Modo CapCut: Ele disse "faz no CapCut" ou "quero editar sozinho no CapCut"? Em vez de MP4, saia um projeto CapCut editável (clipes com zoom, legendas e textos CapCut, voz, efeitos, trilha sonora, motion transparente) → references/capcut.md (um script scripts/40_capcut.py).
⛔ Seu estilo com o usuário
Você quem prepara, não ele. Proibido dar a ele uma lista de comandos para executar.
- Não pergunte "Você tem isso?" — Verifique você mesmo. Algo faltando? "Estou faltando duas ferramentas que vou preparar agora, leva dois minutos — começo?"
- Sem jargões: "Ferramenta de desenho de slides" não "puppeteer", "qualidade de vídeo" não "codec".
- Diga a ele onde estamos a cada passo, e estime o tempo: "Removi as pausas — metade do vídeo foi. Agora vou transcrever sua fala, 3 minutos."
- Uma coisa de cada vez.
- Não entregue sem mostrar um screenshot ou resumo após cada etapa importante.
✅ Onde funciona? Em qualquer lugar — celular · nuvem · Mac · Windows · Linux · Codex
O dispositivo local (Mac + Claude Code) é o mais rápido e poderoso, mas não é obrigatório. Proibido dizer ao usuário "Isso não funciona no seu celular ou na nuvem." Se uma ferramenta não funcionar no ambiente, caia para a alternativa e mencione em uma linha o que usou.
Leia references/any-environment.md — alternativas (transcrição, corte de pessoa, desenho de motion…) e método para celular. E as receitas testadas em detalhe (corte suave sem tremer, motion de papel recortado, montagem) em references/phone-cloud-playbook.md.
- No celular: ele anexa o vídeo à conversa e você trabalha no ambiente de nuvem, e o celular pode desligar.
- Windows:
pythonnãopython3→references/windows.md.
Windows: python não python3, caminhos C:/… → references/windows.md
Etapas 0, 0.5 e 1 — Ferramentas, estilo e identidade
Leia references/start.md e execute — o mesmo início para todos os modos.
Etapa 2 — Pegue o vídeo dele
| Método | Como |
|---|---|
| Arquivo no dispositivo dele (melhor) | Copie para <work>/src.mov |
| Link do Google Drive | Compartilhe "Qualquer pessoa com o link", depois o comando abaixo |
| Conector do Google Drive | Se o arquivo for privado — ferramentas do conector na sessão |
Link do Drive (o ID entre /d/ e /view):
curl -sL "https://drive.usercontent.google.com/download?id=<ID>&export=download&confirm=t" -o <work>/src.mov
- 4K é melhor (o zoom reduz a qualidade original). Mas 1080p funciona — não o recuse nem peça para regravar.
- Vídeo widescreen (entrevista, podcast, episódio de TV)? Mesmas etapas. A etapa 6 corta na vertical ao redor do rosto para cada take em vez de esticá-lo →
references/landscape.md - 🪝 Reel de episódio ou entrevista = Gancho escrito obrigatório. Após
02_captions.py:python3 scripts/22_hook.py suggest <work>- Escreva 3 ganchos da linha mais forte (não a primeira frase que ele disse) →
check→ ele escolhe →apply previewe leiahook_sheet.jpgantes da renderização completa.
- Reel construído fora de nossos motores (MP4 pronto)?
22_hook.py overlay→hook.movtransparente. - Regras e formatos →
references/podcast-hook.md
Verifique a duração:
ffprobe -v error -show_entries format=duration -of csv=p=0 <work>/src.mov
🎞️ Quadros perdidos?
Gravação de navegador ou aplicativo de câmera não original (o iPhone no navegador descarta 13-54%). Verifique as lacunas antes de cortar:
ffprobe -v error -select_streams v -show_entries frame=pts_time -of csv=p=0 <work>/src.mov | python3 -c "import sys;t=[float(x) for x in sys.stdin if x.strip()];g=[(round(a,2),round(b-a,2)) for a,b in zip(t,t[1:]) if b-a>0.07];print(len(g),'lacunas',g[:8])"
Tem lacunas? Restaure antes da etapa 3:
ffmpeg -i src.mov -vf "minterpolate=fps=30:mi_mode=mci:mc_mode=aobmc:me_mode=bidir:vsbmc=1" -c:a copy src_fixed.mov
E diga a ele: "A gravação estava com quadros perdidos — restaurei." E da próxima vez, recomende que ele grave com o aplicativo de câmera.
🔬 Verifique iluminação e cores (segundos, em silêncio)
python3 scripts/25_scopes.py <work>
- "OK" → não mencione.
- Tem problema (escuro, amarelado, desbotado) → uma frase: "O vídeo está um pouco escuro e amarelado — corrijo?"
- Mostre a ele antes e depois com um screenshot.
- Concordar →
theme.json→"grade":"auto"(corrige apenas a faixa). - Recusou ou ficou em silêncio → não toque (regra 4).
Etapas 3-11 — Produção
3) Plano de corte
python3 scripts/01_cut_plan.py <work>
Diga a ele quanto foi removido: "Removi 52 segundos de silêncio — o vídeo ficou com 46 em vez de 98."
3.5) Melhore o áudio (opcional): Tem eco ou ruído, ou ele disse "melhore o áudio"?
→ references/audio-enhance.md
bash scripts/02b_enhance_audio.sh <work> --local
4) Transcrição com tempo de palavra
source "${CLAUDE_SKILL_DIR}/../../setup/env.sh"
ffmpeg -v error -i <work>/src.mov -vn -ac 1 -ar 16000 -y <work>/a.wav
python3 scripts/02a_transcribe_dz.py <work> > <work>/whisper.log 2>&1 # Árabe / Darija (padrão --lang ar)
# Vídeo em inglês: python3 scripts/02a_transcribe_dz.py <work> --lang en
# Modelo argelino em vez de / lado a lado: --engine hadra | --engine compare (primeira execução baixa ~1,8 GB)
- Segundos a um minuto na GPU para um reel. Falhou?
tail -5 <work>/whisper.log - Motor padrão:
cppnum Mac com whisper.cpp, senãowhisper. Para um novo falante argelino, execute--engine compareuma vez e mantenha o motor cuja transcrição precisou de menos correções (salve com--save-default).
5) Correção e legendas
Leia a.json e corrija cada frase — Whisper erra no Darija argelino (transforma em árabe padrão, escreve palavras francesas erradas). Corrija de acordo com references/dialect-dz.md (ortografia e palavras francesas nas letras que o usuário escolheu), e não sabe uma palavra? Pergunte a ele em vez de adivinhar. Escreva <work>/fixes.json:
{ "fix": [["هادي","حاجة","normal","بزاف"], ["نخدمو","بـ","Claude","Code"]], "hot": ["بزاف"],
"gloss": {"normal": "عادية", "Claude Code": "كلود كود"}, "fx": {"خلاص":"drop"} }
gloss= tradução em árabe entre "" que vem após cada palavra francesa/inglesa → «normal "عادية"». A chave é a palavra (ou frase) como está emfix. Palavras latinas são coloridas automaticamente ("hot_latin": falsepara isso).02_captions.pydiz o que você esqueceu.hot= palavras que são destacadas com um círculo de destaque no momento em que são faladas.fxopcional →references/word-fx.md- ⛔ Número de palavras de cada frase = número de palavras do Whisper para a mesma frase. Caso contrário, os tempos ficam bagunçados (o script interrompe).
python3 scripts/02_captions.py <work>
5.5) Mostre o texto a ele e remova o que ele não gostou → Obrigatório
Antes de projetar qualquer cena:
python3 scripts/10_script_edit.py <work> show
- Imprime a fala dele numerada com os tempos e escreve
script.txt. - E imprime as frases repetidas e sugestão de exclusão na mesma execução — não execute
dupesdepois. - ⛔ Imprima o script completo no chat e diga: "O que você quer remover?" — não se limite ao arquivo.
Frase repetida: a primeira é erro, a segunda é a correção. "Você disse a frase duas vezes — «قدرنا نحل السبب» e depois «قدرنا نعرف السبب». Removo a primeira?"
python3 scripts/10_script_edit.py <work> drop 6 8 # Remove as duas frases do vídeo e áudio
python3 scripts/10_script_edit.py <work> keep 1 2 5 9 # Mantém apenas estas
python3 scripts/10_script_edit.py <work> undo
- Tudo depois é deslocado, e
cut.json,caps.jsonesfx.jsonsão atualizados. - Faça aqui. A exclusão após o design das cenas desloca todos os seus tempos.
- Após qualquer exclusão: repita a etapa 6 e renderize com
--force.
6) Corte e zoom
python3 scripts/03_cut_zoom.py <work>
mkdir -p <work>/vfr && ffmpeg -v error -i <work>/cutz.mp4 -vf fps=30 -q:v 3 -y <work>/vfr/%05d.jpg
- O zoom é bloqueado por clipe (6.0): A primeira execução escreve
cut.json→"zooms": {"25.05": 1.06, …}(a chave é o início do clipe em segundos do original). Remover, adicionar ou dividir um clipe? O zoom dos restantes não desliza, então suas coordenadas de renderização permanecem corretas. Mudar o zoom de um clipe = ajuste seu número. E a ordem dekeepé livre (um clipe do final da fala antes do anterior é permitido).
6.1) ⛔ Corte a partir da cabeça — Obrigatório em qualquer vídeo com card (metade da tela, R_DOWN, R_LOWER):
python3 scripts/23_headcrop.py <work> --from <início do primeiro card>
- Escreve
studio.json→cardTop. - Corte fixo durante todo o vídeo — sem rastreamento, nem câmera que o siga.
- Começa acima do ponto mais alto que a cabeça dele atingiu, com uma pequena margem (1,5%).
- Não corta a cabeça dele, nem deixa espaço vazio — "Muito espaço acima da cabeça" é um erro igual.
- O usuário já alertou sobre isso várias vezes e ficou chateado.
- Verifique com seus olhos em um frame em que ele se aproxima da câmera.
- Abaixo do corpo dele está queimado? Aproxime com
theme.json→cardZoom(padrão 1).
7) Projete as cenas → Etapa mais importante
Antes de qualquer cena, leia:
references/motion-rules.md— identidade, lista de factosfacts.md, proibições.references/scenes.md— como escrever a cena, pacote de motion, ideias, B-roll.references/moves.md— Banco de movimentos:python3 scripts/35_moves.py plan --title "…" --cues …→ storyboard (3 fundamentos + variações). Você escolhe conscientemente e o usuário não precisa escolher.
🎯 O padrão desde o primeiro rascunho (6.0 — Reel popular que o banco adotou e se espalhou): Esforce-se na performance e no motion — rico, profundo e surpreendente, não coisas tranquilas.
- Antes de renderizar, planeje 2–3 momentos de profundidade e diga ao usuário em uma linha: elemento que passa atrás da cabeça dele (
11_behind_text.js person+MV.person), onda da voz dele (37_env.py←MV.env), mapa de pontos atrás da cabeça dele, órbita 3D, forma da identidade do cliente que se torna movimento (arco do logotipo = contador e pincelada), entrada one-take (a câmera mergulha no logotipo e sai na próxima cena). - Isto é a primeira coisa a que você recorre, não a única: cartões, selos e badges não são proibidos — use-os quando o assunto merecer.
- A frase que o motion escreve =
nocappara ela (não se distrai entre em cima e embaixo). E escrever acima da cabeça é melhor quando há espaço. - Receitas em código →
references/moves.md§3.
⛔ Regra de layout (aprovada pelo usuário):
| Momento | Retângulo | Forma |
|---|---|---|
| Fala sem gráficos | R_FULL | Rosto dele em tela cheia, legenda inferior em 1460 |
| Qualquer gráfico ou motion | R_DOWN | Gráfico em cima (y 280-520) → legenda → rosto dele embaixo, largura total |
| B-roll ou painel grande | R_LOWER | Card grande em cima → legenda → rosto dele pequeno embaixo |
| Explicação completa (números, listas) | R_OFF | Sem rosto, voz dele continua → references/explainer-and-pace.md |
- ⛔ A legenda nunca é escrita sobre o rosto do falante. Em qualquer modo com card de vídeo, toda a legenda fica acima do card, junto com a barra de progresso.
- A escolha do modo é sua decisão a partir do significado — títulos com 2-4 palavras e sem design =
R_FULL(ele chega perto da câmera, legenda abaixo dos lábios); um número ou palavra-chave que merece um painel visual =R_DOWNenocappara a palavra. Sempre que um gráfico aparecer e a legenda estiver sobre o rosto, você é responsável por essa escolha. - O modo é aplicado às cenas no arquivo de cena (chiave). ⛔ Nunca mude para
R_FULLno meio de uma sequênciaR_DOWN— o espectador vê o rosto mudar de lugar.
Como escrever a cena:
cena 1.0 - "normal"
persona R_DOWN
panelIn fade
panel "Ícone de chave" "A chave da criatividade"
text "seja" "criativo"
cap "مفتاح" "الإبداع"
- ⛔ A cena não descreve a performance — não escreva "a chave aparece e gira". O motor executa sozinho.
- ⛔ Não descreva a legenda — escreva
capcom o texto (ele é sincronizado com a palavra correspondente emcaps.json). - Leia
references/scenes.mdantes de escrever a primeira cena.
8) Tijolo (SFX, transições)
python3 scripts/05_sfx.py <work>
python3 scripts/06_transitions.py <work>
9) Renderização
python3 scripts/04_render_frames.py <work> # ou `04_render_frames.js` após extrair
- Versão leve (padrão): Lento na primeira vez, mas simples.
- Versão completa (Remotion): Só se o usuário solicitar ou a versão leve falhar.
10) Verificação de qualidade
python3 scripts/19_seam_check.py <work> <final>.mp4
- Verifique palavras repetidas ou quebradas.
- Se houver problema: ajuste
fixes.json→"fx": {"palavra":"drop"}ou re-renderize.
11) Entrega
python3 scripts/20_deliver.py <work> <final>.mp4
- Adiciona capa (se houver) e metadados.
- Envia para o usuário ou faz upload.