Curta-metragem Científico Cinematográfico · Padrão de Produção Unificado v1
Fonte: "Uma Breve História da Humanidade · Autorretrato do Cosmos" (4K / 4'58" / 14 cenas) e "Descida · DESCENT" (2K / 1'30" / 90 segundos de perfil vertical). As especificações, fluxos de trabalho, estilos e armadilhas de ambos os filmes estão todos aqui. Para um novo filme, leia primeiro as seções 0 e 1, depois leia as seções relevantes para este projeto.
0. Regras de Ferro (violar qualquer uma resulta em retrabalho)
- Primeiro o som, depois a imagem. Gere a narração frase por frase → meça a duração → a partir da duração, calcule o número de quadros por cena. Nunca organize as imagens primeiro e depois adicione o áudio.
- Narração e dados devem ser consistentes: Os números, unidades e grandezas que aparecem no filme devem ser verificados item por item na tabela de fatos; se a narração diz 98, a imagem não pode mostrar 90. Erros de unidade (como pressão atm ↔ t/m²) são dez vezes mais graves do que uma cor errada.
- Uma cena, uma informação: Cada cena permite apenas um tópico principal + no máximo 3 leituras; informações adicionais vão para a narração.
- O texto deve ser sempre legível: Qualquer texto deve ter um fundo ou escurecimento por baixo; nomes de camadas ≥ 30px, leituras ≥ 13px. A opacidade do texto pequeno não deve ser inferior a 0,6.
- Sem cortes secos: Use dissoluções / respiros de tela preta / movimento contínuo entre as cenas; o mesmo filme deve usar apenas uma linguagem de transição.
- Renderização silenciosa: No Remotion, desligue todos os
<Audio>com{false && ...}. O áudio será incorporado externamente pelo ffmpeg (WAVs longos podem travar a renderização no pré-processamento de áudio). - Antes de renderizar, execute
npx tsc --noEmitsem erros, caso contrário, você renderizará uma série de quadros ruins e terá que recomeçar. - Três coisas antes da entrega: Verificação da duração total, verificação do primeiro e último quadro, verificação quadro a quadro das transições principais (3–6 quadros cada).
1. Pipeline Padrão (em ordem, sem pular)
script.json ──► Geração de VO ──► Pós-processamento de VO ──► Tabela de Duração ──► Linha do Tempo
│
└──► Trilha Sonora (numpy)──► Mixagem ──► master.m4a
Imagem (Remotion)──► Renderização Silenciosa ──► ffmpeg mux ──► Entrega
1.1 Roteiro
- Um arquivo por item:
script.json, camposid / act / text / caption. - Narração em chinês ≈ 4,2 caracteres/segundo; um filme de 60 segundos ≈ 200–230 caracteres, 90 segundos ≈ 300–340 caracteres.
- Escreva os números como são lidos em chinês ("三千六百八十八"), caso contrário, o TTS pode lê-los incorretamente; na imagem, use algarismos arábicos.
1.2 Narração (Qwen3-TTS VoiceDesign, voz masculina documental)
INSTRUCT = ("A deep, calm, authoritative male documentary narrator. Slow, deliberate, cinematic. "
"Low register, warm, intimate, restrained emotion, close-mic. Consistent, even pacing. Mandarin Chinese.")
generate_audio(text=..., model=model, lang_code="zh", instruct=INSTRUCT,
temperature=0.65, top_p=0.9, repetition_penalty=1.05,
output_path="vo_raw", file_prefix=id)
- Modelo
mlx-community/Qwen3-TTS-12Hz-1.7B-VoiceDesign-bf16, semente fixamx.random.seed(11). - Após gerar cada item, verifique imediatamente a duração com
ffprobe: Se um item > 30 segundos ou apresentar repetições inteiras, o TTS está degradado; exclua e regere (mude a semente ou aumenterepetition_penaltypara 1.12). - Revisão ASR: Use
mlx_whisperpara transcrever e verificar números/palavras raras (como hidrogênio, silício, ferro).
1.3 Pós-processamento de Áudio (cadeia unificada, não permitir variações)
highpass=f=70,
asetrate=24000*0.912341, aresample=48000, atempo=1.096081, atempo=1.055,
equalizer=f=190:t=q:w=1.0:g=1.4, equalizer=f=3300:t=q:w=1.4:g=-1.8, equalizer=f=7200:t=q:w=1.8:g=-1.0,
acompressor=threshold=0.14:ratio=2.2:attack=10:release=200,
loudnorm=I=-20:TP=-3:LRA=7
Em seguida, corte o silêncio inicial e final com base no envelope de energia de 20ms, comprima pausas com mais de 0,34 s para 0,34 s, e aplique fades de 12ms/50ms em ambas as extremidades.
1.4 Linha do Tempo
frames = round(seconds * 24); deslocamento da narração = início da cena + lead (geralmente 18–24 quadros).- Cada cena:
lead + vo + tail, tail 16–90 quadros (dar tempo suficiente para o final). - Gere
timeline.ts(gerado automaticamente, não modifique manualmente), campos{ id, from, dur, voAt, voDur }.
1.5 Trilha Sonora (sintetizada por código, numpy)
- Deve ter estrutura, não ser contínua: Escreva "eventos" com base no código de tempo, em vez de um pad contínuo.
- Harmonia: Mude a cada 12–18 segundos, com crossfade nas junções; o baixo deve ser apenas uma nota sustentada acima de 55 Hz.
- Sem ruído de baixa frequência: O público pode descrever como "zumbido" ou "muito alto". Corte o baixo em 85–100 Hz, use tons puros senoidais para notas longas, sem harmônicos de oitava.
- Priorize o silêncio: O nível da música deve ser aproximadamente −20 ~ −27 dB em relação à narração; quando a narração aparecer, comprima 40–70% (sidechain ducking).
- Loudness final da mixagem: Documentário −18 ~ −24 LUFS (não −14, que é para música pop de streaming).
- "Design de som" tutorial (como mergulho na água, sonar, rangido de metal) adicione apenas se o cliente solicitar explicitamente; já foi rejeitado uma vez, não use por padrão.
1.6 Imagem (Remotion)
Consulte a seção 2.
1.7 Renderização e Mixagem
npx tsc --noEmit
npx remotion render Film4K out/silent.mp4 --codec=h264 --crf=18 --concurrency=7
ffmpeg -i out/silent.mp4 -i public/audio/master.m4a \
-map 0:v -map 1:a -c:v copy -c:a aac -b:a 320k -shortest -movflags +faststart out/final.mp4
- 4K = layout 1920×1080 +
transform: scale(2); 2K =scale(2560/1920). Escreva apenas um layout. - Retrabalho local: Renderize apenas o intervalo de quadros alterado →
ffmpegtrim/concatpara unir três partes →-c:v copyapenas para substituir a faixa de áudio; se precisar alterar a imagem, recodifique e una as três partes (cerca de 5–10 minutos).
2. Sistema Visual
2.1 Fundo
- Tela 1920×1080, 24 fps; fundo
AbsoluteFillpróximo ao preto (#01050A/#010407), nunca use preto puro #000. - Estrutura de três camadas: Gradiente de fundo → Luz volumétrica/partículas → Camada de informação (texto, escala de profundidade, leituras).
- Final unificado:
Vignette+Grainestático (0.04, deve teranimate={false}, grãos dinâmicos fazem linhas finas piscarem).
2.2 Fontes
- Título/poesia:
Songti SC(serif), espaçamento entre caracteres 0,4–0,6em, tamanho grande (90–250px). - Dados/leituras:
SF Mono, 8–14px, espaçamento entre caracteres 0,16–0,36em. - Explicação:
PingFang SC, 14–19px, opacidade 0,55–0,7.
2.3 Paleta de Cores ("Cores do Mundo" de cada filme)
| Tipo de Filme | Parte Superior Clara | Meio | Fundo | Cor de Destaque |
|---|---|---|---|---|
| Cosmos / Tempo | Fundo #050506 | Creme #F3E7D0 | — | Âmbar #E8B06A |
| Oceano / Profundidade | Superfície #1E7C93 | #07232E | #01050A | Ciano #4FE0C0 |
Regra: Um filme usa apenas uma cor de destaque; exceções como bioluminescência/fontes hidrotermais podem ter no máximo duas, e cada uma deve estar vinculada a uma grandeza física.
2.4 Motor de Partículas (Canvas 2D)
- Aleatoriedade determinística (hash), o mesmo quadro sempre produz o mesmo resultado; tipos de nuvem:
ball / filament / disk / globe-surface / sphere-shell / figure / city / helix / neuron / glyph / single / text / timeline. - Duas passagens de desenho: primeiro um raio grande com baixa opacidade para brilho, depois um raio pequeno com alta opacidade para o núcleo;
globalCompositeOperation = 'lighter'. - A borda da nuvem de pontos deve estar fora da tela:
makeCloud('text', n)cria uma caixa 3×1.2, que após a projeção pode mostrar bordas retangulares (o bug mais frequentemente apontado pelo público). Useexpand(cloud, kx, ky, kz)para aumentar 2.4–3.2 vezes.
2.5 Biologia e Terreno (SVG)
- Sempre vista lateral, cabeça na direção do movimento; olhos, barbatanas, linha da boca, dobras da garganta, cracas e outros detalhes anatômicos devem ter pelo menos 4 pontos, caso contrário, parecerá uma textura.
- Silhueta + luz de borda (opacidade 0.2–0.35); não use
feTurbulencesobreposto ao corpo (ficará granítico). - Terreno: Linhas poligonais múltiplas + linhas de camadas de rocha + detritos + sedimentos, não triângulos; montanhas não devem ter uma linha de base (senão parecerá um gráfico).
- A janela de aparecimento de criaturas deve ser vinculada à "profundidade/tempo"; não mostre mais de três tipos ao mesmo tempo.
2.6 Camada de Informação (HUD)
- Identificador de camada: fundo gradiente escuro (0.72→0) + barra vertical de cor de destaque de 2px à esquerda + texto chinês branco puro 30–35px.
- Leituras: 2–3 grupos por camada,
LABEL8.5px /VALUE13–14.5px. - Régua de escala: linhas de marcação + valor atual em negrito; o valor atual deve ser calculado em tempo real, não fixo (fixo entrará em conflito com o ponteiro).
- Todos os números com unidades; unidades separadas por espaço (
1,093 atm).
2.7 Transições
- Primeira opção: Movimento contínuo (plano-sequência): profundidade/tempo é uma grandeza contínua, o conteúdo entra e sai da tela com ela.
- Segunda opção: Dissolução curta (4–6 quadros, apenas o novo quadro aparece, o antigo permanece opaco e é sobreposto) — o brilho não cai, o HUD não sobrepõe texto.
- Desabilitado: varredura diagonal, longa dissolução cruzada, empurrão vertical (pode revelar bordas escuras), corte seco após tela preta (a menos que seja um movimento físico como "mergulho na água").
3. Fatos e Dados
- Crie um
facts.md: cadaNúmero / Unidade / Fonte / Como escrever no filme. - Três erros mais comuns: ① Conversão de unidades (1 atm ≈ 10.3 t/m² ≈ 1.03 kgf/cm²); ② Confundir "média" com "extremo" (média 3.688 m vs. mais profundo 10.935 m); ③ Simplificação (90 vs. 98 elementos).
- Use uma versão precisa e unificada em todo o filme; narração e imagem devem ter a mesma fonte.
4. Lista de Entregas
deliverables/
NomeDoFilme-4K-VersaoComNarracao.mp4 # Versão principal
NomeDoFilme-4K-VersaoSoMusica.mp4 # Se necessário
Poster-4K.png / Preview-4K.png # Composição de quadros-chave
Capa/ # 1920 PNG + 4K PNG + 1146×717 JPG
DeclaracaoDoDiretor.md # Estrutura, som, registro de alterações
TextoParaPublicacao-Bilibili.md # Título/Descrição/Tags/Comentário fixado/Sugestão de capa
TabelaDeFatos.md
O pacote de publicação deve incluir: declaração de geração por IA, divisão de trabalho (o que o modelo fez, o que o humano fez), e um comentário fixado com "números fáceis de errar".
5. Registro de Problemas (ordenado por frequência de ocorrência)
| Fenômeno | Causa Raiz | Solução |
|---|---|---|
| Renderização travada no pré-processamento de áudio | WAV longo + <Audio> | Renderização silenciosa, mux externo |
| Texto borrado sobre partículas | Sem fundo + opacidade 0.4–0.5 | Fundo + branco puro + aumentar tamanho da fonte |
| Aparecimento de retângulos regulares na tela (o que o público mais pergunta) | Borda da caixa da nuvem de pontos dentro da tela | expand() aumentar 2.4–3.2× |
| Linhas finas / montanhas piscando | Grãos de filme dinâmicos | Grain animate={false} |
| Baleia/peixe "nadando para trás" | Cabeça e cauda desenhadas ao contrário, olho na cauda | Reconstruir vista lateral: cabeça em +x |
| Montanha parece um gráfico | Caminho com L ... Z fechando linha de base horizontal | Afundar borda inferior para fora da tela |
| Transição interrompe a linha de visão | Varredura de luz / longa dissolução | Dissolução curta ou movimento contínuo |
| Trilha sonora "zumbindo" | Baixo contínuo de 27–80 Hz | High-pass 85–100 Hz, remover sub drone |
| Sincronia áudio-vídeo | Batida da imagem não corresponde ao conteúdo da narração | Reorganizar curva de profundidade/tempo com base no conteúdo da narração |
| TTS de 600 s | Loop de degradação do modelo | Excluir e regenerar, repetition_penalty 1.12 |
| Retrabalho 4K muito lento | Renderizar o filme inteiro novamente | Renderizar apenas o intervalo de quadros alterado + concat |
6. Localização dos Dois Filmes de Referência
- "Uma Breve História da Humanidade · Autorretrato do Cosmos":
~/dsh-video-remotion/film/src/scenes/*, 14 cenas, 4K, 4'58". - "Descida · DESCENT":
~/dsh-video-remotion/film/src/ocean/*, 6 faixas, 2K, 1'30"; narração e trilha sonora em~/dsh-video-remotion/ocean/. - Ambos compartilham
src/engine/particles.tsx(partículas),src/engine/atmos.tsx(Vignette/Grain),src/theme.ts(fontes/paletas/easing).