Otomatisasi Sinkronisasi Subtitle Film dengan Python & FFmpeg

Pernah enggak sih, lagi asyik-asyiknya mau maraton nonton koleksi film kesayangan di media server lokal, eh pas dinyalain ternyata subtitle-nya desync? Teksnya sudah keluar duluan saat karakter filmnya baru mau membuka mulut, atau malah kebalikannya—suaranya sudah beres, teksnya baru nongol 5 detik kemudian.
Dulu, cara paling klasik (dan menyiksa) buat beresin masalah ini adalah pakai subtitle shifter manual. Kita mesti buka player, hitung jeda waktu pakai stopwatch, nebak-nebak milidetik, lalu geser delay-nya manual. Lebih parah lagi kalau desync-nya tipe progressive (makin lama durasi film, makin jauh gesernya gara-gara beda frame rate antara 23.976 fps dan 25 fps).
Tapi tenang, sebagai tech enthusiast atau admin server yang malas buang-buang waktu untuk hal repetitif, kita punya solusi yang jauh lebih cerdas: menggunakan otomatisasi algoritma sinyal suara!
Di artikel kali ini, saya mau bagikan trik simpel memasang ffsubsync di server Linux agar seluruh koleksi subtitle film kita bisa tersinkronisasi otomatis tanpa perlu dites ulang satu per satu.
Bagaimana Benda Ini Bekerja?
Berbeda dengan aplikasi shifter jadul yang cuma paham perintah "maju 2 detik" atau "mundur 3 detik", tools bernama ffsubsync (Speech-to-Subtitle Synchronization) karya developer bernama Stephen Macke ini bekerja dengan cara yang sangat elegan:
Voice Activity Detection (VAD): Dia tidak peduli bahasa apa yang ada di subtitle. Tools ini memindai audio track pada file video untuk mendeteksi gelombang frekuensi vokal manusia—mencatat kapan ada adegan percakapan dan kapan adegan hening.
Cross-Correlation & FFT: File subtitle .srt milik kita diubah menjadi bentuk sinyal biner. Kemudian, dengan algoritma Fast Fourier Transform, pola sinyal teks tersebut ditempelkan dan dicocokkan secara presisi dengan gelombang suara dari audio film.
Hasilnya? Mau subtitle-nya acak-acakan di awal, tengah, atau beda frame rate, ffsubsync bisa mengoreksi dan menguncinya secara pas hanya dalam hitungan detik!
Cara Install System-Wide di Linux Server
Agar tools ini bisa dipanggil dari direktori mana saja oleh user maupun skrip otomatisasi di server, kita bisa menginstalnya secara system-wide menggunakan pipx.
1. Install Dependencies
Pastikan server Linux/Ubuntu Anda sudah memiliki FFmpeg (untuk ekstrak audio) dan pipx:
sudo apt update
sudo apt install -y ffmpeg python3-pip python3-venv pipx
2. Pasang ffsubsync Secara Global
Gunakan perintah berikut agar virtual environment-nya rapi di folder /opt dan binary-nya bisa diakses umum via /usr/local/bin:
sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx install ffsubsync
Cek apakah instalasi berhasil dengan perintah:
ffsubsync --version
Cara Pakai: Dari Single File Sampai Massal (Batch Process)
Cara menggunakannya sangat simpel. Cukup sebutkan file video dan file subtitle yang geser.
Sinkronisasi Satu File
ffsubsync "Film_A.mkv" -i "Film_A_Unsync.srt" -o "Film_A_Sync.srt"
Jika tidak mau bikin file baru dan ingin langsung menimpa file .srt yang rusak:
ffsubsync "Film_A.mp4" -i "Film_A.srt" --overwrite
Magic Script: Auto-Sync Satu Folder Koleksi Film
Jika Anda memiliki puluhan film di folder media server (seperti Jellyfin atau Plex) yang subtitle-nya berantakan, jangan jalankan satu per satu. Pakai looping bash sederhana ini:
# Masuk ke folder koleksi film Anda
cd /path/to/koleksi/film/
# Eksekusi otomatis untuk semua pasang video & srt yang namanya sama
for video in *.{mkv,mp4,avi}; do
base="${video%.*}"
if [ -f "$base.srt" ]; then
echo "Sedang menyelaraskan subtitle untuk: $video..."
ffsubsync "$video" -i "$base.srt" --overwrite
fi
done
Kesimpulan
Teknologi seperti ffsubsync ini adalah bukti nyata bagaimana otomatisasi dan pemrosesan sinyal digital bisa menyelesaikan masalah kecil yang menjengkelkan dalam kehidupan sehari-hari kita sebagai penikmat media lokal.
Sekrung, koleksi film di server pribadi sudah rapi, subtitle pas di bibir pemeran, dan yang paling penting: tidak perlu lagi buang waktu ngepasin milidetik secara manual!
Selamat mencoba di server masing-masing, ya! 🚀