Communitygithub.com

aion88/derush

Montagem automática de vídeo falado (face cam, vocal, screen rec): corta silêncios, euh/hum/mmh, gaguejos, falsos começos e frases repetidas. Saída = MP4 limpo, exportação pronta para postar e relatório de cortes, em $DERUSH_OUT_ROOT/<IMG>/. FR/EN. Gatilhos: derush, dérushe, coupe les silences, enlève les euh, jump cut, nettoie ma vidéo, monte ma vidéo.

O que é derush?

A skill **aion88/derush** automatiza o processo de 'jump cut' para vídeos e áudios falados, cortando silêncios, preenchimentos (euh, hum, mmh), gaguejos, falsos começos e reformulações. Ela produz um MP4 montado, uma exportação otimizada (1080x1920, 30 fps, -14 LUFS) e um relatório detalhado dos cortes em `cuts.md`. Suporta plataformas como Claude Code, Cursor e Codex via CLI (`derush prep`, `edit`, `render`, `export`). A skill usa transcrição por Qwen3-ASR (ou Whisper como fallback) e alinhamento forçado para timestamps precisos. A etapa 6, manual, usa uma rubrica detalhada (The Retraction-Detection Rubric) para identificar falsos começos, reformulações e instruções de direção. Uma interface web (`derush studio`) permite arrastar e soltar vídeos, editar pelo texto e revisar cortes. A skill mantém um arquivo de logos (`logos.json`) para sobreposição de marcas e suporta exportação para Final Cut Pro XML. A principal diretiva é conservadora: cortes falsos de conteúdo verdadeiro são considerados o pior erro, priorizando sempre a preservação do significado do falante.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aion88/derush/tree/HEAD/skill

Perguntar na sua IA favorita

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

Documentação

O que derush faz?

Montagem «jump cut» automática de uma gravação falada. Faz APENAS o corte e a exportação: sem legendas. Esta skill incorpora a rubrica de retração abaixo; os scripts (fillers, prune, cut) estão no repositório.

Os vídeos ficam em $DERUSH_OUT_ROOT/<STEM>/ (padrão ~/Movies/Derush, veja derush config show).

Um áudio sozinho (m4a, mp3, wav, aiff, caf) passa pela mesma cadeia: a montagem sai em <STEM>.derush.m4a, a exportação em <STEM>.export.m4a (-14 LUFS); fcpxml, logos e visual não existem para ele.

Os três comandos

derush prep "<video>"          # organiza a fonte em $DERUSH_OUT_ROOT/<STEM>/, áudio, silêncios, transcrição (qwen),
                               # alinhamento, euh, lacunas, controle de lacunas. ~1.5x a duração
derush words <STEM>            # transcrição palavra por palavra com limites: a etapa 6 é lida aqui
derush studio                  # TUDO no navegador: arrastar um vídeo bruto, derush, montagem pelo
                               # texto, montagem ajustada proposta, renderização. Fala em uma lacuna = mantida, removível
derush edit <STEM>             # montagem pelo texto: página local, riscar palavras (Supr), corrigir um
                               # euh/silêncio (Enter), Validar → retraction_cuts.json + restore.json
                               # «Propor montagem ajustada»: Claude propõe cortes (repetições,
                               # digressões, retomadas), em laranja, nada é cortado sem seu OK
derush render <STEM>           # fusão + guarda + corte + retranscrição da saída + cuts.md
derush logos <STEM>            # opcional: logos.json → <STEM>.logos.mp4, a exportação o pega se existir
derush fcpxml <STEM>           # <STEM>.fcpxml, também escrito por render: timeline Resolve, clipes sobre a
                               # fonte inteira, uma borda puxada revela o que foi cortado
derush export <STEM>           # <STEM>.reel.mp4: 1080x1920, 30 fps, -14 LUFS, pronto para postar

