ミーティングと文字起こし
Control Center は通話を録音し、要約・アクションアイテム・決定事項からなる整理された記録として返します。音声認識と話者分離は自分のハードウェア上で動作します。Granola を想像してください。ただしセルフホストで、エージェントが住むのと同じワークスペースにつながっています。
ミーティングとは
「ミーティングとは」というセクションミーティングとは、録音され、文字起こしされたセッションです。カレンダーの予定とは_別物_です。予定は Google から同期されたスケジュール上の約束であり、ミーティングは実際に録音したものです。予定から録音を開始できるため両者はリンクできますが、記録としては別々のままです。
すべてのミーティングは、Control Center の他のすべてと同様にワークスペース単位です。あるワークスペースで録音されたミーティングが別のワークスペースに現れることはありません。
処理が行われる場所
「処理が行われる場所」というセクション「オンデバイス」という直感は正しいのですが、名詞が適切ではありません。クライアントが音声をキャプチャし、16 kHz PCM16 のフレームを cc_server が動作しているマシン へストリーミングします。その他の処理はすべてこのホストが行います。チャンネルごとの WAV を <dataDir>/meetings/<meetingId>/ に書き出し、ワーカーアイソレート内で文字起こしし、エコーを除去し、事後に話者分離します。スタンドアロンのデスクトップでは、このホストは同じマシンです。リモートサーバーを指している場合は同じではありません。つまり「自分のノート PC から何も出ていかない」が成り立つのは、サーバーが自分のノート PC である場合だけです。
さらに例外が 1 つあり、それが重要なものです。
要約より前のすべて、つまりキャプチャ、文字起こし、エコーキャンセル、話者分離、声紋照合は、ネットワーク呼び出しなしでサーバー上で実行されます。
同梱されるモデル
「同梱されるモデル」というセクション埋め込み、話者分離、音声(ASR)の各モデルは初回起動時に強制インストールされる(デモではスキップされます)ため、設定画面を開かなくても話者分離と録音を利用できます。ASR は引き続き選択可能です。数百メガバイトあり、ピッカーには 4 つのビルドが用意されています。音声モデルは初回ダウンロード後に 1 回の再起動が必要です。文字起こし機能がモデルを解決するのが、取得が完了するより前だからです。
サイズ、言語カバレッジ、精度が異なるピッカーの 4 つのエントリ:
- Parakeet TDT 0.6B v3 — 多言語対応、推奨の既定(約 600 MB)
- Parakeet TDT 0.6B v2 — 英語(約 480 MB)
- Whisper large-v3-turbo — 多言語対応(約 626 MB)
- Whisper base.en — 英語のみ、従来の小さな既定(約 198 MB)
実行時にサーバーが取得するのはモデルだけです。ネイティブライブラリはすべてバンドルに同梱されています。
キャプチャの仕組み
「キャプチャの仕組み」というセクションミーティングは2 つのオーディオチャンネルを同時に録音します:
- あなた(「me」): 自分のマイク。
- 相手(「them」): ミーティングの音声出力。ドライバー不要のループバックでキャプチャします。macOS では Core Audio のプロセス/デバイスタップ、Windows では WASAPI ループバック、Linux では PipeWire / PulseAudio のモニターです。
2 つのチャンネルを別々にキャプチャするため、文字起こしは最初から話者ごとに割り当てられます。あなたの発言には me、通話の参加者全員には them が付きます。
自分の声はシステム出力からマイクに回り込み、そのままだと二重に文字起こしされます。これを防ぐのが 2 つのフィルターです。信号レベルの AEC3 はすべてのリモートモードの録音で実行され、必須です。ネイティブの AEC ライブラリを読み込めない場合、エコーが混入したマイクを黙ってストリーミングするのではなく、録音の開始を拒否します。(対面モードには打ち消す相手側の参照がないため、AEC は恒等パススルーになります。)さらにその上で、ホスト側のテキストレベルのエコーフィルターがすべてのプラットフォームで実行されます。
OS レベルのマイク処理は意図的にすべて無効化されています。macOS でプラットフォーム自身のエコーキャンセルや自動ゲインを有効にすると、マイクが Voice Processing I/O に切り替わり、このビルドではマイク_と_システムオーディオタップの両方が使えなくなりました。
文字起こしと話者分離
「文字起こしと話者分離」というセクション録音中、音声は UI スレッドの外でローリングウィンドウ単位にデコードされます。短い末尾の無音で区切られるか、最大ウィンドウ長で区切られます。各ウィンドウは、ミリ秒単位のオフセットを持つ話者タグ付きの文字起こしセグメントになります。
RMS しきい値を一度も超えなかったウィンドウは、まったくデコードされずにスキップされます。音声モデルは無音を幻覚的な非音声トークンとして出力し、そのデコードは無駄な CPU 消費になるためです。実際に何が起こるかというと、非常に小さな声の話者は文字起こしが一切生成されません。誰かの発言が空で返ってきたら、モデルのせいにする前にその人の入力レベルを確認してください。
録音を停止した後、話者分離が録音全体に対してオフラインで実行され、リモートチャンネルを個々の話者(Person 1、Person 2、…)に分割します。話者には名前を付けられます。話者の数は自分で設定した数ではなく、クラスタリングのしきい値から推定されます。つまりしきい値が生む結果であり、声が小さかったり発言が重なったりした話者は隣の話者に統合されることがあります。文字起こしは [mm:ss] SPEAKER: text という行として表示されます。
音声プロファイル
「音声プロファイル」というセクション話者の名前を変えることは、1 つの文字起こしにラベルを付けるだけにとどまりません。Control Center は話者の声紋を音声プロファイルとして保存できるため、今後のミーティングでその人を自動的に認識します。話者分離された話者に名前を付けると、声紋を保存するかどうかを尋ねられます。保存すると、その名前の実行中のセントロイドにブレンドされ、新しい話者とコサイン類似度で照合されるため、次回は名前を付け直さなくても同じ人物がその名前で現れます。
音声プロファイルはワークスペース単位で、境界を越えることはありません。設定 → ワークスペース → ミーティングで管理します。以前に保存された話者の名前を変えると、古い名前の登録が解除され、新しい名前を登録するかどうかを尋ねられます。プロファイルを削除すると保存済みの声紋は削除されますが、過去のミーティングに適用済みの名前はそのまま残ります。
要約パイプライン
「要約パイプライン」というセクション録音が停止すると、サーバーは MeetingRecordingStopped ドメインイベントを発行します。組み込みの meeting_summary パイプラインテンプレートがこのイベントでトリガーされます。レコーダーはこれを待ちません。ミーティングは単にステータスのライフサイクルを遷移していきます:
recording → processing → done要約エージェントは、タイトル、録音中に書いた大まかなメモ、文字起こしを受け取り、構造化 JSON を返します。どのセクションを書くかは、ワークスペースの有効な会議メモのテンプレート(設定 → ワークスペース → ミーティング)によって決まります。有効なテンプレートは、新規と再実行の要約の両方に適用されます。その後、パイプラインの永続化ステップがその JSON を個別の行に書き込みます:
enhancedNotesとsummary→ ミーティングのメモ- 各アクションアイテム →
MeetingActionItem行(content、owner、任意のチケットリンク) - 各決定事項 →
MeetingDecision行
アクションアイテムと決定事項が自由形式の markdown から解析されることは決してなく、エージェントの構造化配列からのみ取り出されます。実行が構造化出力を生成しなかった場合、永続化ステップはスキップされ、生の文字起こしがフォールバックとして保持されるため、記録を失うことはありません。パイプライン内の何もミーティングを done にしません。実行の終端イベントから単一のリコンサイラーがそれを行います。そのため、兄弟ステップが失敗しても、すでに完成して見える半分だけ書かれたミーティングが取り残されることはありません。
ミーティングが表示される場所
「ミーティングが表示される場所」というセクション| サーフェス | 表示内容 |
|---|---|
/meetings |
ミーティングの一覧。アクションアイテムと決定事項の件数付き |
/meetings/record |
録音中のライブ HUD。片側に自分のメモ、もう片側にストリーミングされる文字起こし |
/meetings/:meetingId |
ミーティングの詳細。メモ、文字起こし、アクションアイテム、決定事項のタブ |
| 設定 → ワークスペース → ミーティング | このワークスペースの会議メモのテンプレートと保存済みの音声プロファイル |
プラットフォーム対応
「プラットフォーム対応」というセクションキャプチャは 3 つのデスクトッププラットフォームすべてでドライバー不要です(macOS では Core Audio タップ、Windows では WASAPI、Linux では PipeWire)。
Web クライアントも録音します。このページの残りの部分がデスクトップ前提で書かれていると、この点は見えにくくなります。ブラウザーは getUserMedia でマイクを、getDisplayMedia(画面共有)でミーティングの音声を取得し、16 kHz PCM16 にダウンサンプリングして同じホストにストリーミングします。ここには 3 つの注意点があります:
- 共有するサーフェスはオーディオトラックを必ず含んでいる必要があります。Safari、Firefox、macOS の全画面共有ではオーディオトラックが得られず、録音の開始が拒否されます。
- ネイティブの AEC3 はありません。マイクにはブラウザー自身のエコーキャンセルが要求され、ホスト側のテキストエコーフィルターは引き続き実行されます。HUD には、マイクの PCM から駆動される入力レベルメーターが表示されます。
- 要約の再実行と処理のキャンセルはデスクトップ専用です。
カレンダーの録音を開始してリンク操作はデスクトップ専用で、Web ではその旨をはっきりと報告します。ただし、ミーティング画面自体の録音フローは Web でも機能します。
関連項目
「関連項目」というセクション- カレンダーとスケジュール: カレンダーの予定から直接ミーティングを録音する
- パイプラインと自動化:
meeting_summaryを支えるエンジン - チケットと委任: ミーティングのアクションアイテムをチケットにリンクする
- ドメインイベント:
MeetingRecordingStoppedとMeetingStartingSoon - ミーティングを録画して要約