リアルタイム
一言でいうと
realtime はデスクトップの音声(打合せ・面談など)をリアルタイムで文字起こしし、AI アシスト(示唆・翻訳・要約)を提供するモジュールです。デスクトップ音声セッションと電話通話は、文字起こし → AI アシストの後段パイプラインを共有しています — 電話側の詳細は 電話 を参照してください。
主要ドメイン概念
| 概念 | 役割 |
|---|---|
RealtimeSession | セッションのaggregate root。owner・source・開始/終了時刻・文字起こしの格納先ドキュメント(transcriptNodeId)を持つ |
RealtimeSource | セッションの音源種別 |
RealtimeAssistSuggestion | AI が生成する応対中の示唆(カテゴリ別: SuggestionCategory) |
SessionSummary | セッション終了後の要約 |
BriefingContextPort | 事前ブリーフィング(ai の AI チャットセッションの最新回答)を読むための port(DIP境界、下記参照) |
Backend 構造
api/controller/RealtimeSessionController.kt:POST /api/v1/realtime/sessions(開始)、/{id}/end(終了)、/{id}/translation(翻訳設定)api/controller/RealtimeTranscriptEventController.kt/RealtimeAssistEventController.kt:/api/v1/events/realtime-transcripts//realtime-assistの SSE 購読口infrastructure/websocket/DesktopAudioStreamWebSocketHandler.kt: デスクトップから16kHz PCM 音声フレームを受信するWebSocketハンドラinfrastructure/listener/RealtimeAssistGenerator.kt: 文字起こし確定イベント(デスクトップ由来のRealtimeTranscriptFinalEventと、電話由来のPhoneTranscriptFinalEventをPhoneFinalEventMapperでマッピングしたもの)を受け取り、AI示唆を生成・publish する統一パイプラインinfrastructure/adapter/AiChatBriefingContextAdapter.kt:BriefingContextPortの実装。aiモジュールのメッセージストアから事前ブリーフィングを読むinfrastructure/listener/RealtimeTranscriptNodeWriter.kt: セッション終了時、文字起こしをDocumentNodeとして実体化する
Frontend 構造
composables/:useDesktopRealtimeSession(デスクトップ音声セッション開始/終了)、useConversationRealtimeSession、useRealtimeTranscriptStream/useRealtimeAssistStream(SSE購読)、useRealtimeTranslationConfig、useTranscriptWindowcomponents/:RealtimeActiveSessionPanel.vue、RealtimeTranscriptDisplay.vue/ConversationCaptionLine.vue、RealtimeAssistFloatingPanel.vue/RealtimeAssistSuggestionGrid.vue/RealtimeAssistSupplementCard.vue、VoiceCaptureButton.vue/AudioLevelMeter.vue、ActiveCallsHeaderButton.vue(進行中の電話通話をヘッダーに表示する —phone由来のUIがこのモジュールに同居している)
他モジュールとの辺
phone:RealtimeAssistGeneratorはPhoneTranscriptFinalEventを購読し、電話通話にも同じ示唆生成パイプラインを適用する。セッションIDの決定的導出はphone側のPhoneRealtimeSessionがSSoTで、realtimeはその結果をRealtimeSessionIdでラップするだけ(依存方向: realtime → phone。逆方向の依存を作ると循環になる)ai:BriefingContextPort経由で、AI チャットの事前ブリーフィング(研究フェーズの最初のターン)を示唆生成のグラウンディングに使う。ポートを挟むことでRealtimeAssistGeneratorはaiの永続化スタックなしに単体テスト可能editor: セッション終了時、文字起こしをDocumentNodeとして保存する
SSE のfanoutスコープが phone と realtime で異なります。デスクトップの RealtimeSession は ownerUserId のみが transcript/assist イベントを受け取ります(テナント全体には配信されない)。一方 phone は「共有の受信リソース」として扱われ、着信は担当し得る複数スタッフに通知されます。realtime のコードを読むときにこの非対称性を前提にしないと、フォンアウトの挙動を読み違えます。