¿No os ha pasado que, después de encontrar los subtítulos de una película, resulta que están desincronizados? Pues a mí más de una vez. Por lo general sigo buscando y probando hasta que doy con los que se ajustan al vídeo en cuestión. Esta vez no ha sido así. Seguramente debido a que El Principito de 1974 ya tiene sus años y no abunda la oferta de transcripciones.
Los subtítulos que descargué parecían encajar con los diálogos de la película, solo que empezaban con 7 segundos de antelación. Para quien no lo sepa los ficheros de subtítulos de tipo SRT, son ficheros de texto plano que cuentan con una lista de entradas numeradas, con su estampillas de tiempo y el texto del audio, a veces entre marcado HTML con el fin de enfatizarlo. Éstas son los subtítulos de las primeras escenas de El Principito.
1
00:00:32,159 --> 00:00:34,992
EL PEQUEÑO PRÍNCIPE
2
00:03:01,800 --> 00:03:05,395
Un día, cuando tenía seis años,
vi un dibujo magnífico
3
00:03:05,600 --> 00:03:08,319
en un libro sobre el bosque primitivo.
4
00:03:08,520 --> 00:03:12,308
Era de una boa constrictor
tragándose un animal.
5
00:03:12,520 --> 00:03:15,830
Intento esbozarlo para que lo vean.
6
00:03:16,040 --> 00:03:17,917
Debajo decía:
7
00:03:18,120 --> 00:03:23,240
«Las boas se tragan
su presa sin masticarla».
En teoría el problema se solucionaría añadiendo 7 segundos a cada estampilla de tiempo. Pregunté a ChatGPT si no le importaría hacerlo por mí. Primero hice una prueba con una decena de items
I’ll paste you the content of an srt file. I want you to add 7 seconds to every timestamp of the following block of subtitles:
Para mi sorpresa, comprendió bien la tarea: ahora los subtítulos se mostraban en el momento adecuado.
El fichero srt entero cuenta con más de 900 entradas, demasiado texto para pegar en una sola pregunta al chat de GPT. Probé primero a trocearlo en bloques de 300. Seguía siendo demasiado, 200 también. Con 100 empezó a procesar, pero cuando llevaba unos diez corregidos, añadió un «y así para el resto…». Esta vez le pido de manera explícita que corrija cada una de las estampillas de tiempo. ¡Sin problema! responde entusiasmado. Pero se detiene al cabo de una treintena de entradas, tras lo cual se activa el botón «continue generating…». Sobre el que tendré que hacer click dos veces más. En total le ha llevado unos cinco minutos finalizar la tarea, mucho más que cuando le pido que genere código o complete una historia. Es curioso, da la sensación de que este tipo de tarea más rutinaria y precisa le demanda más recursos.
Vuelvo a probar el fichero generado. Los subtítulos aparecen sincronizados con las voces de los actores, sin embargo hay algo que no me cuadra. No coincide el contenido del audio con el escrito por GPT. En general los subtítulos no tienen porque ser una mera transcripción del audio, pero en este caso claramente los subtítulos estaban contando otra historia. Los comparo con los originales y, en efecto, ChatGPT se ha tomado la licencia de rescribir el clásico del cine.
Esta solución no vale. No solo tarda mucho en ajustar las estampillas, además modifica el texto a su antojo. Probé a corregirlos con una aplicación de escritorio para Linux, Subtitle Editor. La instalación no puede ser más sencilla sudo apt-get install subtitleeditor y la interfaz gráfica resulta intuitiva. Basta abrir un fichero srt para que en la ventana superior se muestre la película y en la inferior los subtítulos. Permite adelantar las estampillas, pero por lo que vi solo de una en una. Es posible que pueda hacerlo en lote, pero no investigo más. Ya llevo demasiado tiempo invertido en esto.
¿Y si lo hago con un script? ¡Cómo no había caído antes! Es lo que tendría que haberle preguntado desde un principio a ChatGPT:
I need you create a bash script that accepts as an input an srt file and adds a number of seconds to each timestamp, then creates a new fixed file.Dos segundos después tenía mi script funcional:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/bash if [[ $# -ne 2 ]]; then echo "Usage: $0 <srt-file> <seconds-to-add>" exit 1 fi srt_file="$1" seconds_to_add="$2" fixed_file="${srt_file%.srt}_fixed.srt" awk -F' --> ' -v sec="$seconds_to_add" ' { if($2) { split($1, start, ":|,"); split($2, end, ":|,"); start_secs = start[1]*3600 + start[2]*60 + start[3] + start[4]/1000 + sec; end_secs = end[1]*3600 + end[2]*60 + end[3] + end[4]/1000 + sec; printf "%02d:%02d:%02d,%03d --> ", int(start_secs/3600), int((start_secs%3600)/60), int(start_secs%60), (start_secs*1000)%1000; printf "%02d:%02d:%02d,%03d\n", int(end_secs/3600), int((end_secs%3600)/60), int(end_secs%60), (end_secs*1000)%1000; } else { print $0; } }' "$srt_file" > "$fixed_file" echo "Fixed file saved as $fixed_file" |