Zoom Memo Automation システム
Zoom Memo Automationは、Zoomクラウド録画を定期監視し、新しい録画を検知すると自動で文字起こし・要約を生成し、Google Driveに保存してSlackに通知するシステムです。
【2025年8月6日更新】 システム全体を責任分離された部品化サービスアーキテクチャに再設計しました。
説明: Zoom API経由で実際の録画データを取得し、シーケンシャル処理で効率的に動画・音声を処理する部品
実装場所: 1.src/services/zoomRecordingService.js
状態: ✅ 実装完了
ステップ | 処理内容 | メモリ効率 | 備考 |
---|---|---|---|
1. 録画リスト取得 | Zoom API からprocessableRecordingsを取得 | 軽量 | 処理可能な録画のみフィルタリング |
2. 動画処理 | MP4ダウンロード → Google Drive保存 → 共有リンク取得 | 中程度 | メモリバッファ使用、保存後すぐ解放 |
3. 音声処理 | M4A/MP3ダウンロード → Gemini AI処理 → メモリ破棄 | 高負荷 | 音声はGoogle Driveに保存しない |
4. 結果統合 | 動画リンク + 音声要約 → Slack投稿用データ生成 | 軽量 | 最終的な処理結果をまとめ |
メソッド名 | 機能 | 戻り値 |
---|---|---|
getRecordingsList() | 指定期間のZoom録画リスト取得 | 処理可能録画配列 |
processRecording() | 単一録画の完全処理(動画+音声) | 統合処理結果 |
processVideoFile() | 動画ファイル処理(取得→保存→共有リンク) | 動画保存結果 |
processAudioFile() | 音声ファイル処理(取得→AI処理→破棄) | 音声解析結果 |
processBatchRecordings() | 複数録画の一括処理(シーケンシャル) | 一括処理結果 |
説明: Google Drive「99.zoom_memo_recording/sample」フォルダからサンプル音声データを取得する部品(開発・テスト専用)
実装場所: 1.src/services/sampleDataService.js
状態: ✅ 実装完了(本番では非使用)
項目 | 内容 |
---|---|
対象フォルダ | Google Drive: 1Q_KNzjRFzd_n5ktbouZix2Hs13qfTP7a/sample |
検索ファイル | 音声ファイル(.m4a, .mp3, .wav)を優先選択 |
ダウンロード先 | /tmp/sample-data/(一時フォルダ) |
主要メソッド | getSampleData(), downloadSampleFile(), cleanup() |
説明: 音声ファイルをGeminiで8項目構造化要約を生成する部品
実装場所: 1.src/services/audioSummaryService.js
状態: ✅ 実装完了
項目 | 内容 |
---|---|
1. クライアント名 | 会議内容から推測されるクライアント名・組織名・プロジェクト名 |
2. 会議目的 | 会議が開催された理由・主要目標 |
3. 出席者名・社名 | 発言者から判別される参加者の名前・所属組織・役職 |
4. 資料 | 会議中に言及された資料・文書・データ・画面共有内容 |
5. 論点・議論内容 | 誰がどのような発言をし、どのような論理展開になったか(詳細) |
6. 結論・決定事項 | 会議で確定した事項・合意に達した内容 |
7. 宿題 | 今後調査・検討が必要な事項・持ち帰り検討項目 |
8. Next Action / Due Date | 具体的なアクションアイテムと実行期限・担当者 |
説明: 動画ファイルをGoogle Driveに保存し、組織内共有リンクを生成する部品
実装場所: 1.src/services/videoStorageService.js
状態: ✅ 実装完了
項目 | 内容 |
---|---|
保存先フォルダ | 99.zoom_memo_recording/{年}/{月}/ |
ファイル命名 | YYYY-MM-DD_HHMMSS_会議名.mp4 |
共有設定 | 組織ドメイン内で視聴可能リンク生成 |
主要メソッド | saveVideoToGoogleDrive(), ensureFolderStructure() |
説明: 8項目構造化要約と動画共有リンクをSlackに投稿する部品
実装場所: 1.src/services/meetingNotificationService.js
状態: ✅ 実装完了
項目 | 内容 |
---|---|
メッセージ構造 | ヘッダー + 基本情報 + 動画リンク + 8項目要約 + フッター |
通知種類 | 処理開始通知・完了通知・エラー通知 |
フォーマット | Slackブロック形式(Markdown対応) |
主要メソッド | sendStructuredMeetingSummary(), buildStructuredSlackMessage() |
説明: 検知された録画ファイル(音声・動画)を一時フォルダにダウンロードする機能
実装場所: 1.src/services/zoomService.js
状態: ✅ 実装完了
項目 | 内容 |
---|---|
ダウンロード対象 | 音声ファイル(M4A)、動画ファイル(MP4) |
保存先 | ./recordings(一時フォルダ) |
メタデータ取得 | 会議名、開始日時、参加者、時間 |
ファイル管理 | 処理完了後自動削除 |
説明: ダウンロードした音声ファイルをGoogle Gemini APIで高精度テキストに変換する機能
実装場所: 1.src/services/aiService.js
状態: ✅ 実装完了(動的モデル選択対応)
項目 | 内容 |
---|---|
対象ファイル | M4A音声ファイル(優先)、MP4動画ファイル |
使用モデル | Gemini 2.5 Pro → 2.0 Flash → 1.5 Flash(自動フォールバック) |
出力形式 | 日本語テキスト(話者識別付き) |
プロンプト | システム・ユーザープロンプトによる精度向上 |
説明: 文字起こしテキストを解析し、構造化された議事録を自動生成する機能
実装場所: 1.src/services/aiService.js(analyzeComprehensively)
状態: ✅ 実装完了
項目 | 内容 |
---|---|
入力データ | 文字起こしテキスト + 会議メタデータ |
出力構造 | 基本情報、議論内容、決定事項、Next Action & Due Date |
抽出項目 | 参加者、アクションアイテム(担当者・期限付き)、決定事項 |
形式 | Markdown構造化文書 |
説明: 録画ファイルをGoogle Driveの組織フォルダに自動保存し、共有リンクを生成する機能
実装場所: 1.src/services/googleDriveService.js
状態: 🔄 実装済み(認証設定待ち)
項目 | 内容 |
---|---|
保存対象 | MP4動画ファイル、M4A音声ファイル |
フォルダ構造 | Zoom_Recordings/2025/07/会議名_日付.mp4 |
共有設定 | 組織ドメイン内で視聴可能リンク生成 |
認証方式 | Google Cloud サービスアカウント |
説明: 議事録要約とGoogle Drive録画リンクをSlackチャンネルに自動投稿する機能
実装場所: 1.src/services/slackService.js
状態: ✅ 実装完了(運用品質向上機能実装済み)
項目 | 内容 |
---|---|
メッセージ形式 | Slackブロック形式(ヘッダー、基本情報、要約、リンク) |
投稿内容 | 会議要約、録画リンク、参加者、決定事項、Next Action |
添付ファイル | 文字起こし全文(TXTファイル) |
運用品質機能 | 要約全文表示(2700文字制限)、日付適切表示、エンドマーカー、切断検知 |
制御機能 | 開発モード時の通知無効化(DISABLE_SLACK_NOTIFICATIONS) |
説明: Google Drive APIの基本操作を提供する共通部品
実装場所: 1.src/services/googleDriveService.js
使用部品: SampleDataService, VideoStorageService
状態: ✅ 実装完了
メソッド | 機能 |
---|---|
initialize() | サービスアカウント認証・Drive API初期化 |
uploadFile() | ファイルアップロード |
createShareableLink() | 組織内共有リンク生成 |
ensureFolder() | フォルダ存在確認・作成 |
説明: Google Gemini APIを使用した文字起こし・要約機能を提供する共通部品
実装場所: 1.src/services/aiService.js
使用部品: AudioSummaryService
状態: ✅ 実装完了(動的モデル選択対応)
メソッド | 機能 |
---|---|
transcribeAudio() | 音声ファイルの文字起こし |
analyzeComprehensively() | 文字起こし結果の総合分析・要約 |
initializeModel() | 最適なGeminiモデル自動選択 |
説明: Slack Web APIを使用した投稿機能を提供する共通部品
実装場所: 1.src/services/slackService.js
使用部品: MeetingNotificationService
状態: ✅ 実装完了
メソッド | 機能 |
---|---|
sendMessage() | Slackメッセージ投稿 |
sendFile() | ファイル付きメッセージ投稿 |
説明: Zoom Cloud Recording APIを使用した録画取得機能を提供する共通部品
実装場所: 1.src/services/zoomService.js
使用部品: ZoomRecordingService, 各種テストエンドポイント
状態: ✅ 実装完了(Vercel対応メソッド追加)
メソッド名 | 機能 | 備考 |
---|---|---|
downloadFileAsBuffer() | 録画ファイルをメモリバッファとしてダウンロード | NEW: Vercel環境対応 |
メソッド | 機能 |
---|---|
monitorNewRecordings() | 新しい録画データの監視・取得 |
downloadRecording() | 録画ファイルのダウンロード |
説明: 処理中のエラーを自動検知し、Slackにエラー通知を送信する機能
実装場所: 1.src/utils/logger.js、1.src/services/slackService.js
状態: ✅ 実装完了
項目 | 内容 |
---|---|
対象エラー | API接続エラー、ファイル処理エラー、AI処理エラー |
通知形式 | Slackエラーメッセージ(エラー内容・コンテキスト付き) |
ログ記録 | 3.operations/logs/app.log(Winston使用) |
説明: 各録画ファイルの処理実行ログを個別ファイルで Google Drive に自動保存する機能
実装場所: 1.src/utils/executionLogger.js、PT001テストに統合済み
状態: ✅ 実装完了 - エラーコード体系と完全統合済み
項目 | 仕様 |
---|---|
ログファイル名 | YYYYMMDD_HHMMSS_{会議名}_{MeetingID}_execution.log 例: 20250807_143021_1on1Meeting_12345_execution.log |
保存場所 | Google Drive: 99.zoom_memo_recording/{年}/{月}/logs/ 動画保存フォルダと同じ階層構造でlogsフォルダを自動作成 |
ログ内容 |
• 処理開始・終了時刻 • 各ステップの成功・失敗状況 • 失敗時のエラーコード(専用体系) • 処理時間・ファイルサイズ等の性能データ • 詳細ログは除外(容量・性能最適化) |
ログレベル |
• SUCCESS : 処理成功• ERROR : 処理失敗• INFO : 重要情報(開始・終了・パフォーマンス)• WARN : 警告(リトライ・代替処理等)
|
{ "executionId": "exec_20250807_143021_12345", "meetingInfo": { "id": "12345", "topic": "1on1 Meeting", "startTime": "2025-08-07T14:30:21.000Z" }, "steps": [ { "step": "zoom_data_fetch", "status": "SUCCESS", "startTime": "2025-08-07T14:30:21.100Z", "endTime": "2025-08-07T14:30:25.200Z", "duration": 4100, "details": { "fileSize": "74.3MB" } }, { "step": "gemini_transcription", "status": "ERROR", "startTime": "2025-08-07T14:30:25.300Z", "endTime": "2025-08-07T14:32:10.100Z", "duration": 104800, "errorCode": "AI001", "errorMessage": "Gemini API rate limit exceeded" } ], "summary": { "overallStatus": "ERROR", "totalDuration": 108900, "successSteps": 1, "errorSteps": 1 } }
説明: システム全体で統一されたエラーコード体系を定義・実装
実装場所: 1.src/utils/errorCodes.js
状態: ✅ 実装完了(50種類の詳細エラーコード定義済み)
カテゴリ | コード範囲 | 主要エラー例 | 定義数 |
---|---|---|---|
Zoom API | ZM001-ZM010 | OAuth認証失敗、レート制限、録画データ取得失敗、権限不足 | 10種類 |
Google Drive | GD001-GD010 | API認証失敗、容量制限、アップロード失敗、共有リンク生成 | 10種類 |
Gemini AI | AI001-AI010 | レート制限、文字起こし失敗、要約生成失敗、処理タイムアウト | 10種類 |
Slack API | SL001-SL010 | Bot認証失敗、チャンネルアクセス拒否、メッセージ投稿失敗 | 10種類 |
システム内部 | SY001-SY010 | メモリ不足、処理タイムアウト、環境変数未設定、JSON解析エラー | 10種類 |
// エラーコード定義例 ZM001: { code: 'ZM001', message: 'Zoom API認証失敗', messageEn: 'Zoom API authentication failed', retryable: false, notifySlack: true, troubleshooting: 'ZOOM_API_KEY、ZOOM_API_SECRET、ZOOM_ACCOUNT_IDを確認してください' } // ErrorManager使用例 const error = ErrorManager.createError('ZM001', { userId: 'user123' }); const isRetryable = ErrorManager.isRetryable('ZM001'); // false const shouldNotify = ErrorManager.shouldNotifySlack('ZM001'); // true
説明: 全外部API(Zoom・Gemini・Slack・Google Drive)の接続状況をチェックする機能
実装場所: api/health-check.js
状態: ✅ 実装完了
項目 | 内容 |
---|---|
チェック対象 | Zoom API、Google AI API、Slack API、Google Drive API |
実行方法 | 手動実行(GET /api/health-check) |
応答形式 | JSON(各サービスの状態・レスポンス時間) |
説明: 開発過程のClaude Codeとの対話を記録し、設計書を自動更新するシステム
実装場所: 3.operations/ClaudeScriptLogging/
状態: ✅ 実装完了
項目 | 内容 |
---|---|
記録方式 | 手動記録(save-conversation.js)+ 自動監視(claude-monitor) |
保存先 | 0.docs/claude.md(要約)、詳細ログ |
自動更新 | 設計書HTML最終更新日時の自動反映 |
項目 | 仕様 | 実測値 |
---|---|---|
監視間隔 | 30分間隔(設定可能) | 設定通り動作 |
処理対象期間 | 過去24時間以内の録画 | - |
音声認識処理時間 | 録音時間に依存 | 要測定 |
同時処理可能数 | 1セッション(順次処理) | 実装済み |
カテゴリ | 技術 | バージョン |
---|---|---|
ランタイム | Node.js | 18.x LTS |
AI・機械学習 | Google Gemini API | 2.5 Pro / 2.0 Flash |
外部API統合 | Zoom API v2, Slack Web API, Google Drive API v3 | 最新版 |
認証 | Server-to-Server OAuth 2.0, Bot Token, Service Account | - |
インフラ | Vercel Serverless Functions | - |
監視・ログ | node-cron, Winston | 最新版 |