Logos (derush logos): $DERUSH_OUT_ROOT/<STEM>/logos.json = {"cues":[{"logo":"canva","t":14.27}]}, t lido em derush words (instante FONTE, convertido por keep.json). Arquivos em $DERUSH_OUT_ROOT/_logos/src/<logo>.svg|png (recortados, fundo transparente; sem arquivo, cartão de texto). Cartão branco arredondado 30% de largura, no topo à ESQUERDA por padrão (face cam: o rosto ocupa o terço superior centralizado), 2 s, fade 0,2 s; uma lista dita rapidamente organiza os cartões lado a lado. Controle: extrair uma imagem por cue e OLHAR. IMG_4596 (2026-10-11): Canva ×2, Microsoft 365, Gamma, Higgsfield («Xfield» no transcript: pedir os nomes a ele, whisper não conhece metade).

derush = bin/derush do repositório. Opções de prep: --lang en, --noise -40 (voz fraca), --min 0.3 --pad 0.08 (mais apertado), --min 0.8 --pad 0.2 (mais pausado). Dois vídeos: executar os prep em sequência em segundo plano, ler os words enquanto isso.

O que é cortado, e quem decide

CamadaSinalQuem decide
Silêncioswaveform, silencedetect (não as lacunas whisper, muito grosseiras)script
(pré-requisito) limites reais de palavrasalinhamento forçado CTC no áudio (align_words.py)script
euh / hum / hein escritos por whisper, gaguejos «je je», «et et»timestamps de palavra (detect_fillers.py)script
euh / mmh NÃO escritos (a maioria)lacuna não silenciosa entre 2 palavras (gap_fillers.py)script
falsos começos, frase retomada, «não espera», palavra abandonada, instruções ditas à câmeraleitura do transcriptVOCÊ, etapa 6

Diretriz principal da skill: um corte falso de conteúdo verdadeiro é o pior erro. Na dúvida, mantém-se, e se diz em cuts.md («mantido de propósito»).

Etapa 6, a única manual: os falsos começos

Leia derush words <STEM> (palavra@início-fim, ? = limite interpolado, não alinhado) e escreva $DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json = {"retraction_cuts":[{start,end,cue_text,rationale}]}. Rubrica: «A RUBRICA DE DETECÇÃO DE RETRAÇÃO» mais abaixo neste arquivo, com estes casos de fala espontânea:

  • Falso começo «eu vou... vamos ver»: cortar «eu vou» até o início da retomada.
  • Palavra reformulada «é uma coisa, uma ferramenta que»: cortar a primeira apenas se a segunda a SUBSTITUI (não se especifica).
  • Frase recomeçada do zero, inclusive após um aparte: cortar a primeira tentativa inteira.
  • Instruções de direção ditas à câmera («tiramos isso», «não no meu microfone, não», «mantemos»): são instruções, não conteúdo. Aplicá-las, depois cortá-las. IMG_4566: os últimos 40 segundos eram 3 falsos começos e 2 instruções.
  • Não cortar: repetição de ênfase («sempre, sempre»), lista, «na verdade» que adiciona, pausa expressiva, autocorreção cômica («século XXI e XXII. Não, do XXI»).
  • Limites, lidos em words: start = meio entre o fim da última palavra mantida e o início da primeira palavra abandonada; end = início da primeira palavra mantida − 0,04 s. Para cortar até o fim: end = duração do vídeo.

Para um transcript longo (> 1000 palavras), delegar a leitura a um subagente que retorna o JSON, depois reler seus limites contra words.

Verificar antes de renderizar (re-derivar, não reconhecer)

