📞 日本語ドキュメント
English →

📞Layer 1: Voice Edge

電話の入口(HGW / Asterisk / bridge)。現状運用と Phase C v2 の違い。

電話の物理的な入口(Voice Edge)。ひかり電話 HGW で着信を受け、Asterisk から AudioSocket で bridge.py に渡し、OpenAI Realtime で判定します。

構成図

Raspberry Pi 3B(1階・宅内) HGW(ひかり電話) SIP REGISTER 内線 Asterisk 22 (chan_pjsip) dialplan / chan_audiosocket bridge.py AudioSocket :9092 / slin 8k↔PCM 24k OpenAI Realtime classify_call 移植予定(32bit→64bit) 残課題参照 RTS RDS Arrowfone AMI :5039 Status逆引き→Hangup(発火しない) 対象チャンネル AEGIS_UUID で特定 block → Hangup(21) 第1関門・登録番号(fail-safe) allow → Dial(ALLOW_DESTINATION) 正常転送 unknown/空 → Dial(HUMAN_PEER) fail-open(C-2(b))
図: 実線=音声経路(slin 8k ↔ PCM 24k)。破線=判定→切断(B案): AI の should_terminate を受け bridge が AMI Status で対象チャンネルを逆引きし Hangup する経路はコードに残るが発火しない(撤去予定・2026-09-16)。登録番号は第1関門で遮断(fail-safe)、allow/unknown は dialplan へ(fail-open)。実線の紫枠 = Raspberry Pi 3B(宅内)の機器境界で、HGW と OpenAI は枠外(最下段は Pi の dialplan が実行する通話の行き先)。※移行中: 旧 A案(AstDB verdict 経由)は退避。点線=64bit移植後に同居予定の既存Rhodium機能。

現状運用 と Phase C v2 の違い

現状運用(v1) voice-edge A22(実機テスト前)
ハード 既存機材 新品 Raspberry Pi 3B
OS Raspbian 9 Raspberry Pi OS Bookworm 64-bit
Asterisk Asterisk 11 Asterisk 22
SIP chan_sip chan_pjsip
音声連携 (旧経路) AudioSocket → bridge.py
設置 ChatVoice 経由 scripts/aegis_setup.sh / systemd(asterisk.service・aegis-sip-bridge.service)
✅fail の倒し方(重要)

登録番号(blocklist)の着信は 第 1 関門(route-decision=block)で案内→Hangup(21)(fail-safe=遮断)。 通話中の判定(spam)で切る経路は現行コードで発火しません(下の「主要パラメータ」AMI の行・撤去予定)。 判定不能・障害は 人へ取次(fail-open=業務継続)。確定設計(2026-09-16)では固定電話へ 1 回発呼(第 1 段 E01・未実装)。 全切断(fail-closed)は採用していません(C-2(b) で廃止)。詳細は用語集へ。

主要パラメータ

  • AudioSocket: 127.0.0.1:9092。Asterisk は slin(16bit PCM・8kHz) を送り(dialplan の c(slin))、bridge が 24kHz PCM へリサンプルする。AUDIO_FORMAT=ulaw は互換モードで、実測上使う場面は無い(bridge _audio_format())
  • AMI: 127.0.0.1:5039。bridge の hangup_by_uuid(Status 逆引き → Hangup)はコードに残っているが、会話判定から呼ぶ道は現行コードで発火しない(conversation_may_terminate() が常に False)。確定設計(2026-09-16)で撤去予定
  • OpenAI Realtime: 既定モデル gpt-realtime-2.1(AEGIS_REALTIME_MODEL で上書き)。接続は /v1/realtime
  • 人へ倒す先: HUMAN_EXTEN(kitted で設定。空なら着信内線)へ Dial(PJSIP/…@hgw-trunk,30)。<ALLOW_DESTINATION> / <HUMAN_PEER> という placeholder は現行 dialplan に無い
  • route-decision の応答 decision は 4 値(block / human / ai / take_message)。空は静的フォールバック、未知の値は人へ
✅OpenAI Realtime は GA へ移行済み

OpenAI Realtime の Beta API は 2026-05-12 に廃止されました。bridge.py は GA へ移行済み(既定モデル gpt-realtime-2.1)で、 接続 / session.update 受理 / classify_call の中継は実 OpenAI で確認済みです。 「分類 → 締めの一言 → AMI Hangup」の通しは 2026-07 時点の記録で、現行コードではこの経路は発火しません(下記)。

ℹ️音声フォーマット:Asterisk → bridge は slin(16bit PCM・8kHz)

実 Asterisk は AudioSocket に slin(16bit PCM・8kHz・LE) を渡します(2026-08-03 実測・dialplan c(slin))。 bridge.py の既定 AUDIO_FORMAT=slin はこれをそのまま受けて 24kHz PCM へリサンプルします。 AUDIO_FORMAT=ulaw は「AudioSocket が μlaw を運ぶ」場合の互換モードで、実測上は使う場面がありません。 以前ここに書いていた「μlaw 8kHz 直送・既定 pcm16」は誤りでした(2026-09-16 訂正)。

⚠️第2関門(通話中の自動切断)は動いていない・撤去予定

classify_call の should_terminate から AMI Hangup を予約する経路(B案 / D-1)はコードに残っていますが、 conversation_may_terminate() が常に False のため どの通話でも発火しません(bridge src/bridge.py・br=a557a5b1d41d)。 2026-09-16 の確定設計(案A)はこの経路を 撤去し、通話中の判定は tools 応答の受付モードで受けます。会話判定で発信者を切ることはしません。

📌新設計(案A・2026-09-16 確定)はまだ実装されていません

確定設計の受け渡し契約は aegis-docs docs/PHONE_CALL_CONTRACT.md。主な変更点(いずれも未実装・段ごとに受入票で確認):

  • 通話 ID を route-decision より前に作り、人直行・案内終了にも渡す(現行は AI 経路に入ってから生成・判定へは渡さない)
  • 判定不能(空・不正 JSON・401・時間切れ)は 固定電話へ 1 回発呼(現行は AI_ROUTE_DEFAULT の静的フォールバック)
  • 人が出なければ AI 再受付を 1 回(AI を経由した通話だけ)。再受付から人へは二度と回さない
  • 用件は電話側にも確定保存し、サーバ未送信でも受付完了。用件は自動削除しない。上限時は AI 受付を止めるが 固定電話は鳴らす
  • AI 受付経路は着信から 300 秒(初回 180・呼出 30・再受付 90 は目安)。有人応答後は時間制限なし
  • 録音は NAS 保存確認後に Pi から削除。未転送分は SD の空きの半分の枠内で古い順