SRT 字幕純文字提取神器:一鍵清除序號與時間軸

你是否曾經需要從 .srt 字幕檔案中提取純文字內容,卻被惱人的序號、時間軸空白行打亂?傳統的文字處理方式容易誤刪內容(例如字幕剛好是數字),效率低落。

本文將介紹一個強大且穩健的 Python 腳本,它採用 SRT 檔案的區塊結構分析原理,能夠精準地刪除所有非字幕資訊,完美保留每一句對話。


🎯 腳本核心目標

我們的 Python 腳本將實現以下功能:

  1. 讀取使用者指定的外部 .srt 檔案。
  2. 精準識別並移除 SRT 檔案中每一組的:
    • ❌ 序號行 (例如: 1, 2)
    • ❌ 時間軸行 (例如: 00:00:02,680 --> 00:00:04,360)
    • ❌ 所有多餘的空白行。
  3. 保留所有字幕內容,即使字幕是純數字也不會誤刪。
  4. 將提取出的純文字內容輸出到終端機或指定的新 .txt 檔案。

🛠️ 第一步:準備工作

1. 安裝 Python (如果尚未安裝)

請確保你的電腦已經安裝了 Python 3 環境。你可以從 Python 官網 下載並安裝。

2. 儲存腳本

將以下程式碼儲存為一個檔案,命名為 srt_to_text.py

Python

import os
import re
import sys

def extract_subtitles_by_block(input_filepath, output_filepath=None):
    """
    讀取一個 .srt 檔案,使用區塊分析模式,精準提取字幕內容。
    """
    if not os.path.exists(input_filepath):
        print(f"❌ 錯誤: 找不到檔案 {input_filepath}")
        return [] if output_filepath is None else None
    
    if not input_filepath.lower().endswith('.srt'):
        print(f"⚠️ 警告: 檔案 {input_filepath} 似乎不是 .srt 格式。")

    try:
        # 1. 讀取整個檔案內容
        with open(input_filepath, 'r', encoding='utf-8') as f:
            content = f.read()

        # 2. 以兩個連續的換行符分割成獨立的字幕區塊 (\n\n 或 \r\n\r\n)
        blocks = re.split(r'\n\s*\n|\r\n\s*\r\n', content.strip())
        
        subtitle_lines = []
        
        for block in blocks:
            if not block.strip():
                continue
            
            # 將區塊內的行按換行符分割
            lines = block.splitlines()
            
            # 依據 SRT 結構,字幕內容從 lines[2] (第三行) 開始
            if len(lines) >= 3:
                for line in lines[2:]:
                    stripped_line = line.strip()
                    # 只添加非空行,處理多行字幕
                    if stripped_line:
                        subtitle_lines.append(stripped_line)
                        
    except Exception as e:
        print(f"❌ 讀取或處理檔案時發生錯誤: {e}")
        return [] if output_filepath is None else None

    # 處理輸出
    if output_filepath:
        try:
            with open(output_filepath, 'w', encoding='utf-8') as outfile:
                outfile.write('\n'.join(subtitle_lines))
            print(f"✅ 成功提取字幕並儲存至:{output_filepath}")
            return None
        except Exception as e:
            print(f"❌ 寫入檔案時發生錯誤: {e}")
            return subtitle_lines
    else:
        return subtitle_lines


def main():
    # 檢查命令行參數
    if len(sys.argv) < 2:
        print("💡 使用方式:")
        print(f"   python {sys.argv[0]} <輸入的.srt檔案路徑> [輸出的.txt檔案路徑]")
        print("\n範例:")
        print(f"   python {sys.argv[0]} my_video.srt")
        print(f"   python {sys.argv[0]} my_video.srt output.txt")
        return

    input_file = sys.argv[1]
    output_file = None

    if len(sys.argv) > 2:
        output_file = sys.argv[2]
        
    print(f"🚀 正在處理檔案: {input_file}")
    
    if output_file:
        extract_subtitles_by_block(input_file, output_file)
    else:
        subtitles_list = extract_subtitles_by_block(input_file)
        if subtitles_list:
            print("\n--- 提取出的字幕內容 ---")
            print("\n".join(subtitles_list))
            print("--------------------------")
        elif subtitles_list is not None:
             print("⚠️ 提取結果為空,請檢查 .srt 檔案內容。")


if __name__ == '__main__':
    main()

💻 第二步:執行腳本

打開你的命令提示字元 (Windows) 或終端機 (macOS/Linux),導航到你存放 srt_to_text.py 的目錄。

方式一:列印到終端機 (快速檢視)

如果你只是想快速查看提取出的純文字內容,不需要存檔,則只提供 SRT 檔案路徑。

  • 命令格式: python srt_to_text.py <你的 SRT 檔案名>

Bash

# 假設你的字幕檔名為 my_episode.srt
python srt_to_text.py my_episode.srt

結果輸出:

🚀 正在處理檔案: my_episode.srt

--- 提取出的字幕內容 ---
放棄台積電的主管
轉到這個跑道上來
那個心中的掙扎應該是蠻大的吧
--------------------------

方式二:儲存到純文字檔案 (永久存檔)

如果你想將結果儲存為一個新的 .txt 檔案,請在命令後加上你想要的輸出檔名。

  • 命令格式: python srt_to_text.py <輸入 SRT 檔案名> <輸出 TXT 檔案名>

Bash

# 將 my_episode.srt 的結果儲存到 script_output.txt
python srt_to_text.py my_episode.srt script_output.txt

結果輸出:

🚀 正在處理檔案: my_episode.srt
✅ 成功提取字幕並儲存至:script_output.txt

深入理解:腳本為何如此穩健?

這個腳本的精妙之處在於它不依賴內容猜測,而是利用 SRT 檔案的固定格式

行號內容類型腳本處理
1序號 (例如 1)忽略 (這是區塊中的第一行)
2時間軸 (例如 00:00 --> ...)忽略 (這是區塊中的第二行)
3字幕內容保留
4+額外的字幕內容 (多行)保留

透過先用空行將整個檔案切割成獨立的「字幕區塊」,再針對每個區塊,我們只需要跳過前兩行,就能確保抓取到的永遠是正確的字幕文字,完美解決了字幕內容剛好是純數字所導致的誤刪問題

現在,你可以輕鬆、快速且精準地將任何 .srt 字幕文件轉換為乾淨的純文字稿了!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *