- 背景
- 实现过程
- json转srt
- 创建python文件
- 将json文件复制到同一文件夹下
- 错误1
- 运行成功
- 代码(json_to_srt)
- 繁体中文转简体中文
- 安装pylangtools
- 导入pylangtools包
- 分析示例
- 修改代码
- 运行成功
- 最终代码
- 打包为可执行文件
前两天剪辑找视频资源的时候下载的一个视频没有中文字幕,找到的字幕文件只有json的繁体中文字幕文件,个人使用的PotPlayer播放器不支持json字幕,所以我决定给它转换成简体中文的srt格式字幕文件,希望对大家有所帮助。
实现过程 json转srt 首先我们需要将json文件改变其中的编码规则信息转为srt文件。搜了一圈找到
json字幕转换为srt字幕python。
创建一个py后缀的文件并将代码复制进去
将json文件复制到同一文件夹下比如说我们创建的python文件在桌面,那么只需要将json文件放到桌面即可
错误1运行,出现如下错误
看了下json文件
发现14行循环域错误,我们只需要在 datas后面加上[‘body’] 即可
for data in datas:>>>>for data in datas['body']运行成功
再次编译,成功运行,生成srt文件
查看srt文件,没有问题
import json
import math
import os
file = '' # 这个变量用来保存数据
i = 1
for doc in os.listdir(): # 遍历当前文件夹的所有文件
if (doc[-4:] == 'json'): # 若是json文件则进行处理
name = doc[:-5] # 提取文件名
# 将此处文件位置进行修改,加上utf-8是为了避免处理中文时报错
with open(doc, encoding='utf-8') as f:
datas = json.load(f) # 加载文件数据
f.close()
for data in datas['body']:
start = data['from'] # 获取开始时间
stop = data['to'] # 获取结束时间
content = data['content'] # 获取字幕内容
file += '{}n'.format(i) # 加入序号
hour = math.floor(start) // 3600
minute = (math.floor(start) - hour * 3600) // 60
sec = math.floor(start) - hour * 3600 - minute * 60
minisec = int(math.modf(start)[0] * 100) # 处理开始时间
file += str(hour).zfill(2) + ':' + str(minute).zfill(2) + ':' + str(sec).zfill(2) + ',' + str(
minisec).zfill(2) # 将数字填充0并按照格式写入
file += ' --> '
hour = math.floor(stop) // 3600
minute = (math.floor(stop) - hour * 3600) // 60
sec = math.floor(stop) - hour * 3600 - minute * 60
minisec = abs(int(math.modf(stop)[0] * 100 - 1)) # 此处减1是为了防止两个字幕同时出现
file += str(hour).zfill(2) + ':' + str(minute).zfill(2) + ':' + str(sec).zfill(2) + ',' + str(
minisec).zfill(2)
file += 'n' + content + 'nn' # 加入字幕文字
i += 1
with open('./{}.srt'.format(name), 'w', encoding='utf-8') as f:
f.write(file) # 将数据写入文件
f.close()
接下来就是实现将繁体中文转化为简体中文
繁体中文转简体中文于是我又双在网上搜索,找到文章繁体简体转换的python包pylangtools
根据文章示例,我们将对代码进行改动
运行cmd窗口,或者pycharm中的Terminal窗口运行下面代码
pip install pylangtools导入pylangtools包
在文件最上方添加第三方包,代码:
from pylangtools.langconv import Converter分析示例
然后根据示例
from pylangtools.langconv import Converter
if __name__=="__main__":
traditional_sentence = '陳奕迅'
simplified_sentence = Converter('zh-hans').convert(traditional_sentence)
print(simplified_sentence)#陈奕迅
我们可以清楚的知道
对于示例:
traditional_sentence表示需要翻译的句子
simplified_sentence用来存放翻译后的句子
对于现有代码,在每次循环中:
先用 content 来装下一次循环中获取的字幕,再将它拼接到字段中写入文件
于是我们可以在每次写入文件之前将它作为 traditional_sentence调用Converter(‘zh-hans’).convert(traditional_sentence)方法,并将得到的数据返回到 content 。
修改代码经过上述考虑,我们可以在第18行后面添加以下代码:
content = Converter('zh-hans').convert(content)
也可以将第18行代码改写为
content = Converter('zh-hans').convert(data['content'])
运行成功
经过编译和运行,我们得到翻译过的srt文件,如图所示:
最终代码import json
import math
import os
from pylangtools.langconv import Converter
file = '' # 这个变量用来保存数据
i = 1
for doc in os.listdir(): # 遍历当前文件夹的所有文件
if (doc[-4:] == 'json'): # 若是json文件则进行处理
name = doc[:-5] # 提取文件名
# 将此处文件位置进行修改,加上utf-8是为了避免处理中文时报错
with open(doc, encoding='utf-8') as f:
datas = json.load(f) # 加载文件数据
f.close()
for data in datas['body']:
start = data['from'] # 获取开始时间
stop = data['to'] # 获取结束时间
content = data['content'] # 获取字幕内容
content = Converter('zh-hans').convert(content) # 将繁体中文转化为简体中文
#content = Converter('zh-hans').convert(data['content'])此行等同于上面两行代码
file += '{}n'.format(i) # 加入序号
hour = math.floor(start) // 3600
minute = (math.floor(start) - hour * 3600) // 60
sec = math.floor(start) - hour * 3600 - minute * 60
minisec = int(math.modf(start)[0] * 100) # 处理开始时间
file += str(hour).zfill(2) + ':' + str(minute).zfill(2) + ':' + str(sec).zfill(2) + ',' + str(
minisec).zfill(2) # 将数字填充0并按照格式写入
file += ' --> '
hour = math.floor(stop) // 3600
minute = (math.floor(stop) - hour * 3600) // 60
sec = math.floor(stop) - hour * 3600 - minute * 60
minisec = abs(int(math.modf(stop)[0] * 100 - 1)) # 此处减1是为了防止两个字幕同时出现
file += str(hour).zfill(2) + ':' + str(minute).zfill(2) + ':' + str(sec).zfill(2) + ',' + str(
minisec).zfill(2)
file += 'n' + content + 'nn' # 加入字幕文字
i += 1
with open('./{}.srt'.format(name), 'w', encoding='utf-8') as f:
f.write(file) # 将数据写入文件
f.close()
打包为可执行文件
我们还可以将做好的程序打包成为可执行文件(.exe),于是我又双叒去网上搜索了一下。
终于给我找到了。
又是熟悉的pip install
pip install PyInstaller
然后Win+Q搜索cmd,打开cmd管理员窗口
用cd 命令进入到你需要打包的python文件所在的文件夹下
然后输入
pyinstaller -F -w [文件名].py
按下Enter后,执行成功后,出现下面界面
然后会在当前目录下生成两个文件夹
执行文件就在dist文件夹中,然后我们将json字幕文件放到dist文件夹中,双击exe文件,就会生成一个srt文件了。
下面附上我自己做出来的文件链接,大家可以下载玩玩。
json_to_srt(TC_to_CN)



