Convertir y Editar Subtítulos SRT, VTT y ASS con Python
Los subtítulos existen en múltiples formatos: SRT (el más común), WebVTT (para web), ASS/SSA (con estilos), y LRC (para letras de canciones). Python permite convertirlos, editarlos y sincronizarlos.
Instalación
pip install srt webvtt-py pysrt
Leer y Parsear Archivos SRT
import srt
from datetime import timedelta
def leer_srt(ruta_srt):
with open(ruta_srt, encoding='utf-8') as f:
subtitulos = list(srt.parse(f.read()))
for sub in subtitulos[:5]:
inicio = str(sub.start).split('.')[0]
fin = str(sub.end).split('.')[0]
print(f"[{sub.index}] {inicio} --> {fin}")
print(f" {sub.content}\n")
return subtitulos
subs = leer_srt("pelicula.srt")
print(f"Total subtítulos: {len(subs)}")
Convertir SRT a WebVTT
import srt
def srt_a_vtt(entrada_srt, salida_vtt):
with open(entrada_srt, encoding='utf-8') as f:
subtitulos = list(srt.parse(f.read()))
lineas = ["WEBVTT", ""]
for sub in subtitulos:
def fmt(td):
total = int(td.total_seconds())
h, resto = divmod(total, 3600)
m, s = divmod(resto, 60)
ms = td.microseconds // 1000
return f"{h:02}:{m:02}:{s:02}.{ms:03}"
lineas.append(str(sub.index))
lineas.append(f"{fmt(sub.start)} --> {fmt(sub.end)}")
lineas.append(sub.content)
lineas.append("")
with open(salida_vtt, 'w', encoding='utf-8') as f:
f.write('\n'.join(lineas))
print(f"VTT creado: {salida_vtt} ({len(subtitulos)} entradas)")
srt_a_vtt("pelicula.srt", "pelicula.vtt")
Convertir WebVTT a SRT
import webvtt
import srt
from datetime import timedelta
def vtt_a_srt(entrada_vtt, salida_srt):
subtitulos = []
for i, caption in enumerate(webvtt.read(entrada_vtt), 1):
def parse_time(s):
partes = s.replace(',','.').split(':')
h, m = int(partes[0]), int(partes[1])
seg_ms = partes[2].split('.')
segs = int(seg_ms[0])
ms = int(seg_ms[1]) if len(seg_ms) > 1 else 0
return timedelta(hours=h, minutes=m, seconds=segs, milliseconds=ms)
subtitulos.append(srt.Subtitle(
index=i,
start=parse_time(caption.start),
end=parse_time(caption.end),
content=caption.text
))
with open(salida_srt, 'w', encoding='utf-8') as f:
f.write(srt.compose(subtitulos))
print(f"SRT creado: {salida_srt} ({len(subtitulos)} entradas)")
vtt_a_srt("video.vtt", "video.srt")
Sincronizar Subtítulos (Ajustar Tiempo)
import srt
from datetime import timedelta
def sincronizar_srt(entrada, salida, desfase_segundos):
with open(entrada, encoding='utf-8') as f:
subs = list(srt.parse(f.read()))
delta = timedelta(seconds=desfase_segundos)
for sub in subs:
sub.start = max(timedelta(0), sub.start + delta)
sub.end = max(timedelta(0), sub.end + delta)
with open(salida, 'w', encoding='utf-8') as f:
f.write(srt.compose(subs))
print(f"Sincronizado: {desfase_segundos:+.1f}s -> {salida}")
sincronizar_srt("pelicula.srt", "pelicula_sync.srt", -2.5) # adelantar 2.5s
sincronizar_srt("pelicula.srt", "pelicula_sync.srt", +5.0) # retrasar 5s
Limpiar y Eliminar Etiquetas HTML de Subtítulos
import srt
import re
def limpiar_srt(entrada, salida):
with open(entrada, encoding='utf-8') as f:
subs = list(srt.parse(f.read()))
for sub in subs:
# Eliminar etiquetas HTML: <i>, <b>, <font color="...">, etc.
sub.content = re.sub(r'<[^>]+>', '', sub.content)
# Normalizar espacios
sub.content = re.sub(r'\s+', ' ', sub.content).strip()
with open(salida, 'w', encoding='utf-8') as f:
f.write(srt.compose(subs))
print(f"SRT limpio: {salida} ({len(subs)} subtítulos)")
limpiar_srt("con_etiquetas.srt", "limpio.srt")
Extraer Solo el Texto (Para Traducción)
import srt
def srt_a_texto(entrada_srt, salida_txt):
with open(entrada_srt, encoding='utf-8') as f:
subs = list(srt.parse(f.read()))
lineas = [sub.content.replace('\n', ' ') for sub in subs]
with open(salida_txt, 'w', encoding='utf-8') as f:
f.write('\n'.join(lineas))
print(f"Texto extraído: {salida_txt} ({len(lineas)} líneas)")
srt_a_texto("pelicula.srt", "transcripcion.txt")
Recurso Adicional
Para convertir archivos de vídeo entre MP4, MKV, AVI y otros formatos sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones frecuentes del catálogo: