# 🤖 Meeting Bot - 会議自動議事録システム

Google Meet / Zoom 会議に自動参加し、録音・文字起こし・要約・タスク抽出を行い、参加者にメール＋Google Chat通知するシステムです。

---

## 📁 ディレクトリ構成

```
meeting-bot/
├── README.md              # このファイル
├── package.json
├── setup.sh               # セットアップスクリプト
├── src/
│   ├── calendar-monitor.js  # Googleカレンダー監視（5分ごとcron）
│   ├── meet-bot.js          # Google Meet自動参加・録音
│   ├── zoom-bot.js          # Zoom自動参加・録音
│   ├── transcribe.js        # gsk transcribeで文字起こし
│   ├── summarize.js         # gsk summarizeで要約＋タスク抽出
│   ├── notify.js            # メール＋Google Chat通知・cronリマインダー
│   └── reminder.js          # openclaw cronリマインダー管理ユーティリティ
├── config/
│   ├── config.example.json  # 設定ファイルテンプレート
│   └── config.json          # 実際の設定（.gitignore推奨）
├── recordings/              # 録音ファイル・文字起こし・議事録
└── logs/
    ├── monitor-state.json   # 処理済み会議ID状態
    └── notifications.jsonl  # 通知ログ
```

---

## ⚙️ セットアップ

### 1. セットアップスクリプト実行

```bash
cd /home/work/.openclaw/workspace/meeting-bot
bash setup.sh
```

### 2. config/config.json を設定

```bash
cp config/config.example.json config/config.json
nano config/config.json
```

### 3. 必要なAPIキー・認証情報

#### Google OAuth2（カレンダー + Meet + Gmail + Chat）

1. [Google Cloud Console](https://console.cloud.google.com/) → プロジェクト作成
2. APIs & Services → 以下のAPIを有効化:
   - Google Calendar API
   - Gmail API
   - Google Chat API
3. 認証情報 → OAuth 2.0 クライアントID → デスクトップアプリ
4. `clientId`, `clientSecret` を取得
5. `gsk calendar list` が動作する場合、すでにGoogle連携済み（gskのOAuth2を利用）

> **注**: `gsk calendar list` と `gsk email send` は既にGoogle Workspace連携済みのため、追加認証不要で動作します。

#### Zoom API（クラウド録画ダウンロード用）

1. [Zoom App Marketplace](https://marketplace.zoom.us/) → Build App → Server-to-Server OAuth
2. スコープ: `meeting:read:admin`, `recording:read:admin`
3. `accountId`, `clientId`, `clientSecret` を取得
4. `config.json` の `zoom` セクションに設定

#### Google Chat Webhook（オプション）

1. Google Chat → 送信先のスペース → アプリと連携 → Webhook
2. Webhook URLをコピー
3. `config.json` の `googleChat.webhookUrl` に設定

---

## 🚀 使い方

### 自動実行（推奨）

セットアップ後、`openclaw cron` で5分ごとにカレンダーを確認し、会議が近づくと自動起動します。

```bash
# cronジョブ確認
openclaw cron list

# 手動でカレンダー確認
node src/calendar-monitor.js
```

### 手動実行

```bash
# Google Meet に手動参加
MEETING_URL="https://meet.google.com/abc-defg-hij" \
MEETING_TITLE="定例MTG" \
node src/meet-bot.js

# Zoom に手動参加
MEETING_URL="https://zoom.us/j/1234567890?pwd=XXXXX" \
MEETING_TITLE="Zoom定例" \
node src/zoom-bot.js

# 録音済みファイルを文字起こし
AUDIO_FILE="recordings/2026-01-01_meeting.ogg" node src/transcribe.js

# 文字起こし済みファイルを要約
TRANSCRIPT_FILE="recordings/2026-01-01_transcript.txt" node src/summarize.js

# 要約済みファイルを通知送信
SUMMARY_FILE="recordings/2026-01-01_summary.md" node src/notify.js
```

### タスクリマインダー管理

```bash
# リマインダー追加
node src/reminder.js add "仕様書を完成させる" "2026-03-20" "member@example.com"

# リマインダー一覧
node src/reminder.js list

# 会議ボット関連リマインダーをまとめて削除
node src/reminder.js clear
```

---

## 🔄 処理フロー

```
Googleカレンダー（5分ごとにポーリング）
    ↓ 会議URLを検出（Meet/Zoom）
    ↓ 5分前になったら
    ↓
meet-bot.js / zoom-bot.js
    ├── Pulseaudio virtual sink セットアップ
    ├── Chrome CDP で会議URLを開く
    ├── 参加ボタンを自動クリック
    ├── Chrome音声 → virtual sink にルーティング
    └── ffmpeg で録音（.ogg）
    ↓ 会議終了後
    ↓
transcribe.js
    ├── gsk transcribe（Whisper）で文字起こし
    └── _transcript.txt, _transcript.json を保存
    ↓
summarize.js
    ├── gsk summarize で要約・タスク抽出
    └── _summary.md, _summary.json を保存
    ↓
notify.js
    ├── gsk email send → 参加者にメール送信
    ├── Google Chat Webhook → チャットに投稿
    └── openclaw cron → タスクリマインダー設定
```

---

## ⚠️ 技術的な制限と代替案

### 1. Google Meet / Zoom への完全自動参加

**課題**: 
- Google Meetはアカウント認証が必要（Cookieをブラウザに保持している場合のみ動作）
- Zoomの `@zoom/meetingsdk` はブラウザ専用（Node.js環境では動作しない）
- ヘッドレスChromiumは「ボットによるアクセス」として拒否される場合がある

**現在の実装**:
- 既存のChrome CDPセッション（`:9222`）を利用（Cookieが保持されている）
- x11grab でデスクトップを録画可能
- Pulseaudio virtual sink で音声をキャプチャ

**代替案**:
- **Recall.ai** (https://recall.ai): ボットAPIでMeet/Zoomに自動参加・録音・文字起こし可能。月$50〜$500。最も信頼性が高い。
- **Fireflies.ai**: 同様のサービス、月$10〜
- **Zoom Cloud Recording**: ZoomのAutomatic Cloud Recording機能をAPIで有効化し、会議後に録音をダウンロード（録音を自分でする必要なし）

### 2. 音声ルーティング

**課題**: 
- `snd_aloop` カーネルモジュールがAzureVMで利用不可
- PulseAudioは動作するが、ChromeからVirtual Sinkへの音声ルーティングには`pactl set-sink-input-sink`が必要

**現在の実装**:
- Pulseaudio null sink + モニタリング
- Chrome参加後に全sink-inputをvirtual sinkにルーティング

**代替案**:
- ffmpegの `-f x11grab` で画面全体を録画（音声はPulseから）
- Zoom/Meetの「クラウド録音」機能を使い、後からAPIでダウンロード

### 3. Google Chat API通知

**課題**: 
- gsk に Google Chat 送信機能はない
- Google Chat API（Service Account or OAuth2）の設定が必要

**現在の実装**:
- Webhook URL方式（設定が最も簡単）
- `curl` でWebhookに直接POST

**代替案**:
- メールのみの通知（gsk email send は動作確認済み）
- Google Apps Script経由でのChat投稿

### 4. Zoom参加方法

**課題**:
- Zoom Web Client は Zoomアカウントのログインが必要
- ゲスト参加はCAPTCHAや待機室でブロックされる場合がある

**推奨代替案**:
1. **Zoom SDK + Heroku/Server**で動かすアプローチ
2. **Recall.ai API**: `POST https://api.recall.ai/api/v1/bot/` でZoom URLを渡すだけでボット参加
3. **ZoomのCloud Recording機能**: ホスト側で自動録音を設定し、APIでダウンロード

---

## 📋 必要な確認事項（Mikaへ）

1. **Zoom APIキー**: Zoom App Marketplace でServer-to-Server OAuthアプリの作成が必要
   - 権限: `meeting:read:admin`, `recording:read:admin`
   
2. **Google Cloud Console**: OAuth2クライアントの設定（カレンダー・Chat・Gmailアクセス用）
   - ※ `gsk calendar list` や `gsk email send` がすでに動作しているため、gskのOAuth2で代替可能かもしれない

3. **Google Chat Webhook**: 議事録を送信したいスペースでWebhookを設定

4. **Recall.ai検討**: Zoom参加を確実にするには Recall.ai ($50/月〜) が最も信頼性が高い

5. **Google Meet参加**: 現在のChrome（`:9222`）にnishide@beethoven.co.jpでログイン済みであれば、そのCookieを使って参加可能

---

## 🛠️ デバッグ

```bash
# カレンダーの会議一覧確認
gsk calendar list

# 録音テスト（10秒）
ffmpeg -f pulse -i virtual_meeting.monitor -t 10 /tmp/test.ogg

# パイプライン手動実行
AUDIO_FILE=/path/to/recording.ogg \
META_FILE=/path/to/meta.json \
node src/transcribe.js

# cron ジョブ確認
openclaw cron list

# cron 即時実行テスト
openclaw cron run --label meeting-bot-calendar-monitor
```

---

*Generated by Meeting Bot auto-setup — 2026-03-14*
