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]