Communitygithub.com

Extensão OpenCaptions

Extensão OpenCaptions para o Content Engine — adiciona legendas CWI (Caption With Intent) orientadas por intenção ao pipeline de pós-produção. Conecta-se na etapa final (grade → legenda → exportação). Gera legendas que entendem a intenção do vídeo (tom, volume, emoção, ênfase) e se estilizam automaticamente com peso, tamanho e cor variáveis da fonte. Usa a CLI ou servidor MCP do OpenCaptions. Dispara em: 'adicionar legendas', 'opencaptions', 'legendas CWI', 'legendas de intenção'.

O que é Extensão OpenCaptions?

Esta habilidade (skill) integra o padrão de legendas CWI (Caption With Intent) ao pipeline de pós-produção do Content Engine, substituindo legendas estáticas por legendas que codificam a experiência sentida da fala. Utilizando o OpenCaptions, uma ferramenta de código aberto para o padrão CWI vencedor do Oscar em 2025, a extensão analisa áudio e vídeo para extrair sinais de intenção (tom, volume, emoção) e mapeá-los em parâmetros visuais como peso variável da fonte, tamanho e animações. O pipeline inclui transcrição com faster-whisper, diarização com pyannote-audio, extração de intenção (com suporte a backends V1, V2 e V3), mapeamento para CWI, validação contra 12 regras (nos pilares de Atribuição, Sincronização e Entonação) e renderização via Remotion ou ffmpeg. A skill funciona tanto via CLI (comandos como `npx opencaptions generate`) quanto via servidor MCP para integração com agentes como Claude Code, e suporta três estilos de legenda predefinidos (palavra por palavra, narrativo e minimalista). A operação é segura para o pipeline do Content Engine, com degradação gradual caso as dependências não estejam disponíveis.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/broomva/skills/tree/main/skills/video/content-engine/extensions/opencaptions

Perguntar na sua IA favorita

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

Documentação

O que Extensão OpenCaptions faz?

Conecte legendas CWI (Caption With Intent) ao pipeline de pós-produção do Content Engine. Em vez de legendas estáticas e planas, o CWI codifica a experiência sentida da fala — o tom determina o peso da fonte, o volume determina o tamanho da fonte, a ênfase aciona animações de brilho e a identidade do locutor é mapeada para cores WCAG AA. O resultado são legendas que comunicam como algo foi dito, não apenas o que foi dito.

CWI é o padrão de legendagem vencedor do Oscar (2025), criado pela FCB Chicago e pela Chicago Hearing Society. OpenCaptions é o primeiro conjunto de ferramentas programáticas de código aberto para ele.

Ponto de Conexão no Pipeline

Etapa: Pós-Produção (Etapa 3) Posição: Após o upscale e a correção de cor, antes da exportação final.

Cadeia de Pós-Produção:
  1. Upscale (Real-ESRGAN / Topaz)   --> Resolução mais alta
  2. Correção de Cor (LUT da marca / ffmpeg) --> Cores da marca
  3. OpenCaptions (CWI)               --> Legendas orientadas por intenção
  4. Exportação Final (ffmpeg)         --> Arquivo pronto para produção

A extensão recebe um arquivo de vídeo corrigido e produz:

  1. Um documento CWI (.cwi.json) com anotações de intenção por palavra
  2. Um fallback WebVTT (.vtt) para plataformas que exigem legendas padrão
  3. Um relatório de validação (JSON) com pontuações dos pilares
  4. Um vídeo legendado (.mp4) renderizado via Remotion ou ffmpeg

Como Funciona

Vídeo Corrigido + Briefing da Cena
  |
  ├── [1] Transcrição (faster-whisper) --> timestamps por palavra
  ├── [2] Diarização (pyannote-audio)    --> atribuição de locutor
  ├── [3] Extração de Intenção           --> tom, volume, emoção, ênfase por fala
  |       V1: parselmouth + FER (áudio+visão)
  |       V2: modelo de mundo V-JEPA2
  |       V3: predição neural TRIBE v2
  ├── [4] Mapeamento Intenção --> CWI     --> peso, tamanho, ênfase, animação por palavra
  |       V1: RulesMapper (tom-->peso, volume-->tamanho)
  |       V2: LearnedMapper (treinado em dados de correção)
  |       V3: NeuralMapper (ativações de regiões cerebrais direcionam a estilização)
  ├── [5] Validação (12 regras)          --> Pontuações de Atribuição + Sincronização + Entonação
  └── [6] Renderização                   --> Sobreposição Remotion OU queima ffmpeg

