catch-img

動画から議事録を自動生成するシステムを実装してみた──Whisper AIで見えた「本当の価値」と「落とし穴」

はじめに

こんにちは、DIVXの阿部です。

議事録作成は、従来の手作業で時間がかかるプロセスですが、音声認識AIを活用することで自動化できます。

この記事では、**OpenAI Whisper**をベースにした議事録自動生成システムを構築した経験と、実際に使ってみて分かった「使えるポイント」と「注意すべき落とし穴」について共有します。

最小限のセットアップ(ローカル環境で準備)

Whisperを使い始めるのに必要な準備は、驚くほどシンプルです。

 Whisperのインストール

まず、仮想環境を作成してWhisperをインストールします。

 基本的な使い方

python3 -m venv .venv
source .venv/bin/activate  # Windowsの場合は .venv\Scripts\activate
pip install whisper


Whisperの基本的な使い方は、以下のように非常にシンプルです。

import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")


これだけで、音声ファイルから文字起こしが可能です。言語指定はオプションで、自動検出も利用できます。


 システムの基本的な構成


今回実装したシステムは、以下のような構成になっています。


 各コンポーネントの役割


1. Web UI: ファイルのアップロードと結果の表示を行うインターフェース

2. Flask API: ファイルの受け取り、Whisperの呼び出し、後処理を統括

3. Whisper: OpenAIが開発した音声認識エンジン(オープンソースとして提供、ライセンス下で利用可能)

4. 後処理: タイムスタンプの整形、専門用語の置換など


 実装の詳細


 基本的な実装の流れ


Whisperを使った実装は、以下の3ステップで完了します。



 コード例(最小限)


 1. 音声認識の実行


import whisper
model = whisper.load_model("base")
result = model.transcribe(filepath, language='ja')


 2. タイムスタンプの整形


from datetime import timedelta




def format_timestamp(seconds):

    """秒数を時:分:秒形式に変換"""

    td = timedelta(seconds=int(seconds))

    hours, remainder = divmod(td.seconds, 3600)

    minutes, seconds = divmod(remainder, 60)

    return f"{hours:02d}:{minutes:02d}:{seconds:02d}"


 3. 専門用語の自動置換


TECHNICAL_TERMS = {
    'クーベネティス': 'Kubernetes',
    'エーピーアイ': 'API',
    'エーピーアイゲートウェイ': 'API Gateway',
}
def replace_technical_terms(text):
    """専門用語を辞書に基づいて置換"""
    for key, value in TECHNICAL_TERMS.items():
        text = text.replace(key, value)
    return text


今回はプロトタイプとして、分かりやすさを優先し、辞書をコードにベタ書きしています。

一方で、サービス運用を前提にする場合は、辞書をコードにベタ書きするのではなく、CSV/スプレッドシートやDBで管理し、更新を運用フローに乗せるのが現実的です。用語の表記揺れや同義語も増えるため、更新頻度や責任範囲を決めて「辞書を育てる」設計が重要になります。



 ローカル環境で動作確認してみる


 サーバー起動


docker-compose up


ブラウザで http://localhost:5001 にアクセスすると、以下のようなUIが表示されます(ポート番号は設定によって異なる場合がありますので、事前に確認してください)。



ファイルをドラッグ&ドロップするか、クリックしてファイルを選択すると、対応する音声ファイル形式(例:.wav, .mp3など)の場合に自動的に音声認識が開始されます。


 実際の処理結果


4分程度の会議音声ファイルを処理した結果、以下のような議事録が生成されました。


処理時間: 約2分18秒

ファイル形式: WAV


生成された議事録の一部(誤認識も含まれる例):

[00:00:00 - 00:00:04] 票は鈴木さんが 研修のため不財です
[00:00:04 - 00:00:06] それ以外の皆さんはそろっているので
[00:00:06 - 00:00:10] 今週の集事定例新直会を 始めていきましょう
[00:00:10 - 00:00:16] それぞれ新直の報告をお願いします まず高橋さんからお願いします


タイムスタンプ付きで文字起こしが生成され、後から確認しやすい形式になっています。


実際に使ってみて分かった「落とし穴」

落とし穴1: 音声ファイルの形式問題

