1. はじめに:AI時代の「データの洪水」をどう捌くか
ボイスレコーダーで毎日数時間の記録を取っていると、すぐに数テラバイトの音声データが積み上がります。これをすべてWhisperなどのASR(自動音声認識)に投げるのは、計算リソース(GPU時間)の無駄であり、何より「無音区間でのハルシネーション(幻覚)」というAI特有の問題に直面します。
本記事では、「信号処理による特徴量抽出」と「AIによる文字起こし」を組み合わせた、効率的な音声解析パイプラインの構築について解説します。
2. 解析パイプラインのアーキテクチャ
本システムは以下の4つのステージで構成されるパイプラインとして設計しました。
-
Segmentation: 長尺ファイルを1分単位のチャンクに分割
-
Audio Profiling:
torchaudioを用いた物理量(RMS, Spectral Flatness)の抽出とスコアリング -
Heuristic Selection: タイムウィンドウ(30分間隔)内での代表ファイル選出
-
AI Transcription: 厳選された区間のみを
Whisper-mediumで推論
3. 実装の肝:信号処理によるフィルタリング
3.1 RMS(音量)とSpectral Flatness(スペクトル平坦度)
単に音量が大きい箇所を探すだけでは、空調の「ゴー」という音や電車の走行音を拾いすぎてしまいます。そこで、**Spectral Flatness(スペクトル平坦度)**を導入しました。
-
RMS (Root Mean Square): 音のエネルギー。
-
Spectral Flatness: 音のスペクトルがどれだけ平坦かを示す指標。
-
ホワイトノイズに近い音(ザーという音)ほど 1.0 に近づく。
-
声のように特定の周波数にエネルギーが集中する音ほど 0 に近づく。
-
この2つを組み合わせ、独自の「お宝スコア」を算出します。
# スコア算出ロジックの核
score = rms / (flatness + 1e-5)
この式により、「ノイズが少なく、明瞭な声が入っている区間」をアルゴリズム的にあぶり出します。
3.2 30分間隔の代表選出アルゴリズム
一日全体の流れを把握するため、単純な「上位N個」ではなく、**「時間帯ごとの代表」**を選出します。
pandas の groupby を活用することで、各時間枠内で最も高いスコアを持つファイルを抽出します。
4. Whisper推論の最適化とハルシネーション対策
文字起こしフェーズでは、1分単位のチャンク処理特有の課題を以下の設定で解決しました。
-
VRAM管理: RTX 3060の12GBを活かし、
mediumモデルを採用。 -
ハルシネーション抑制: 無音やノイズ区間を無理やり文字化させない設定。
-
no_speech_threshold=0.6: 無音判定を厳格化。 -
condition_on_previous_text=False: チャンク間の文脈依存を切り、ループ現象を防止。
-
5. 分析を加速させる Reviewer GUI
解析結果のCSVをフロントエンドとして活用するTkinter製のGUIツールを構築しました。
-
Treeviewによる動的ソート: ファイル名(時間軸)での確認と、スコア順(重要度軸)での確認をトグル可能に。
-
非同期再生:
pygameミキサーを使い、リストをダブルクリックした瞬間に該当の1分間をロードして再生。
6. 考察:環境音のセマンティック解析
今回面白かったのは、文字起こし結果から「今、電車に乗っている」「オフィスにいる」といったコンテキストの自動推測の可能性が見えたことです。
例えば、電車の通過音がある区間はWhisperがハルシネーションを起こしやすいですが、逆に言えばその信号特性を捉えることで、行動ログとしてのタグ付けが自動化できます。
7. まとめと展望:LLMへの橋渡し
本パイプラインにより、数時間の録音をわずか10分〜15分程度の「代表区間」の確認だけで把握できるようになりました。
今後の展望としては、厳選された音声チャンクを Gemini 1.5 Pro/Flash API に投げ、背景音からの状況推測や、より高精度なマルチモーダル要約を自動生成するステージを追加する予定です。
技術スタック:
-
Python 3.11
-
PyTorch / torchaudio
-
OpenAI Whisper
-
NVIDIA GeForce RTX 3060 (12GB)