0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事は筆者オンリーのAdvent Calendar 202515日目の記事です。

アドベントカレンダー15日目は、いったん「現行実装でどこまでできているか」を MVPとして再掲 します。
SIP/RTP/録音/フロント連携まで、今のコードが正(Single Source of Truth)という前提でまとめます。

この記事の狙いは、仕様や議論を増やすことではなく、

  • 「ここまでできたらMVP」
  • 「今の構成はこうなっている」
  • 「イベントの流れはこう」

を固定して、16日以降の記事(SIP/RTP/会話/AI)を書きやすくすることです。


最小動作の定義(「ここまでをMVP」とする)

SIP(最低限の呼制御)

  • INVITE → 200 OK → ACK が通る
  • BYE 受信時に 200 OK を返す
  • 再送/タイマは簡易で可(本格対応は後続)

RTP(まずは片方向でもOK)

  • 片方向でもOK(PCMU / 8000Hz 固定)
  • 音声を受信し、録音(mixed.wav + meta.json)を生成できる

録音配信(フロントで再生できる)

  • /recordings/<日時_callId>/mixed.wav を HTTP で配信
  • recordingUrl をフロントに渡せる

履歴連携(通話が終わったらフロントに渡す)

  • 通話終了時に ingest へ Call 情報を送る(from/to/開始/終了/recordingUrl)
  • これ以上の SIP 拡張(PRACK/UPDATE/Session-Expires等)、RTCP、本格エラーポリシーは後続

全体アーキテクチャ(現行コードが正)

現行の全体構成は以下です。

役割(ざっくり)

  • transport:UDP入出力とバイト配送だけ(SIP/RTPを振り分ける)
  • sip:SIPパースとトランザクション(タイマ簡易版)
  • rtp:RTP受信パース+jitter簡易廃棄
  • session:コール制御+録音開始/停止+ingest送信(現状ここに集約)
  • mediamixed.wavmeta.json の生成
  • http:録音ファイルの静的配信(/recordings

このMVP段階では、「会話ロジック(app)」よりも通話基盤(SIP/RTP/録音/配信)を優先しています。


ディレクトリ構成(主要)

  • src/transport/:UDP I/O(SIP/RTP振り分け)
  • src/sip/:SIP パース・トランザクション
  • src/rtp/:RTP 受信/送信、stream管理
  • src/session/:コール制御、録音/ingestを呼び出し(現状の中心)
  • src/media/:録音生成(mixed.wav / meta.json
  • src/http/:録音静的配信サーバ
  • docs/design.md:レイヤと責務の設計(神様)
  • docs/mvp.md:このMVP再掲(神様)

イベントの流れ(現行実装)

MVPは「通話→録音→配信→履歴送信」を一本通すのが目的なので、イベント流れはシンプルにしています。

  1. transport が SIP UDP を受信 → sipSipInput
  2. sip が INVITE をパースし、SessionOut180/200 を送出
    transport 経由で送信
  3. mainSipEvent を受けて session を生成(rtp/recordingを配線)
  4. RTP受信:transport → rtp → sessionMediaRtpIn
  5. session が録音開始、音声を media に書き込み
  6. BYE / タイムアウトで録音停止し、ingest に通話情報+recordingUrl を POST
  7. http/recordings/<日時_callId>/mixed.wav を配信し、フロントは recordingUrl を再生

ポイントは、MVPでは 「会話(ASR/LLM/TTS)」は後回しでも、録音と可視化(フロント再生)まで通している ことです。
デバッグが一気にやりやすくなります。


設定(主な環境変数)

MVPで触る範囲の設定はこのあたり。

  • SIP_BIND_IP / SIP_PORT / ADVERTISED_IP / ADVERTISED_RTP_PORT
  • RECORDING_HTTP_ADDR
    • 録音配信サーバのbind(デフォルト 0.0.0.0:18080
  • RECORDING_BASE_URL
    • フロントに渡す録音URLのベース
    • 未指定なら RECORDING_HTTP_ADDRhttp:// で利用
  • INGEST_CALL_URL
    • フロントの /api/ingest/call へのURL

このMVPで「やらない」と決めたこと(後続タスク)

MVPを固めるために、あえて後回しにしているものも明記しておきます。

  • 正式な SIP トランザクションタイマ(A/B/E/F/H/J)と状態機械
  • RTCP SR/RR、本格ジッタバッファ、Codec拡張
  • 録音の時間同期(実時間ベース化 / トラック分離)
  • httpレイヤのREST/SSE提供と認証

ここを次々回以降のネタにできます。


まとめ(15日目の固定点)

  • 「通話が成立する(SIP)」「音が取れる(RTP)」「録音が残ってフロントで再生できる(http/media)」「履歴が飛ぶ(ingest)」
    ここまでを 2025-12-15時点のMVP として固定。
  • 実装上は session に責務が集約されているが、MVPとしては意図的(後で分離していく余地あり)。
  • 16日以降は、このMVPを土台にして「SIPをちゃんとする」「RTPをちゃんとする」「会話(ASR/LLM/TTS)をつなぐ」を順に書いていく。

次回(16日)は、まず SIP UASの最小実装(INVITE/ACK/BYE) を、実装目線で掘り下げます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?