Python入門トップページ


目次

  1. 仮想環境を構築し,watchdog をインストールする
  2. Watchdog でフォルダを監視する
  3. 新しいファイルを検知する
  4. 検知した新しいファイルを待ち行列フォルダに移動する
  5. 文字起こし処理用のワーカープログラムのひな形を作成する
  6. ワーカープログラムを常駐化する
  7. フォルダ監視とワーカープログラムでパイプライン処理する
  8. 処理用フォルダを設置してそこで処理を行う
  9. ファイルサイズの変化を監視する
  10. サイズの大きなファイルのコピーに対応する
  11. タイムスタンプを表示する
  12. Subprocess で外部コマンドを起動する
  13. WhisperX の設定を行う
  14. ワーカープログラムで音声データからの文字起こしを実行する
  15. 文字起こし結果を完了用フォルダに移動する
  16. ログを保存し例外を処理する
  17. サブフォルダに結果を格納する
  18. Ollama をインストールする
  19. Python から Ollama にプロンプトを送る
  20. Ollama 処理を関数化する
  21. 文字起こしデータから議事録を作成する
  22. サイズの大きなテキストファイルにも対応する
  23. ワーカープログラムで文字起こし結果から議事録を生成する
  24. 議事録をマークダウンファイルに出力する
  25. 文字コードを強制的に指定する

フォルダ監視により,音声ファイルから文字起こしと議事録生成を自動化しよう

処理用フォルダを設置してそこで処理を行う

前のページまででパイプライン処理の基本形が出来上がりました.ただ,一瞬で全ての処理が終わってしまっていました.将来的にはワーカープログラムでは文字起こしや議事録生成など,時間を要する処理を行うことを考えます.現時点では待ち行列にある複数のファイルのうちどのファイルが処理中であるかがわかりにくい状態です.どのファイルが処理中であるかがわかりやすくなるように,作業用 working フォルダに移動して,そのフォルダで処理を進めるようにしてみましょう.

具体的にはワーカープログラムを次のように修正します.なお,処理中であることがさらにわかりやすいように10秒間のスリープも設定しています.

worker.py
from pathlib import Path
import shutil
import time

BASE_DIR = Path(__file__).parent
QUEUE_DIR = BASE_DIR / "queue"
WORKING_DIR = BASE_DIR / "working"
DONE_DIR = BASE_DIR / "done"

# ディレクトリを作っておく
QUEUE_DIR.mkdir(parents=True, exist_ok=True)
WORKING_DIR.mkdir(parents=True, exist_ok=True)
DONE_DIR.mkdir(parents=True, exist_ok=True)

try:
    while True:
        for src in QUEUE_DIR.glob("*.md"): # 拡張子が .md のファイルだけ
            print(f"処理開始: {src.name}")
            working_file = WORKING_DIR / src.name
            shutil.move(src, working_file)
            print(f"作業開始: {working_file}")
            with open(working_file, "r", encoding="utf-8") as f:
                print("処理中...")
                time.sleep(10)
                print(f.read())
            dst = DONE_DIR / src.name
            shutil.move(working_file, dst)
            print(f"完了: {dst}")
        time.sleep(1)

except KeyboardInterrupt:
    print("停止します")

ターミナルを2個起動し,それぞれで watch.py と worker.py を実行します.

(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog> python watch.py ⏎
(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog> python worker.py ⏎

2つのプログラムが開始されたら,監視用 watch フォルダにマークダウンファイルを4個格納します.その結果,マークダウンファイルが待ち行列用 queue フォルダに移動し,その中から1個のファイルが作業用 working フォルダに移動し,そこで内容を表示,10秒後に完了用 done フォルダに移動します.実行中に待ち行列用 queue フォルダや作業用 working フォルダの状態を詳細に確認してください.

(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog> python watch.py
新しいファイルを検出: C:\Users\rinsaka\Documents\python\watchdog\watch\sample1.md
新しいファイルの名前: sample1.md
新しいファイルを移動: C:\Users\rinsaka\Documents\python\watchdog\queue\sample1.md
新しいファイルを検出: C:\Users\rinsaka\Documents\python\watchdog\watch\sample2.md
新しいファイルの名前: sample2.md
新しいファイルを移動: C:\Users\rinsaka\Documents\python\watchdog\queue\sample2.md
新しいファイルを検出: C:\Users\rinsaka\Documents\python\watchdog\watch\sample3.md
新しいファイルの名前: sample3.md
新しいファイルを移動: C:\Users\rinsaka\Documents\python\watchdog\queue\sample3.md
新しいファイルを検出: C:\Users\rinsaka\Documents\python\watchdog\watch\sample4.md
新しいファイルの名前: sample4.md
新しいファイルを移動: C:\Users\rinsaka\Documents\python\watchdog\queue\sample4.md
Ctrl + C
停止します
(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog>

(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog> python worker.py
処理開始: sample1.md
作業開始: C:\Users\rinsaka\Documents\python\watchdog\working\sample1.md
処理中...
# Watchdog
Watchdogでフォルダを監視します.

完了: C:\Users\rinsaka\Documents\python\watchdog\done\sample1.md
処理開始: sample2.md
作業開始: C:\Users\rinsaka\Documents\python\watchdog\working\sample2.md
処理中...
# 自動処理
新たなファイルが保存されたときに,自動的に何らかの処理を行いたい.

完了: C:\Users\rinsaka\Documents\python\watchdog\done\sample2.md
処理開始: sample3.md
作業開始: C:\Users\rinsaka\Documents\python\watchdog\working\sample3.md
処理中...
# サンプル
3番目のファイルです.

完了: C:\Users\rinsaka\Documents\python\watchdog\done\sample3.md
処理開始: sample4.md
作業開始: C:\Users\rinsaka\Documents\python\watchdog\working\sample4.md
処理中...
# サンプル
4番目のサンプルファイルです.

完了: C:\Users\rinsaka\Documents\python\watchdog\done\sample4.md
Ctrl + C
停止します
(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog>

全ての処理が終了すれば完了用 done フォルダにまとまっていることを確認します.

(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog> gci done ⏎

    ディレクトリ:C:\Users\rinsaka\Documents\python\watchdog\done

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2026/10/25    18:18             56 sample1.md
-a---          2026/10/25    18:18            115 sample2.md
-a---          2026/10/25    18:19             47 sample3.md
-a---          2026/10/25    18:19             59 sample4.md

(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog>

なお,ここまではファイルサイズの小さなマークダウンファイルで処理をしてきました.将来的にはサイズの大きな音声ファイルなどの処理を行うことを考えます.ここで監視用フォルダに音声ファイルをダウンロードして保存しようとしたとき,音声ファイルの全てのダウンロードが完了する前に待ち行列用フォルダに移動する処理が動いてしまう可能性があります.次のページではこうした問題に対応する方法を考えます.

目次に戻る