Communitygithub.com

Liqiuyue9597/data-video-skill

Crie um vídeo explicativo de dados no estilo Tatakye em uma única página HTML autossuficiente (Canvas + Web Audio, sem dependências). Use quando quiser transformar um artigo ou ensaio em um vídeo curto (3-6 min), especialmente com estética minimalista preto e dourado, campos de partículas, curvas animadas, revelações de números grandes, áudio ambiente esparso e narração baseada em legendas.

O que é data-video-skill?

Este skill permite construir vídeos explicativos de dados no estilo Tatakye, gerando um único arquivo HTML autossuficiente que o usuário pode reproduzir no navegador e gravar a tela. É ideal para transformar artigos, ensaios ou descobertas de pesquisa em vídeos de 3 a 6 minutos, com uma estética minimalista preta e dourada, herdada de canais como 3Blue1Brown, Veritasium e Tatakye. Suporta legendas em chinês como única forma de narração, áudio ambiente esparso e animações como campos de partículas, curvas animadas e revelações de números grandes. O skill enfatiza a importância de uma 'coluna vertebral' visual — um único objeto persistente na tela que ancora todo o vídeo — e uma estrutura narrativa com poucos beats, cada um com um visual-chave e uma transição fluida. O resultado final inclui uma tela de resposta com 3 itens nomeados que o espectador pode levar consigo.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add Liqiuyue9597/data-video-skill

Perguntar na sua IA favorita

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

Documentação

Vídeo Explicativo de Dados (Estilo Tatakye)

Construa um vídeo explicativo curto, com legendas em chinês, como um único arquivo HTML autossuficiente que o usuário reproduz em um navegador e grava a tela.

Para que isso é bom

  • Transformar um artigo, ensaio ou descoberta de pesquisa em um vídeo de 3 a 6 minutos
  • Estética minimalista preta e dourada de "artigo de opinião" (linhagem 3Blue1Brown / Veritasium / Tatakye)
  • Entregáveis onde o usuário deseja postar no Xiaohongshu / WeChat Video / Bilibili / YouTube
  • Zero ativos externos — sem fontes para comprar, sem imagens de arquivo, sem preocupações com royalties, sem servidor

Antes de escrever uma única linha de código

Perguntas inegociáveis anteriores — faça estas com AskUserQuestion, não depois. Errar significa reescrever.

  1. Tema em uma frase: Não "sobre o que é o artigo" — a afirmação que o vídeo está defendendo. Se você não consegue dizer em uma frase, você ainda não tem um vídeo, você tem uma lista de leitura.
  2. A coluna vertebral: Qual único objeto na tela ancorará todo o vídeo? (Veja "A Coluna Vertebral" abaixo — esta é a decisão de design mais importante, e a que a maioria dos vídeos explicativos erra ao omitir completamente.)
  3. Duração: 3-4 min (destaques) vs 5-6 min (duração padrão Tatakye) vs 8-10 min (profundo). A duração determina quantas seções sobrevivem. Para um artigo de 10 seções visando 5 min, você precisa eliminar 60-70% das seções.
  4. Modo de narração: Apenas legendas (ritmo baseado em texto) vs narração por IA vs auto-gravada. "Apenas legendas" é o padrão — as próprias legendas se tornam a batida.
  5. Atribuição: Como creditar o autor original. "原文 · [Nome]" no canto superior direito é o padrão limpo. Se você tem uma coluna vertebral, a atribuição vai abaixo da coluna, não no lugar dela.
  6. A recompensa (não é uma pergunta retórica): O que específico o espectador leva embora? Uma pergunta reformulada NÃO é uma recompensa. "Você é eles?" soa poderoso, mas não dá nada para o espectador levar para casa. Uma recompensa real é uma lista curta nomeada (2-4 itens) que eles podem repetir no dia seguinte. Veja "Recompensa, não retórica" abaixo.

Nunca pule estas. A primeira tentativa quase sempre falha no #1 (tema) e #5 (aterrissagem). Você pode reescrever livremente uma vez que estas estejam definidas.

A Coluna Vertebral — a decisão de design mais importante

