Décaler des sous-titres srt

Updated: 20 octobre 2015

Script .py fourni par Nicos Correction de bug Thanks to Thierry

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]

Cette entrée a été publiée dans Informatique, Python, avec comme mot(s)-clef(s) , , , . Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *