Skip to content

Latest commit

 

History

History
229 lines (163 loc) · 7.93 KB

File metadata and controls

229 lines (163 loc) · 7.93 KB
name smart-cut
description Content-aware video editor. Transcribes with Groq Whisper, Claude analyzes for fillers/pauses/repetitions, applies precise cuts via ffmpeg preserving audio.
trigger /smart-cut

/smart-cut — Content-Aware Video Editor

Edita vídeo inteligentemente: transcreve com timestamps de palavras, Claude analisa o conteúdo e decide os cortes, ffmpeg aplica preservando áudio.

Quando usar

  • Usuário passa um arquivo de vídeo e pede para editar/cortar
  • /smart-cut <video_path> [idioma]
  • Idioma padrão: pt. Outros: en, es, etc.

Step 0 — Escolha de modo e nível de corte

Antes de qualquer processamento, pergunte ao usuário (mensagem única, concisa):

Modo de edição:
  [1] Automático — Claude decide os cortes e aplica diretamente
  [2] Editável   — você revisa os segmentos antes de cortar

Nível de corte de gaps:
  [N] Normal — corta pausas > 1.0s
  [H] HARD   — corta pausas > 0.5s (ritmo mais acelerado, ainda respeita o contexto)

Ex: "1N", "2H", "1H"...

Aguarde a resposta antes de prosseguir.

Nível HARD (--gap-threshold 0.5): remove pausas mais curtas, gerando um ritmo mais dinâmico e acelerado. O Step 2b de revisão contextual continua obrigatório — nenhum corte pode quebrar o sentido da fala.


Step 1 — Transcrever

python3 "/Users/josephcribeiro/.claude/skills/smart-cut/scripts/transcribe.py" "<video_path>" [idioma]

O script:

  • Extrai áudio mono 16kHz via ffmpeg
  • Chama Groq Whisper whisper-large-v3 com word-level timestamps
  • Salva JSON em <video>.transcript.json
  • Imprime no stdout: texto completo + lista de palavras com timestamps + gaps > 0.5s

Requer GROQ_API_KEY em ~/.config/watch/.env ou no ambiente.


Step 2 — Auto-segmentar (script)

Parâmetros por nível:

Nível --gap-threshold --merge-threshold --tail-pad --head-pad
Normal 1.0 0.5 0.35 0.1
HARD 0.5 0.3 0.35 0.1
# Normal
python3 "/Users/josephcribeiro/.claude/skills/smart-cut/scripts/auto_segment.py" \
    "<video>.transcript.json" \
    --lang pt \
    --gap-threshold 1.0 \
    --merge-threshold 0.5 \
    --tail-pad 0.35 \
    --head-pad 0.1

# HARD
python3 "/Users/josephcribeiro/.claude/skills/smart-cut/scripts/auto_segment.py" \
    "<video>.transcript.json" \
    --lang pt \
    --gap-threshold 0.5 \
    --merge-threshold 0.3 \
    --tail-pad 0.35 \
    --head-pad 0.1

O script salva <video>.segments.json e imprime estatísticas.


Step 2b — Revisão contextual (Claude)

Esta etapa é obrigatória em ambos os modos — o script corta por silêncio, você corta por significado.

O princípio central: o vídeo editado deve ter sentido. Cada corte deve respeitar o fluxo de fala.

Verifique cada um dos seguintes problemas:

1. Frases incompletas nas bordas dos segmentos

  • Leia as primeiras e últimas palavras de cada segmento no transcript
  • Se um segmento começa no meio de uma frase (ex: começa com "então" sem contexto anterior), mescle com o segmento anterior ajustando o start
  • Se um segmento termina antes do fim da ideia (ex: corta antes do substantivo final de uma oração), estenda o end para incluir a palavra seguinte
  • Regra: nunca deixe uma palavra semanticamente dependente isolada no início ou fim de um segmento

2. Repetições e erros de fala

  • Sempre mantenha a ÚLTIMA ocorrência completa — a primeira é o erro/tentativa
  • Padrões a detectar:
    • Falante diz frase incompleta, pausa, repete do zero: remova a primeira
    • Falante usa palavra errada e para (ex: "resolvi então testar," [pausa longa] → continua com "criar..."): o "testar" é erro — corte o segmento logo antes da palavra errada, emende no próximo
    • Segmento termina abruptamente sem completar ideia, seguido de segmento que retoma a mesma frase: mescle a partir do ponto em que a frase fica correta
  • Como cortar palavra errada mid-segmento: ajuste o end do segmento para ~0.15s após a última palavra CORRETA (antes da palavra errada)

