Cómo re-sincronizar (cambiar) los subtítulos de una película desde un archivo SRT en Python 3

No puedo contar todas las veces que descargué una película ... legalmente, lo prometo ... y la película viene en un idioma que no entiendo, sin embargo la calidad es sin duda la mejor que no puedes buscar en Internet, por lo que simplemente decide conservar el archivo y buscar subtítulos en Internet. Desafortunadamente, los subtítulos no coinciden con las partes donde hablan los actores. Probablemente, ya utilizas un programa reproductor que incluye la función de retrasar el tiempo de los subtítulos, por ejemplo con Power DVD 17, puedes hacerlo fácilmente en la opción de subtítulos:

Subtitles SRT Movie

Nadie está descargando ninguna versión pirata del moview de John Wick aquí . Como puede ver, hay un área para retrasar los subtítulos en una cantidad específica de segundos. Eso es bastante útil, sin embargo, la configuración se almacenará en el reproductor, por lo que cuando mueva los archivos de la computadora, verá el problema con los subtítulos nuevamente.

La solución más rápida es utilizar una herramienta en línea como esta que ofrecen los chicos de Bits'n'Bites que te permite cargar un archivo SRT y sincronizar (cambiar) la hora de los subtítulos . Estas herramientas cambian todas las marcas de tiempo de un archivo de subtítulos de películas. Se puede utilizar para sincronizar los subtítulos de una película cuando hay un ligero desplazamiento entre los dos (este puede ser el caso cuando los subtítulos y la película provienen de dos fuentes diferentes) o cuando hay una diferencia de escala de tiempo (por ejemplo si la película y el archivo de subtítulos tienen diferentes velocidades de fotogramas).

Sin embargo, Our Code World no se trata de cómo resolver los problemas de los usuarios normales, ¿verdad? ¿Estás intentando implementar la misma herramienta del sitio web que te recomendamos anteriormente? Entonces, hoy es su día de suerte, ya que le explicaremos cómo hacerlo con un script Python de código abierto.

1. Creación de la secuencia de comandos de resincronización

Una implementación muy agradable en Python que puede encontrar para lograr esta tarea es el proyecto srt-resync disponible en Github aquí . Sin embargo, a menos que esté trabajando en un entorno basado en Linux, el script que encontró en el repositorio no funcionará correctamente en Windows debido a su forma de funcionalidad (funciona como un ejecutable bash), así que si intenta ejecutar el script con Python srt-resync {argumento} en un entorno como Windows, verá un error en el espacio de nombres principal. Para solucionar este problema le recomendamos que copie el contenido del script principal y cree su propio archivo de python como le explicaremos ahora.

Para comenzar, crea un archivo Python srt-resync.py y almacene el siguiente código en el archivo:

"""
  Copyright (c) 2013, William Ting

  *  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 3, or (at your option)
  any later version.

  *  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  *  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

    Original code: https://github.com/wting/srt-resync
        Issue: the file in the repo doesn't contain any python format, so in
        environments like Windows it can't run without modifying its extension
        to srt-resync.py
"""

import argparse
import datetime
import os
import re
import shutil
import sys

from io import FileIO as file

VERSION = "0.1"

def parse_options():
    global VERSION

    parser = argparse.ArgumentParser(
            description = 'Offset srt subtitles.')

    parser.add_argument('offset', type = float)
    parser.add_argument('srt_file', type = file)
    parser.add_argument('-o', '--overwrite', action = "store_true", default = False,
            help = "overwite original file")
    parser.add_argument('--version', action = "version", version = "%(prog)s " + VERSION,
            help = "show version information and quit")

    return parser.parse_args()

def rzeropad(ms):
    ms = str(int(ms))
    while len(ms) < 3:
        ms += "0"
    return ms

