本指南將為您提供一個完整的Python腳本,該腳本具備GUI介面,能夠讀取.srt字幕檔案,並根據使用者指定的多個時段篩選出需要保留的字幕。保留的字幕將重新計算起訖時間,最終生成一個新的.srt檔案,支持中文、英文及日文等多語言字幕。
為了順利執行此 Python 腳本,請確保已安裝以下套件:
tkinter:Python的標準GUI程式庫。pysrt:用於處理.srt字幕檔案的Python庫。您可以使用以下指令安裝必要的套件:
pip install pysrt
以下是一個完整的Python腳本範例,使用tkinter建立GUI介面,並運用
import tkinter as tk
from tkinter import filedialog, messagebox
import pysrt
from datetime import timedelta
class SubtitleEditor:
def __init__(self, master):
self.master = master
master.title("SRT字幕編輯器")
master.geometry("600x500")
# 檔案選擇
self.file_frame = tk.Frame(master)
self.file_frame.pack(pady=10)
self.select_button = tk.Button(self.file_frame, text="選擇字幕檔 (.srt)", command=self.select_file)
self.select_button.pack(side=tk.LEFT, padx=5)
self.file_label = tk.Label(self.file_frame, text="尚未選擇檔案")
self.file_label.pack(side=tk.LEFT, padx=5)
# 時段輸入區域
self.time_frame = tk.Frame(master)
self.time_frame.pack(pady=10)
self.add_time_button = tk.Button(self.time_frame, text="新增時段", command=self.add_time_range)
self.add_time_button.pack()
self.times_display = tk.Frame(master)
self.times_display.pack(pady=10)
self.time_entries = []
self.add_time_range() # 初始化一個時段輸入列
# 執行按鈕
self.process_button = tk.Button(master, text="處理並儲存", command=self.process_subtitles)
self.process_button.pack(pady=20)
def select_file(self):
file_path = filedialog.askopenfilename(filetypes=[("SRT files", "*.srt")])
if file_path:
self.file_label.config(text=file_path)
self.filename = file_path
else:
self.file_label.config(text="尚未選擇檔案")
def add_time_range(self):
frame = tk.Frame(self.times_display)
frame.pack(pady=5)
tk.Label(frame, text="從 (HH:MM:SS,mmm)").pack(side=tk.LEFT)
start_entry = tk.Entry(frame, width=15)
start_entry.pack(side=tk.LEFT, padx=5)
start_entry.insert(0, "00:00:00,000")
tk.Label(frame, text="到 (HH:MM:SS,mmm)").pack(side=tk.LEFT)
end_entry = tk.Entry(frame, width=15)
end_entry.pack(side=tk.LEFT, padx=5)
end_entry.insert(0, "00:00:00,000")
self.time_entries.append((start_entry, end_entry))
def process_subtitles(self):
if not hasattr(self, 'filename'):
messagebox.showerror("錯誤", "請先選擇一個.srt檔案")
return
# 讀取並解析時間範圍
keep_ranges = []
for start_entry, end_entry in self.time_entries:
start = start_entry.get()
end = end_entry.get()
try:
start_td = self.parse_time(start)
end_td = self.parse_time(end)
if start_td >= end_td:
raise ValueError("開始時間必須小於結束時間")
keep_ranges.append((start_td, end_td))
except Exception as e:
messagebox.showerror("錯誤", f"時間範圍有誤: {e}")
return
try:
# 讀取字幕檔
subtitles = pysrt.open(self.filename, encoding='utf-8')
new_subtitles = pysrt.SubRipFile()
new_index = 1
total_offset = timedelta(0)
for sub in subtitles:
for keep_start, keep_end in keep_ranges:
if keep_start <= sub.start <= keep_end and keep_start <= sub.end <= keep_end:
# 調整時間
adjusted_start = sub.start - keep_start + total_offset
adjusted_end = sub.end - keep_start + total_offset
new_subtitles.append(pysrt.SubRipItem(index=new_index,
start=adjusted_start,
end=adjusted_end,
text=sub.text))
new_index += 1
total_offset += (adjusted_end - adjusted_start)
break # 只保留在第一個匹配的區間
# 儲存新的字幕檔案
save_path = filedialog.asksaveasfilename(defaultextension=".srt",
filetypes=[("SRT files", "*.srt")])
if save_path:
new_subtitles.save(save_path, encoding='utf-8')
messagebox.showinfo("成功", "字幕檔案已成功處理並保存")
except Exception as e:
messagebox.showerror("錯誤", f"處理字幕檔時發生錯誤: {e}")
def parse_time(self, time_str):
"""解析時間字串為timedelta物件"""
try:
h, m, s_ms = time_str.split(':')
s, ms = s_ms.split(',')
return timedelta(hours=int(h), minutes=int(m), seconds=int(s), milliseconds=int(ms))
except:
raise ValueError(f"無效的時間格式: {time_str}")
if __name__ == "__main__":
root = tk.Tk()
app = SubtitleEditor(root)
root.mainloop()
假設您有以下原始.srt檔案內容:
1
00:00:59,002 --> 00:01:01,202
AA
2
00:02:15,045 --> 00:02:17,045
BB
3
00:02:44,908 --> 00:02:47,744
CC
4
00:04:21,371 --> 00:04:24,671
DD
並且您希望保留以下兩個時段:
經過處理後,新的.srt檔案將如下所示:
1
00:00:00,045 --> 00:00:02,045
AA
2
00:00:26,371 --> 00:00:29,671
DD
此Python腳本主要包含以下部分:
tkinter建立簡單易用的使用者介面,提供字幕檔案選擇、時段輸入、處理啟動等功能。timedelta物件,方便進行時間運算。腳本開始部分會匯入Python標準庫中的tkinter模組,以及
import tkinter as tk
from tkinter import filedialog, messagebox
import pysrt
from datetime import timedelta
使用tkinter建立主視窗、按鈕、輸入框等元件,讓使用者能夠選擇檔案、輸入保留的時間範圍,並觸發處理功能。
提供一個按鈕讓使用者選擇.srt檔案,並在介面上顯示所選檔案的路徑。
使用者可以點擊「新增時段」按鈕來增加多個時間範圍的輸入框,每個範圍需要分別輸入開始和結束時間。
在使用者輸入完所有需要保留的時段後,點擊「處理並儲存」按鈕。腳本將讀取原始字幕檔,篩選出落在保留時段內的字幕,並重新計算這些字幕的時間點,最終生成一個新的字幕檔案。
腳本將「HH:MM:SS,mmm」格式的時間字串轉換為timedelta物件,方便進行時間加減運算,並且將調整後的時間重新轉換回原始格式以寫入新的.srt檔案。
假設您有一個影片的字幕檔案,裡面包含多段字幕。您希望保留影片中的特定兩個時段的字幕,並刪除其他所有字幕。使用此腳本,您可以輕鬆指定要保留的時段,並生成一個僅包含這些時段字幕的新.srt檔案。
本腳本支援多語言字幕,包括中文、英文、日文等。無論您的字幕內容使用哪種語言,腳本都能正確處理並生成新的.srt檔案。
在GUI介面中,點擊「新增時段」按鈕即可增加更多的時間範圍輸入欄位。每個時段需要分別輸入開始和結束時間,格式必須為「HH:MM:SS,mmm」。
保留的字幕根據指定的時段重新賦予新的時間點,這樣可以確保字幕在新的時間線上正確顯示。例如,第一個保留時段的字幕將從00:00:00開始,而非影片的實際播放時間。
此腳本不限制字幕內容的語言,支持如中文、英文、日文等Unicode字幕。您只需確保選擇的.srt檔案使用UTF-8編碼,以避免字符顯示問題。
通過此Python腳本,您可以輕鬆地管理.srt字幕檔案,根據需要保留特定的時段字幕,並生成新的字幕檔案。無論是用於影片剪輯、內容整理,還是語言學習,本工具都能提供便捷的解決方案。