無料で文字起こし (その3)作成したTXTをSRTに変換し字幕用データにする

概要

無料で文字起こし(その2)で作ったTXTは議事録作成用としていたのでTXT形式でした。せっかくなので動画編集時の字幕用ファイルSRTへ変換できるようにコードを作ったので紹介です。DaVince Resolveなどで字幕に扱えます。

前回の投稿は次のURLカードを参照してください。

Pythonコード

このコードををメモ帳へ貼り付けて「TXTtoSRT.py」とファイル名を設定して保存する

from __future__ import annotations
import re
from pathlib import Path
import tkinter as tk
from tkinter import filedialog, messagebox

LINE_RE = re.compile(
    r"""^(?P<speaker>\S+)\s+\[(?P<start>\d{2}:\d{2}:\d{2}\.\d{3})\s*-\s*(?P<end>\d{2}:\d{2}:\d{2}\.\d{3})\]\s*(?P<text>.*)$"""
)

def to_srt_timestamp(ts: str) -> str:
    return ts.replace(".", ",")

def convert_txt_to_srt(input_path: Path, output_path: Path) -> int:
    lines = input_path.read_text(encoding="utf-8").splitlines()

    blocks: list[str] = []
    idx = 0

    for raw in lines:
        raw = raw.strip()
        if not raw:
            continue

        m = LINE_RE.match(raw)
        if not m:
            # 形式違いの行があると初心者が困るので、行内容も添えて明示
            raise ValueError(f"対応していない行形式です:\n{raw}")

        text = m.group("text").strip()
        if not text:
            continue

        idx += 1
        start = to_srt_timestamp(m.group("start"))
        end = to_srt_timestamp(m.group("end"))
        blocks.append(f"{idx}\n{start} --> {end}\n{text}\n")

    output_path.write_text("\n".join(blocks).strip() + "\n", encoding="utf-8")
    return idx

def main() -> None:
    # tkinterのルートウィンドウは表示しない(ダイアログだけ使う)
    root = tk.Tk()
    root.withdraw()

    messagebox.showinfo(
        "TXT→SRT 変換",
        "入力テキストファイルを選択してください。\n"
        "形式例: SPEAKER_00 [00:00:01.000 - 00:00:02.000] テキスト"
    )

    in_file = filedialog.askopenfilename(
        title="入力テキストを選択",
        filetypes=[("Text files", "*.txt"), ("All files", "*.*")]
    )
    if not in_file:
        return

    out_file = filedialog.asksaveasfilename(
        title="SRTの保存先を指定",
        defaultextension=".srt",
        initialfile=Path(in_file).with_suffix(".srt").name,
        filetypes=[("SubRip Subtitle", "*.srt")]
    )
    if not out_file:
        return

    try:
        count = convert_txt_to_srt(Path(in_file), Path(out_file))
    except Exception as e:
        messagebox.showerror("変換エラー", str(e))
        return

    messagebox.showinfo("完了", f"SRTを書き出しました。\n件数: {count}\n保存先: {out_file}")

if __name__ == "__main__":
    main()

使い方

  1. TXTtoSRT.py ファイルを開く
    Pythonアプリで開きます。
  2. 確認ウィンドウが開く
    OKをクリック
  3. 入力テキストをを選択ウィンドウが開く
    TXTファイルを選択して開く
  4. SRTの保存先を指定ウィンドウが開く
    ファイル名を入力して、SRTファイルを保存する
  5. 完了ウィンドウが表示される