📋 機能設計書

Zoom Memo Automation システム

1. システム概要

Zoom Memo Automationは、Zoomクラウド録画を定期監視し、新しい録画を検知すると自動で文字起こし・要約を生成し、Google Driveに保存してSlackに通知するシステムです。

【2025年8月6日更新】 システム全体を責任分離された部品化サービスアーキテクチャに再設計しました。

🏗️ 部品化アーキテクチャ構造

【上位レイヤー: 業務機能部品】
📋 monitor-recordings-gdrive-test.js (エントリーポイント)
  ↓
📥 ZoomRecordingService - Zoom本番録画データ取得・処理(シーケンシャル)
  ↓
🤖 AudioSummaryService - 音声ファイル8項目要約
  ↓
💾 VideoStorageService - Google Drive保存・共有リンク
  ↓
💬 MeetingNotificationService - Slack構造化投稿

【テスト・開発用】
📋 SampleDataService - Google Drive sampleデータ取得(開発・テスト用)

【下位レイヤー: 基盤サービス部品】
🔧 googleDriveService.js - Google Drive API操作
🔧 aiService.js - Gemini AI文字起こし・要約
🔧 slackService.js - Slack API投稿
🔧 zoomService.js - Zoom API録画取得

🔄 部品化処理フロー

【Step 1: Zoom録画取得】ZoomRecordingService (シーケンシャル処理)
  • Zoom API経由で録画リスト取得
  • 動画ファイル取得 → Google Drive保存 → 共有リンク生成
  • 音声ファイル取得 → メモリバッファ処理
  • Vercel制約対応(メモリ効率・300秒制限)

【Step 2: AI要約処理】AudioSummaryService
  • ダウンロード済み音声ファイルをGeminiで文字起こし
  • 8項目構造化要約を生成:
    1. クライアント名
    2. 会議目的
    3. 出席者名・社名
    4. 資料
    5. 論点・議論内容(詳細)
    6. 結論・決定事項
    7. 宿題
    8. Next Action / Due Date

【Step 3: 動画保存】VideoStorageService
  • 音声ファイルをGoogle Drive本番フォルダ (1Q_KNzjRFzd_n5ktbouZix2Hs13qfTP7a) に保存
  • 年/月フォルダ構造を自動作成
  • 組織内共有リンクを生成

【Step 4: 通知送信】MeetingNotificationService
  • 8項目構造化要約 + 動画共有リンクを統合
  • フォーマットされたSlackメッセージを送信
  • 処理開始・エラー通知機能も提供

【Step 5: クリーンアップ】
  • 一時ファイルの自動削除
  • 処理結果ログの記録

2. 部品化コア機能

P001: ZoomRecordingService(本番録画処理部品)

説明: 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() 複数録画の一括処理(シーケンシャル) 一括処理結果

P001-DEV: SampleDataService(開発・テスト用)

説明: 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()

P002: AudioSummaryService(音声要約部品)

説明: 音声ファイルをGeminiで8項目構造化要約を生成する部品

実装場所: 1.src/services/audioSummaryService.js

状態: ✅ 実装完了

8項目要約構造

項目 内容
1. クライアント名 会議内容から推測されるクライアント名・組織名・プロジェクト名
2. 会議目的 会議が開催された理由・主要目標
3. 出席者名・社名 発言者から判別される参加者の名前・所属組織・役職
4. 資料 会議中に言及された資料・文書・データ・画面共有内容
5. 論点・議論内容 誰がどのような発言をし、どのような論理展開になったか(詳細)
6. 結論・決定事項 会議で確定した事項・合意に達した内容
7. 宿題 今後調査・検討が必要な事項・持ち帰り検討項目
8. Next Action / Due Date 具体的なアクションアイテムと実行期限・担当者

P003: VideoStorageService(動画保存部品)

説明: 動画ファイルをGoogle Driveに保存し、組織内共有リンクを生成する部品

実装場所: 1.src/services/videoStorageService.js

状態: ✅ 実装完了

詳細仕様

項目 内容
保存先フォルダ 99.zoom_memo_recording/{年}/{月}/
ファイル命名 YYYY-MM-DD_HHMMSS_会議名.mp4
共有設定 組織ドメイン内で視聴可能リンク生成
主要メソッド saveVideoToGoogleDrive(), ensureFolderStructure()

P004: MeetingNotificationService(通知部品)

説明: 8項目構造化要約と動画共有リンクをSlackに投稿する部品

実装場所: 1.src/services/meetingNotificationService.js

状態: ✅ 実装完了

詳細仕様

