Teknoloji ve Yazılım

Python ile SRT altyazı zamanını kaydırma: metni bozmadan senkron düzeltme

Altyazının tamamı aynı miktarda erken veya geç geliyorsa zaman damgalarını Python ile kaydırın; kaymanın türünü önce doğru teşhis edin.

Python ile SRT altyazı zamanını kaydırma: metni bozmadan senkron düzeltme — Farkı ölç, Zamanı dönüştür, Yeni kopya yaz, Videoda doğrula
Bu rehber için hazırlanan özgün açıklayıcı şema; uygulama ekran görüntüsü değildir.
GÖRSEL ANLATIM

Python ile SRT altyazı zamanını kaydırma — uygulama akışı

1

Farkı ölç

Baş, orta ve sonda aynı kayma olduğunu doğrula.

2

Zamanı dönüştür

SRT zamanlarını milisaniyeye çevir.

3

Yeni kopya yaz

Metne dokunmadan zaman farkını uygula.

4

Videoda doğrula

Üç bölümde sesi ve yazıyı birlikte kontrol et.

Bu şema rehber için hazırlanmış özgün bir iş akışıdır; uygulama ekran görüntüsü değildir.

Kısa özet

Altyazının tamamı aynı miktarda erken veya geç geliyorsa zaman damgalarını Python ile kaydırın; kaymanın türünü önce doğru teşhis edin.

Teknoloji ve Yazılım topluluğuna git

Videonun başına kısa bir logo eklediğinizde daha önce düzgün çalışan altyazı erken görünmeye başlayabilir. Bütün altyazılar aynı miktarda kayıyorsa zaman damgalarını topluca değiştirmek işe yarar. Ancak videonun başında doğru, sonunda yanlış olan altyazı farklı bir problem olabilir. Bu rehber yalnızca sabit zaman farkını düzeltir; konuşmayı tanımaz, cümleleri yeniden yazmaz ve kare hızı kaynaklı giderek artan kaymayı çözmez.

1. Farkı milisaniye olarak ölçün

Videoda anlaşılır bir kelimenin başladığı anı seçin. Örneğin ses 4,5 saniyede başlıyor, altyazı 3 saniyede görünüyorsa altyazıyı 1500 milisaniye geciktirmek gerekir. Başta, ortada ve sonda üç nokta kontrol edin. Fark her noktada yaklaşık aynıysa bu yöntem uygundur. Fark değişiyorsa tek sayı kullanmak bir bölümü düzeltirken diğerini bozabilir. Önce doğru video sürümüyle çalıştığınızdan emin olun.

2. Kaynak dosyayı koruyun

Örnekte girdi.srt okunur, kaydirilmis.srt oluşturulur. Çıktı varsa üzerine yazmak yerine hata verir. Bir sonraki denemede farklı bir çıktı adı seçin. SRT dosyasını düz metin düzenleyicide açın; zaman satırlarının 00:00:01,000 --> 00:00:03,000 biçiminde olduğunu görün. Konuşma metni Türkçe karakter içeriyorsa UTF-8 kullanmak dosyanın farklı uygulamalarda doğru okunmasını kolaylaştırır.

3. Çalışan kaydırma betiği

Kodu srt_kaydir.py olarak kaydedin. Terminalde python srt_kaydir.py girdi.srt kaydirilmis.srt 1500 komutunu çalıştırın. Son sayı pozitifse altyazı gecikir, negatifse daha erken gelir. Bir zamanın sıfırın altına düşmesi durumunda betik durur; ilk satırları sessizce silmez.

python
from pathlib import Path
import re
import sys

if len(sys.argv) != 4:
    raise SystemExit('Kullanım: python srt_kaydir.py girdi.srt cikti.srt milisaniye')
source, target = map(Path, sys.argv[1:3])
offset = int(sys.argv[3])
pattern = re.compile(r'^(\d{2,}:[0-5]\d:[0-5]\d,\d{3})( --> )(\d{2,}:[0-5]\d:[0-5]\d,\d{3})(.*)$', re.M)

def milliseconds(value):
    h, m, tail = value.split(':')
    s, ms = tail.split(',')
    return ((int(h)*60+int(m))*60+int(s))*1000+int(ms)

def timestamp(value):
    if value < 0:
        raise ValueError('Kaydırma, bir zamanı sıfırın altına indiriyor.')
    seconds, ms = divmod(value, 1000)
    minutes, seconds = divmod(seconds, 60)
    hours, minutes = divmod(minutes, 60)
    return f'{hours:02}:{minutes:02}:{seconds:02},{ms:03}'

def shift(match):
    start, end = milliseconds(match[1]), milliseconds(match[3])
    if end <= start:
        raise ValueError('Bitiş zamanı başlangıçtan sonra olmalı.')
    return timestamp(start+offset)+match[2]+timestamp(end+offset)+match[4]

text = source.read_text(encoding='utf-8-sig')
result, count = pattern.subn(shift, text)
if count == 0:
    raise SystemExit('Geçerli SRT zaman satırı bulunamadı.')
with target.open('x', encoding='utf-8', newline='') as file:
    file.write(result)
print(count, 'zaman satırı kaydırıldı:', target)

4. Beklenen sonucu anlayın

Bir satırın başlangıcı 1 saniye, bitişi 3 saniyeyse 1500 milisaniyelik kaydırma sonrası 2,5 ve 4,5 saniye olur. Satırın ekranda kalma süresi değişmez. Düzenli ifade yalnızca zaman satırlarına uygulanır; diyalog içindeki rakamlar değiştirilmez. Bununla birlikte sıra dışı biçimlendirme kullanan dosyalar için bu örnek kapsamlı bir SRT ayrıştırıcısı değildir. Eşleşen satır sayısını beklenen altyazı sayısıyla karşılaştırın.

5. Videoda üç aşamalı doğrulama

Yeni SRT dosyasını video oynatıcısına ekleyin. Önce başta ölçtüğünüz kelimeye bakın, sonra orta bölümdeki belirgin bir cümleyi ve son konuşmayı inceleyin. Sesle birlikte kelimelerin doğru anlarda görünmesi gerekir. Otomatik üretilmiş metinde yazım yanlışları varsa zaman kaydırmak bunları düzeltmez. Kişi adları, olumsuzluk ekleri ve ürün ölçülerini ayrıca kontrol edin.

6. Sık hataları ayırın

UnicodeDecodeError alırsanız dosyanın kodlamasını inceleyip bir kopyasını UTF-8 olarak kaydedin. “Geçerli zaman satırı bulunamadı” mesajı WebVTT dosyasını SRT sanmanızdan veya farklı zaman biçiminden kaynaklanabilir. Sıfır altı zaman hatasında seçtiğiniz farkı yeniden ölçün. Dosyada yalnızca bazı bölümler kayıksa bütün satırları aynı miktarda taşımayın; kurgu değişikliklerine göre bölümlü düzenleme gerekir.

7. Teslim notu bırakın

Kaydırma miktarını ve kullanılan video sürümünü not edin. Eski dosya, yeni dosya ve son video birlikte saklanırsa geri dönüş kolaylaşır. Yayın platformuna yükledikten sonra altyazıyı oradaki oynatıcıda da deneyin. Yerel dosyanın doğru olması, yanlış video sürümüne yüklenmediğini garanti etmez. Son kontrolde konuşma dışı önemli seslerin açıklamalarını da okuyun; altyazı yalnızca sözcükleri değil, sahnenin anlaşılması için gereken bilgiyi taşımalıdır.

İlgili okumalar

Resmî kaynaklar ve devamı

#Python#SRT#altyazı#senkron