有时候,我们想把srt格式的字幕文件,转换成 lrc 格式的字幕文件,怎么办?批量转换呢?
于是,自己使用开源软件,手撸了一个简单的字幕转换工具。下载链接在文末尾。
通过使用python、pyside6学习开发《字幕转换助手》这款Windows桌面端软件。软件支持将常见的字幕格式 'srt', 'smi', 'vtt', 'stl', 'sbv', 'sub', 'ass', 'ttml', 'dfxp', 'xml', 'lrc' 进行格式相互转换。
通过项目的练手,掌握pycharm环境下使用PySide6开发桌面端软件、并打包发布的整个流程。
1.1、项目简介:
想转就转字幕转换助手,使用pyside6进行图形界面开发,支持常见字幕格式文件之间相互转换,不仅支持单个文件,也支持批量字幕文件格式转换。在软件内部代码中,主要调用了SubtitleEdit.exe这款开源软件。
1.2.2、主窗口分2个区:左侧菜单区、右侧工作区
二、项目架构
2.1、开发设备
Windows10 64位电脑
2.2、开发工具
PyCharm Community Edition 2022.1.1、Python 3.8.10、PySide6、Pyinstaller、auto-py-to-exe
2.3、技术点
UI设计: 使用pyside6-designer.exe设计,
Ui编译:使用pyside6-uic.exe编译成py文件,
逻辑功能实现:Python
主要第三软件:SubtitleEdit.exe
项目打包:auto-py-to-exe
2.4、项目搭建
2.4.0、构建项目虚拟环境
Pycharm打开后,在File菜单选择New Project,打开界面,新建项目名Subtitle_Assistant,同时新建一个Base interpreter为Python 3.8的虚拟环境venv,如下:
2.4.1、pyside6配置:
Pycharm终端Terminal,虚拟环境下输入:pip install pyside6==6.4.3 回车后等待安装成功:Successfully installed PySide6-6.4.3 PySide6-Addons-6.4.3 PySide6-Essentials-6.4.3 shiboken6-6.4.3
2.4.2、配置外部工具pyside6-designer.exe、pyside6-uic.exe、Pyside6-rcc.exe
参考:PySide6开发实战案例:艺术签名助手_pyside6 window程序开发-CSDN博客
2.4.3、项目结构
入口函数,位于app.py里的main函数。其中,
img存放图标图片文件;
src文件夹存放各模块程序源代码文件;
ui文件夹存放pyside designer设计的ui 文件;
venv文件夹为项目虚拟环境文件夹;
三、模块功能实现:
3.1、主界面
3.1.1、界面UI
在Pycharm中打开Tools菜单进入External Tools,选择使用pyside6-designer.exe设计主窗口界面,保存为 index.ui文件。
3.1.2、UI转py文件
index.ui文件完成后使用pyside6-uic.exe编译成 ui_index.py文件,供src/index_module/index.py文件引入,补充界面设计,并添加业务逻辑。
四、核心代码:
4.1、subtitle_convert_page.py的部分代码:
# 1、对于目标格式为lrc:
if self.target_format == 'lrc':
# 如果源文件格式srt,则
if source_format == 'srt':
# srt转lrc,调用srt_to_lrc.py模块中的函数,其它格式转换,采用2、其它格式
# srt文件转成lrc格式的文本字符串
lrc_str = srt_to_lrc(file_path_wait_handle)
# 将lrc格式的文本字符串写入到lrc文件中
with open(out_file_path, "w+", encoding='utf-8') as fo:
fo.write(lrc_str)
# 如果转换后目标文件存在,则表示转换成功:
if os.path.isfile(out_file_path):
# 表格中“处理状态”字段值设置为“处理完成!”
self.set_handle_status_item(row_index, "处理完成!")
else:
# 表格中“处理状态”字段值设置为“出错啦!”
self.set_handle_status_item(row_index, "出错啦!")
# 如果源文件格式不是srt,则先将其转为srt,再srt转lrc
elif source_format != 'srt':
# 命令行输入文件
cmd_in_file = f'{file_path_wait_handle}'
# 命令行输出格式
cmd_out_format = "srt"
# 命令行输出文件,srt文件保存文件夹
cmd_out_folder = f'/outputfolder:"{self.out_dir_lineEdit_2.text()}"'
# 命令行转格式字符串
cmd = f'{SubtitleEdit_path} /convert "{cmd_in_file}" {cmd_out_format} {cmd_out_folder}'
# print("转换字幕cmd:", cmd)
# 执行命令行
result_state = os.system(cmd)
if result_state == 0:
# 转换成srt文件后,再将srt文件转为lrc文件
srt_file_path = out_file_path.replace('.lrc', '.srt')
# srt文件转成lrc格式的文本字符串
lrc_str = srt_to_lrc(srt_file_path)
# 将lrc格式的文本字符串写入到lrc文件中
with open(out_file_path, "w+", encoding='utf-8') as fo:
fo.write(lrc_str)
# 如果转换后目标文件存在,则表示转换成功:
if os.path.isfile(out_file_path):
# 表格中“处理状态”字段值设置为“处理完成!”
self.set_handle_status_item(row_index, "处理完成!")
else:
# 表格中“处理状态”字段值设置为“出错啦!”
self.set_handle_status_item(row_index, "出错啦!")
# 2、其它格式转换
else:
# Subtitle Edit 命令行选项参考:https://www.nikse.dk/subtitleedit/help
# 语法:SubtitleEdit /convert "pattern" "name-of-format-without-spaces" [/encoding:?] [/fps:?] [/outputfolder:?]:
# 举例:SubtitleEdit /convert sub1.srt sami 将srt转成sami格式
# 命令行输入文件
cmd_in_file = f'{file_path_wait_handle}'
# 命令行输出格式
cmd_out_format = f'{self.target_format}'
# 命令行输出文件
cmd_out_folder = f'/outputfolder:"{self.out_dir_lineEdit_2.text()}"'
# 命令行转格式字符串
cmd = f'{SubtitleEdit_path} /convert "{cmd_in_file}" {cmd_out_format} {cmd_out_folder}'
# print("转换字幕cmd:", cmd)
# 执行命令行
result_state = os.system(cmd)
if result_state == 0:
# 表格中“处理状态”字段值设置为“处理完成!”
self.set_handle_status_item(row_index, "处理完成!")
else:
# 表格中“处理状态”字段值设置为“出错啦!”
self.set_handle_status_item(row_index, "出错啦!")
else:
# 弹出警告消息框提示
QMessageBox.warning(self, "警告", "请添加文件!")
五、打包项目:
参考:PySide6开发实战案例:艺术签名助手_pyside6 window程序开发-CSDN博客
打包软件下载地址: 想转就转字幕转换助手