栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【python】实现将json字幕转srt,并将繁体中文翻译为简体中文

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【python】实现将json字幕转srt,并将繁体中文翻译为简体中文

【python】实现将json字幕转srt,并将繁体中文翻译为简体中文
  • 背景
  • 实现过程
    • json转srt
      • 创建python文件
      • 将json文件复制到同一文件夹下
      • 错误1
      • 运行成功
      • 代码(json_to_srt)
    • 繁体中文转简体中文
      • 安装pylangtools
      • 导入pylangtools包
      • 分析示例
      • 修改代码
      • 运行成功
  • 最终代码
  • 打包为可执行文件

背景

前两天剪辑找视频资源的时候下载的一个视频没有中文字幕,找到的字幕文件只有json的繁体中文字幕文件,个人使用的PotPlayer播放器不支持json字幕,所以我决定给它转换成简体中文的srt格式字幕文件,希望对大家有所帮助。

实现过程 json转srt

首先我们需要将json文件改变其中的编码规则信息转为srt文件。搜了一圈找到
json字幕转换为srt字幕python。

创建python文件

创建一个py后缀的文件并将代码复制进去

将json文件复制到同一文件夹下

比如说我们创建的python文件在桌面,那么只需要将json文件放到桌面即可

错误1

运行,出现如下错误
看了下json文件

发现14行循环域错误,我们只需要在 datas后面加上[‘body’] 即可

for data in datas:>>>>for data in datas['body']
运行成功

再次编译,成功运行,生成srt文件


查看srt文件,没有问题

代码(json_to_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
根据文章示例,我们将对代码进行改动

安装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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/313656.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号