20230812在WIN10下使用python3将SRT格式的字幕转换为SSA格式

news2025/1/15 6:46:28

20230812在WIN10下使用python3将SRT格式的字幕转换为SSA格式
2023/8/12 20:58


本文的SSA格式以【Batch Subtitles Converter(批量字幕转换) v1.23】的格式为准!

1、
缘起:网上找到的各种各样的字幕转换软件/小工具都不是让自己完全满意!
【都有各种各样的小瑕疵】
因此决定用python3自己写一个练手!
本文的python脚本只处理UTF8编码的SRT格式字幕,ANSI编码的SRT格式请自行参照本文修改了!
!!!!Batch Subtitles Converter(批量字幕转换) v1.23 绿色英文版:不能修改/自定义所需要的SSA字幕的位置和颜色/字体/字号。


subresync.exe:不支持UTF8编码的字幕!且不能修改/自定义所需要的SSA字幕的位置和颜色/字体/字号。
vobsub.dll

技术点:
Red.Eye.2005.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-FGT.cn9.srt
将《迫在眉睫》的英文字母通过google翻译之后的中文SRT格式的字幕转换为SSA格式!

path_to_save_txt+utf8_file.cn.srt

1
00:02:12,766 --> 00:02:16,099
泰勒·鲍勃和玛丽安·泰勒和我在一起

2
00:02:16,100 --> 00:02:16,900
一秒


path_to_save_txt+utf8_file.cn.ssa

[Script Info]
; This is a Sub Station Alpha v4 script.
Title: path_to_save_txt+utf8_file.cn
ScriptType: v4.00
Collisions: Normal
PlayDepth: 0

