| 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 |
Edita vídeo inteligentemente: transcreve com timestamps de palavras, Claude analisa o conteúdo e decide os cortes, ffmpeg aplica preservando áudio.
- 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.
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.
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-v3com 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.
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.1O script salva <video>.segments.json e imprime estatísticas.
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:
- 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
endpara incluir a palavra seguinte - Regra: nunca deixe uma palavra semanticamente dependente isolada no início ou fim de um segmento
- 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
enddo segmento para ~0.15s após a última palavra CORRETA (antes da palavra errada)
- 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
- 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
- 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
startouenddo segmento
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)
Após Step 2b (aplicar correções de contexto no segments.json), exiba a lista de segmentos ao usuário:
=== 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")
- Remova os segmentos marcados do
segments.json - 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)
- Aguarde confirmação antes de rodar o Step 3.
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 demuxerpreservando áudio - Output: MP4 com vídeo H.264 + áudio AAC 192kbps
Informe ao usuário:
- Caminho do arquivo editado
- Duração original vs. duração final
- Tempo economizado
[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
- 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
encomo segundo argumento para melhor precisão - O arquivo de saída será sempre MP4 H.264, compatível com a maioria das plataformas