Um grande vídeo explicativo tem uma coluna vertebral: um objeto persistente na tela que permanece visível durante a maior parte do vídeo, e cada batida ilumina uma parte diferente dele.

O vídeo 股市回报 do Tatakye é o exemplo canônico. A coluna vertebral é a fórmula p = E[mx], fixada no canto superior direito de 1:00 a 3:30. Cada seção destaca um símbolo — x, depois m, depois π_s — ensinando o significado desse símbolo. No final, a fórmula "desbloqueia" em três conclusões concretas (x → "quais futuros", m → "qual mundo", π_s → "quanto tempo esperar").

Por que isso funciona, e por que vídeos sem coluna vertebral parecem fracos:

  • A coluna vertebral é uma âncora visual. Se um espectador desvia o olhar e volta, ele sabe imediatamente "o que estamos decompondo atualmente."
  • Converte uma estrutura abstrata em um objeto físico na tela. A ideia tem coordenadas.
  • Os rótulos de capítulo só podem dizer aos espectadores onde na estrutura eles estão. A coluna vertebral diz aos espectadores qual componente da ideia está sendo explicado — que é um sinal mais forte.
  • A recompensa no final pode literalmente ser "a coluna vertebral, resolvida." Você abre com uma pergunta, constrói cada parte da coluna e fecha entregando a coluna de volta como a resposta.

O que faz uma boa coluna vertebral

Um candidato a coluna vertebral deve:

  1. Caber em uma linha (para que possa viver em um canto o tempo todo)
  2. Ter 3-5 componentes nomeados que cada um mapeia para uma batida do vídeo
  3. Ser visualmente estável — não uma animação, um quadro de referência estático
  4. Conter a tese — se você entende cada parte da coluna vertebral, você entende a peça

Formas comuns (classificadas por impacto):

  • Uma equação: 工作 = 肌肉 × 心智, p = E[mx], 价值 = 稀缺性 × 关注度
  • Um diagrama com setas nomeadas: 生产者 → 产品 → 用户, nós que você pode destacar um de cada vez
  • Uma razão ou comparação rotulada: 过去 : 现在 : 未来
  • Uma sequência curta: 观察 → 假设 → 实验 → 结论

Evite como coluna vertebral:

  • Um único número (sem componentes para iluminar)
  • Uma frase longa (muito verbosa para um canto, derrota o propósito)
  • Um gráfico (gráficos são visuais-chave, eles vivem no centro, não como coluna vertebral)

Coluna vertebral deve aparecer ANTES do final do Ato I, e persistir

Não jogue a coluna vertebral no espectador no início e nunca mais volte. Não espere até o Ato II para introduzi-la. A estrutura é:

  1. 0:00–0:30 Gancho: sem coluna vertebral ainda; configure a pergunta
  2. ~0:30 Revelação da coluna: a equação/diagrama aparece no canto superior direito
  3. Ato I–III: coluna permanece, cada ato ilumina um componente
  4. Recompensa: coluna se dissolve e se torna a lista de três itens de conclusões

Destaque de termo da coluna vertebral (receita visual)

Cada termo da coluna vertebral deve ter três estados:

  • escuro (padrão): color: var(--dim) — cinza, presente mas suave
  • aceso (atualmente sendo explicado): color: var(--gold) + text-shadow glow — inconfundivelmente "estamos aqui agora"
  • concluído (já explicado): color: var(--fg) — branco, ensinado, estabelecido

Quando uma nova seção começa, rebaixe o .lit anterior para .done, promova o novo termo para .lit. Um termo aceso por vez. O efeito visual: a coluna vertebral acende progressivamente da esquerda para a direita, e no final tudo está branco (totalmente ensinado), pronto para se dissolver na recompensa.

Estrutura narrativa — uma afirmação, poucas batidas

A única regra rígida: a peça defende uma afirmação, e cada batida existe para servi-la. Se uma seção não impulsiona a afirmação ou prepara uma batida posterior que o faça, corte-a.

