文章目录(Table of Contents)
简介
之前介绍了一个关于英语精听的软件, 英语听力练习工具–Praat, 这个最后会生成一个textgrid的文件, 这个文件里面是包含每一段标注的台词的起始时间和自己标注的内容的, 再加上最近有想给视频配字幕的想法, 所以想着先利用Praat这个软件来生成textgrid文件, 接着利用textgrid文件转换为字幕文件, 关于字幕文件的生成我会使用Subtitle Edit来进行实现.
我们首先讲一下主要的流程:
- 将textgrid转换为类字幕文件的格式
- 使用Subtitle Edit进一步优化字幕文件
- 使用VLC预览字幕和视频或是音频
说起来很简单, 就三个步骤, 下面对每一个步骤进行一下详细的说明.
关于字幕文件之间的转换, 可以参考我之前写的一篇文章: Python字幕转换工具–asstosrt
字幕文件生成方式
转换textgrid格式
我们首先要做的第一步就是对textgrid文件进行处理, 有一个好消息是我们不需要自己写正则表达式(关于正则表达式, 可以参考Python正则表达式指南-详细版). 我们可以使用TextGridTools来完成文件内容的提取.
下面是该工具在GitHub上的链接: TextGridTool--Read, write, and manipulate Praat TextGrid files with Python. 下面我们只说明一下我们会使用到的功能.
在讲怎么使用TextGridTool之前, 我们首先看一下textgrid文件每个部分的名字. 就是在Praat这个软件的界面, 下面有三条轨道, 我们称这个为tier. 接着在第一条轨道里, 我们有很多个间隔(边界), 这个就叫做intervals.
我们要做的就是提取每一个intervals中的信息. 关于TextGridTool的API的介绍, 我们可以查看下面的链接, 我后面只会讲我用到的部分, TextGridTool API Introduction
所以, 我们首先读取textgrid文件.
- tg = tgt.read_textgrid('./meal-plan.TextGrid') # 读取文件
- tg_part = tgt.TextGrid() # 转换为TextGrid
因为我们之前只在第一个轨道进行了标注, 所以我们首先获得第一个轨道的内容.
- subtitle = tg.get_tier_by_name('Mary')
如果不知道name的话, 我们可以使用下面的方式来获得所有tier的名字.
- tg.get_tier_names()
有了上面的tier之后, 下面我们要做的就是获取每一个intervals中的内容, 并直接输出为类似srt字幕文件的格式, 我们可以简单的使用下面的方式来进行实现.
- num = 0 # 用来记录每一句字幕的标号
- for i in subtitle.intervals:
- num = num + 1
- stb = datetime.datetime.fromtimestamp(i.start_time)-datetime.timedelta(hours=1) # 将秒转换为dateset.date的格式
- etb = datetime.datetime.fromtimestamp(i.end_time)-datetime.timedelta(hours=1)
- st = stb.strftime('%H:%M:%S,%f')[:-3] # 转换为字幕指定格式
- et = etb.strftime('%H:%M:%S,%f')[:-3]
- print("{}\n{}-->{}\n{}\n".format(num, st, et, i.text)) # 进行输出
就可以生成类似与下面的内容.
我们可以直接将上面生成的文字内容复制粘贴, 保存为一个txt文件. 用于接下来的进一步优化字幕的工作.
完整的代码如下所示, 最后可以直接保存为txt文件.
同时下面代码有以下的一点需要注意, 我们设置了highlight的内容. 如果有被【S】和【E】包住的, 我们将其修改为红色. 其中给字幕增加颜色就是使用<font color='#ff0000'>包住即可.
- import tgt
- import datetime
- import fire
- import os
- def convertTitle(fileName, tierName='John'):
- # highlight
- highlightStart = '<font color="#ff0000">'
- highlightEnd = '</font>'
- titleTime = 5
- tg = tgt.read_textgrid('{}'.format(fileName)) # 读取文件
- tg_part = tgt.TextGrid() # 转换为TextGrid
- print(tg.get_tier_names()) # 打印tier所有名称
- subtitle = tg.get_tier_by_name('{}'.format(tierName)) # 提取指定tier的内容
- num = 0 # 用来记录每一句字幕的标号
- outputSubtitle = ''
- for i in subtitle.intervals:
- num = num + 1
- stb = datetime.datetime.fromtimestamp(i.start_time)-datetime.timedelta(hours=1) # 将秒转换为dateset.date的格式
- etb = datetime.datetime.fromtimestamp(i.end_time)-datetime.timedelta(hours=1)
- st = stb.strftime('%H:%M:%S,%f')[:-3] # 转换为字幕指定格式(时间格式)
- et = etb.strftime('%H:%M:%S,%f')[:-3]
- outputSubtitle = outputSubtitle + "{}\n{}-->{}\n{}\n\n".format(num, st, et, i.text.replace('[S]', highlightStart).replace('[E]', highlightEnd)) # 进行输出
- # 写入文件
- outputName = os.path.basename(fileName).split('.')[0]
- with open('{}.txt'.format(outputName),'w') as file:
- file.write(outputSubtitle)#这样默认是不换行的
- def main():
- fire.Fire(convertTitle)
- if __name__ == '__main__':
- main()
使用Subtitle Edit进一步优化字幕
有了上面生成的内容之后, 下面我们就是要进一步调整, 或是优化字幕的内容. 此时我们需要完整的看一遍, 确保一条字幕不会太长, 同时此时可以进行字幕的换行, 最后生成想要的字幕.
我们这里会使用的软件是Subtitle Edit, 这个也是一个开源的软件, 链接如下: the subtitle editor . 我们可以在release界面进行下载: SubtitleEdit Release
下面还是说一下我们在这里用到的功能, 完整的功能可以自己进行查看.
首先, 我们将上面Python脚本生成的内容, 导入到Subtitle Edit中间去, 点击File->Open即可.
接着我们导入我们对应的音频或是视频, 点击Video->Open video file即可.
这时候, 我们的整个界面如下图所示:
这时候我们可以在内容预览区对我们的视频和字幕进行预览. 因为我这里是纯音频, 所以是没有画面的. 同时在最上面, 是可以转换字幕的类型, 也就是可以将srt类型转换为ass字幕类型. 我们将字幕类型设置为ass有一个好处就是可以对字幕的样式进行编辑. 接下来就来说明一下如何对字幕的样式进行编辑.
如下图所示, 我们选中一条字幕点击右键, 可以看到Advanced Sub Station Alpha styles, 点击.
点进去之后的界面就是这个样子的, 我们可以设置字体, 颜色和各种样式.
关于样式的修改, 我们也是可以在Option->Setting->ASS Style中进行修改, 这里就不放图片进行说明了, 这样可以永久进行修改.
有一点需要注意的是, 在修改完样式之后, 我在软件中旁边的视频播放器中是没有看到字体的效果的, 但是导出之后播放确实是会有字体的效果的, 所以看到旁边没变, 可能不是没有改成功, 而是没有显示而已.
完成了上面的操作之后, 我们就可以进行保存了, 保存点击save即可.
设置视频播放器
Subtitle Edit的默认播放器有时候播放不了, 我们可以设置为自己本地的播放器. 下面是我本地VLC的位置.
- C:\Program Files\VideoLAN\VLC
还是从Option->Setting进行设置.
使用VLC预览文件
完成了上面一系列的操作之后, 我们就有了视频或是音频对应的字幕文件了, 下面我们可以使用VLC来进行预览一遍, 看一下最终的效果, 确保字体大小, 排版是否合适, 是否需要进行更多的调整.
关于音频文件, 要是想要看到字幕效果, 我们需要自播放音频的时候打开可视化, 如下图所示.
之后导入字幕, 就可以看到字幕的最终效果了, 下面就看一下我这个音频的最终的效果.
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论