12/22 は、タイムアウト/キャンセル/失敗時の作法(無言回避のポリシー)をまとめました。
今日はその続きとして、音声ボット開発で地味に効く 録音・メタ情報・可観測性(Observability) を草案として整理します。
SIP/RTP/AIは「その場で再現しにくい」不具合が多いので、後から追える仕組みをMVPの時点で入れておくと開発速度が上がります。
0. まず方針:録音は“機能”というより“デバッグ装置”
このプロジェクトでは録音を次の用途で使います。
- RTPが本当に届いているか(無音/途切れ/歪み)
- コーデックが想定通りか(PCMU/8000)
- ASRの入力として使えるか(10秒バッファなど)
- 問題が起きた通話を「証拠」として残せるか
つまり録音は、UIのためだけじゃなく 開発の武器 です。
1. 現行MVPの録音:何が生成されるか
MVPでは録音の実体はこの形です。
storage/recordings/<timestamp_callid>/mixed.wavstorage/recordings/<timestamp_callid>/meta.json
そして http モジュールが
/recordings/<timestamp_callid>/mixed.wav
を静的配信し、フロントには recordingUrl を渡します。
2. 役割分担(media と http を混ぜない)
ここは将来の拡張で壊れやすいので、最初に線を引きます。
-
media:生成・保存(wavを書き、meta.jsonを書く) -
http:配信(ファイルを返すだけ、可能ならRange対応)
「生成と配信が混ざる」と、あとからS3等に逃がしにくくなるので、MVPのうちに分けておくのが正解です。
3. meta.json に何を入れるか(最小のおすすめ)
metaは「後から追える」ことが目的なので、最小でもこれがあると助かります。
callId-
from/to(SIPの相手) -
startedAt/endedAt(ISO8601) durationSec-
sampleRate/channels -
files(mixed.wavなど)
余裕が出たら追加したい:
-
codec(PCMUなど) -
rtp(pt/ssrc等を“参考値”で) -
metrics(drop/missing/reorder、rtp_in bytes 等)
4. “時間同期”は今は割り切る(MVPの現実解)
録音とUtteranceの時間同期(startSec/endSec)を完璧にやるのは沼です。
MVPの現実解:
-
mixed.wavは「書いた順」でOK(多少のズレは許容) -
meta.jsonに開始/終了時刻だけ残す - 厳密同期は後続(トラック分離/タイムライン設計)
この割り切りでも「再現とデバッグ」には十分効きます。
5. 可観測性(Observability):ログ相関が全て
音声ボット開発で一番効くのは、実はメトリクスより ログ相関 です。
最低限のルール
- すべての重要ログに
call_idを付ける - 可能なら
remote_addr/sip_from/sip_toも付ける - 「いつ」「どの段階で」起きたか分かるようにする
例:
- SIP:INVITE受信、200送信、ACK受信、BYE受信
- RTP:受信開始、PT不一致、drop、timeout
- media:録音開始、録音停止、meta書き出し
- ingest:POST成功/失敗
6. レイテンシ計測ポイント(ボトルネックが見える)
LLMやTTSを繋ぐと、体感品質はレイテンシで決まります。
MVP+αで測りたい区間はこの3つ。
- RTP受信 → ASR確定
- ASR確定 → LLM応答
- LLM応答 → TTS最初のPCM送出(=喋り始め)
これが取れると、遅い原因が「ASR」「LLM」「TTS」「送信側」のどこかすぐ分かります。
7. ingest(フロント連携)も“観測”の一部
MVPでは通話終了時に ingest へ Call情報を送りますが、これも観測上重要です。
- 「通話が正常終了したか」
- 「recordingUrlが正しいか」
- 「フロントに届いたか」
を追えるので、失敗時はログに必ず残すのがおすすめです(HTTPステータス、レスポンスなど)。
8. 12/24 に向けた“実測準備”メモ
24日は実際の通話で挙動を見せる想定なので、これを仕込んでおくと吉。
- サンプル通話を1本録っておく:
storage/recordings/<ts_callid>/mixed.wavとmeta.json - 代表ログをまとめる:INVITE/200/ACK/BYE、RTP受信開始・drop、録音開始/停止、ingest送信結果
- レイテンシの計測結果を拾う:
RTP→ASR確定/ASR→LLM/LLM→TTS開始 - Wiresharkキャプチャ(pcap)が取れればベスト。難しければ
RTP len/seqのログでも可。
9. 12/23時点の固定点
-
mediaがmixed.wav/meta.jsonを生成する(生成責務に閉じる) -
httpは/recordings/...を配信する(配信責務に閉じる) -
call_idを軸にログ相関できるようにする(SIP/RTP/録音/ingest) - レイテンシ計測点を最小3つ置く(ASR/LLM/TTS)
次回(12/24)は、実測ログ/録音/pcapを添えて テスト&デバッグの具体例 をまとめる予定です。