Communitygithub.com

khmer-money-explainer

Cria vídeos explicativos em Khmer de 8 a 10 minutos sobre decisões financeiras reais, em estilo boneco de palito limpo e acolhedor, com Remotion e narração KiriTTS.

O que é khmer-money-explainer?

Esta skill produz vídeos horizontais explicativos em Khmer (8-10 minutos) sobre decisões financeiras da vida real, no estilo visual de bonecos de palito com personagens originais, etiquetas de dinheiro, potes, gráficos e um narrador calmo. O formato segue duas pessoas comuns enfrentando a mesma escolha financeira (ex: alugar vs comprar, salário vs dívida, franquia vs marca própria, tontina vs banco) e calcula quem termina na frente, usando fontes citadas. A skill usa Remotion para renderização e KiriTTS para narração, com um pipeline estruturado que inclui pesquisa com fontes primárias cambojanas, escrita de script, cálculos verificados, revisão visual antes de gastar créditos de voz, e um processo de QA rigoroso. É ideal para criadores de conteúdo que desejam fazer vídeos de finanças para audiência cambojana, comparativos do tipo 'quem fica com mais?' ou 'qual é melhor?', e segue regras estritas de originalidade, honestidade financeira e anonimato de pessoas reais.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SopheaktraKP/khmer-money-explainer-skill/tree/HEAD

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Explicador de dinheiro Khmer

Cada vídeo acompanha duas pessoas comuns através da mesma decisão financeira, faz a aritmética em voz alta e deixa o espectador capaz de decidir por si mesmo. Os espectadores ficam pelos números e confiam no canal porque os números são honestos.

O exemplo funcional é o vídeo tontina vs banco em templates/project/ (src/story/).

Regras que protegem o canal

  • Apenas trabalho original. A pesquisa de estilo pode olhar para outros canais, mas nunca copiar seus roteiros, personagens, miniaturas, logotipos ou cenas, e nunca nomeá-los em um vídeo ou descrição. Nosso elenco, histórias e identidade visual (incluindo o guia de krama) são nossos.
  • Dinheiro honesto. Mostre as suposições na tela. Dê os dois lados, incluindo os riscos da opção que parece melhor. Dê perguntas a fazer, não uma recomendação pessoal. Toda descrição termina com uma linha de não-aconselhamento financeiro e diz que os personagens são fictícios.
  • Pessoas reais ficam de fora. Acusações de fraude contra pessoas ou empresas nomeadas não são função deste formato. Descreva padrões de casos relatados, com links na descrição.
  • Gastos: a voz custa créditos KiriTTS: o piloto de 1.100 caracteres usou 433, então um vídeo de 9 minutos é aproximadamente 3.000-3.500. Verifique get_usage antes de narrar, informe a estimativa ao usuário e obtenha aprovação do roteiro primeiro.

Pipeline

1. Tópico

Se o usuário não der um tópico, sugira 3 com uma linha cada. Um tópico forte é uma encruzilhada que todos no Camboja reconhecem, tem números que podem ser referenciados e tem uma reviravolta onde a resposta óbvia está errada ou incompleta. Pesquise o que está em alta antes de sugerir.

Decida no início e só pergunte sobre o que ainda não é conhecido: tópico, voz (padrão Maly; a conta pode ter vozes clonadas, veja list_voices) e nome do canal (CHANNEL em story.tsx; vazio esconde o selo).

2. Pesquisa e aritmética

  • Use fontes primárias cambojanas quando existirem: Banco Nacional do Camboja, Instituto Nacional de Estatística, tabelas de taxas bancárias, notas fiscais de escritórios de advocacia, imprensa respeitável. Observe as datas de publicação: taxas e regras fiscais mudam.
  • Reescreva scripts/calc.py para o tópico. Cada número na tela e na narração vem dele e é escrito em src/story/numbers.json. Adicione asserções de sanidade. Execute vários cenários, incluindo um onde o "vencedor" perde.
  • Separe o que é referenciado do que é suposto e rotule valores supostos na tela com <Note>. Se um fato não puder ser referenciado, enquadre-o como uma suposição clara ou descarte-o, e informe o usuário.

3. Roteiro

Cerca de 7.000 a 9.000 caracteres Khmer para 8-10 minutos; a voz do piloto rodou cerca de 15 caracteres por segundo. Um batida é uma ou duas frases de cerca de 70 caracteres, então um vídeo de 9 minutos tem aproximadamente 100-120 batidas. Leia references/script-formula.md para a estrutura e para regras de escrita Khmer.

Escreva em src/story/script.json (cenas contêm batidas; formato abaixo) e mostre ao usuário o roteiro Khmer completo com as fontes e suposições. Aguarde aprovação antes de narrar. O usuário é a autoridade em redação e termos Khmer.

4. Configurar o projeto

Copie templates/project/ para uma nova pasta, execute npm install, depois substitua src/story/script.json, src/story/story.tsx e scripts/calc.py. Deixe src/engine/ intacto, a menos que adicione algo reutilizável. Use um caminho curto (veja Armadilhas).

5. Teste visual antes de gastar créditos

python scripts/calc.py
python scripts/build_timeline.py --placeholder
python scripts/check_numbers.py
npx tsc --noEmit
node scripts/stills.mjs out/look/x_ 100,400,900 0.5

Olhe você mesmo para os quadros, contra a checklist em references/visual-style.md. Depois de narrado, verifique cada linha duas vezes, perto do seu início e perto do seu fim: stills capturados apenas no final escondem cartões que ficam vazios enquanto a voz constrói um número. Escreva as cenas uma de cada vez e verifique cada uma, porque problemas de layout são muito mais baratos de corrigir agora.

