Dublör
YouTube videolarını mevcut altyazıdan, altyazı yoksa yerel konuşma tanımadan işleyen; çevrilmiş ses parçalarını SRT zamanlarına göre videoyla eşleyen yayınlanmamış hibrit dublaj prototipi.
Neden yaptım?
Problem
Video çevirisinde yalnızca doğru metni üretmek yetmiyor. Her videoda altyazı bulunmuyor; çeviri ve ses üretimi de kaynak konuşmadan farklı sürelerde tamamlanıyor. Bu nedenle hem altyazısız içerik için bir geri dönüş yoluna hem de üretilen sesi görüntüyle aynı zaman çizgisinde tutacak bir yapıya ihtiyaç vardı.
Yaklaşım
İki yollu bir akış kurduk. Mevcut altyazı bulunduğunda ytdl-core üzerinden erişilen YouTube kaynak bilgisiyle altyazı izini alıyor, SRT parçalarının metnini DeepL API ile çeviriyor ve gTTS ile seslendiriyorduk. Altyazı bulunmadığında videonun sesini FFmpeg ile uygun parçalara hazırlıyor, whisper.cpp ile yerelde metne çevirip zaman damgalı SRT üretiyor; ardından aynı çeviri ve seslendirme hattına bağlıyorduk. Üretilen ses parçalarını SRT başlangıç zamanlarına göre sıraya koyarak işlem süresinden doğan gecikmeyi tahminle değil, kaynak zaman çizelgesini koruyarak yönetiyorduk.
Parçalar değil,
veri akışı.
Her katman tek bir sorumluluğu taşıyor; ürün davranışı sınırların arasında kaybolmuyor.
Zor kısımlar.
Altyazı varsa aynı işi tekrar etmemek
Mevcut altyazıyı hızlı yol olarak kullanıp konuşma tanıma maliyetini atladık. Yalnızca altyazı bulunmayan videolarda FFmpeg ile hazırlanan sesi whisper.cpp üzerinden geçirerek zaman damgalı SRT ürettik.
Metin zamanı ile yeni sesin süresi aynı değil
Çevrilmiş bir cümlenin seslendirme süresi kaynak konuşmayla birebir örtüşmüyor. SRT cue'larını zamanlama sözleşmesi olarak koruyup sesleri parça parça ürettik; FFmpeg ile oynatılabilir biçime getirdiğimiz parçaları başlangıç zamanlarına göre yerleştirerek kaymayı ve üst üste binmeyi kontrol ettik.
Yerel işlem ile dış servisleri birleştirmek
Konuşma tanımayı whisper.cpp ile yerelde tutarken çeviri ve ses üretimini DeepL API ile gTTS üzerinden yürüttük. Her adımı bağımsız ele almak, bir servis yavaşladığında veya altyazı bulunmadığında bütün akışı değiştirmeden alternatif yola geçebilmemizi sağladı.
Doğru iş için
doğru araç.
YouTube kaynak bilgisini ve uygun medya akışını Node.js hattına almak; altyazı bulunduğunda konuşma tanıma adımını atlayacak hızlı yolu başlatmak için.
Altyazısız videolarda konuşmayı yerelde çözüp sonraki adımların da kullanabileceği zaman damgalı SRT çıktısı üretmek için.
SRT cue metinlerini başlangıç ve bitiş zamanlarını uygulama tarafında koruyarak hedef dile çevirmek için.
Çevrilmiş her metin parçasını ayrı bir ses çıktısına dönüştürüp zaman çizelgesinde bağımsız yönetebilmek için.
Kaynak sesi whisper.cpp için hazırlamak, üretilen ses dosyalarını ortak biçime getirmek ve oynatılacak parçaları düzenlemek için.
İşlem gecikmesini gizlemek yerine her dublaj parçasını kaynak konuşmanın başladığı ana bağlayan ortak zamanlama sözleşmesi olarak.
Öğrendiklerim.
Hibrit yaklaşım yalnızca yerel ve bulut araçlarını birleştirmek değil, kaynağın sunduğu veriye göre en ucuz işlem yolunu seçmektir.
SRT zamanlarını çeviri boyunca korumak, dublajı sonradan tahminle hizalamaktan daha güvenilir bir temel sağlar.
Toplam gecikme; medya hazırlığı, gerektiğinde konuşma tanıma, çeviri, ses üretimi ve oynatma hazırlığının birlikte ele alınmasını gerektirir.