問題: 対応していない形式の音声ファイルをそのまま渡すと、音声形式やサンプリングレートの不一致によりエラーが発生することがある。

対策: まずは「対応形式を明示し、非対応ファイルは受け付けない」という設計に寄せるのが現実的です。必要であれば、特定の形式(例:モノラル/16kHz)に統一する前処理を追加することで、対応範囲を広げられます。

落とし穴2: 処理時間の見積もり

問題: 一般的なCPU環境では、モデルサイズや音声品質、ハードウェア構成によって処理時間が大きく変動する。条件によってはリアルタイムの2〜5倍程度かかることがある。

対策: モデルサイズを調整することで、精度と速度のバランスを取れます。

  • tiny: 処理は速いが精度は低め

  • base: 精度と速度のバランスが良い(今回採用)

  • large: 高精度だが処理が重い


落とし穴3: 専門用語の誤認識

問題: 技術用語や社内用語が正しく認識されない。例えば「Kubernetes」がカタカナ表記になったり、「API Gateway」が全角カタカナになることがある。

対策: 一方で、サービス運用を前提にする場合は、辞書をコードにベタ書きするのではなく、CSV/スプレッドシートやDBで管理し、更新を運用フローに乗せるのが現実的です。用語の表記揺れや同義語も増えるため、更新頻度や責任範囲を決めて「辞書を育てる」設計が重要になります。1つ具体例を挙げると文字起こしログから誤認識候補を抽出し、AIで置換候補を提示し、人が承認して反映する半自動フローにすると、安全性と効率のバランスが取りやすいのではと考えています。


学んだこと:AIは「完璧な自動化」ではなく「効率化のツール」

この取り組みを通じて、最も大きな学びは**「AIに100%任せることはできない(その必要もない)」**ということです。

人間が関与すべきポイント

1. 文脈の補完: AIは「何について話しているか」を理解できない

2. 重要度の判断: どの発言が重要で、何を記録すべきかはAIには分からない

3. 最終チェック: 誤認識や不自然な表現は、やはり人の目で確認が必要

AIの得意なこと、人間の得意なこと

  • AIが得意: 大量の音声を素早くテキスト化する、繰り返しの作業

  • 人間が得意: 文脈を理解する、重要な情報を抽出する、読みやすく整形する


この役割分担を意識することで、**議事録作成の時間を約70%削減することができました**。完全に自動化するのではなく、「叩き台を作ってくれる優秀なアシスタント」として使うことが、最も効果的でした。


 まとめ

Whisperを使った議事録自動生成システムの実装を通じて、以下のことが分かりました。

  • Whisperは強力: オープンソースでありながら、商用ツールに匹敵する精度

  • 後処理が重要: 生の出力をそのまま使うのではなく、整形処理で使いやすさが大幅に向上

  • 完璧を求めすぎない: 100%の自動化を目指すのではなく、「叩き台を作るツール」として使うのが現実的

Whisperは、議事録作成を驚くほど簡単にしてくれます。 ローカル環境でサクッと試せるので、ぜひ一度触ってみてください。

ただし、生成された議事録は、必ず人間による確認と修正が必要です。AIの得意なことは任せ、人間にしかできないことは人間がやる。この協働のバランスを見つけることが、真の「AI活用」なのかもしれません。

 今後の展望

今回実装したシステムは、基本的な文字起こし機能の一例に過ぎません。Whisperには、さらに多くの可能性があります。


実務での展望

 1. 話者識別機能の追加

Whisperは音声認識に特化したモデルであり、話者識別機能は標準では提供されていませんが、pyannote.audioなどのライブラリを組み合わせることで、話者識別を実現できます。

 2. 議事録の構造化

現在は時系列の文字起こしのみですが、以下のような構造化も可能です:

  • 議題ごとの分類

  • 決定事項の抽出

  • アクションアイテムの自動抽出


3. リアルタイム処理

現在はファイルをアップロードしてから処理しますが、WebSocketを使うことでリアルタイムでの文字起こしも可能です。実現するには、音声データのストリーミングと遅延制御が必要になります。

今回の取り組みを通じて、私たちは「AIをどう使うか」ではなく「AIとどう協働するか」を考えることの重要性を学びました。これは、AIカンパニーとして、今後も様々なプロジェクトで活かしていきたい知見です。


参考リンク