[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Tahoma,25,&H80ff00,&H00ffff,&H000008,&H000008,-1,0,1,2,0,6,80,80,80,0,134

[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: Marked=0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000,0000,!Effect,泰勒·鲍勃和玛丽安·泰勒和我在一起
Dialogue: Marked=0,0:02:16.10,0:02:16.90,Default,NTP,0000,0000,0000,!Effect,一秒


重点:将SRT格式的时间轴修改为SSA格式的,需要使用python3的字符串处理/分割功能!


PYTHON SRT转SSA
python 时间轴 字符串拆分


https://www.techiedelight.com/zh/split-string-with-delimiters-python/
在 Python 中使用分隔符拆分字符串

在 Python 中使用分隔符拆分字符串
Google Translate Icon
这篇文章将讨论如何在 Python 中使用分隔符分割字符串。

1.使用 re.split() 功能
通过模式的出现来拆分字符串的简单解决方案是使用内置函数 re.split().模式可以由一个或多个分隔符组成:

在单个分隔符上拆分

要使用单个分隔符拆分字符串,您只需将该分隔符传递给 re.split() 功能。

import re
if __name__ == '__main__':
    s = 'Hello,World'
    res = re.split(',', s)                # split with comma
    print(res)                            # ['Hello', 'World']


Microsoft Windows [版本 10.0.19045.2311]
(c) Microsoft Corporation。保留所有权利。

C:\Users\Administrator>python
Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
KeyboardInterrupt
>>> temp = '00:00:16,533 --> 00:00:18,366'
>>> import re
>>> temp
'00:00:16,533 --> 00:00:18,366'
>>> res = re.split(':', temp)
>>> print(res)
['00', '00', '16,533 --> 00', '00', '18,366']
>>> res[0]
'00'
>>> res[1]
'00'
>>> res[2]
'16,533 --> 00'
>>>
>>> re.split('-->', res[2])
['16,533 ', ' 00']
>>> res[3]
'00'
>>> res[4]
'18,366'
>>>

 


srt2ssa.py

# coding=utf-8

import re


#f2 = open(new_file, "w", encoding="UTF-8")
f2 = open('test.ssa', "w", encoding="UTF-8")

f2.write('[Script Info]\n')
f2.write('; This is a Sub Station Alpha v4 script.\n')
f2.write('Title: 8月7日.cn\n')
f2.write('ScriptType: v4.00\n')
f2.write('Collisions: Normal\n')
f2.write('PlayDepth: 0\n')
f2.write('\n')
f2.write('[V4 Styles]\n')
f2.write('Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding\n')
f2.write('Style: Default,Tahoma,25,&H80ff00,&H00ffff,&H000008,&H000008,-1,0,1,2,0,6,80,80,80,0,134\n')
f2.write('\n')
f2.write('[Events]\n')
f2.write('Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n')
#f2.write('Dialogue: Marked=0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000,0000,!Effect,泰勒·鲍勃和玛丽安·泰勒和我在一起\n')


#with open(file, "r", encoding="UTF-8") as f:
#f = open(file, "r", encoding="UTF-8")
f = open('path_to_save_txt+utf8_file.cn.srt', "r", encoding="UTF-8")
lines = f.readlines()

temp = 1
xuhao = 1;

for line in lines:
    if temp == 1:
        #f2.write(str(xuhao))
        #f2.write(str('\n'))
        #temp=0
        temp=2
    else:
        #time8 = ''
        
        # 2023/8/11 9:09 发现SRT的空格
        if len(line) == 1:
            temp=1
            xuhao = xuhao+1
        #f2.write(line)
        # 2023/8/11 9:34 中英文字幕干掉空格行之后的时间轴
        elif temp == 2:
            temp = 3
            #res = re.split(':', temp)
            time1 = re.split(':', line)
            #re.split('-->', res[2])
            #time2 = re.split('-->', time1[2])
            time2 = re.split(' --> ', time1[2])
            #Dialogue: Marked=0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000,0000,!Effect,泰勒·鲍勃和玛丽安·泰勒和我在一起
            #time8 = 'Dialogue: Marked=0,' + time1[0] + time1[1] + time2[0] + time2[1] + time1[3] + time1[4] + ',Default,NTP,0000,0000,0000,!Effect,'
            
            #time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time2[0] + ':' + time2[1] + ':' + time1[3] + ':' + time1[4] + ',Default,NTP,0000,0000,0000,!Effect,'
            #print(line.rstrip())
            #time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time2[0] + ':' + time2[1] + ':' + time1[3] + ':' + time1[4].rstrip() + ',Default,NTP,0000,0000,0000,!Effect,'
            #time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time2[0] + ',' + time2[1] + ':' + time1[3] + ':' + time1[4].rstrip() + ',Default,NTP,0000,0000,0000,!Effect,'
            
            #Dialogue: Marked=0,00:02:12,76, 00:02:16,099,Default,NTP,0000,0000,0000,!Effect,泰勒·鲍勃和玛丽安·泰勒和我在一起
            #time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time2[0][0:5] + ',' + time2[1] + ':' + time1[3] + ':' + time1[4].rstrip() + ',Default,NTP,0000,0000,0000,!Effect,'

 


            
            #Dialogue: Marked=0,00:02:12,766,00:02:16,099,Default,NTP,0000,0000,0000,!Effect,泰勒·鲍勃和玛丽安·泰勒和我在一起
            #time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time2[0] + ',' + time2[1] + ':' + time1[3] + ':' + time1[4].rstrip() + ',Default,NTP,0000,0000,0000,!Effect,'

 


            
            #Dialogue: Marked=0,0:02:12.76,0:02:16.09,Default,NTP,0000,0000,0000,!Effect,泰勒·鲍勃和玛丽安·泰勒和我在一起
            #Dialogue: Marked=0,00:02:12,76,00:02:16,09,Default,NTP,0000,0000,0000,!Effect,泰勒·鲍勃和玛丽安·泰勒和我在一起
            #time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time2[0][0:5] + ',' + time2[1] + ':' + time1[3] + ':' + time1[4][0:5] + ',Default,NTP,0000,0000,0000,!Effect,'
            
            #time2[0][2] = '.' 
            #time1[4][2] = '.'
            #time2 = re.split(' --> ', time1[2])
            time5 = re.split(',', time2[0][0:5])
            time6 = re.split(',', time1[4][0:5])
            #time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time2[0][0:5] + ',' + time2[1] + ':' + time1[3] + ':' + time1[4][0:5] + ',Default,NTP,0000,0000,0000,!Effect,'
            time8 = 'Dialogue: Marked=0,' + time1[0] + ':' + time1[1] + ':' + time5[0] + '.' + time5[1] + ',' + time2[1] + ':' + time1[3] + ':' + time6[0] + '.' + time6[1] + ',Default,NTP,0000,0000,0000,!Effect,'
        #else if temp == 2:
        elif temp == 3:
            #f3.write(line_en)
            #f4.write(line)
            #f2.write(line)
            f2.write(time8 + line)
            #f2.write('\n\n')

 

 


参考资料:
https://mathpretty.com/10393.html
Python字幕转换工具–asstosrt


https://fiime.cn/blog/281970
如何实现ass/ssa批量转换srt的脚本


https://www.techiedelight.com/zh/split-string-with-delimiters-python/
在 Python 中使用分隔符拆分字符串


https://zhuanlan.zhihu.com/p/460511660
python如何切割字符串


TypeError: 'str' object does not support item assignment
https://pythonjishu.com/python-error-66/
Python报”TypeError: ‘str’ object does not support item assignment “的原因以及解决办法


https://blog.51cto.com/u_15849381/5801826
python TypeError: ‘str‘ object does not support item assignment 报错解决方法


https://blog.csdn.net/scp_6453/article/details/107866043
解决python中“TypeError ‘str‘ object does not support item assignment”问题


python字符串截取
https://www.ycpai.cn/python/xBRw8f2K.html
python怎么截取字符串
print(string[2:8]) # 输出:llo, W


#for line in lines: python 逐行读取
https://blog.csdn.net/weixin_39662834/article/details/109925505
python逐行获取_Python逐行读取文件内容的三种方法


python if else if
https://blog.csdn.net/MeiWenjilu/article/details/127546798
python中的if和if_else以及if_elif_else


https://blog.csdn.net/ldgk3ekkd/article/details/126383516
python使用docx模块读写docx文件的方法与docx模块常用方法


https://www.php.cn/faq/395631.html
Python读写docx文件的方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/869645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年中国智慧公安行业发展现况及发展趋势分析:数据化建设的覆盖范围不断扩大[图]

智慧公安基于互联网、物联网、云计算、智能引擎、视频技术、数据挖掘、知识管理为技术支撑,公安信息化为核心,通过互联互通、物联化、智能方式促进公安系统各功能模块的高度集成、协同作战实现警务信息化“强度整合、高度共享、深度应用”警察发展的新概…

goland插件推荐Rider UI Theme Pack

推荐一个goland配色插件Rider UI Theme Pack,里面自带visual assist配色,配色截图如下: 直接在plugins里面进行搜索或者在插件home page下载后进行安装均可。 总算找到一统vscode 和goland二者优势的插件了。

由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题

d3dx9_42.dll是一个动态链接库文件,它是Microsoft DirectX 9的一部分。这个文件包含了DirectX 9的一些函数和资源,用于支持计算机上运行基于DirectX 9的应用程序和游戏。它通常用于提供图形、音频和输入设备的支持,以及其他与图形和游戏相关的…

【分布式系统】聊聊高性能设计

每个程序员都应该知道的数字 高性能 对于以上的数字,其实每个程序员都应该了解,因为只有了解这些基本的数字,才能知道对于CPU、内存、磁盘、网络之间数据读写的时间。1000ms 1S。毫秒->微秒->纳秒-秒->分钟 为什么高性能如此重要的…

分布式任务调度平台XXL-JOB使用

说明:分布式任务调度平台XXL-JOB,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用(官方语)。 本文介绍使用XXL-JOB实现定时执行代码,可用于项目中…

postgresql之内存池-GenerationContext

创建GenerationContext MemoryContext GenerationContextCreate(MemoryContext parent,const char *name,Size blockSize) {GenerationContext *set; ...set (GenerationContext *) malloc(MAXALIGN(sizeof(GenerationContext))); .../* Fill in GenerationContext-specific …

利用ApiPost实现Mock Server服务

APIPOST可以让你在没有后端程序的情况下能真实地返回接口数据,你可以用APIPOST实现项目初期纯前端的效果演示,也可以用APIPOST实现开发中的数据模拟从而实现前后端分离。在使用APIPOST之前,你的团队实现数据模拟可能是下面的方案中的一种或者…

android Ndk Jni动态注册方式以及静态注册

目录 一.静态注册方式 二.动态注册方式 三.源代码 一.静态注册方式 1.项目名\app\src\main下新建一个jni目录 2.在jni目录下,再新建一个Android.mk文件 写入以下配置 LOCAL_PATH := $(call my-dir)//获取当前Android.mk所在目录 inclu

uniapp开发(由浅到深)

文章目录 1. 项目构建1.1 脚手架构建1.2 HBuilderX创建 uni-app项目步骤: 2 . 包依赖2.1 uView2.2 使用uni原生ui插件2.3 uni-modules2.4 vuex使用 3.跨平台兼容3.1 条件编译 4.API 使用4.1 正逆参数传递 5. 接口封装6. 多端打包3.1 微信小程序3.2 打包App3.2.1 自有…

IO密集型服务提升性能的三种方法

文章目录 批处理缓存多线程总结 大部分的业务系统其实都是IO密集型的系统,比如像我们面向B端提供摄像头服务,很多的接口其实就是将各种各样的数据汇总起来,展示给用户,我们的数据来源包括Redis、Mysql、Hbase、以及依赖的一些服务…

Linux查看GPU显卡/CPU内存/硬盘信息

显卡信息命令/CPU内存/硬盘 1.显卡2、CPU内存3、硬盘 1.显卡 nvidia-smi nvidia-smi(显示一次当前GPU占用情况) nvidia-smi -l(每秒刷新一次并显示) watch -n 5 nvidia-smi (其中,5表示每隔6秒刷新一次终端…

java下载JDK

1.去官网下载 https://www.oracle.com/java/technologies/javase-downloads.html 2.点击 傻瓜式安装 注意选择版本跟电脑系统就行 下载后文件的作用

7.8 SpringBoot事务@Transactional实战 管理员借阅审核

文章目录 前言一、事务是用来干什么的?事务是用来解决什么问题的?二、事务执行的流程三、事务的ACID四大特性四、事务的四种隔离级别五、声明式事务Transactional六、web层实战七、service层实战7.1 BookBorrowService7.2 细数BookBorrowServiceImpl实战细节7.2.1 …

【Linux命令详解 | chmod命令】 chmod命令用于修改文件或目录的权限,保护文件安全性。

文章目录 简介一,参数列表二,使用介绍1. 修改用户权限2. 修改用户组权限3. 修改其他用户权限4. 同时修改多个权限5. 使用数字模式设置权限6. 递归修改目录权限 总结 简介 在Ubuntu系统中,chmod命令是一个强大的工具,用于修改文件…

数据库技术--数据库引擎,数据访问接口及其关系详解(附加形象的比喻)

目录 背景数据库引擎Jet数据库:ISAM:ODBC(Open Database Connectivity): 数据访问接口ADO(ActiveX Data Objects)DAO(Data Access Objects)RDO(Remote Data O…

美团视觉GPU推理服务部署架构优化实战

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

由于找不到vcruntime140.dll,无法继续执行代码,有什么修复方法比较推荐

首先我们在解决vcruntime140.dll问题前,先了解一下vcruntime140.dll是什么,它有什么用途跟作用。 vcruntime140.dll是Microsoft 安装程序的一部分,它是Windows操作系统中的一个动态链接库文件。该文件包含了一些常用的运行时函数和变量&…

Leetcode-每日一题【剑指 Offer 24. 反转链表】

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 解题思路 1.题目要求我们反转…

[NOIP2003 普及组] 栈

题目背景 栈是计算机中经典的数据结构&#xff0c;简单的说&#xff0c;栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作&#xff0c;即 pop&#xff08;从栈顶弹出一个元素&#xff09;和 push&#xff08;将一个元素进栈&#xff09;。 栈的重要性不言自…

【佳佳怪文献分享】MVFusion: 利用语义对齐的多视角 3D 物体检测雷达和相机融合

标题&#xff1a;MVFusion: Multi-View 3D Object Detection with Semantic-aligned Radar and Camera Fusion 作者&#xff1a;Zizhang Wu , Guilian Chen , Yuanzhu Gan , Lei Wang , Jian Pu 来源&#xff1a;2023 IEEE International Conference on Robotics and Automat…