3. Pausas com movimento físico

  • Falante vira o rosto, se movimenta, olha para o lado — pausa visual sem gap de áudio
  • Se dois segmentos têm um gap de 0.5s–1.5s entre si e a fala continua a mesma ideia, considere mesclar
  • O script não detecta isso — você precisa inferir pelo contexto das palavras ao redor do gap

4. Pausas curtas estranhas (gaps 0.5s–1.0s)

  • O transcript reporta gaps > 0.5s — revise os marcados como ⚡ MÉDIO
  • Se o gap cai no meio de uma frase (ex: entre sujeito e verbo), mescle os segmentos adjacentes
  • Se o gap é entre ideias completas, pode ser mantido

5. Digressões e introduções desnecessárias

  • Blocos inteiros que não agregam (ex: "antes de começar...", "deixa eu ver aqui...")
  • Remova o segmento inteiro do JSON

Como editar o segments.json:

  • Para mesclar dois segmentos: substitua [A_start, A_end], [B_start, B_end] por [A_start, B_end]
  • Para remover: delete a entrada do array
  • Para ajustar borda: altere o start ou end do segmento

Fluxo: Modo Automático

Após Step 2b, aplique as correções diretamente no segments.json e prossiga para o Step 3.

Informe ao usuário:

  • Quantos segmentos serão mantidos
  • Duração estimada do resultado
  • O que foi ajustado além do automático (especifique cada tipo de problema encontrado)

Fluxo: Modo Editável

Após Step 2b (aplicar correções de contexto no segments.json), exiba a lista de segmentos ao usuário:

Formato de exibição

=== SEGMENTOS — marque com X o que quer REMOVER. O resto fica. ===

[01] 0:00 → 0:03  "Oi pessoal, hoje vou mostrar uma coisa..."
[02] 0:08 → 0:10  "que eu achei incrível"
[03] 0:11 → 0:20  "essa ferramenta analisa o vídeo e faz os cortes automaticamente"
...

(gaps, pausas e trechos prolixos já foram removidos automaticamente)
Total: Xs de Xs originais (~X% cortado)

Regras:

  • Exiba os timestamps no formato M:SS → M:SS
  • Mostre as primeiras palavras reais do segmento (lidas do transcript) — não invente
  • Segmentos já removidos no Step 2b não aparecem na lista
  • Aguarde o usuário responder com quais números quer remover (ex: "2, 5, 7" ou "nenhum")

Após confirmação do usuário

  1. Remova os segmentos marcados do segments.json
  2. Exiba o texto corrido de como ficará o vídeo:
=== PRÉVIA DO TEXTO FINAL ===

"Oi pessoal, hoje vou mostrar uma coisa que eu achei incrível.
Essa ferramenta analisa o vídeo e faz os cortes automaticamente..."

Duração estimada: Xs
Confirma? (s/n)
  1. Aguarde confirmação antes de rodar o Step 3.

Step 3 — Aplicar cortes

python3 "/Users/josephcribeiro/.claude/skills/smart-cut/scripts/cut.py" \
    "<video_path>" \
    "<video>.segments.json" \
    "<video_sem_ext>_edited.mp4"

O script:

  • Extrai cada segmento com ffmpeg -ss -t (encode individual com libx264 + aac)
  • Concatena com ffmpeg concat demuxer preservando áudio
  • Output: MP4 com vídeo H.264 + áudio AAC 192kbps

Step 4 — Confirmar

Informe ao usuário:

  • Caminho do arquivo editado
  • Duração original vs. duração final
  • Tempo economizado

Exemplo de output do auto_segment

[auto_segment] Segmentos salvos: video.segments.json
[auto_segment] Duração original:  312.4s
[auto_segment] Duração mantida:   201.3s (64.4%)
[auto_segment] Cortado:           111.1s (35.6%)
[auto_segment] Blocos mantidos:   47

Notas importantes

  • Sempre preserve o áudio — nunca use VideoWriter ou processamento frame-a-frame sem remuxar
  • Se a transcrição falhar por falta de API key, informe o usuário e peça para configurar em ~/.config/watch/.env
  • Para vídeos em inglês, passe en como segundo argumento para melhor precisão
  • O arquivo de saída será sempre MP4 H.264, compatível com a maioria das plataformas