Nonton video beneran
Model tidak bisa memutar video. Yang bisa dilakukan: mengunduh berkasnya, mendengar audionya, dan melihat gambarnya. Skill ini adalah cara melakukan ketiganya sampai laporannya layak disebut "sudah nonton".
Aturan yang tidak boleh dilanggar
Jangan pernah bilang "sudah nonton" kalau yang dibaca cuma judul, caption, atau metadata. Judul TikTok sering cuma satu kalimat clickbait. Melaporkan isi video berdasar judul saja adalah mengarang. Kalau pipeline gagal di tengah, katakan sejauh mana berhasilnya: "audionya sudah aku dengar, tapi teks di layar belum sempat aku lihat."
Selalu ambil frame, bukan cuma audio.
Video teknis hampir selalu menaruh informasi paling penting di layar, bukan di suara: potongan kode, nama file, angka, screenshot chat. Video yang audionya terdengar seperti "ada file namanya itu" baru masuk akal setelah framenya dilihat dan ternyata di sana tertulis lib/constants/Math_Symbol.js. Transkrip tanpa frame akan melewatkan justru bagian yang dicari user.
Kerjakan yang lama di background. Unduh model Whisper pertama kali bisa 400 MB lebih dan memakan beberapa menit. Jalankan sebagai background task, jangan biarkan satu perintah foreground kena timeout lalu dikira gagal.
Langkah 0. Cek perkakas sekali di awal
for c in yt-dlp ffmpeg whisper; do printf "%s: " "$c"; command -v "$c" || echo TIDAK-ADA; done
python -c "import curl_cffi" 2>/dev/null && echo "curl_cffi: ada" || echo "curl_cffi: TIDAK-ADA"
Yang wajib: yt-dlp dan ffmpeg. Yang sangat dianjurkan: curl_cffi (lihat jebakan TikTok di bawah) dan salah satu dari faster-whisper atau openai-whisper.
Kalau ada yang kurang:
pip install -U yt-dlp curl_cffi faster-whisper
ffmpeg dipasang lewat package manager sistem (winget install Gyan.FFmpeg, brew install ffmpeg, apt install ffmpeg).
Jangan mengarang alasan "aku tidak bisa mengakses video". Cek dulu. Mesin ini kemungkinan besar sudah punya perkakasnya.
Langkah 1. YouTube? Coba caption dulu
Caption resmi jauh lebih cepat dan lebih akurat daripada Whisper, dan tidak perlu mengunduh video sama sekali.
yt-dlp --skip-download --write-auto-subs --write-subs --sub-langs "id,en" \
--sub-format json3/vtt --convert-subs srt -o "cap" "URL"
Kalau dapat berkas .srt, itu sudah transkrip. Lanjut ke Langkah 4 untuk framenya.
Kalau kosong (TikTok, Instagram, dan Reels praktis tidak pernah punya), lanjut Langkah 2.
Catatan: YouTube kadang membalas dengan "confirm you're not a bot". Itu bukan alasan untuk berhenti. Lewati caption, turun ke Whisper lokal.
Langkah 2. Unduh videonya
cd "$SCRATCH"
yt-dlp -f "download/b[vcodec^=avc]/b[acodec!=none]/b" --merge-output-format mp4 \
--write-info-json --no-playlist -o "vid.%(ext)s" "URL"
Pemilihan format itu bukan gaya-gayaan. Urutannya berarti: format khusus yang disediakan situs, lalu H.264 (paling aman untuk ffmpeg dan untuk dilihat), lalu apa pun yang punya audio, baru terakhir apa saja.
Ambil metadatanya sekalian, berguna untuk laporan:
python -c "
import json; d=json.load(open('vid.info.json',encoding='utf-8'))
for k in ('title','description','duration','uploader','upload_date','view_count','like_count'):
print(k,'=',repr(d.get(k))[:400])
"
Kalau yang diberikan user adalah berkas lokal, lewati langkah ini.
Langkah 3. Audio dan transkrip
ffmpeg -y -loglevel error -i vid.mp4 -vn -ac 1 -ar 16000 vid.wav
16 kHz mono adalah yang diminta Whisper. Mengirim audio stereo 48 kHz cuma memperlambat tanpa menambah akurasi.
Lalu, jalankan di background:
whisper vid.wav --model small --language Indonesian \
--output_format txt --output_dir . --fp16 False
Pilihan model: small adalah titik seimbang untuk bahasa Indonesia. base sering salah dengar istilah teknis. medium lebih akurat tapi jauh lebih lambat di CPU. Kalau tersedia faster-whisper, pakai itu: hasilnya sama, waktunya sepertiga.
Sebutkan bahasanya secara eksplisit kalau sudah tahu. Autodetect pada video campur Indonesia dan Inggris kadang memilih Inggris lalu mentranskripsi seluruhnya jadi kata Inggris yang bunyinya mirip.
Unduhan model pertama kali tersimpan di ~/.cache/whisper. Kalau ingin tahu progresnya sambil menunggu, lihat ukuran berkas .pt di sana.
Langkah 4. Lihat layarnya
Ini langkah yang paling sering dilewatkan dan paling sering menentukan.
mkdir -p frames
ffmpeg -y -loglevel error -i vid.mp4 -vf "fps=1/10,scale=720:-1" frames/f%02d.jpg
Satu frame tiap 10 detik cukup untuk video 2 sampai 3 menit. Untuk video padat teks, rapatkan ke fps=1/5. Untuk video panjang, pakai deteksi perubahan adegan supaya tidak membanjiri context:
ffmpeg -y -loglevel error -i vid.mp4 \
-vf "select='gt(scene,0.35)',scale=720:-1" -vsync vfr frames/scene%02d.jpg
Lalu baca frame-framenya sebagai gambar, jangan cuma daftar nama berkasnya. Mulai dari yang kemungkinan berisi layar penuh, bukan wajah. Kalau transkrip menyebut sesuatu yang menggantung ("file yang namanya itu", "angkanya segini"), cari frame di detik itu: ffmpeg -ss 78 -i vid.mp4 -frames:v 1 frames/t78.jpg.
Prioritaskan frame yang menampilkan editor kode, terminal, dashboard, atau tangkapan layar percakapan. Wajah orang bicara tidak menambah informasi apa pun di atas transkrip.
Langkah 5. Laporkan
Susun laporan dari transkrip dan frame yang digabung, bukan salah satunya saja. Sebutkan hal yang cuma terlihat di layar sebagai terlihat di layar, misalnya "di frame detik 110 kelihatan kodenya menulis persistence ke .vscode/tasks.json".
Sebutkan durasi dan siapa yang bicara supaya user tahu ini video yang benar. Jangan tempelkan transkrip mentah kecuali diminta. Transkrip Whisper penuh salah dengar, dan menyalinnya bulat-bulat memindahkan kesalahan itu ke laporan.
Kalau ada klaim teknis di video yang menurutmu keliru, katakan. User menonton video itu untuk tahu faktanya, bukan untuk tahu isi videonya.
Bersih-bersih
Video, wav, dan frame bisa ratusan megabita. Simpan semua di direktori scratchpad, bukan di folder kerja user. Hapus setelah selesai kecuali user minta berkasnya.
Jebakan yang sudah terbukti
TikTok: "Unable to extract universal data for rehydration"
yt-dlp butuh impersonation TLS untuk melewati JS challenge TikTok. Peringatannya muncul lebih dulu dan mudah terlewat: "attempting impersonation, but no impersonate target is available". Perbaikannya satu baris, pip install curl_cffi, lalu ulangi perintah yang sama persis. Jangan buang waktu mencari extractor alternatif atau situs downloader pihak ketiga.
TikTok: video jadi tapi tidak bisa dibaca ffmpeg
Sebagian format TikTok adalah H.265 (bytevc1) yang dilabeli muxed padahal terpisah. Rantai format di Langkah 2 sudah menghindarinya dengan mendahulukan vcodec^=avc.
YouTube: hanya dapat 360p, atau "Requested format is not available"
Biasanya karena override client [android,web] atau cookie basi. Kosongkan extractor_args dan coba tanpa cookie dulu. Sejak akhir 2025 YouTube juga butuh runtime JavaScript (deno, node, atau quickjs) untuk memecahkan signature challenge. Tanpa itu yt-dlp tidak gagal, cuma diam-diam menurunkan kualitas.
HTTP 429 Too Many Requests
Turunkan agresivitas: --sleep-requests 1 --min-sleep-interval 2 --max-sleep-interval 5 --retries 10.
Video butuh login
--cookies-from-browser chrome. Peringatan: browser yang sedang terbuka mengunci basis data cookie-nya, jadi Chrome harus ditutup atau pakai --cookies berkas.txt. Jangan pernah minta user menempelkan password ke chat.
Whisper crash tanpa pesan di CPU tertentu
ctranslate2 memilih jalur instruksi CPU otomatis (AVX512, AVX2, dan seterusnya) dan sebagian CPU jatuh karenanya. Ulangi dengan CT2_FORCE_CPU_ISA=GENERIC dan satu thread. Lebih lambat, tapi jadi.
Transkrip mengulang kalimat yang sama berkali-kali
Halusinasi Whisper pada bagian senyap. Nyalakan VAD (vad_filter=True di faster-whisper) atau --condition_on_previous_text False di openai-whisper.
Video tanpa suara sama sekali Slideshow TikTok dan sebagian Reels tidak punya track audio. Whisper akan mengembalikan kosong dan itu bukan galat. Langsung ke Langkah 4, seluruh isinya memang ada di gambar.
Video sangat panjang
Di atas 20 menit, jangan transkrip semuanya kalau user cuma butuh satu bagian. Ambil caption kalau ada, atau potong dulu: ffmpeg -ss 300 -t 180 -i vid.mp4 ....
Berkas lokal
Semua langkah dari 3 ke bawah berlaku sama untuk berkas video yang sudah ada di disk. Lewati saja Langkah 1 dan 2.