この記事は筆者オンリーの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送信(現状ここに集約)
-
media:
mixed.wavとmeta.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は「通話→録音→配信→履歴送信」を一本通すのが目的なので、イベント流れはシンプルにしています。
-
transport が SIP UDP を受信 → sip に
SipInput -
sip が INVITE をパースし、
SessionOutで180/200を送出
→ transport 経由で送信 -
main が
SipEventを受けて session を生成(rtp/recordingを配線) - RTP受信:transport → rtp → session に
MediaRtpIn - session が録音開始、音声を media に書き込み
-
BYE/ タイムアウトで録音停止し、ingest に通話情報+recordingUrlを POST -
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)
- 録音配信サーバのbind(デフォルト
-
RECORDING_BASE_URL- フロントに渡す録音URLのベース
- 未指定なら
RECORDING_HTTP_ADDRをhttp://で利用
-
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) を、実装目線で掘り下げます。