rostrum

Limpe gravações de conversas localmente: encontre repetições, retomadas e silêncios com transcrição de fala, revise cada corte, depois renderize com ffmpeg e verifique a sincronização de áudio/vídeo.

Documentação

rostrum

Limpe gravações de palestras, de um único vídeo a um evento inteiro, manualmente ou por meio do seu agente. O rostrum encontra repetições, retomadas, trechos repetidos e silêncios, mostra cada corte com sua justificativa e, em seguida, renderiza com ffmpeg e verifica o resultado. Tudo roda na sua máquina.

rostrum on a short demo talk: init finds the cuts, the review page adjusts one, then import, render and verify

Uma palestra de demonstração sintética de 58 segundos. O terminal mostra a saída real, resumida às linhas principais.

Gravar uma palestra de uma só vez significa reiniciar frases, slides e cliques. Cortar isso manualmente leva horas, e uma junção ruim estraga um clipe. O rostrum propõe cada corte com as evidências por trás dele, você aprova ou ajusta, e ele renderiza junções com precisão de quadro e depois verifica a sincronização em cada junção.

Início rápido

uv tool install rostrum
rostrum init talk.mp4

pipx install rostrum também funciona. Você também precisa do ffmpeg (winget install Gyan.FFmpeg, brew install ffmpeg, apt install ffmpeg).

O init faz toda a primeira passagem:

  1. analisa o arquivo (ou arquivos) e escreve rostrum.json com padrões,
  2. transcreve com um mecanismo de fala local (a primeira execução baixa o modelo, cerca de 480 MB),
  3. encontra cortes: pistas faladas ("refazer", "parar", "recomeçar"), retomadas, repetições, pausas longas, silêncios no início e no fim, e fala distorcida ou não transcrita para você ouvir,
  4. escreve review.html, onde você pode reproduzir cada junção, alternar manter/cortar e ajustar bordas.

Nada é cortado antes de você ver.

  • rostrum plan lista cada corte e o comprimento esperado.
  • render recusa até que os cortes sejam revisados: com rostrum decide, ou salvando na página e importando esse arquivo. --yes ignora essa verificação.
  • A página salva <talk>-decisions.json. Importá-lo nunca desfaz uma decisão mais recente: para cada corte, o mais recente vence.
  • As fontes nunca são modificadas e as saídas nunca são sobrescritas.
rostrum plan                       # every cut, its reason, and the expected output length
rostrum decide <cut-id> keep       # or: cut, with --start/--end to move its edges
rostrum decide --import talk-decisions.json   # apply what you saved from review.html
rostrum render                     # frame-accurate render into <talk>.rostrum/renders/render-N/
rostrum verify --mode full         # checks the newest render: frames, audio, decode, A/V sync at every join
rostrum map 23:30 --from render-1  # a time in the edited video -> the source time

O rostrum simples mostra o status do projeto, e o rostrum doctor verifica sua configuração.

O que esperar

Esses números vêm de uma palestra de 60 minutos em take único, executada apenas em CPU (8 núcleos, small.en):

  • Velocidade:
    • primeira passagem: cerca de 11 minutos;
    • renderização: cerca de 4 minutos;
    • verificação completa: cerca de 1,5 minuto.
  • Precisão: em relação à edição final do palestrante, os cortes marcados como auto cobriram 69% do tempo removido, e 95% do que foi removido estava correto. Adicionar as propostas elevou a cobertura para 90%. A revisão fecha o restante da lacuna, por isso é o padrão.

Gravando para isso

  • Quando você hesitar, diga "refazer" (ou "parar", "recomeçar"), pause por um segundo e recomece do início da frase.
  • Recomeçar um slide ou um clique é aceitável: a tentativa ruim e o recomeço parecem qualquer outra retomada.
  • Continue gravando. Quanto menos arquivos separados, mais fácil a revisão; vários arquivos também funcionam.

Uma palestra, vários arquivos ou um evento inteiro

rostrum init talk-part1.mp4 talk-part2.mp4   # one talk recorded in parts: one timeline, one output
rostrum init talks/                          # one talk per file; *-part1/*-part2 files are grouped

Os arquivos se juntam em uma palestra quando seus nomes terminam em -part1, -part2 e assim por diante (_ ou um espaço também funciona; defina init.partPattern para alterar). Qualquer outro arquivo é uma palestra própria.

As partes são analisadas como uma única linha do tempo, então um refazer que começa no final de um arquivo e é dito novamente no próximo ainda é detectado. Um evento compartilha um bloco de configurações (mecanismo, palavras de pista, configurações de renderização, alvo de volume, nomenclatura) e qualquer palestra pode substituir qualquer parte dele.

Configure tudo

As configurações são JSON simples em camadas, onde a mais recente vence:

  1. padrões integrados;
  2. ~/.rostrum/config.json, seus padrões;
  3. rostrum.json, o arquivo do evento ou da palestra;
  4. flags de linha de comando.

Cada limite, lista de palavras, mecanismo e opção de renderização é uma chave, e o esquema publicado fornece autocompletar no seu editor. O rostrum config imprime o valor efetivo de cada chave e de onde veio. Veja examples/rostrum.example.json.

