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_usageantes 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.pypara o tópico. Cada número na tela e na narração vem dele e é escrito emsrc/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"}] }
]}]}
idde uma cena deve corresponder a um componente emSCENESemstory.tsx.chapterindexaCHAPTERS; 0 é o gancho e esconde a barra.music:light,tenseouresolve.- 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, emoney().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_modulespassam de 260 caracteres:Failed to launch the browser process/spawn ... chrome-headless-shellem stills, e errosgetExecutableDirem renderizações completas. Apontar para um navegador diferente não corrige o segundo. Mantenha o projeto em um caminho curto comoD:/videos/<nome>(abaixo de cerca de 100 caracteres) e executenpm installlá. - Espaço temporário. Cada pacote copia para a pasta temporária e não é removido. Se C: estiver cheio, defina
RENDER_TMPparastills.mjs, eTEMP/TMPpara 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 passex={960}para elementos centralizados.- Dígitos de Koulen são lidos mal ("12" parece "I2").
Titlejá 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 multiplexemix.wavdepois como mostrado. - Heredocs bash com muito TSX podem falhar ao analisar em alguns shells no Windows. Escreva arquivos fonte com a ferramenta de arquivo.