📝

Google DriveとLLMで議事録を自動生成する仕組みを作る

2025/01/23に公開

Google DriveとLLMで議事録を自動生成する仕組みを作る

こんにちは。 株式会社エスマットでSREをしているbiosugar0です。
今回は私が社内向けに構築した Google Driveにアップロードされた音声・動画ファイルからLLMを使って自動的に議事録を生成するシステムを紹介します。Python製です。

数ある会議や電話、インタビュー音源を文字起こしし、要点をまとめる作業は非常に手間がかかりがちです。そこで、Google Cloud Run・Google Workflow・Whisper・gpt-4o などを活用して、書き起こしから最終的な議事録ドキュメントを作成するまでを自動化しました。Googleカレンダー情報の連携やSRT形式による動画連携、フォルダ名による処理分岐など、拡張性を持った仕組みを整えているので、そのポイントを順番に紹介していきます。

システム全体概要

全体構成図

  1. 共有ドライブにファイルアップロード
    • 会議音声やインタビュー動画などを特定フォルダに置く。
  2. 5分ごとのCloud Run JobがDriveの変更を検知
    • Google Drive APIの変更履歴(Change API)をもとに差分をFirestoreに記録し、Pub/Subにメッセージを投げる。
  3. Google WorkflowでファイルIDを受け取り、議事録生成ジョブ(Cloud Run Job)を実行
    • Firestoreのファイル情報やパス情報を参照しながら音声変換や書き起こしの準備をする。
  4. Whisperで文字起こし&gpt-4oで議事録生成
    • 動画ファイルの場合は moviepyffmpeg を使って音声トラックを抽出 → Whisper → gpt-4o
  5. Google Docs APIで自動ドキュメント出力
    • 生成した文章をDocs API経由で同じフォルダに新規作成。Slack通知でユーザーに共有。
  6. 議事録完成通知
    • SlackのBlock Kitなどを用いて議事録の完成を視認性高く通知。

アーキテクチャで重視した点

  • 変更検知をCloud Run Jobが担当
    5分おきに起動し、Google Driveの変更分だけをFirestoreへ登録。Pub/Subにメッセージ送信することで、多数ファイルに対してもスケーラブルに処理できる。
  • 本処理はGoogle Workflow + Cloud Run Job
    受け取ったファイルIDをGoogle Workflowで受信し、本番ジョブのコンテナを起動して非同期で書き起こし・議事録生成を実行。
    “キック役(変更検知)” と “重い処理役(議事録生成)” を分けることで、保守もしやすい。
  • 柔軟な拡張
    フォルダ名や拡張子による分岐で拡張機能を追加しやすい構成。

WhisperでのSRT生成と議事録フォーマット

このプロジェクトではOpenAIの Whisper API を使い、動画ファイルの場合は moviepy で音声のみ抽出→Whisperにかけてテキスト化しています。

if mime_type == "video/mp4":
    # mp4 -> mp3に変換
    with VideoFileClip(temp_file.name) as video:
        video.audio.write_audiofile(temp_mp3.name)
    srt_content = transcribe_audio(client, temp_mp3.name)

さらにWhisperが出力したテキストを SRT形式 に変換します。SRTによって後続の要約処理や、時刻別のリンク生成(後述)がやりやすくなります。
Whisper API 単体でもSRT出力は可能ですが、chunkして分割処理するときにはwhisperには verbose_json 出力させ、自前でそれをマージしてSRT形式に変換してしまったほうが楽です。
whisper APIを使うとだいたいcontext長の制限で引っかかるので、chunkして分割する必要があります。

transcript = client.audio.transcriptions.create(
    file=audio_file,
    model="whisper-1",
    temperature=0,
    response_format="verbose_json",
    language="ja",
    prompt=transcript_prompt,
)

SRTのタイムスタンプで動画連携

議事録本文には該当トピックの冒頭秒数からジャンプできるリンクを付与しています。

例えば start_time_str1h10m11s ならGoogle Driveの動画URLに #t=1h10m11s を付けることで、議事録の任意の場所から動画の該当箇所に飛べる 仕組みです。

link_url = f"{base_url}#t={start_time_str}"

gpt-4oで議事録テンプレートを自動生成

Whisperで作成したSRT結果に対して、LLMを使って議事録を生成しています。

  1. 話題分割:gpt-4o によってSRTを解析し、「会話が切り替わったセクション」を5つ以上に分割させるようプロンプト指定
  2. 各トピックごとに簡潔要約: gpt-4o によって箇条書きなどの形式で出力させる
  3. 最終的な議事録レイアウト(参加者一覧、会議の概要、Next Step、質疑応答、インサイトなど) をHTMLとして整形

生成したHTMLをparseし、Docs API用に変換してGoogleDocsに流し込むことで、最終的な議事録を作成しています。
また、作成完了と同時にslackでその議事録の概略と共に作成完了通知を行っています。

Googleカレンダー情報で議事録に文脈を追加

議事録を生成する前に、GoogleカレンダーAPIを使って会議情報を取得し、議事録に追加情報を付与しています。
マッチするイベントが見つかったら、会議タイトル/参加者メール/会議説明 などの情報を議事録作成時に追加できます。これにより「書き起こしには出てこないが、カレンダー上で事前に登録してあった情報」を補完して議事録を作成可能です。

検索の際には、処理対象の録画ファイルを格納するフォルダ名をslackのユーザー名にすることで、slackのユーザー名でメールアドレスを取得し、 ドメイン全体の委任 を利用することでカレンダーAPIでそのユーザーの予定を検索できるようにしています。

フォルダ名による処理分岐

音声・動画に限らず、同じ仕組みでPDFを扱う例もあります。特定のフォルダにPDFファイルがアップロードされたらOCRをしてテキスト化→ gpt-4oに投げてIDを抽出し、Google Drive上のファイル名をIDに変更、などのフローを取り入れています。

if "feature-rename" in full_path:
    if mime_type == "application/pdf":
        renameSurveyScanFile(drive_service, file_id)

これにより、「フォルダに入れるだけでOCR→ID抽出→自動リネーム」までを実行できます。
このフォルダ名による処理分岐は、新しい機能を追加する際にも柔軟に対応できるため、拡張性を高めることができます。

まとめ

  • Google Drive へのファイルアップロードをトリガーに、WhisperとLLMを組み合わせた議事録自動生成
  • SRT形式 で書き起こしを管理し、タイムスタンプを使って動画とのリンクを簡単に設定
  • GoogleカレンダーAPI で会議情報を補完し、より的確な議事録を自動生成
  • フォルダ構成/拡張子 を利用して機能を切り替え、インタビュー議事録やPDFファイルrenameなど多用途に対応

Google Workspaceを利用している組織であれば、こうしたGoogle Driveをトリガーにした自動化は非常に有用で様々な業務に応用できるのではないでしょうか。
こうした形でLLMを活用しているよという事例でした。

株式会社エスマット

Discussion