Além disso, a estrutura é uma ferramenta, não um modelo. Escolha a forma que se ajusta à afirmação:

  • Três atos (Gancho → Padrão → Reviravolta → Custo) — bom quando a afirmação tem uma reversão surpreendente (como "já fizemos isso antes, mas desta vez há um custo")
  • Problema → Mecanismo → Implicação — bom para explicar por que algo funciona da maneira que funciona
  • Linha do tempo / acúmulo — bom quando o ponto é a acumulação ("olha o quanto isso chegou")
  • Comparação — bom para "A vs B, e aqui está por que importa"
  • Pergunta → Tentativas → Resolução — bom para descobertas de pesquisa ou peças de investigação
  • Revelação de um único insight — um fato surpreendente, lentamente construído e depois aterrissado (o vídeo 股市回报 do Tatakye é este)

Como escolher: diga a afirmação de uma frase em voz alta. Qual é o ritmo natural de fazer esse argumento? Essa é sua estrutura.

A contagem de seções escala com a duração, não com a estrutura:

  • 3-4 min → 3-4 batidas-chave
  • 5-6 min → 5-7 batidas
  • 8-10 min → 8-12 batidas

Cada batida precisa de:

  • Um visual-chave (uma curva, uma comparação, um diagrama, um evento de partícula)
  • Um número-chave OU uma frase-chave
  • Uma transição que pivota para a próxima batida (não apenas "e agora seção 2")

Bandeira vermelha: se seu esboço parece "seção 1, seção 2, seção 3..." como uma lista plana, você está guiando o usuário através de uma lista de leitura. Comprima ou re-sequencie para que as batidas se encadeiem — cada uma fazendo a próxima parecer inevitável.

Economia de cena — menos cenas, evoluções mais longas

Um modo de falha comum: fazer de cada seção uma nova cena. Resultado: sete visuais não relacionados em sequência, cada um durando 30 segundos, os espectadores ficam com whiplash e não lembram de nada.

O princípio Tatakye: um objeto visual, evoluindo por 2-3 minutos. No vídeo 股市回报, a "grade de espaço de probabilidade" está na tela de ~0:40 a ~2:30 — quase dois minutos. Durante esse período:

  1. Aparece como apenas linhas ("todos os mundos possíveis")
  2. Crescem barras douradas (x, pagamento em cada mundo)
  3. Barras ficam coloridas (m, peso de cada mundo)
  4. A fórmula aparece acima (valor esperado)
  5. Números específicos sobrepõem (exemplo concreto: 0.86, +16.9%)
  6. Rótulos verbais sobrepõem ("萧条/繁荣")

Seis iterações, um objeto visual. Os olhos do espectador nunca redefinem.

Regras práticas

  • Alvo: 3-5 cenas no total para um vídeo de 5 minutos. Mais do que isso = provavelmente mudando demais.
  • Duração mínima da cena: 60-90 segundos para cenas substantivas. Menos de um minuto = provavelmente pertence como uma camada dentro de outra cena, não uma cena própria.
  • Prefira cena-cresce-em-próxima-cena em vez de corte. Exemplo: um gráfico de curva dupla cresce uma área sombreada entre as curvas, que cresce barras subindo dessa área — três "seções" de conteúdo, zero cortes de cena.
  • Mudanças de cena acontecem nos limites dos atos, não dentro dos atos. Dentro de um ato, use sobreposições, destaques, contagens de números, rótulos — não mudanças de cena.

Quando uma mudança de cena É justificada

  • Gancho → primeira cena de conteúdo
  • Ato N → Ato N+1 se a metáfora visual fundamentalmente não pode carregar a próxima ideia
  • Conteúdo → recompensa (o final merece uma redefinição visual)

É isso. Três mudanças de cena em um vídeo de 5 minutos, no máximo.

Recompensa, não retórica

Grandes vídeos explicativos terminam com uma lista específica e nomeada de 2-4 coisas que o espectador pode levar. Não uma pergunta. Não um sentimento. Uma lista.

O vídeo 股市回报 do Tatakye termina entregando três coisas (x, m, π_s) com interpretações concretas: "quais futuros comprar, em qual mundo você está, quanto tempo esperar." O espectador pode repetir isso no jantar naquela noite.