def offset_time(offset, time_string):
    #FIXME: no admite marcas de tiempo> = 24 horas
    ts = time_string.replace(',', ':').split(':')
    ts = [int(x) for x in ts]
    ts = datetime.datetime(2013, 1, 1, ts[0], ts[1], ts[2], ts[3] * 1000) # millisecond -> microsecond

    delta = datetime.timedelta(seconds = offset)
    ts += delta

    if ts.year != 2013 or ts.month != 1 or ts.day != 1:
        sys.exit("ERROR: invalid offset resulting timestamp overflow")

    return "%s,%s" % (ts.strftime("%H:%M:%S"), rzeropad(ts.microsecond / 1000)) # microsecond -> millisecond

def modify_file(options):
    if '.srt' not in options.srt_file.name:
        sys.exit("ERROR: invalid srt file")

    out_filename = os.path.splitext(options.srt_file.name)[0] + '-resync.srt'
    with open(out_filename, 'w', encoding = 'utf-8') as out:
        with open(options.srt_file.name, 'r', encoding = 'utf-8') as srt:
            for line in srt.readlines():
                match = re.search(r'^(\d+:\d+:\d+,\d+)\s+--\>\s+(\d+:\d+:\d+,\d+)', line)
                if match:
                    out.write("%s --> %s\n" % (
                        offset_time(options.offset, match.group(1)),
                        offset_time(options.offset, match.group(2))
                        ))
                else:
                    out.write(line)

    if options.overwrite:
        shutil.move(out_filename, options.srt_file.name)

if __name__ == "__main__":
    modify_file(parse_options())

Esta secuencia de comandos cambia el tiempo de los subtítulos en un .srtarchivo por un desplazamiento determinado en segundos. Se admiten números negativos y segundos parciales. Guarde los cambios del archivo y proceda a aprender a usarlo en el siguiente paso.

Para obtener más información sobre este script, visite el repositorio oficial de Github aquí .

2. Usando el guión

Ahora que tiene el script de Python, simplemente puede ejecutarlo en su terminal proporcionando como primer argumento posicional el número de segundos que desea cambiar, por ejemplo, -0.50, +1, +1.50, etc. y como segundo argumento posicional, la ruta al archivo original de los subtítulos que desea corregir:

python srt-resync.py [+seconds or -seconds] [original_subtitles_file.srt]

De forma predeterminada, los scripts crean un nuevo archivo con el prefijo de resincronización al final del archivo; por ejemplo, si proporciona un archivo de entrada llamado subtitles.srt, el archivo de salida será subtitles-resync.srt. También puede sobrescribir el archivo original usando la opción -o o --overwrite.

El contenido del archivo srt original en nuestro caso es el siguiente:

1
00:03:36,055 --> 00:03:38,142
¿Ya cargaron todo?

2
00:03:38,183 --> 00:03:42,188
Casi.

3
00:03:42,687 --> 00:03:45,816
Con todo respeto,
¿es nuestra mejor opción?

4
00:03:45,857 --> 00:03:50,070
- ¿Por qué no corregimos el problema?
- Porque mi maldito sobrino...

5
00:03:50,862 --> 00:03:52,782
mató a un perro.

6
00:03:53,948 --> 00:03:55,743
Y robó un auto.

Luego la salida del archivo SRT con una modificación ( yourfile-resync.srt) de -0.50segundos con el siguiente comando:

REM mover los subtítulos menos medio segundo
python srt-resync.py -0.50 ./subtitles.srt

estarán:

1
00:03:35,555 --> 00:03:37,642
¿Ya cargaron todo?

2
00:03:37,683 --> 00:03:41,688
Casi.

3
00:03:42,187 --> 00:03:45,316
Con todo respeto,
¿es nuestra mejor opción?

4
00:03:45,357 --> 00:03:49,570
- ¿Por qué no corregimos el problema?
- Porque mi maldito sobrino...

5
00:03:50,362 --> 00:03:52,282
mató a un perro.

6
00:03:53,448 --> 00:03:55,243
Y robó un auto.

Bastante fácil, ¿verdad? Ahora tiene un archivo de subtítulos completamente funcional que coincide con la hora de su película descargada completamente legal ...

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable