概要
無料で文字起こし(その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()