Anti-padrões comuns:

  • "你,是吗?" / "Você é eles?" — pergunta reformulada. Parece poderoso. Não ensina nada. O espectador fecha o vídeo, lembra da vibe, esquece o conteúdo.
  • "O que você acha?" — chute retórico. O vídeo não se comprometeu com nada.
  • "Só o tempo dirá." — evasiva jornalística. Mesmo problema.
  • Uma única frase de conforto. "Já estivemos aqui antes." — plano, não acionável.

Como uma boa recompensa se sente: como desbloquear a coluna vertebral. A coluna era A = B × C. A recompensa é "então o que importa são: (1) B, (2) C, (3) a interação entre eles." O vídeo literalmente se resolve em sua resposta.

A tela de resposta de 3 itens (receita)

     01            02            03
      X             Y             Z
    label         label         label
   caption       caption       caption
  • Três colunas verticais, espaçamento igual
  • Itens aparecem um de cada vez, ~1 segundo de intervalo (campainha por item)
  • Cada item: número de índice (01/02/03), emblema de um único glifo (um caractere chinês ou símbolo matemático), rótulo curto (2-4 caracteres), legenda de uma frase
  • Segure por 3-4 segundos depois que todos os três aparecerem, depois transicione para fora
  • Depois uma linha de encerramento, que pode ser o gancho reformulado como resolvido: "你,在哪一侧?" funciona DEPOIS de você ter nomeado os lados.

Rótulos de capítulo como sinais de conteúdo

Rótulos de capítulo fracos: ATO I, ATO II, ATO III — diz ao espectador onde na estrutura eles estão. Eles não se importam.

Rótulos de capítulo fortes: 肌肉 · 第一次外包, 心智 · 第二次外包, × · 相乘, = · 代价, 答案 · 三件事 — cada rótulo é um termo da coluna vertebral ou uma peça direta de conteúdo. Lendo o rótulo, o espectador sabe imediatamente qual ideia está sendo decomposta agora.

Regra: o rótulo do capítulo deve ser uma palavra que a coluna vertebral destacaria. Se "ATO II" é seu rótulo de capítulo, mas sua coluna vertebral diz "心智", mude o rótulo do capítulo para "心智". Não duplique andaime estrutural no rótulo do capítulo — a estrutura é implícita, o conteúdo é o que os espectadores precisam.

Sistema visual (estilo Tatakye)

Cor

--bg:    #0a0a0f   /* NÃO #000000 — preto puro parece morto na tela */
--fg:    #eceae4   /* branco quente, 2% de viés azul; nunca branco puro */
--dim:   #8a8a90   /* para rótulos de eixo e legendas */
--gold:  #d4a85a   /* ÚNICA cor usada para ênfase */
--red:   #c15b4e   /* apenas para estatísticas "negativas" (salários atrasados) */

Nunca use mais do que estas 5. Resista à vontade de adicionar azul/verde para variedade.

Tipografia — é aqui que os vídeos morrem

  • Chinês ou inglês, escolha um por elemento. Nunca "ATO II · THE PARALLEL · 第二幕 · 现在轮到心智" — isso é redundante, difícil de ler e grita "slide bilíngue feito por IA". Escolha um idioma por rótulo.
  • Minimize itálico. Itálico em CJK parece ruim em quase todos os navegadores (glifos falsamente inclinados). Use cor (var(--gold)) para ênfase, não itálico.
  • Tamanhos mínimos para visualização em dispositivos móveis:
    • Marcas de eixo: 17px linha de base (escalado por fontPx())
    • Rótulos de eixo: 17-19px
    • Rótulos de fim de curva: 19px
    • Rótulo do capítulo (canto superior esquerdo): 1.1rem
    • Legenda (centro inferior): 1.15rem
    • Números de manchete (centro): 4.5rem+
    • Texto de abertura/fechamento mega: 1.9rem+
  • Serifa para números de exibição (fallback EB Garamond → Noto Serif SC). Sans-serif para todo o resto (Inter → PingFang/Noto Sans).

Arquitetura de informação de quatro camadas (assinatura Tatakye)