6. Voz

python scripts/tts_todo.py

Isso lista apenas batidas que são novas ou alteradas. Para cada uma, chame KiriTTS text_to_speech com o campo tts da batida (ou text) e uma voz consistente, deixando as configurações de entrega não definidas. Baixe o URL para voice/<id>.mp3 (links expiram em cerca de um dia) e registre com python scripts/tts_todo.py --done <id> <speech_id>. Um clipe por batida significa que uma palavra errada custa uma frase para corrigir.

Indicações palavra-por-palavra são opcionais: salve a saída de get_word_timestamps como voice/<id>.words.json, depois use at('b03', 'word'). Frações como at('b03', .5) geralmente são suficientes. Ouça números, nomes e palavras estrangeiras; se KiriTTS ler errado, adicione uma grafia tts para essa batida.

7. Linha do tempo, som, renderização

python scripts/build_timeline.py
python scripts/make_audio.py
npx remotion render src/index.ts Main out/video.mp4 --codec h264 --crf 18 --muted
ffmpeg -y -i out/video.mp4 -i out/mix.wav -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest out/final.mp4
python scripts/qa.py out/final.mp4 out/qa
npx remotion still src/index.ts Thumbnail out/thumb.png

Vídeos longos demoram um pouco, então execute a renderização em segundo plano. Renderize um piloto curto das primeiras cenas para revisão do usuário antes do vídeo completo quando o visual ou a voz forem novos.

8. QA

Leia out/qa/report.md e olhe para cada folha de contato. Investigue quadros pretos ou congelados e volume muito distante de -15 LUFS. Verifique se cada figura na tela corresponde a numbers.json e se nenhum texto Khmer está cortado ou sobreposto.

9. Entrega

Envie o mp4 e a miniatura com SendUserFile. Também escreva out/description.md em Khmer, contendo: um gancho, um resumo trabalhado com as suposições, riscos, perguntas a se fazer, as linhas de personagens fictícios e não-aconselhamento financeiro, um prompt de comentário, capítulos com timestamps reais de timeline.json, links de fontes e hashtags. Nunca faça upload ou publique sem o usuário pedir.

Formato script.json

{ "gap": 0.3, "scene_gap": 0.7, "tail": 1.5,
  "scenes": [{ "id": "Hook", "chapter": 0, "music": "light", "beats": [
    { "id": "h1", "text": "Frase Khmer", "tts": "grafia falada opcional", "sfx": [{"at": 0.75, "type": "coin"}] }
  ]}]}
  • id de uma cena deve corresponder a um componente em SCENES em story.tsx.
  • chapter indexa CHAPTERS; 0 é o gancho e esconde a barra.
  • music: light, tense ou resolve.
  • Tipos sfx: pop whoosh coin cash ding thud tick paper sad tada alarm. at é uma fração da batida. Use-os em revelações, não em cada linha.

Escrevendo cenas

Leia src/story/story.tsx: é a referência de como uma cena é escrita. Em resumo, const {f, at} = useScene() dá o quadro e os tempos das batidas, e cada elemento entra através de <Show at={...} out={...} x y>. Nada é cronometrado em segundos, então re-narrar nunca quebra uma cena.

Partes disponíveis:

  • engine/Figure: rostos, poses, andar e acessórios na mão. Defina cada personagem uma vez no topo da história.
  • engine/Props: Title, Label, Chip, Tag, Bubble, ThoughtCloud, Jar, Coin, Bill, MoneyBag, Calendar, Bank, House, Stall, Notebook, Phone, Rock, Umbrella, StormCloud, CheckMark, VsBadge, Arrow, FlyingMoney, Note, Moto, NameChip.
  • engine/Charts: Card, Counter, Bars, LineChart, MonthGrid, e money().
  • engine/Stage: mood, tint, zoom, focus.

Se um tópico precisar de um novo acessório, desenhe-o no mesmo estilo de tinta no arquivo da história e mova-o para engine/Props.tsx se for reutilizável.

Armadilhas (cada uma destas já aconteceu)

  • Limite de caminho do Windows. O Remotion falha quando o caminho do projeto é tão longo que arquivos dentro de node_modules passam de 260 caracteres: Failed to launch the browser process / spawn ... chrome-headless-shell em stills, e erros getExecutableDir em renderizações completas. Apontar para um navegador diferente não corrige o segundo. Mantenha o projeto em um caminho curto como D:/videos/<nome> (abaixo de cerca de 100 caracteres) e execute npm install lá.
  • Espaço temporário. Cada pacote copia para a pasta temporária e não é removido. Se C: estiver cheio, defina RENDER_TMP para stills.mjs, e TEMP/TMP para o CLI, para uma unidade maior.
  • <Show> padrão é x=0, y=0, o que coloca um título centralizado meio fora da tela. Sempre passe x={960} para elementos centralizados.
  • Dígitos de Koulen são lidos mal ("12" parece "I2"). Title já define dígitos e símbolos na fonte do corpo; não o ignore.
  • Tags sobre rostos. A cabeça de uma figura em pé atinge cerca de y=470, e mãos levantadas vão mais alto. Coloque tags em y≈300-350 acima de uma figura.
  • Remotion não escreve áudio utilizável com --muted, então sempre multiplexe mix.wav depois como mostrado.
  • Heredocs bash com muito TSX podem falhar ao analisar em alguns shells no Windows. Escreva arquivos fonte com a ferramenta de arquivo.

Habilidades Relacionadas