render faz os controles mecânicos e escreve cuts.md. O que VOCÊ relê:

  • A seção diff de cuts.md (transcript fonte → saída). Cada delete deve ser um corte desejado. Um replace/insert estranho («é é é») é frequentemente um loop do whisper: retranscrever a região sozinha antes de acusar o corte.
  • Uma lacuna marcada FALA NA LACUNA por gap_check (final de prep): ouvir a janela. Se for um falso começo, o corte é bom. Se for conteúdo, remover essa lacuna de _work/gap_cuts.json antes de render.
  • Um euh, um mmh CITADO é conteúdo. «os silêncios, os mmh», «sobretudo nos euh»: a palavra é o objeto da frase, permanece. Após «os», «das», «um», «sobre os» antes de um euh/mmh/hum, ouvir e remover a lacuna que o cobre. Nunca tratar «sobre os» como um falso começo: a frase termina no euh. (2026-10-27, A001_10272011_C008.)
  • Transcrição: Qwen3-ASR por padrão desde 2026-11-04 (transcribe_qwen.py, DERUSH_ASR=whisper para voltar; qwen ausente ou falho → whisper, dito no log). Qwen escreve as gagueiras e falsos começos que whisper funde (C010: «des des trucs», «j'aurais pas mes, j'aurais pas mes, tous mes»), portanto eles aparecem em derush words e em derush edit. Ele não escreve os euh: gap_fillers.py permanece. Mais fraco em nomes próprios («claudito» → «claudio»).
  • Falso começo fundido pelo whisper: whisper pode escrever apenas uma vez uma frase dita duas vezes. IMG_4543: «je t'en mets… je vais mettre» transcrito «je vais mettre». Uma frase que soa estranha numa junção na saída = retranscrever a fonte palavra por palavra nesse ponto.
  • Siglas, nomes de domínio, números: CTC alinha mal letras soletradas. IMG_4549: a lacuna antes de «SI» (SpaceX SI) carregava o «ès». Toda lacuna que toca uma sigla ou um .com: retranscrever a janela, e não cortá-la ao menor sinal de dúvida. Tokens com dígito («5h», «J3») são interpolados, nunca alinhados.
  • Sincronia: cuts.md dá a diferença A/V. Acima de 40 ms, verificar.
  • Preencher a linha Assunto de cuts.md.

A RUBRICA DE DETECÇÃO DE RETRAÇÃO

Você (o agente invocador) lê derush words <STEM> e escreve este JSON em $DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json, o arquivo que derush render lê:

Contrato de saída do detector

{
  "retraction_cuts": [
    {
      "start": 6.4,
      "end": 9.8,
      "cue_text": "Scratch that",
      "rationale": "Reparandum 'runs every time the user opens a file' + cue 'Scratch that'; repair 'it actually runs on session start' is kept."
    }
  ]
}
  • start = onde o pensamento abandonado (reparandum) começa. Julgamento SEMÂNTICO; pode cair no meio de uma frase. Leia o tempo exato dos timestamps de palavras de derush words (veja «Ancoragem de limites» abaixo). Os tempos estão em segundos do vídeo FONTE.
  • end = fim da deixa de retração (interregno). O reparandum + deixa são AMBOS removidos; a reparação que SEGUE é MANTIDA. Na prática, end cai no limite onde a enunciação corrigida começa.
  • Lista vazia {"retraction_cuts": []} quando não há retração genuína. Chamarizes e mudanças de tópico NÃO produzem corte.

O modelo de auto-reparação (Levelt / Clark & Wasow)

[REPARANDUM] [INTERREGNUM/DELIXA] [REPARAÇÃO]
 abandonado         a deixa       substituição
   CORTAR             CORTAR        MANTER

O corte = reparandum + deixa. A reparação é preservada.

Teste positivo (cortar): TODOS devem valer

  1. O falante está invalidando conteúdo anterior (negando, deletando ou julgando errado/incoerente), E
  2. Ele substitui ou abandona: uma versão corrigida segue, ou o pensamento é abandonado, E
  3. Há um reparandum real presente no transcript para remover (uma deixa sem fala precedente para retrair → NENHUM corte; veja caso extremo abaixo).

Testes negativos (NÃO cortar): qualquer um rejeita o candidato

Estes superficialmente se assemelham a deixas mas não são retrações:

  • Mudança de tópico qualificada por tempo: «esqueça o orçamento por um segundo/por agora», «oublie le budget deux secondes». O qualificador «por um segundo/por agora» (frequentemente mais um adiamento posterior como «cobriremos na próxima semana») significa que o conteúdo anterior ainda é VÁLIDO, apenas adiado. NENHUM corte.
  • Escala aditiva: «na verdade é ainda melhor», «não mas espera, é ainda mais poderoso que isso». «na verdade»/«não mas» aqui SOBEM a afirmação anterior; ela ainda se mantém. NENHUM corte.
  • Afirmação: «não mas é exatamente isso», «actually, that's a good point». O «não»/«actually» intensifica concordância, não correção. NENHUM corte.
  • Pausa procedural: «espera, vou te mostrar» / «wait, let me show you». A fala pausa para uma demonstração; nada é retraído. NENHUM corte.
  • Refinamento de nuance/escopo: «é mais sutil que isso», «enfim, é um pouco mais complicado». A afirmação anterior é qualificada/estendida, não descartada. NENHUM corte.
  • Fechamento de tópico: «enfim, é complicado», «de qualquer forma». Fecha uma cadeia sem invalidá-la. NENHUM corte. (bref é ambíguo: apenas um corte quando é seguido por um abandono real como «bref, peu importe les critères».)

