---
name: ler-video-local
description: Lê um arquivo de vídeo do próprio computador (mp4, mov, mkv, webm) transformando-o em quadros JPEG e transcrição da fala com carimbo de tempo, tudo offline. Use quando o pedido mencionar um vídeo, uma gravação de tela, um mp4 no desktop ou nos downloads, ou quando alguém disser "assista esse vídeo", "veja o que eu falei aqui", "transcreve essa gravação". Instala o que faltar (ffmpeg e faster-whisper) sem tocar no sistema.
license: MIT
allowed-tools: Bash, Read, Glob
---

# 🎬 Ler vídeo local

Você não assiste vídeo. Ninguém aqui assiste. A entrada visual é imagem — JPEG, PNG,
GIF, WebP — e um `.mp4` bate na porta, olha pra dentro e vai embora.

Esta skill é a ponte: o vídeo vira uma série de quadros que você lê nativamente, mais um
texto da fala com o horário em cada trecho. Assim "o que ele disse em 04:12" e "o que
estava na tela em 04:12" viram a mesma pergunta, que é o ponto inteiro do exercício.

🔌 Roda tudo na máquina. Nenhum byte sai daqui, ninguém cobra por minuto, e o vídeo da
reunião não vai parar em servidor nenhum.

## 1️⃣ Achar o arquivo e medir

Não pergunte o caminho se der pra descobrir sozinho. Gravação de tela tem hábitos, e o
hábito dela é cair no desktop ou em downloads com a data no nome:

```bash
ls -lat ~/Desktop ~/Downloads 2>/dev/null | grep -iE "\.(mp4|mov|mkv|webm)$" | head
```

⏱️ Meça a duração antes de qualquer outra coisa. Ela manda no resto do plano: passando de
10 minutos, a transcrição vira uma caminhada de vários minutos de CPU e **tem que ir para
segundo plano**. Rodar isso em primeiro plano é como esperar o café olhando pra cafeteira.

## 2️⃣ Instalar o que falta

Duas dependências, as duas por `pip`, nenhuma pedindo senha de administrador:

```bash
python -m pip install --quiet imageio-ffmpeg faster-whisper
```

📦 O `imageio-ffmpeg` traz um ffmpeg estático dentro do próprio pacote — se já houver
ffmpeg no PATH, o script prefere esse e ignora o carona. Na primeira transcrição o modelo
é baixado (~1,5 GB do `large-v3-turbo`) e fica em cache; da segunda vez em diante ele já
está lá, esperando.

Ambiente gerido por `uv`? `uv pip install` faz o mesmo serviço.

## 3️⃣ Quadros primeiro, transcrição ao fundo

Esta ordem não é frescura. Os quadros saem em segundos, a transcrição leva minutos.
Dispare a transcrição em segundo plano e vá lendo os quadros enquanto ela trabalha.

```bash
# ⚡ rápido: devolve os JPEG e o índice arquivo -> instante
python ler_video.py "CAMINHO/DO/VIDEO.mp4" --intervalo 20 --frames-apenas

# 🐌 lento: escreve transcricao.txt linha a linha, dá pra acompanhar com tail
python ler_video.py "CAMINHO/DO/VIDEO.mp4" --transcrever-apenas
```

O segundo comando vai para segundo plano (no Claude Code, `run_in_background`). Enquanto
ele mói o áudio, leia os quadros com a ferramenta de leitura de arquivo — JPEG entra
direto, sem cerimônia.

📐 Intervalo por duração: **20s** para gravação longa (16 minutos dão 50 quadros, que é o
limite razoável antes de o contexto começar a reclamar) e **5s** para vídeo de até 3
minutos.

🧭 Gravação de navegador? Acrescente `--tira-urls`. O script recorta a barra de endereço
de todos os quadros e empilha numa imagem só: uma leitura, e você tem o roteiro inteiro
da navegação. Confira o resultado — se o recorte pegar o lugar errado a tira sai
ilegível, e aí não insista, leia os quadros normalmente.

🗒️ Passe o jargão do projeto em `--vocabulario`. Sigla, nome próprio e termo interno só
saem escritos direito se estiverem nessa lista. Sem ela, o modelo escreve o que acha que
ouviu, com toda a confiança do mundo.

## 4️⃣ Ler os dois juntos, e desconfiar do texto

📝 A transcrição é matéria-prima, não ata de reunião assinada. Numa gravação de 16 minutos
que passou por aqui, 19 das 183 linhas registraram apenas "Beleza." A fala tinha conteúdo.
O modelo é que estava de acordo com tudo.

Antes de executar qualquer coisa que a transcrição mandar:

- 🖼️ Confira cada pedido contra o quadro do mesmo instante. É o quadro que diz qual botão
  estava sob o cursor quando ele falou "tira esse aqui".
- ⚖️ Texto e imagem discordaram? A imagem ganha.
- ❓ Trecho ininteligível e importante? Diga qual minuto e pergunte. Adivinhar pedido de
  interface é como adivinhar senha: tecnicamente possível, socialmente caro.

Ao final, escreva o inventário do que foi pedido com o minuto ao lado de cada item, e
confirme antes de encostar no código.

## 🩹 Ajustes que já custaram tempo

Estão embutidos no script. Você só precisa mexer se trocar de caminho — e cada um deles é
cicatriz de alguém.

- **`condition_on_previous_text=False`.** O padrão da biblioteca é `True`, e com ele o
  modelo se ancora no que já escreveu e entra em loop, repetindo a mesma linha por
  minutos a fio, muito convicto. Custou dez minutos de CPU antes de alguém notar.
- **`large-v3-turbo`, nunca `small`.** O `small` é bem mais rápido e inventa português:
  frases que não existem na fala, com cara de frase correta. É o pior tipo de erro, o que
  não parece erro.
- **`int8` na CPU.** Sem GPU, é o que torna o `large-v3-turbo` viável — cerca de duas
  vezes o tempo real, ou seja, 16 minutos de vídeo em uns 8 minutos de máquina.
- **WAV mono 16 kHz.** É o que o Whisper quer. Entregar outro formato só faz a biblioteca
  reamostrar por dentro, de mau humor.

## 🚧 Quando esta skill é a escolha errada

Ela lê pixel e fala. Só. Se o vídeo for de um defeito em página web, uma ferramenta de
bug report que capture console, requisições de rede e eventos de clique vai entregar o
que nenhum quadro contém: o status da requisição que falhou, o seletor do elemento
clicado, o horário de cada evento. Diga isso a quem pediu, em vez de reconstruir por
adivinhação a partir de uma imagem de alguém clicando com cara de decepção.

✅ Aqui você ganha em outra moeda: sem limite de duração, sem upload, e o áudio em
português continua em português.
