インデックス&コントロールシステム / フロントエンド開発

録音した数万件もの音声ファイルを整理し、いつでも瞬時に検索・再生・管理できるようにすることは、個人アーカイブシステムにおける最大の課題です。本記事では、特定エリア(JP26など)の番組表を自動で巡回パトロールして番組メタデータをインデックス化し、自作の「レトロハードウェア風WebUI」から録音・再生・Whisper音声認識・アーカイブ修復を一元管理するシステム構築の取り組みについて解説します。

このシステムは、単に音声をダウンロードするだけでなく、「過去7日間のタイムシフト番組表をローカルにインデックス化するパトロールクローラー」「登録された任意の検索ディレクトリ群からオフラインファイルを再帰探索する自己修復(Self-Healing)機能」を組み合わせ、ファイル名や保存場所が変更されても自動でリンク切れを防ぐ、耐久性の高い仕様となっています。

パトロール・クロールによるローカル番組表データベースの構築

Radikoのタイムフリーは過去7日分しか聴取できません。この期間を過ぎると番組詳細データも公式サイトから取得できなくなります。そこで、バックグラウンドで動く自動巡回パトロールスクリプトを構築しました。

クローラーは定期的に(既定では6時間おきに)エリアID(例:京都エリア JP26)に所属する全放送局の番組表XMLを取得し、番組タイトル、出演者、番組詳細、放送枠をパースしてローカルの番組データベース(CSVおよびSQLite)に記録します。これにより、タイムシフト配信が終了した過去の番組でも、タイトルや説明文から検索可能な「恒久的なインデックス」が構築されます。

自己修復(Self-Healing)型検索ディレクトリ機能の設計

録音ファイルを外部HDDや大容量ストレージ(H:\radiko\など)に整理して移動させると、データベースに記録されたファイルパスが不一致を起こし、WebUIから再生やダウンロードができなくなる「リンク切れ」が発生します。本システムでは、この問題を解決するために自己修復(Self-Healing)機能を実装しました。

ユーザーは設定タブから任意の「検索対象ディレクトリ(複数登録可)」を指定できます。ファイルが見つからないリクエストが発生すると、バックグラウンドで指定されたディレクトリ群を再帰的(サブフォルダ含む)に高速スキャンし、一致するファイル名(例:LFR_20260531_xxxx.m4a)を検知すると、即座にデータベースのファイルパスを新しい絶対パスに自動書き換えして修復します。これにより、手動のフォルダ整理を許容する柔軟性が得られました。

# webui.py に実装された自己修復スキャンロジック
def find_file_in_search_directories(filename: str, search_dirs: list) -> str:
    for s_dir in search_dirs:
        if not os.path.exists(s_dir):
            continue
        for root, _, files in os.walk(s_dir):
            if filename in files:
                return os.path.join(root, filename)
    return ""
Retro-Futuristic Radio Tuner WebUI Mockup

図1. 琥珀色LEDとレベルメーターを配した自作WebUI「オーディオデッキ」

レトロフューチャーWebUIのデザインシステム

UIは「80年代〜90年代のラジオチューナーデッキ・カセットデッキ」を彷彿とさせる、落ち着いたデザインシステムで構築されています。

  • カラーパレット: 背景には純黒に近い #0a0908#1c1917 を用い、アクセントカラーには真空管やLEDをイメージした琥珀色(アンバーグロウ #f97316)を採用。
  • 操作パネル: 音声波形や状態表示用LED(録音中・完了・エラー)を配置。
  • 音素復号ログ(Whisper): 文字起こしを実行すると、グリーンフォントのターミナル風画面が表示され、文字起こしテキストのログが出力される演出を導入。
  • 高機能再生バー: 下部に固定されたプレイヤーには、再生速度を 0.5x から 8.0x まで無段階でチューニングできる「SPEEDスライダー」が搭載され、英会話番組やトーク番組のリスニングに対応しています。

実際の動作画面と使いやすさの検証

実際に構築したWebUIから以下の操作をテストし、その動作性能を検証しました。

機能項目 検証アクション 結果とユーザビリティ
自動巡回インデックス JP26エリアの京都放送(KBS)等の7日分の番組表取得 数秒でクローリングが完了し、インデックス件数・新規検出数が即時反映された。
アーカイブ自動修復 ファイルを H:\radiko\KBS\202605\ へ手動移動後にWebUIから再生 移動先のパスが短時間で検出され、履歴が自動アップデートされて再生が開始された。
Whisper文字起こし 録音済みの15分番組を選択し「文字起こし」を実行 バックグラウンドでWhisperによる処理が走り、完了後にターミナル画面からテキストログが表示された。

まとめ: クローラーによる自動番組データ収集と、自己修復による物理フォルダ移動のサポート、そしてカセットデッキを操作しているかのようなWebUIにより、実用的なラジオ録音アーカイブシステムが構築できました。このシステムは、毎日のラジオ聴取体験を快適にするプロダクトです。