メインコンテンツへ

リアルタイム

一言でいうと

realtime はデスクトップの音声(打合せ・面談など)をリアルタイムで文字起こしし、AI アシスト(示唆・翻訳・要約)を提供するモジュールです。デスクトップ音声セッションと電話通話は、文字起こし → AI アシストの後段パイプラインを共有しています — 電話側の詳細は 電話 を参照してください。

主要ドメイン概念

概念役割
RealtimeSessionセッションのaggregate root。ownersource・開始/終了時刻・文字起こしの格納先ドキュメント(transcriptNodeId)を持つ
RealtimeSourceセッションの音源種別
RealtimeAssistSuggestionAI が生成する応対中の示唆(カテゴリ別: 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 と、電話由来の PhoneTranscriptFinalEventPhoneFinalEventMapper でマッピングしたもの)を受け取り、AI示唆を生成・publish する統一パイプライン
  • infrastructure/adapter/AiChatBriefingContextAdapter.kt: BriefingContextPort の実装。ai モジュールのメッセージストアから事前ブリーフィングを読む
  • infrastructure/listener/RealtimeTranscriptNodeWriter.kt: セッション終了時、文字起こしを DocumentNode として実体化する

Frontend 構造

  • composables/: useDesktopRealtimeSession(デスクトップ音声セッション開始/終了)、useConversationRealtimeSessionuseRealtimeTranscriptStream/useRealtimeAssistStream(SSE購読)、useRealtimeTranslationConfiguseTranscriptWindow
  • components/: RealtimeActiveSessionPanel.vueRealtimeTranscriptDisplay.vue/ConversationCaptionLine.vueRealtimeAssistFloatingPanel.vue/RealtimeAssistSuggestionGrid.vue/RealtimeAssistSupplementCard.vueVoiceCaptureButton.vue/AudioLevelMeter.vueActiveCallsHeaderButton.vue(進行中の電話通話をヘッダーに表示する — phone 由来のUIがこのモジュールに同居している)

他モジュールとの辺

  • phone: RealtimeAssistGeneratorPhoneTranscriptFinalEvent を購読し、電話通話にも同じ示唆生成パイプラインを適用する。セッションIDの決定的導出は phone 側の PhoneRealtimeSession がSSoTで、realtime はその結果を RealtimeSessionId でラップするだけ(依存方向: realtime → phone。逆方向の依存を作ると循環になる)
  • ai: BriefingContextPort 経由で、AI チャットの事前ブリーフィング(研究フェーズの最初のターン)を示唆生成のグラウンディングに使う。ポートを挟むことで RealtimeAssistGeneratorai の永続化スタックなしに単体テスト可能
  • editor: セッション終了時、文字起こしを DocumentNode として保存する

SSE のfanoutスコープが phonerealtime で異なります。デスクトップの RealtimeSessionownerUserId のみが transcript/assist イベントを受け取ります(テナント全体には配信されない)。一方 phone は「共有の受信リソース」として扱われ、着信は担当し得る複数スタッフに通知されます。realtime のコードを読むときにこの非対称性を前提にしないと、フォンアウトの挙動を読み違えます。