个性化阅读
专注于IT技术分析

如何在Python 3中从SRT文件中重新同步电影的字幕(移位)

本文概述

我不能数所有的时间来下载电影…合法地, 我保证…电影以我不懂的语言来播放, 但是质量无疑是你无法做到的。在互联网上查找, 因此你只需决定保留文件并在互联网上搜索字幕。不幸的是, 字幕与演员说话的地方不匹配。可能你已经使用了包含该功能的播放器程序来延迟字幕的时间, 例如使用Power DVD 17, 你可以在字幕选项中轻松地做到这一点:

字幕SRT电影

没有人在这里下载任何John Wick moview的盗版版本。如你所见, 有一个区域可以在指定的秒数内延迟字幕。这非常有用, 但是配置将存储在播放器中, 因此, 当你移动计算机文件时, 你会再次看到字幕问题。

更快的解决方案是使用由Bits’n’Bites的家伙提供的在线工具, 使你可以上传SRT文件并同步(移动)字幕时间。这些工具可移动电影字幕文件的所有时间戳。当两者之间略有偏移时(当字幕和电影来自两个不同的来源时, 可能是这种情况), 它可用于将字幕与电影同步。如果电影和字幕文件的帧速率不同)。

但是, 我们的代码世界并不是关于如何解决普通用户的问题!!你是否要实施我们之前推荐的网站工具?那么今天就是你的幸运日, 因为我们将向你解释如何使用开源Python脚本来做到这一点。

1.创建重新同步脚本

你可以在Python中找到一个很好的实现该任务的实现, 该程序可在Github上找到srt-resync项目。但是, 除非你在基于Linux的环境中工作, 否则由于其功能方式(作为bash可执行文件), 你在存储库中找到的脚本将无法在Windows中正常工作, 因此, 如果你尝试使用python运行脚本srt-resync {argument}在Windows之类的环境中, 你将看到主命名空间的错误。为了解决这个问题, 我们建议你复制主脚本的内容并创建自己的python文件, 正如我们现在要解释的那样。

首先, 创建一个python文件srt-resync.py并将以下代码存储在该文件上:

"""
  Copyright (c) 2013, William Ting

  *  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 3, or (at your option)
  any later version.

  *  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  *  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

    Original code: https://github.com/wting/srt-resync
        Issue: the file in the repo doesn't contain any python format, so in
        environments like Windows it can't run without modifying its extension
        to srt-resync.py
"""

import argparse
import datetime
import os
import re
import shutil
import sys

from io import FileIO as file

VERSION = "0.1"

def parse_options():
    global VERSION

    parser = argparse.ArgumentParser(
            description = 'Offset srt subtitles.')

    parser.add_argument('offset', type = float)
    parser.add_argument('srt_file', type = file)
    parser.add_argument('-o', '--overwrite', action = "store_true", default = False, help = "overwite original file")
    parser.add_argument('--version', action = "version", version = "%(prog)s " + VERSION, help = "show version information and quit")

    return parser.parse_args()

def rzeropad(ms):
    ms = str(int(ms))
    while len(ms) < 3:
        ms += "0"
    return ms

def offset_time(offset, time_string):
    #FIXME: does not support timestamps >= 24 hours
    ts = time_string.replace(', ', ':').split(':')
    ts = [int(x) for x in ts]
    ts = datetime.datetime(2013, 1, 1, ts[0], ts[1], ts[2], ts[3] * 1000) # millisecond -> microsecond

    delta = datetime.timedelta(seconds = offset)
    ts += delta

    if ts.year != 2013 or ts.month != 1 or ts.day != 1:
        sys.exit("ERROR: invalid offset resulting timestamp overflow")

    return "%s, %s" % (ts.strftime("%H:%M:%S"), rzeropad(ts.microsecond / 1000)) # microsecond -> millisecond

def modify_file(options):
    if '.srt' not in options.srt_file.name:
        sys.exit("ERROR: invalid srt file")

    out_filename = os.path.splitext(options.srt_file.name)[0] + '-resync.srt'
    with open(out_filename, 'w', encoding = 'utf-8') as out:
        with open(options.srt_file.name, 'r', encoding = 'utf-8') as srt:
            for line in srt.readlines():
                match = re.search(r'^(\d+:\d+:\d+, \d+)\s+--\>\s+(\d+:\d+:\d+, \d+)', line)
                if match:
                    out.write("%s --> %s\n" % (
                        offset_time(options.offset, match.group(1)), offset_time(options.offset, match.group(2))
                        ))
                else:
                    out.write(line)

    if options.overwrite:
        shutil.move(out_filename, options.srt_file.name)

if __name__ == "__main__":
    modify_file(parse_options())

该脚本以秒为单位将.srt文件中的字幕定时偏移给定的偏移量。支持负数和部分秒。保存文件的更改, 然后继续学习如何在下一步中使用它。

有关此脚本的更多信息, 请访问Github上的官方存储库。

2.使用脚本

有了python脚本后, 你只需在终端中运行该脚本, 即可将要移动的秒数作为第一个位置参数, 例如-0.50, + 1, + 1.50等, 并作为第二个位置参数, 即路径到你要修复的字幕的原始文件:

python srt-resync.py [+seconds or -seconds] [original_subtitles_file.srt]

默认情况下, 脚本创建一个新文件, 该文件的末尾带有resync前缀, 例如, 如果你提供一个输入文件subtitles.srt, 则输出文件将为subtitles-resync.srt。你也可以使用-o选项或–overwrite覆盖原始文件。

在我们的案例中, 原始srt文件的内容如下:

1
00:03:36, 055 --> 00:03:38, 142
¿Ya cargaron todo?

2
00:03:38, 183 --> 00:03:42, 188
Casi.

3
00:03:42, 687 --> 00:03:45, 816
Con todo respeto, ¿es nuestra mejor opción?

4
00:03:45, 857 --> 00:03:50, 070
- ¿Por qué no corregimos el problema?
- Porque mi maldito sobrino...

5
00:03:50, 862 --> 00:03:52, 782
mató a un perro.

6
00:03:53, 948 --> 00:03:55, 743
Y robó un auto.

然后使用以下命令将SRT文件的输出(-yourfile-resync.srt)修改为-0.50秒:

REM move the subtitles by minus half second
python srt-resync.py -0.50 ./subtitles.srt

将会:

1
00:03:35, 555 --> 00:03:37, 642
¿Ya cargaron todo?

2
00:03:37, 683 --> 00:03:41, 688
Casi.

3
00:03:42, 187 --> 00:03:45, 316
Con todo respeto, ¿es nuestra mejor opción?

4
00:03:45, 357 --> 00:03:49, 570
- ¿Por qué no corregimos el problema?
- Porque mi maldito sobrino...

5
00:03:50, 362 --> 00:03:52, 282
mató a un perro.

6
00:03:53, 448 --> 00:03:55, 243
Y robó un auto.

很容易吧?现在, 你拥有了一个功能齐全的字幕文件, 该文件与你下载的合法电影的时间相匹配…

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Python 3中从SRT文件中重新同步电影的字幕(移位)

评论 抢沙发

评论前必须登录!