Il arrive souvent que l’on récupère un fichier srt qui est désynchronisé par rapport au film. On aimerait bien alors pouvoir décaler les sous-titres de quelques secondes pour que ça soit un peu plus raccord avec le film. Il y a sur ici une application qui permet de faire ca on line (vous pouvez aussi jeter un oeil sur comment re-synchroniser des sous-titresavec VLC). Comme il n’y a pas le code source j’avais entrepris de faire ça en bash mais après quelques heures à me battre avec les regexp j’ai lâchement abandonné pour une solution python. Je propose ici une solution sous forme d’un notebook ipython. C’est très simple et le lecteur pourra l’adapter à sa convenance.
Il faut modifier srt_name par votre fichier srt et add_second pour le décalage que vous voulez effectuer.
A la fin le programme vous sort le fichier srt avec le décalage que vous vouliez.
NB:
J’ai considéré que le srt avait cette forme
N° du sous titre : 692
Début et fin du sous titre (que l’on va modifier avec le programme): 00:54:26,746–>00:54:28,748
Sous titre: Nous sommes là.
''' Olivier Dadoun For comments and questions www.dadoun.net ipython notebook for shifting the time line of your srt file I have supposed here that March 2015 ''' srt_name="OLD.srt" shifted_srt_name="shifted_"+srt_name add_second=10 import re pattern="[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}" prog = re.compile(pattern) with open(shifted_srt_name, 'w') as shifted_file: with open(srt_name, 'r') as the_file: lecture=the_file.read() line=lecture.split("\n") for li in line: if prog.match(li): begin_time=li.split(" ")[0] begin_hours=begin_time.split(":")[0] begin_minutes=begin_time.split(":")[1] begin_seconds_milliseconds=begin_time.split(":")[2] begin_seconds=begin_seconds_milliseconds.split(",")[0] begin_milliseconds=begin_seconds_milliseconds.split(",")[1] end_time=li.split(" ")[2] end_hours=end_time.split(":")[0] end_minutes=end_time.split(":")[1] end_seconds_milliseconds=end_time.split(":")[2] end_seconds=end_seconds_milliseconds.split(",")[0] end_milliseconds=end_seconds_milliseconds.split(",")[1] shifted_file.write(begin_hours+":"+begin_minutes+":"+ str(int(begin_seconds)+add_second)+","+begin_milliseconds +"-->"+ end_hours+":"+end_minutes+":"+str(int(end_seconds)+add_second) +","+end_milliseconds+"\n") else: shifted_file.write(li) |
Merci à Nico qui en fournit un .py:
''' Olivier Dadoun For comments and questions www.dadoun.net ipython notebook for shifting the time line of your srt file I have supposed here that March 2015 ''' import os import re prog = re.compile("[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}") def go(srt_path, add_second): dirname, srt_name = os.path.split(srt_path) shifted_path = os.path.join(dirname, "shifted_" + srt_name) with open(shifted_path, 'w') as shifted_file: with open(srt_path, 'r') as the_file: for li in the_file.read().split("\n"): if prog.match(li): begin_time=li.split(" ")[0] begin_hours=begin_time.split(":")[0] begin_minutes=begin_time.split(":")[1] begin_seconds_milliseconds=begin_time.split(":")[2] begin_seconds=begin_seconds_milliseconds.split(",")[0] begin_milliseconds=begin_seconds_milliseconds.split(",")[1] end_time=li.split(" ")[2] end_hours=end_time.split(":")[0] end_minutes=end_time.split(":")[1] end_seconds_milliseconds=end_time.split(":")[2] end_seconds=end_seconds_milliseconds.split(",")[0] end_milliseconds=end_seconds_milliseconds.split(",")[1] shifted_file.write("%s:%s:%s,%s-->%s:%s:%s,%s\n" % ( begin_hours, begin_minutes, int(begin_seconds) + add_second, begin_milliseconds, end_hours, end_minutes, int(end_seconds) + add_second, end_milliseconds )) else: shifted_file.write(li + '\n') if __name__ == '__main__': import sys argvL = len(sys.argv) try: srt_name = sys.argv[1] except: raise IOError('You must specify an SRT file') try: add_second = int(sys.argv[2]) except IndexError: add_second = 10 except Exception, error: raise IOError('Failed to convert "%s" in integer' % sys.argv[2]) go(srt_name, add_second) |
Pour le lancer depuis son terminal:
python shiftSRT.py chemin_vers_srt [offset]