SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

Ajustando subtítulos

2009-07-13

Este artículo está dedicado con simpatía a mi colega y amigo J. L., quien me mostró la solución a un problema casi idéntico al aquí presentado que había desarrollado como aplicación de sus recientemente adquiridos conocimientos sobre el manejo de ciertas herramientas poderosas (enlace a un artículo de la Wikipedia en español fechado el 12 de julio de 2009 a las 20:09).


Varios amiguetes se me han presentado con el siguiente problema: disponen de unos ficheros con subtítulos para acompañar algún vídeo, pero los propios subtítulos están desajustados por un desfase constante o, quizá, creciente linealmente con el tiempo. En estos casos, una simple transformación del tiempo original t al tiempo A (t + d) resolvería la cuestión. Vamos a ver cómo, con un poco de astucia y las herramientas adecuadas podemos dar solución a este problema cotidiano.

Conoce a tu enemigo

Los ficheros a tratar son de texto simple, tienen nombres que acaban en «.srt» y tienen la siguiente estructura que se repite para cada subtítulo:

  1. Número de subtítulo
  2. Tiempo de aparición --> Tiempo de desaparición
  3. Texto
  4. Línea en blanco

El indicador de fin de línea es CR+LF. El número de subtítulo empieza en 1 y es incrementado con normalidad subtítulo a subtítulo. El tiempo está indicado según el formato «horas:minutos:segundos,milisegundos» de la siguiente manera (según la sintaxis de printf y funciones similares de C y otros lenguajes): %02d:%02d:%02d,%03d.

Para ilustrar estos conceptos, digamos que el quinto subtítulo empieza en el minuto tercero exacto y termina tres segundos con dos centésimas después y su texto es «Hola, enfermera». El subtítulo estaría indicado por las siguientes líneas:

5
00:03:00,000 --> 00:03:03,020
Hola, enfermera

Los tiempos tienen un error homotético: si es t' el tiempo correcto, el tiempo incorrecto que aparece en el fichero es t = (t' − d) ⁄ A.

Diseñando la solución

Bastará recorrer el fichero de subtítulos y modificar los tiempos haciendo la transformación t' = A (t + d). Como ejemplo, presento aquí un pequeño código que hace uso de la imprescindible herramienta que es AWK. El programita no es todo lo conciso que podría ser, pero tengo la impresión de que es razonablemente claro y fácil de entender. Aquí está el código: adjustsrt. Se trata de un script, así que el programa ejecutable es el propio código fuente. El manejo es mediante tuberías: la entrada estándar contiene ficheros de subtítulos y la salida estándar lleva los datos procesados. Basta hacer, suponiendo que adjustsrt está en $PATH:

adjustsrt [desfase] [razón] < [subtítulos] \ > [subtítulos-corregidos]

Por ejemplo, si el desfase a aplicar, d, es de tres segundos negativos, la razón con la que escalar los tiempos resultantes es igual a 1,1, el fichero original a corregir se llama subtitles.srt y el fichero con los subtítulos corregidos se llama subtitles-ok.srt, uno puede introducir la siguiente orden:

adjustsrt -3 1.1 < subtitles.srt \ > subtitles-ok.srt

Es posible indicar el desfase mediante un código temporal como los que aparecen en los ficheros. Si ahora el desfase es de tres minutos positivos, tenemos:

adjustsrt 00:03:00,000 1.1 < subtitles.srt \ > subtitles-ok.srt

El programa adjustsrt está distribuido bajo los términos de la licencia GPLv3.

Los requisitos para el funcionamiento son escasos: basta cuanlquier máquina con sh y awk siguiendo POSIX. El código está comentado en inglés, que es el lenguaje natural más apropiado para hablarle a una máquina y a quien tiene que programar máquinas. Por lo demás, y dado que no hace la más mínima comprobación de sanidad de la entrada, es posible hacer cosas malas pasándole datos con formato incorrecto.

Repito por comodidad el enlace para descargarlo: adjustsrt.


Categorías: Informática

Permalink: http://sgcg.es/articulos/2009/07/13/ajustando-subtitulos/