Edição Automática Completa de Vídeos de Aula (sem rota Jianying)
Problema que resolve
Após o usuário gravar um vídeo tutorial, a skill automatiza toda a cadeia: "transcrição → correção → remoção de pausas → exclusão de gaguejos/repetições → correção de erros de fala → geração do vídeo final".
O fluxo inteiro não requer abrir o Jianying; o produto final é um vídeo pronto para publicação (com legendas hardcoded + barras de correção amarelas no topo).
Qualquer parâmetro (tamanho da fonte, trechos a cortar, texto) pode ser alterado editando o cut_plan.json e executando novamente o script — iteração de 1 minuto.
Limite com a skill jianying-subtitle-fixer: aquela modifica rascunhos do Jianying (o usuário exporta manualmente); essa gera o vídeo final diretamente com ffmpeg. Se o usuário não mencionar Jianying, use essa.
Dependências do ambiente (já instalado)
- Python:
C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe(faster-whisper 1.2.1 + torch instalados; cache do modelo em ~/.cache/huggingface, com small) - ffmpeg:
D:\Software\ffmpeg\bin\ffmpeg.exe(detectado automaticamente pelo script)
Fluxo de trabalho padrão (o AI deve seguir)
Step 0 ffprobe para obter duração/resolução do vídeo (usado para ajuste automático do tamanho da fonte)
Step 1 Transcrição: transcribe.py → raw.json (timestamps por frase + palavra)
Step 2 Análise de IA (o core da skill, veja abaixo) → escreve cut_plan.json
Step 3 Itens de corte: AskUserQuestion para o usuário aprovar (pergunte tudo de uma vez, sem enrolação)
Step 4 Renderização: render.py --plan cut_plan.json → vídeo final
Step 5 Verificação de qualidade: extrair quadros nos momentos das barras de correção (ler visualmente: texto completo, sem estourar largura)
Step 6 Entrega: relatar o que foi cortado, o que foi corrigido e o caminho do arquivo
Step 1 Comando de transcrição
& "C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe" "<skill>/scripts/transcribe.py" --video "<caminho do vídeo>" --outdir "<diretório de trabalho>" --prompt "Tutorial técnico em chinês sobre XXX, YYY etc."
--prompt use o tema do vídeo + termos frequentes (do glossário em ~/.claude/skills/jianying-subtitle-fixer/config/terms.json),
melhora significativamente a precisão para nomes próprios. Diretório de trabalho sugerido: D:\Sistema de produção de conteúdo\Edição\workspace\<data-job>\.
Step 2 Análise de IA (etapa insubstituível, metodologia em references/cut-heuristics.md)
Após ler o raw.json por completo, produzir quatro itens:
- Correção de legendas fixed: corrigir erros de homófonos e termos mal interpretados. Manter o texto falado original, apenas corrigir erros (não reescrever — legendas devem casar com o áudio, reescrita causa dessincronia). Ver referências para padrões de erro do whisper.
- Cortes de conteúdo content_cuts: trechos inteiros a deletar (timestamp + motivo), tipos e critérios nas referências. Repetições no nível da palavra (dentro da frase "publiquei… publiquei") usar timestamps de palavras para localização precisa.
- deleted_ids: IDs das legendas cobertas pelos content_cuts (essas legendas não entram no vídeo).
- Barras de correção corrections: trechos com erro factual, barra amarela no topo. Escrever em cut_plan.json.
Step 3 Aprovação do usuário (princípios)
- Cortes óbvios (gaguejos, recomeços, meias frases descartadas): incluir diretamente no plano, apenas informar ao relatar
- Trechos com erro factual: perguntar ao usuário "Deletar / Manter + barra de correção", para conteúdo opinativo preferir manter + correção
- Texto das barras de correção, conclusão da verificação factual (se precisar checar online, use WebSearch primeiro) — tudo para o usuário revisar
- Use AskUserQuestion para perguntar todos os itens de uma vez
Step 4 Comando de renderização
& "C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe" "<skill>/scripts/render.py" --plan "<diretório de trabalho>/cut_plan.json"
Formato do cut_plan.json (comentários no cabeçalho do render.py têm explicação completa):
{
"video": "C:/video_original.mp4",
"out": "C:/video_final.mp4",
"raw": "raw.json",
"content_cuts": [[213.45, 230.98, "explicação gira experimental"]],
"deleted_ids": [48, 49, 50],
"fixed": {"1": "texto corrigido"},
"corrections": [[12.95, 20.14, "Correção: O nome correto é XX"]],
"silence": {"min_dur": 1.0, "keep": 0.25},
"style": {"sub_size": 64, "cor_size": 48}
}
Todos os timestamps usam a linha do tempo do vídeo original (o script mapeia automaticamente para a nova linha do tempo). silence/style são opcionais. O estilo padrão das legendas é para telas de celular com fonte grande (base 2560 de largura, 64/48, escala proporcional conforme resolução). Se o usuário disser "fonte pequena", ajuste os valores em style e execute novamente.
Step 5 Verificação de qualidade (extrair quadros)
Ler o tempo real das barras de correção do final.ass (linhas Cor), extrair quadros na nova linha do tempo:
& "D:\Software\ffmpeg\bin\ffmpeg.exe" -y -i "<vídeo final>" -vf "select='eq(n\,<número do quadro>)',scale=1100:-1" -vsync vfr "<diretório qc>/qc_%d.jpg"
Número do quadro = segundos × 20fps. Ler cada quadro + inspeção visual: texto completo, não estoura largura, não conflita com legendas inferiores.
Arquivo de armadilhas (lições aprendidas, não pise)
- aselect silencioso falha: em alguns streams AAC, aselect não corta nenhum quadro e não reporta erro → corte de áudio
deve usar
asplit+atrim+concat(já embutido no render.py, não volte para aselect) - concat não pode ser usado após select em stream único como concatenador (erro de incompatibilidade de pads); select+setpts já produz saída contínua
- Verificação do vídeo final deve usar ffprobe separadamente para streams de vídeo e áudio: a duração format pode ser inflada pelo stream mais longo, escondendo o fato de que "não cortou nada" (já aconteceu: render "bem-sucedida" mas áudio inteiro preservado)
- Caminho do filtro subtitles: use caminho relativo se o .ass estiver no mesmo diretório de execução, para evitar problemas de escape com caminhos em chinês
- Corte de silêncio deve ter zona de proteção de palavra (já embutida no render.py como strip_guard): timestamps de palavras do whisper podem diferir do silencedetect; palavras suaves (como termos em inglês no início da frase) podem cair dentro do "silêncio", e cortar por silêncio puro cortaria metade da palavra
- O script de transcrição faz fallback de codificação GBK no stderr do ffmpeg (problema comum de encoding no Windows, ignore os avisos dessa thread)
Custo de iteração
Alterar tamanho da fonte / texto da correção / adicionar ou remover cortes → editar os campos correspondentes no cut_plan.json e executar novamente render.py, 1-2 minutos cada vez. O vídeo final é sobrescrito, o original nunca é modificado.