關於字幕檔我們常常會看到「.srt」、「.ass」、「.vtt」…等影片的字幕格式, 但你知道嗎? 這些字幕檔是很重要的一個寶貴資訊, 可以從中對段落的長度、文字進行提取, 此時就需要一個強大的工具來幫我們解析一下字幕檔, 就讓我們來看看怎麼用吧!
pip install pysubs2
他的用法除了可以直接用終端命令之外, 也可以在Python開發時進行引入並操作相關的API進行更細緻的處理。
終端命令的用法:
# 轉換.ass檔至.srt檔
pysubs2 --to srt *.ass
引入Python的用法
import pysubs2
# 載入字幕
subs = pysubs2.load("my_subtitles.ass", encoding="utf-8")
# 處理字幕
subs.shift(s=2.5)
for line in subs:
# 對每一行的文字內容進行加工
line.text = "{\\\\be1}" + line.text
# 將處理結果儲存成新的檔案
subs.save("my_subtitles_edited.ass")
為什麼只介紹這兩個部份呢? 因為基本上我們較常從這兩個類別進行異動, 無非就是更改整個字幕檔的樣式或者是對每一句進行裁切之類的加工程序。
這一個步驟可以幫我們了解一下套件的設計, 透過結構上的了解, 清楚的拆解字幕與片段的部份, 我們只要對於這兩個結構, 就能夠很容易的處理各種字幕內容。
結構上我們大致上拆成兩塊來看, 一塊是整個字幕結構, 另一塊是每個段落結構。
class SSAFile {
- events: List[SSAEvent] = [] #: :class:`SSAEvent` 實例的列表,即單獨的字幕。
- styles: Dict[str, SSAStyle] = {"Default": SSAStyle.DEFAULT_STYLE.copy()} #: :class:`SSAStyle` 實例的字典。
- info: Dict[str, str] = self.DEFAULT_INFO.copy() #: 包含腳本元數據的字典,即 ``[Script Info]``。
- aegisub_project: Dict[str, str] = {} #: 包含 Aegisub 專案的字典,即 ``[Aegisub Project Garbage]``。
- fonts_opaque: Dict[str, Any] = {} #: 包含嵌入字體的字典,即 ``[Fonts]``。
- graphics_opaque: Dict[str, Any] = {} #: 包含嵌入圖像的字典,即 ``[Graphics]``。
- fps: Optional[float] = None #: 讀取文件時使用的幀率(如適用)。
- format: Optional[str] = None #: 原始字幕文件的格式(如適用),例如 ``"srt"``。
}
class SSAEvent {
- start: int = 0 #: 字幕的開始時間(毫秒)
- end: int = 10000 #: 字幕的結束時間(毫秒)
- text: str = "" #: 字幕的文本(包含 SubStation 格式標記)
- marked: bool = False #: (僅限 SSA 格式)
- layer: int = 0 #: 層級編號,0 為最低層級(僅限 ASS 格式)
- style: str = "Default" #: 樣式名稱
- name: str = "" #: 演員名稱
- marginl: int = 0 #: 左邊距
- marginr: int = 0 #: 右邊距
- marginv: int = 0 #: 垂直邊距
- effect: str = "" #: 行效果
- type: str = "Dialogue" #: 行類型(對話/註釋)
}
# SSAFile
subs = pysubs2.load("my_subtitles.ass", encoding="utf-8")
# event: SSAEvent
for event in subs:
# 每個段落的內容
print(event.start)
print(event.end)
print(event.text)
print(event...)
這次就針對Python的字幕處理套件做一個簡單的介紹,其實要如何使用工具是其次,重點是我們可以用它來做什麼? 這提供了幾個方向給你啟發,如果你有任何不一樣的想法,歡迎下方留言互相交流與討論。
喜歡撰寫文章的你,不妨來了解一下:
Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?
歡迎加入一起練習寫作,賺取知識!