Até onde o reparandum começa?

O limite inicial é um julgamento semântico:

  • Pergunte o que o falante está substituindo. O reparandum começa onde a ideia abandonada primeiro divergiu da substituição correta.
  • Marcadores de reinício («je reprends», «let me start over», «não espera eu recomeço») → mais amplo reparandum: de volta ao início do trecho refeito.
  • Pivôs de correção («não na verdade», «actually no», «wait no`) → estreito reparandum: apenas o predicado/cláusula imediatamente anterior.
  • Regra de limite natural de tópico: nunca corte além de um assunto diferente. Uma introdução de tópico compartilhado válida que tanto a versão errada quanto a correta constroem é MANTIDA (por exemplo, uma introdução «para o projeto de instalação de som…» permanece; apenas a afirmação técnica errada após ela é cortada).
  • Teste de CONFIGURAÇÃO vs ELABORAÇÃO (manter a última afirmação ainda verdadeira). Quando uma CONFIGURAÇÃO/introdução PERMANECE verdadeira e apenas uma ELABORAÇÃO, ENUMERAÇÃO, LISTA, ou DETALHE subsequente é abandonado, o reparandum começa na elaboração, não na configuração. A pergunta decisiva é: «o falante está negando ESTA cláusula, ou apenas o que veio depois dela?» Se a cláusula ainda é verdadeira após a reparação, MANTER ela; comece o corte na primeira cláusula que a reparação invalida.
    • «It uses four criteria: A, B, C, D. Anyway, never mind the criteria: what matters is X.» → a configuração «it uses four criteria» ainda é VERDADEIRA (ele usa critérios); apenas a enumeração «A, B, C, D» é abandonada. O corte começa na enumeração, NÃO em «it uses four criteria». Manter a configuração é obrigatório: cortá-la é um falso corte de conteúdo real.
    • Contraste: se o falante nega a própria configuração («it uses four criteria… actually no, it uses none, it's a flat rule»), então a configuraÇÃO É o reparandum e o corte começa ali. Leia o que a reparação substitui.
  • Corte mínimo / conservadorismo: quando em dúvida sobre o quanto atrás, prefira o corte MAIS ESTREITO. Deixar uma cláusula anterior ligeiramente imprecisa é muito melhor do que cortar uma frase correta.
  • Reparanda multissentença: quando o pensamento abandonado abrange várias sentenças ou linhas de derush words, o corte cobre todas elas.
  • Ancoragem de limites: use os timestamps de palavras, nunca aritmética. derush words <STEM> imprime cada palavra como word@início-fim (? após uma palavra = o limite é interpolado, não alinhado ao som; trate-o como menos exato). Apoie-se neles:
    1. start = o meio da lacuna entre o FIM da última palavra que você mantém e o INÍCIO da primeira palavra abandonada.
    2. end = o INÍCIO da primeira palavra que você mantém (a cabeça da reparação) menos 0,04 s. O reparandum e a deixa são cortados, a cabeça da reparação nunca é tocada. Para cortar até o fim do vídeo, end = a duração do vídeo.
    3. Deixa e cabeça da reparação na mesma frase (divididas por «mas», «é», «it's», uma vírgula, um traço): termine o corte na última palavra da deixa, não depois. Use a PRIMEIRA pontuação que segue a deixa, nunca uma vírgula posterior dentro da cláusula de reparação. Quando a deixa carrega uma vírgula final («não espera,», «scratch that,`), as palavras após ela são reparação e são MANTIDAS.
    4. Reparandum na cauda de uma linha e a deixa na cabeça da próxima: termine o corte no fim do reparandum em vez de avançar para também pegar a deixa. Uma breve deixa residual («não espera») é inócua; comer a cabeça da reparação é o pecado cardinal.
    5. Limites interpolados (?): arredonde PARA DENTRO (veja abaixo). S

...

[truncado para tradução]

Habilidades Relacionadas