Cada cena tem até quatro camadas de texto em posições fixas:

  1. Canto superior esquerdo: Rótulo do capítulo (pequeno, espaçado, escuro)
  2. Canto superior direito: Crédito do autor (pequeno, escuro)
  3. Centro: Número grande / manchete (grande, serifado)
  4. Centro inferior: Narração da legenda (médio, sem serifa)
  5. Canto inferior esquerdo em itálico (opcional): Citação acadêmica (恩格斯停滞 · Robert Allen)

Motivos principais (reutilize 3-5 ao longo da peça)

Não invente um novo visual por seção — escolha um pequeno conjunto e varie-os:

  • Campo de partículas com perspectiva: grade 120×36, linhas distantes perto do horizonte, leve onda senoidal
  • Curva ascendente no eixo do tempo: plana na maior parte do X, decolagem exponencial; rotule âncoras de tempo como palavras narrativas ("现在", "未来") não anos específicos (2000 já é passado)
  • Curva descendente com preenchimento de área: colapso de preço / drenagem de valor
  • Barras de tempo horizontais: comparação de comprimento proporcional (40年 vs 5年 em escala 1/8)
  • Chuva de código: linhas curtas específicas de domínio caindo, para "máquina assume trabalho cognitivo"
  • Explosão de ponto / partícula: para momentos de "algo quebra"

Respiração da câmera

Adicione micro paralaxe a qualquer cena estática: camBreath = sin(t*0.14)*6, camSway = sin(t*0.09)*4, aplicado com multiplicador ponderado por profundidade para que elementos próximos se movam mais do que os distantes. Previne a sensação de "quadro morto".

Transições de cena

Sempre use piscadas de escurecimento entre cenas — nunca cortes secos. sceneBlink(cb, {dark:0.45, hold:0.08, light:0.5}): escurecer para preto em 0.45s → executar mudança de cena → clarear em 0.5s. Total ~1s por transição. Parece cortes de filme, não trocas de slide.

Contagem numérica

Todo número grande anima de 0 → alvo com easeOutCubic em ~1.1s quando revelado. Use <span class="count" data-to="..."></span>. Animar no início do quadro via requestAnimationFrame.

Áudio — esparso, atmosférico, não musical

Sem faixas de fundo. Sem loops. Sem melodias.

Pilares de áudio:

  1. Subgrave de ambiente (osc = audioCtx.createOscillator(); osc.type = 'sine'; osc.frequency.setValueAtTime(27.5 + (Math.random()-0.5)*4, t)) — onda senoidal ultra-baixa, quase inaudível, que acentua a tensão. Volume: -28dB normal, sobe para -18dB em momentos de revelação de número grande.
  2. Campainha de revelação (curta, 2 parciais: 660Hz + 1320Hz, decaimento ~0.6s). Uma única campainha quando um grande número aparece. Uma segunda campainha (tom mais alto, 880Hz + 1760Hz) quando a recompensa se desbloqueia.
  3. Brilho de texto (ruído filtrado passa-alta em 3600Hz, envelope de 0.08s). Disparado quando um rótulo de capítulo muda.
  4. Silêncio — lacunas intencionais de 2-3 segundos de silêncio completo após a revelação de um número grande. O silêncio é o efeito.

Implementação:

const actx = new (window.AudioContext || window.webkitAudioContext)();
// Um único oscilador subgrave, religado conforme necessário
// Revela campainhas como osciladores + ganho com envelope de decaimento
// Brilhos de ruído via AudioBufferSourceNode com buffer de ruído branco e BiquadFilterNode

Nunca: reproduza um arquivo de áudio. Nunca use HTMLAudioElement. Sempre sintetize no Web Audio API. O arquivo final não tem um único byte de áudio.

Tamanho e desempenho alvo

  • Meta de tamanho de arquivo: < 150 KB para um vídeo de 5 minutos com 4 cenas e 2000 partículas. < 200 KB com 6 cenas.
  • Quedas de quadro: FPS nunca deve cair abaixo de 50 em um laptop de 2020 (Intel Iris). Em dispositivos móveis, 30 fps sustentado.
  • Estratégia de dimensionamento de partículas: Acima de 2000 partículas, reduza a taxa de atualização para quadro sim, quadro não (pule a lógica de atualização em quadros alternados).

Integrações de código

