利用Python将WEBVTT格式的视频字幕文件转为SRT格式

1 WebVTT & SRT 格式

WebVTT字幕格式与SRT字幕格式主要区别在于时间格式的区分。

下面是一个WebVTT格式的字幕文件

WEBVTT

1
00:00:20.000 --> 00:00:24.400
En réponse à l'augmentation dramatique
de la criminalité dans certains quartiers,

2
00:00:24.600 --> 00:00:27.800
Le gouvernement se félicite pour les prochaines élections…

对应的SRT字幕格式则为

1
00:00:20,000 --> 00:00:24,400
En réponse à l'augmentation dramatique
de la criminalité dans certains quartiers,

2
00:00:24,600 --> 00:00:27,800
Le gouvernement se félicite pour les prochaines élections…

可以看到两种格式的文件主要有两个的区别:

  1. WebVTT格式的文件头有WEBVTT标识,而SRT格式的文件则没有;

  2. WebVTT格式的时间为00:00:20.000 --> 00:00:24.400,而SRT格式的时间为00:00:20,000 --> 00:00:24,400;即一个为.一个为,

有个上述的基本认识之后,要将WebVTT格式的字幕文件转为SRT格式的字幕文件就迎刃而解了。

2 解决方案

为了实现WebVTT转换为SRT文件格式,本解决方案采用Python实现,使用PyQt4提供界面。在界面设计中,使用到了Qt Designer进行界面设计。

程序界面如下图所示:

利用Python将WEBVTT格式的视频字幕文件转为SRT格式_第1张图片

2.1 QT Designer 界面设计

利用QT Designer设计完界面后,将文件保存为.ui后缀的文件名。然后利用pyuic.py'.ui文件转为.py文件。命令如下:

C:\>python "D:\Program Files (x86)\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" -o vtt2srt_ui.py vtt2srt.ui

这里界面文件文vtt2srt.ui,生成后的python文件为vtt2srt_ui.py

备注:pyuic.py在安装完PyQt时就默认安装上了,路径应该为XXX\Lib\site-packages\PyQt4\uic,其中XXX为Python路径。 如果你找不到,可以使用Everything进行搜索。

2.2 引用界面文件

在创建好UI文件并将其转换为Python源文件之后,就需要在我们的Python源文件中使用该UI界面,PyQt Designer上已经有了详细的说明,此外,由于个人英文水平有限,即便在这个胡诌两句,各位看官也不一定能明白,毕竟存在信息损耗嘛!所以介意各位看官移步到PyQt Designer手册自行琢磨。

以下代码展示了如何引用PyQt的UI文件。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui
from vtt2srt_ui import Ui_vtt2srt


class VTT2SRT(QtGui.QMainWindow, Ui_vtt2srt):

    def __init__(self, parent=None):
        super(VTT2SRT, self).__init__(parent)
        self.setupUi(self)
        self.show()


def main():
    app = QtGui.QApplication(sys.argv)
    vtt2srt = VTT2SRT()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

在上面的代码中我们只是引用了UI文件,并将通过QT Designer设计的界面显示出来,除此之外,没有任何实质性的东西。接下来的工作就是响应各种消息。

2.3 WebVTT 转为 SRT

该程序创建两个文本输入框、两个标签以及三个按钮,界面稍显丑陋。接下来就是对按钮的响应以执行相应的操作。代码如下:

class VTT2SRT(QtGui.QMainWindow, Ui_vtt2srt):

    def __init__(self, parent=None):
        super(VTT2SRT, self).__init__(parent)
        self.setupUi(self)
        self.show()

        self.output_button.clicked.connect(lambda: self.open_file(1))
        self.input_button.clicked.connect(lambda: self.open_file(0))
        self.convert.clicked.connect(self.vtt2srt)

    def open_file(self, flag):
        fname = QtGui.QFileDialog.getOpenFileName(self, u'打开文件')

        if flag == 1:
            self.output_file.setText(fname)
        else:
            self.input_file.setText(fname)

    def vtt2srt(self):
        infile = self.input_file.text()
        outfile = self.output_file.text()
        # using thread is more reasonable
        inf = open(infile, 'r')
        outf = open(outfile, 'w')
        line = inf.readline()
        rep = re.compile('\.')
        for line in inf:
            if re.search('^WEBVTT', line):
                continue
            if re.search('^[0-9][0-9]:[0-9][0-9].+ -->', line):
                line = rep.sub(',', line)
            outf.write(line)

        inf.close()
        outf.close()

在上述代码中,其中两个按钮分别对应两个文本输入框用于指定输入文件和输出文件,它们执行的动作类似,因此将其关联到一个函数上。而核心的转换工作则由第三个按钮关联的vtt2srt函数执行。

备注:在此处为了简便,直接在界面线程中执行转换;但当转换工作非常耗时时,这样做回将界面线程卡死。一般的做法是新建一个工作线程用于执行转换工作。

3 总结

在我准备做这个转换器的时候,原以为十分简单。虽然它确实不复杂,只是将.替换为,,但在实现过程中却还是会遇到很多问题,真是纸上得来终觉浅,绝知此事要躬行。这个小程序还有以下几可以改进:

  1. 输入文件是否为WebVTT格式,这个为了省事而没有做的;
  2. 转换工作转移到工作线程中,避免界面线程假死;
  3. 异常处理。

附件: 源码及文档

参考文献

[1] https://fr.wikipedia.org/wiki/WebVTT
[2] http://www.delphiki.com/webvtt/
[3] https://en.wikipedia.org/wiki/.srt
[4] http://nikolak.com/pyqt-qt-designer-getting-started/

你可能感兴趣的:(python,PyQt,WebVTT,SRT)