項目 内容
メッセージ構造 ヘッダー + 基本情報 + 動画リンク + 8項目要約 + フッター
通知種類 処理開始通知・完了通知・エラー通知
フォーマット Slackブロック形式(Markdown対応)
主要メソッド sendStructuredMeetingSummary(), buildStructuredSlackMessage()

C002: 録画ダウンロード機能

説明: 検知された録画ファイル(音声・動画)を一時フォルダにダウンロードする機能

実装場所: 1.src/services/zoomService.js

状態: ✅ 実装完了

詳細仕様

項目 内容
ダウンロード対象 音声ファイル(M4A)、動画ファイル(MP4)
保存先 ./recordings(一時フォルダ)
メタデータ取得 会議名、開始日時、参加者、時間
ファイル管理 処理完了後自動削除

C003: AI文字起こし機能

説明: ダウンロードした音声ファイルをGoogle Gemini APIで高精度テキストに変換する機能

実装場所: 1.src/services/aiService.js

状態: ✅ 実装完了(動的モデル選択対応)

詳細仕様

項目 内容
対象ファイル M4A音声ファイル(優先)、MP4動画ファイル
使用モデル Gemini 2.5 Pro → 2.0 Flash → 1.5 Flash(自動フォールバック)
出力形式 日本語テキスト(話者識別付き)
プロンプト システム・ユーザープロンプトによる精度向上

C004: AI議事録生成機能

説明: 文字起こしテキストを解析し、構造化された議事録を自動生成する機能

実装場所: 1.src/services/aiService.js(analyzeComprehensively)

状態: ✅ 実装完了

詳細仕様

項目 内容
入力データ 文字起こしテキスト + 会議メタデータ
出力構造 基本情報、議論内容、決定事項、Next Action & Due Date
抽出項目 参加者、アクションアイテム(担当者・期限付き)、決定事項
形式 Markdown構造化文書

C005: Google Drive保存機能

説明: 録画ファイルをGoogle Driveの組織フォルダに自動保存し、共有リンクを生成する機能

実装場所: 1.src/services/googleDriveService.js

状態: 🔄 実装済み(認証設定待ち)

詳細仕様

項目 内容
保存対象 MP4動画ファイル、M4A音声ファイル
フォルダ構造 Zoom_Recordings/2025/07/会議名_日付.mp4
共有設定 組織ドメイン内で視聴可能リンク生成
認証方式 Google Cloud サービスアカウント

C006: Slack統合機能

説明: 議事録要約とGoogle Drive録画リンクをSlackチャンネルに自動投稿する機能

実装場所: 1.src/services/slackService.js

状態: ✅ 実装完了(運用品質向上機能実装済み)

詳細仕様

項目 内容
メッセージ形式 Slackブロック形式(ヘッダー、基本情報、要約、リンク)
投稿内容 会議要約、録画リンク、参加者、決定事項、Next Action
添付ファイル 文字起こし全文(TXTファイル)
運用品質機能 要約全文表示(2700文字制限)、日付適切表示、エンドマーカー、切断検知
制御機能 開発モード時の通知無効化(DISABLE_SLACK_NOTIFICATIONS)

3. 基盤サービス(共通部品)

B001: GoogleDriveService(基盤)

説明: Google Drive APIの基本操作を提供する共通部品

実装場所: 1.src/services/googleDriveService.js

使用部品: SampleDataService, VideoStorageService

状態: ✅ 実装完了

提供メソッド

メソッド 機能
initialize() サービスアカウント認証・Drive API初期化
uploadFile() ファイルアップロード
createShareableLink() 組織内共有リンク生成
ensureFolder() フォルダ存在確認・作成

B002: AIService(基盤)

説明: Google Gemini APIを使用した文字起こし・要約機能を提供する共通部品

実装場所: 1.src/services/aiService.js

使用部品: AudioSummaryService

状態: ✅ 実装完了(動的モデル選択対応)

提供メソッド

メソッド 機能
transcribeAudio() 音声ファイルの文字起こし
analyzeComprehensively() 文字起こし結果の総合分析・要約
initializeModel() 最適なGeminiモデル自動選択

B003: SlackService(基盤)

説明: Slack Web APIを使用した投稿機能を提供する共通部品

実装場所: 1.src/services/slackService.js

使用部品: MeetingNotificationService

状態: ✅ 実装完了

提供メソッド

メソッド 機能
sendMessage() Slackメッセージ投稿
sendFile() ファイル付きメッセージ投稿

B004: ZoomService(基盤)

説明: Zoom Cloud Recording APIを使用した録画取得機能を提供する共通部品

実装場所: 1.src/services/zoomService.js

