Me puse a ver una película en inglés, con los subtítulos recién bajados (también en inglés), y cuál fue mi chasco cuando descubrí que el texto aparecía desfasado unos 18 segundos con respecto a la voz. Cualquier persona normal hubiese probado a bajarse otro fichero, o simplemente hubiera prescindido de los subtítulos. Pero yo no soy una persona normal. Así que le eché un vistazo al fichero de los subtítulos y aquí tenéis un ejemplo de lo que vi:
Me puse manos a la obra e hice un programilla que leía el fichero y sumaba (o restaba) una cantidad de tiempo constante a todos los indicadores temporales. Tras un rato haciendo pruebas y arreglando fallos (es lo que pasa cuando uno se pone a programar en plan albañilería), ya tenía el programa funcionando. Copié el nuevo fichero y me puse a ver la película. Los primeros textos estaban en una sincronía perfecta, pero noté que según iba avanzando la película se iban volviendo a quedar desfasados. Vaya jodienda, tanto trabajo para nada. Pero no me iba a dar por vencido tan fácilmente.
Volvía a reproducir la película, anotando los tiempos en los que empezaban cada frase y comparándolos con los que había en el fichero. Efectivamente, la diferencia no era constante, sino que cada vez se hacía mayor. Tomé unas cuantas muestras, repartidas por todo el metraje de la película y las copié en la hoja de cálculo. Pinté una gráfica en la que en un eje estaban los tiempos observados y en otra los definidos en el fichero de subtítulos. Aquello parecía una recta, por lo menos era algo esperanzador, no todo estaba perdido.
Cogí el libro de Álgebra de primero de la carrera, le quité el polvo que tenía encima y busqué cómo se hacía una aproximación por mínimos cuadrados. Ah, aquellas fórmulas me resultaban tan familiares y entrañables... al fin encontré una sección en la que explicaban cómo aproximar una recta, justo lo que yo necesitaba. Antes me hubiese puesto a mirar los teoremas para asegurarme de que entendía por qué funcionaba, pero ahora me bastaba con aplicarlo. 5 años dan para perder mucho interés por las cosas.
Ahora que ya tenía la fórmula y los datos, tenía que encontrar la solución al problema. Abrí el octave y me puse a echar las cuentas con los vectores y las matrices. Resultado final: los tiempos reales estaban relacionados con los predefinidos por la siguiente función: f(t) = -15 + t*0.96
Cambié mi programilla para que además de sumar un tiempo, multiplicase por una constante y... alucinante, los textos coincidían con la voz. Increible que una chapuza así haya funcionado.
Para los que gusten de estas cosillas, les pongo el código del super-programón, hecho en Java.
¿Y a cuento de qué viene todo esto? ah, sí... esto era un ejemplo en el que había pensado para hablar sobre la alfabetización informática. La mayoría de la gente que se viese en la necesidad de hacer algo parecido, ¿qué habría hecho? seguramente cambiar a mano, una a una, todas las líneas, mientras iba dándole a la pausa a la película y miraba en qué segundo empezaban cada frase. A ojo de buen cubero, tardaría en hacer eso el doble de la duración de la película y además ya la habría visto para cuando quisiera utilizar los nuevos subtítulos.
Pues cosas así pasan a diario cuando la gente trabaja con ordenadores (puede que no tan exageradas). En un próximo post daremos cuenta de ello.
Actualización
Hay otro formato de subtítulos con el que me he encontrado, que tiene las marcas de tiempo por fotogramas. Un ejemplo:
{11186}{11271}Sixty-eight...sixty-nine...
{11272}{11325}seventy...seventy-one...
{11326}{11362}Come on, will you?
De nuevo, estaba desincronizado, por lo que hice el nuevo ajuste por mínimos cuadrados (de frames a centésimas de segundos) tomando algunas muestras y un nuevo programa, esta vez en Python, que trataba con ese formato.
#!/usr/bin/python
#cambiar estos valores (pendiente y corte en origen)
m = 3.3368
r = -14.1243
import sys
def csecsToTime(csecs):
t = csecs
result = "." + str(t%100)
t /= 100
result = ":" + str(t % 60) + result
t /= 60
result = ":" + str(t % 60) + result
t /= 60
result = str(t) + result
return result
def transform(orig):
return csecsToTime(int(int(orig) * m + r))
f = file(sys.argv[1])
for line in f:
tokens = line.replace("{","").split("}")
print transform(tokens[0]) + "," + transform(tokens[1])
print tokens[2].replace("\r","")
El programa es mucho más corto que el anterior, más que por la mayor sencillez de Python, por la simplicidad del fichero a procesar (no había subtítulos que ocupasen múltiples líneas, no había que leer marcas en formato H:M:S.CS) y que los parámetros están incluidos en el fuente, que para eso es un script.
I like this phrase :)
ResponderEliminar