Etapa 1-2: Transcrição + Diarização

O pipeline chama a CLI ou servidor MCP do OpenCaptions, que executa o faster-whisper para timestamps por palavra e o pyannote-audio para detecção de locutor. Essas etapas produzem um DiarizedTranscript com cada palavra marcada para um locutor.

Etapa 3: Extração de Intenção

O extrator de intenção analisa o áudio e o vídeo para determinar o registro sentido de cada fala:

  • Sinais vocais: Tom (Hz), volume (dB), velocidade da fala (PPM), tempo de pausa
  • Sinais de afeto: Valência (-1 a 1), excitação (0 a 1), emoção dominante
  • Sinais semânticos: Probabilidade de sarcasmo, palavras de ênfase, figuras de linguagem

Esses sinais formam um IntentFrame para cada fala. Palavras individuais que se desviam da linha de base da fala recebem substituições WordIntent.

Etapa 4: Mapeamento de Intenção

O mapeador converte sinais de intenção em parâmetros visuais CWI:

Sinal de IntençãoPropriedade CWIMapeamento (RulesMapper V1)
Tom (normalizado 0-1)weight (100-900)Interpolação linear: 100 + tom_norm * 800
Volume (normalizado 0-1)size (0.7-1.5)Interpolação linear: 0.8 + volume_norm * 0.55
Ênfase semântica + volume altoemphasis (booleano)Palavra em palavras_enfase OU volume > p90
Identidade do locutorcolor do locutorAtribuído a partir de paleta de 12 cores WCAG AA
Sussurro (volume baixo)weight < 300Substituição: peso fixado em 100-250
Grito (volume alto)size > 1.3 + ênfaseSubstituição: tamanho 1.35-1.5, ênfase verdadeiro

Etapa 5: Validação

O validador @opencaptions/spec verifica o documento CWI contra 12 regras em três pilares:

Atribuição (3 regras):

  • ATT_001: Cada legenda tem um locutor no elenco
  • ATT_002: Locutores têm cores únicas
  • ATT_003: Cores atendem ao contraste WCAG AA (4.5:1 contra #1a1a1a)

Sincronização (5 regras):

  • SYN_001: Todas as palavras têm timestamps
  • SYN_002: Timestamps estritamente crescentes
  • SYN_003: Eventos de legenda não se sobrepõem
  • SYN_004: Duração da animação em 600ms conforme especificação
  • FCC_001: Sem lacunas > 3s durante a fala
  • FCC_002: Máximo de 42 caracteres por linha (conforme FCC)

Entonação (3 regras):

  • INT_001: Peso no intervalo válido (100-900)
  • INT_002: Tamanho no intervalo válido (0.7-1.5)
  • INT_003: > 20% das palavras têm peso não padrão (as legendas realmente variam)

Cada pilar pontua de 0 a 100. Um documento CWI é aprovado se todos os três pilares obtiverem pontuação >= 80.

Etapa 6: Renderização

Dois caminhos de renderização:

Caminho Remotion (preferido para o Content Engine): As palavras CWI tornam-se componentes React em uma composição <CaptionOverlay>. Cada palavra aparece em seu timestamp com animação de entrada spring(), cor do locutor, peso variável da fonte e brilho de ênfase. Consulte references/cwi-remotion-bridge.md para o mapeamento completo.

Queima ffmpeg (fallback): Gera um arquivo de legenda ASS a partir do documento CWI e o queima no vídeo via ffmpeg -vf ass=legendas.ass. Perde a animação por palavra, mas preserva as cores do locutor e a variação de peso da fonte.

Uso da CLI

# Gerar legendas CWI a partir de um vídeo
npx opencaptions generate video.mp4 --output legendas.cwi.json

# Gerar com o backend neural TRIBE v2
npx opencaptions generate video.mp4 --backend tribe --output legendas.cwi.json

# Validar um documento CWI
npx opencaptions validate legendas.cwi.json

# Visualizar legendas no terminal (coloridas com ANSI)
npx opencaptions preview legendas.cwi.json

# Exportar para WebVTT
npx opencaptions export legendas.cwi.json --format webvtt

# Exportar para ExtendScript do After Effects
npx opencaptions export legendas.cwi.json --format ae-json

# Exportar para XML do Premiere Pro
npx opencaptions export legendas.cwi.json --format premiere-xml

# Verificar dependências do sistema
npx opencaptions doctor

# Instalar dependências Python
npx opencaptions setup

Uso do Servidor MCP

O servidor MCP do OpenCaptions expõe quatro ferramentas para integração com agentes:

FerramentaDescrição
generate_captionsExecuta o pipeline completo em um arquivo de vídeo
validate_captionsValida um documento CWI contra 12 regras
preview_captionsVisualização formatada no terminal em um determinado momento
export_captionsExporta para o formato WebVTT

Para usar via Claude Code, adicione o servidor MCP às suas configurações:

{
  "mcpServers": {
    "opencaptions": {
      "command": "npx",
      "args": ["@opencaptions/mcp"]
    }
  }
}

Em seguida, invoque na conversa: "Gerar legendas CWI para video.mp4" aciona generate_captions.

Integração com compose-video.py

O compose-video.py do Content Engine aceita a flag --captions:

python3 scripts/compose-video.py storyboard.md --brand arcan-studio --captions

Quando --captions é passado, após todos os clipes serem gerados e montados, o pipeline:

  1. Executa npx opencaptions generate {video-final}.mp4 --output {dir-saida}/legendas.cwi.json
  2. Valida o documento CWI (avisa se a pontuação for < 80, mas não bloqueia)
  3. Se --remotion também for passado, injeta o JSON CWI na composição Remotion como props <CaptionOverlay>
  4. Caso contrário, gera WebVTT como um arquivo auxiliar junto ao vídeo final

Se o OpenCaptions não estiver instalado (npx opencaptions doctor falhar), o pipeline degrada graciosamente:

  • Recai para sobreposição de texto do briefing da cena (texto estático das descrições ## Shot do storyboard)
  • Registra um aviso: "OpenCaptions não disponível, usando sobreposição de texto do briefing da cena"
  • Ainda produz um arquivo .vtt com temporização derivada dos limites dos clipes

Estilos de Legenda

Três estilos de legenda pré-definidos, selecionáveis via configuração:

1. Palavra por Palavra (brainrot)

Estilo de alta retenção: cada palavra aparece individualmente, centralizada, com variação máxima de tamanho. Usado para conteúdo social/TikTok/Reels otimizado para gatilhos de dopamina.

  • Uma palavra visível por vez
  • Tamanho base grande (64px a 1080p)
  • Variação extrema de peso (100-900 faixa completa)
  • Palavras de ênfase escalam para 1.5x com brilho
  • Fundo: nenhum (palavras flutuam sobre o vídeo)
  • Fonte: Roboto Flex variável

2. Narrativo (editorial)

Exibição de frase completa com estilo por palavra. Usado para conteúdo de formato longo, documentários, embeds de vídeo em blogs.

  • Evento de legenda completo visível, palavras estilizadas inline
  • Tamanho base médio (48px a 1080p)
  • Variação moderada de peso (300-700)
  • Palavras de ênfase ganham aumento sutil de tamanho (1.15x)
  • Fundo: pill semitransparente (rgba(0,0,0,0.6))
  • Fonte: Roboto Flex variável

3. Minimalista (terço inferior)

Apresentação limpa no terço inferior. Nome do locutor + texto. Distração visual mínima. Usado para entrevistas, cabeças falantes, gravações de conferências.

  • Rótulo do nome do locutor na cor do locutor, texto da legenda em branco
  • Tamanho base pequeno (36px a 1080p)
  • Variação de peso apenas para ênfase (400 padrão, 700 ênfase)
  • Sem variação de tamanho
  • Fundo: barra de gradiente (15% inferior do quadro)
  • Fonte: sans-serif do sistema

Contrato de Dados

Leituras (imutáveis)

  • Ativo de vídeo corrigido da etapa anterior de pós-produção
  • knowledge/compiled/brands/{slug_da_marca}.md -- para paleta de cores das legendas e preferências tipográficas
  • Briefing da cena (parâmetro em tempo de execução) -- para contexto do tom emocional pretendido

Escritas (apenas no próprio namespace)

  • extensions/opencaptions/output/{id_do_ativo}.cwi.json -- Documento CWI
  • extensions/opencaptions/output/{id_do_ativo}.vtt -- Fallback WebVTT
  • extensions/opencaptions/output/{id_do_ativo}-report.json -- Relatório de validação
  • extensions/opencaptions/output/{id_do_ativo}-captioned.mp4 -- Vídeo renderizado (apenas caminho Remotion)

Configuração

opencaptions:
  # Predefinição de estilo de legenda
  style: "narrative"              # word-by-word | narrative | minimal

  # Parâmetros visuais
  font_family: "Roboto Flex"      # Fonte variável para eixo de peso
  base_font_size: 48              # Pixels a 1080p
  position: "bottom"              # top | center | bottom
  max_chars_per_line: 42          # Conformidade FCC
  background: "pill"              # pill | shadow | gradient | none
  background_opacity: 0.6         # 0.0 - 1.0

  # Backend do pipeline
  backend: "av"                   # av (V1) | jepa (V2) | tribe (V3)
  language: "en"                  # Dica ISO 639-1 para transcrição

  # Substituições de locutor (opcional, auto-detectado por padrão)
  speakers:
    - name: "Narrador"
      color: "#6B8AFF"
    - name: "Convidado"
      color: "#FF6B6B"

  # Renderização
  render_mode: "remotion"         # remotion | ffmpeg | sidecar-only
  output_format: "mp4"            # mp4 | webm
  fps: 30                         # Corresponder ao vídeo de origem

  # Validação
  min_score: 80                   # Pontuação mínima geral para prosseguir
  fail_on_low_score: false        # Se verdadeiro, bloqueia o pipeline em caso de pontuação baixa

  # Mapeamento neural TRIBE v2 (apenas backend V3)
  neural_mapping: false           # Habilita a estilização baseada em resposta neural prevista

Degradação Graciosa

A extensão nunca bloqueia o pipeline do Content Engine. Escada de degradação:

CondiçãoComportamento
CLI OpenCaptions instalada + todas as dependências PythonPipeline CWI completo (transcrição, diarização, intenção, mapeamento)
CLI OpenCaptions instalada, sem dependências PythonBackends simulados com legendas placeholder + validação
CLI OpenCaptions não instaladaSobreposição de texto do briefing da cena como legendas estáticas nos limites dos clipes
Vídeo sem faixa de áudioPular geração de legenda, registrar mensagem informativa
Pontuação de validação < 80Avisar, mas prosseguir (a menos que fail_on_low_score: true)
Remotion não disponívelRecair para queima ASS ffmpeg
ffmpeg não disponívelGerar apenas JSON CWI + WebVTT como arquivos auxiliares (sem vídeo renderizado)

Relacionados

  • Projeto OpenCaptions: ~/broomva/apps/opencaptions/
  • Ponte CWI-Remotion: references/cwi-remotion-bridge.md
  • Guia de integração: references/integration-guide.md
  • SKILL.md do Content Engine: ../../SKILL.md
  • Framework de extensão: ../README.md

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

broomva/skills

Local TTS, voice cloning, voice design, and video dubbing via the OmniVoice Studio MCP server (open-source ElevenLabs alternative; nothing leaves the machine, runs on MPS/CUDA/CPU). Use when: (1) generating speech from text in any of 646 languages, (2) cloning a voice from a 3-second reference clip, (3) designing a voice by gender/age/accent/pitch/style, (4) dubbing a video into another language, (5) listing voice profiles or personality presets, (6) producing narration where privacy, cost, or absent API keys matter, (7) non-English narration where Edge TTS/kokoro fall short, (8) batch audio for blog posts or content pipelines. Triggers: 'omnivoice', 'voice clone', 'clone this voice', 'tts', 'narrate', 'generate speech', 'voice synthesis', 'dub video', 'voice design', 'local tts', 'multilingual voice', 'narrate this post', 'elevenlabs alternative'.

broomva/skills

>- Speak an explanation out loud while working in any project — tiered text-to-speech with a pluggable backend (ElevenLabs by default and quota-guarded, macOS `say` via `--fast` for free instant local speech, local OmniVoice as an unlimited private tier). Markdown-aware, so code fences, URLs and deep paths collapse to short spoken placeholders instead of being dictated character by character, while snake_case identifiers survive intact so the listener can still search for them. Every utterance is saved to disk for later replay. Also carries a **talk mode** toggle: turn it on and the agent speaks a full readback of every turn, for as long as that session lasts — the whole response, not a summary of it, with `brief` and `marker` levels for when you want less. Talk mode is off by default and scoped to the single session that enabled it, so parallel agents in other worktrees stay silent. Use when the user asks to hear something rather than read it — an explanation of a change, a walkthrough of what just happen...

broomva/skills

Shop Tiendas D1 (Colombia, d1.com.co) from the command line — search the catalogue, resolve your nearest physical store, price a basket against that store's real stock, and quote delivery. D1 runs VTEX IO (account `d1tiendas`), so this drives its public storefront API with no admin key at all — catalogue and cart work fully anonymously, and a one-time emailed code unlocks order history. Handles the two traps that make naive D1 automation wrong — availability is regionalized (an unregioned query reports a national catalogue nobody can actually buy from) and prices arrive in two different units (search reports whole pesos, checkout reports hundredths, a silent 100x). Builds and prices baskets; it deliberately cannot pay, handing a checkout URL to a human instead. USE WHEN the user wants to find D1 products or prices, check whether D1 delivers somewhere, build or cost a D1 grocery basket, compare D1 items, or review their D1 orders. NOT FOR other Colombian retailers (Éxito, Jumbo, Ara, Alkosto), and not for c...

broomva/skills

Stateful, local-first household toxics inventory + swap engine. Identify the items in a home that carry endocrine disruptors and persistent chemicals (BPA/BPS, phthalates, PFAS/PTFE, parabens, flame retardants, VOCs, microplastics), score each by *real* exposure (severity x presence x how it's used x condition), and track the swap to a safer alternative from "flagged" -> "sourced" -> "swapped". Ships a grounded, cited knowledge graph of ~20 hazards, ~40 item-classes, and ~40 alternatives. Hands sourcing off to the `procurer` skill. The skill's state is the source of truth — the agent is the app.

broomva/skills

Tekton — the shared architecture-intent substrate for co-designing systems with the agent. One typed graph across six tiers (system / journey / data / infra / decisions / qualities); views are queries, not separate diagrams. The canonical artifact is a diff-friendly YAML model both human and agent read and write; it renders to Mermaid (agent-legible, GitHub-native) and a self-contained tabbed HTML viewer (human-visual). Cross-tier traceability (`tekton query <from> <to>`) answers "which infra does this user-journey step touch?" as a path query. USE WHEN: designing or thinking deeply about architecture, a system, a data model, user journeys/flows, or a technical plan WITH the agent; when a Category-C HTML doc isn't enough because you need to see AND edit AND traverse the design across tiers; "let's design X", "architect this", "model the system", "draw the flow", "how does this fit together", "diagram this", "/tekton". NOT FOR: a one-off throwaway diagram (use Mermaid inline); prose-only ADRs (write the ADR...

broomva/skills

Generate a polished Remotion video and X thread showcasing the full agent skills inventory. Use when creating social media content about skills, rendering category-based skill visualizations, or producing animated showcases of agent capabilities. Triggers on "skills video", "showcase skills", "skills thread", "render skills", "social content for skills", or requests to visualize the skills inventory.

broomva/skills

Produce polished product launch videos using the Liquid Glass aesthetic — dark void backgrounds, 3D perspective floating UI panels, particle effects, spring animations, and cinematic pacing. Built on Remotion with Imagen 4.0 for frames and Veo 3.1 for B-roll. Use when: (1) creating a product demo or launch video, (2) showcasing a UI/app/tool with cinematic polish, (3) building a social-ready video from screenshots and renders, (4) applying the liquid glass floating panel style, (5) composing Remotion videos with 3D transforms and spring animations. Triggers on: 'launch video', 'product video', 'liquid glass video', 'demo video', 'showcase video', 'remotion video', 'floating panel', 'glass aesthetic'.

Habilidades Relacionadas