{
  "$schema": "https://raw.githubusercontent.com/girishkvs/rostrum/main/src/rostrum/schema/rostrum.schema.json",
  "defaults": {
    "cues":   { "words": ["redo", "stop", "restart"] },
    "pauses": { "maxSec": 2.0, "keepSec": 0.5 },
    "render": { "crf": 18, "name": "{speaker}-{title}" }
  },
  "talks": [
    { "id": "keynote", "speaker": "Jane Doe", "title": "Keynote", "sources": ["part1.mp4", "part2.mp4"] }
  ]
}

Cada detector tem um nível:

  • auto: exibido com corte pré-selecionado.
  • propose: exibido com manter pré-selecionado.
  • off: não executado.
DetectorEncontraPadrão
Pistas faladas"refazer", "parar", "recomeçar"; corta de volta até onde você recomeçouautomático
Retomadasuma frase dita novamente logo depois; "dita novamente com uma palavra diferente" é apenas propostaautomático quando a correspondência é forte, caso contrário propor
Repetições"agora, agora", ou uma frase recomeçadapropor
Pausassilêncio acima de maxSec, ajustado para keepSec em cada ladoautomático
Abertura e encerramentosilêncio no início e no fimautomático
Fora da palestra"isso está gravando?" e comentários semelhantespropor
Não clarofala distorcida, alucinada ou não transcritapropor
Preenchimentos"hum", "uh"desligado

Verificações com consciência de slides a partir do seu deck estão planejadas para 0.2.

Mecanismos de fala

MecanismoUso
faster-whisperO padrão. Local, em CPU ou GPU.
commandQualquer programa que imprima palavras em JSON, SRT ou VTT, como whisper.cpp ou um CLI de fornecedor.
importUma transcrição que você já tem.

Os mecanismos command e import funcionam sem configuração extra. Mecanismos de terceiros podem se registrar através do ponto de entrada rostrum.engines, nomeando uma subclasse de rostrum.engines.SpeechEngine; o rostrum o constrói como Engine(settings, tools, report). Os trabalhadores de fala se dimensionam conforme sua CPU e memória (speech.workers: "auto"); defina um número para substituir.

Os padrões são em inglês: o modelo small.en e as listas de palavras de pista, preenchimento e fora da palestra. Para outro idioma, defina speech.model para um modelo multilíngue como small, defina speech.language e substitua as listas de palavras.

Use a partir de um agente

Todo comando, exceto mcp, aceita --json. O rostrum mcp executa um servidor MCP via stdio; etapas longas rodam como trabalhos que seu agente consulta.

Instalações em uma etapa (o servidor MCP mais a habilidade do agente):

HostInstalação
Claude Code/plugin marketplace add girishkvs/rostrum, depois /plugin install rostrum@rostrum
Copilot CLIcopilot plugin install girishkvs/rostrum
Gemini CLIgemini extensions install https://github.com/girishkvs/rostrum
Claude DesktopAbra rostrum-<version>.mcpb da última versão
CursorAdd rostrum to Cursor

Ou adicione o servidor manualmente. O uvx executa o pacote PyPI, então não há mais nada para instalar:

HostAdicione o servidor
Copilot CLI/mcp add, depois nomeie rostrum, comando uvx, argumentos rostrum mcp
Claude Codeclaude mcp add rostrum -- uvx rostrum mcp
VS CodeMCP: Adicionar Servidor, depois Comando (stdio), depois uvx rostrum mcp
Codex CLI~/.codex/config.toml: [mcp_servers.rostrum] com command = "uvx" e args = ["rostrum", "mcp"]
Gemini CLI, Cursor"mcpServers": { "rostrum": { "command": "uvx", "args": ["rostrum", "mcp"] } } em ~/.gemini/settings.json ou ~/.cursor/mcp.json

A primeira inicialização baixa as dependências do rostrum, o que pode levar mais tempo do que um host espera por um servidor para iniciar. Execute uvx rostrum doctor uma vez primeiro.

Depois pergunte: "Limpe talk.mp4 e me mostre qualquer coisa que você não tenha certeza." skills/rostrum/SKILL.md diz ao agente as regras:

  • mostre os cortes antes de renderizar;
  • pergunte sobre os incertos;
  • importe o que você salvou da página de revisão quando você disser (import_decisions);
  • renderize somente depois que você disser (o agente então passa confirmed).

O mcp-pacemaker pode hospedar o servidor e mantê-lo aquecido entre sessões. Adicione esta entrada a ~/.mcp-pacemaker/servers.json; o pacemaker recarrega o arquivo quando ele é salvo:

{ "rostrum": { "command": "uvx", "args": ["rostrum", "mcp"] } }

O que o verify verifica

  • Duração: o comprimento da saída é igual ao tempo mantido dentro de um quadro.
  • Vídeo: os quadros são contínuos em um passo constante.
  • Áudio: os pacotes são contínuos, sem lacunas ou sobreposições.
  • Decodificação: uma decodificação completa termina sem erros.
  • Junções: os carimbos de data/hora são contínuos em cada junção.
  • Deslocamento A/V: medido em relação à fonte nas junções, amostrado no modo fast e em cada junção no modo full.

Requisitos

  • Python 3.11+ e ffmpeg/ffprobe 6.1 ou mais recente (CI executa 6.1 e 9.0). Se não estiverem no PATH, defina ROSTRUM_FFMPEG / ROSTRUM_FFPROBE, ou defaults.tools.ffmpeg / defaults.tools.ffprobe em rostrum.json.
  • Windows, macOS e Linux.

Licença

MIT