Sin timestamps por palabra no hay forma de cortar en el borde exacto de una frase: cortás en el silencio equivocado y el clip arranca a mitad de palabra.
Opción A — Faster-Whisper local (recomendada: sin costo, control total):
python3.11 -m venv ~/.venvs/clip && source ~/.venvs/clip/bin/activate
pip install faster-whisper
cat > transcribe.py <<'PY'
import json, sys
from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cpu", compute_type="int8")
segments, info = model.transcribe(sys.argv[1], word_timestamps=True, vad_filter=True)
words = []
for s in segments:
for w in (s.words or []):
words.append({"w": w.word, "start": round(w.start, 3), "end": round(w.end, 3)})
out = sys.argv[1].rsplit("/", 1)[-1].rsplit(".", 1)[0]
json.dump({"language": info.language, "words": words},
open(f"transcripts/{out}.json", "w"), ensure_ascii=False)
print(f"{out}: {len(words)} palabras")
PY
python3 transcribe.py "library/mi-video-largo.mp4"
Opción B — OpenAI Whisper API (más rápido, cuesta ~US$0,006 por minuto, límite 25 MB por archivo → trocear):
ffmpeg -i "library/mi-video-largo.mp4" -ac 1 -ar 16000 -f segment \
-segment_time 600 -c:a libmp3lame -b:a 32k /tmp/chunk_%03d.mp3
for f in /tmp/chunk_*.mp3; do
curl -s https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F file=@"$f" -F model=whisper-1 \
-F response_format=verbose_json -F "timestamp_granularities[]=word" \
>> transcripts/chunks.jsonl
done
Opción C — Subtítulos existentes (gratis, sin timestamps por palabra): yt-transcript.sh del stack sirve para videos que ya tienen subtítulos en YouTube. Suficiente para un MVP, insuficiente para cortes quirúrgicos.