Abordagem geral

  • HTML + CSS + JavaScript vanilla em um único arquivo. Sem CDNs, sem frameworks, sem bundlers.
  • Canvas 2D para a maioria dos gráficos. WebGL reservado para efeitos de partículas acima de 5000 partículas ou profundidade de cor real.
  • Todo o áudio via Web Audio API.

Estrutura do arquivo

<!DOCTYPE html>
<html>
<head> <!-- estilo inline --> </head>
<body>
  <canvas id="c"></canvas>
  <div id="subtitle"></div>
  <!-- mais divs de sobreposição -->
  <script>
    // Todo o JavaScript aqui
  </script>
</body>
</html>

Funções de utilitário essenciais (tools.js é substituído por funções inline)

fontPx(px): Retorna px * Math.min(window.innerWidth/1920, window.innerHeight/1080). Para dimensionamento de fonte que responde ao tamanho da janela, não pixels fixos. Use em toda parte, nunca px fixo.

lerp(a, b, t): a + (b - a) * t. Interpolação linear.

easeOutCubic(t): 1 - Math.pow(1 - t, 3). Para animações de contagem e transições.

sceneBlink(cb, opts): Ver "Transições de cena" acima.

Gerenciamento de estado

Use um único objeto de estado:

const state = {
  t: 0,            // tempo do vídeo (segundos desde o início)
  scene: -1,       // índice da cena atual (-1 = antes do início)
  transitioning: false,
  counts: [],      // elementos de contagem ativos
  particles: [],   // array de partículas
  spineLit: '',    // índice do termo da coluna atualmente aceso
  spineDone: [],   // índices de termos concluídos
};

Animação de contagem

function animateCount(el, target, duration = 1.1) {
  const start = performance.now();
  const from = 0;
  function tick(now) {
    const t = Math.min((now - start) / (duration * 1000), 1);
    el.textContent = Math.round(from + (target - from) * easeOutCubic(t));
    if (t < 1) requestAnimationFrame(tick);
  }
  requestAnimationFrame(tick);
}

Integração de coluna vertebral

A coluna vertebral é um elemento div no canto superior direito:

<div id="spine">
  <span class="term dim" data-idx="0">a</span>
  <span class="symbol">=</span>
  <span class="term dim" data-idx="1">b</span>
  <span class="symbol">×</span>
  <span class="term dim" data-idx="2">c</span>
</div>

Ilumine termos chamando setSpineTerm(idx, 'lit' | 'done' | 'dim'), que alterna classes CSS.

Modo debug

Adicione ao final do script:

// MODO DEBUG: Pressione D para alternar sobreposição de depuração
// Mostra: FPS, cena atual, tempo, contagem de partículas
// Pressione S para pular para a próxima cena
// Pressione Espaço para pausar/retomar

Lembretes

  1. Objetivo : Criar um arquivo HTML que o usuário possa reproduzir e gravar. Caminho de entrega: escreva o arquivo, diga ao usuário para abri-lo no navegador e usar QuickTime / OBS / gravador de tela embutido para capturar.
  2. Nunca use "clique para iniciar" ou qualquer interação do usuário. O vídeo começa a reproduzir automaticamente. O usuário deve agir para iniciar o áudio (clique necessário para ativar o AudioContext), mas o primeiro frame é desenhado imediatamente.
  3. Latência zero no primeiro frame. A cena de abertura (gancho) é desenhada na primeira chamada requestAnimationFrame. Sem tela preta.
  4. Estruture todo o áudio como eventos programados, não loops. Use AudioContext.currentTime + delay para sincronizar áudio com visuais.
  5. Elegância metropolitana: Sem cantos afiados. Sem bordas. Sem fundos brancos. Texto claro sobre escuro, com a paleta de cores acima.
  6. Tempo mínimo de tela de resposta: 6 segundos. O espectador precisa de tempo para absorver. Os três itens devem aparecer com 1 segundo de intervalo, depois segurar por 3-4 segundos, depois fade out.
  7. Desligue a depuração antes de entregar. Remova o ouvinte de evento de tecla D e a sobreposição de depuração do HTML final.

Habilidades Relacionadas