使用部品: ZoomRecordingService, 各種テストエンドポイント

状態: ✅ 実装完了(Vercel対応メソッド追加)

提供メソッド

メソッド名 機能 備考
downloadFileAsBuffer() 録画ファイルをメモリバッファとしてダウンロード NEW: Vercel環境対応

従来メソッド

メソッド 機能
monitorNewRecordings() 新しい録画データの監視・取得
downloadRecording() 録画ファイルのダウンロード

4. 支援・運用機能

S001: エラーハンドリング・通知システム

説明: 処理中のエラーを自動検知し、Slackにエラー通知を送信する機能

実装場所: 1.src/utils/logger.js、1.src/services/slackService.js

状態: ✅ 実装完了

詳細仕様

項目 内容
対象エラー API接続エラー、ファイル処理エラー、AI処理エラー
通知形式 Slackエラーメッセージ(エラー内容・コンテキスト付き)
ログ記録 3.operations/logs/app.log(Winston使用)

S002: 録画別実行ログ出力システム

説明: 各録画ファイルの処理実行ログを個別ファイルで 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: 警告(リトライ・代替処理等)

🔧 実装要件

  • 軽量化: 詳細ログ・デバッグ情報は出力しない(処理速度・容量最適化)
  • 構造化: JSON形式でログ出力(解析・可視化対応)
  • 自動アップロード: 処理完了時に Google Drive へ自動保存
  • エラーコード連携: 標準化されたエラーコード体系との統合
  • フォルダ自動作成: 年/月/logsの階層構造を自動生成

📊 ログフォーマット例

{
  "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
  }
}
                    

S003: 標準エラーコード体系

説明: システム全体で統一されたエラーコード体系を定義・実装

実装場所: 1.src/utils/errorCodes.js

状態: ✅ 実装完了(50種類の詳細エラーコード定義済み)

🎯 実装済みエラーコード体系(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種類

✅ 実装済み機能

  • 国際化対応: 全エラーメッセージの日英対応完了
  • トラブルシューティング: 各エラーに詳細な解決方法を記載
  • リトライ可能性判定: 各エラーコードにretryableフラグ設定
  • Slack通知制御: 各エラーコードにnotifySlackフラグ設定
  • ErrorManagerクラス: エラー管理・操作用ユーティリティ完備

📊 エラーコード設計詳細

// エラーコード定義例
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
                    

🔗 ExecutionLoggerとの統合

  • 構造化ログ: ExecutionLoggerでエラーコードを自動記録
  • Google Drive保存: エラー発生時もログを確実に保存
  • 日本語運用対応: ログステップ日本語説明、ソース情報、ステータスアイコン追加
  • 統計機能: エラー種別ごとの発生頻度を追跡
  • Slack連携: 重要エラーは自動でSlack通知

S004: ヘルスチェック機能

説明: 全外部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(各サービスの状態・レスポンス時間)

S005: Claude対話記録システム

説明: 開発過程のClaude Codeとの対話を記録し、設計書を自動更新するシステム

実装場所: 3.operations/ClaudeScriptLogging/

状態: ✅ 実装完了

詳細仕様

項目 内容
記録方式 手動記録(save-conversation.js)+ 自動監視(claude-monitor)
保存先 0.docs/claude.md(要約)、詳細ログ
自動更新 設計書HTML最終更新日時の自動反映

4. システム仕様

📊 実行モードとパフォーマンス

項目 仕様 実測値
監視間隔 30分間隔(設定可能) 設定通り動作
処理対象期間 過去24時間以内の録画 -
音声認識処理時間 録音時間に依存 要測定
同時処理可能数 1セッション(順次処理) 実装済み

🔐 セキュリティ・プライバシー

  • API認証トークン管理: 環境変数による安全な管理
  • 一時ファイル削除: 処理完了後の自動クリーンアップ
  • 🔄 Google Drive組織内共有: ドメイン制限付きリンク生成
  • 📋 録音データ暗号化: 計画中(現在はローカル一時保存のみ)

⚡ 可用性・信頼性

  • ヘルスチェック: 全外部API接続状況の監視
  • エラー通知: Slack自動通知システム
  • ログ記録: Winston使用(app.log)
  • 📋 リトライ機能: 要実装(現在は単発実行)
  • 📋 稼働率監視: 要測定

🛠️ 技術スタック

カテゴリ 技術 バージョン
ランタイム 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 最新版
最終更新: 2025年8月8日 18:35 | ZoomRecordingService追加・シーケンシャル処理フロー設計反映(本番Zoom環境対応、メモリ効率最適化)