Wixzel VoiceのAPIでGemini Liveを実際の電話につなぐ
4つのHTTPリクエストで、空のアカウントから、GoogleのGemini Liveモデルが電話口に出る状態まで進みます。SIPトランクを接続し、番号を登録し、リアルタイムのエージェントを作成し、発信します。5つ目のリクエストで、文字起こしと通話料金を含む記録を読み取ります。通信事業者の設定が済んでいれば約10分です。Gemini Liveエンジンは接続1分あたり$0.0491(価格表で最安)で、3分の通話は約$0.15です。前払い残高から秒単位で課金され、これに通信事業者の料金が加わります。
執筆 Aqeel Shamsudheen · 公開日 · 更新日
- 所要時間
- 通信事業者の設定が済んでいれば約10分
- エンジン
- gemini-live
- エンジン利用時間
- 接続1分あたり$0.0491
始める前に何が必要ですか?
- クレジットのあるWixzel VoiceのAPIキー。最低チャージ額は$5です。
- 通信事業者のSIPトランクと、そのトランク上の番号。通信事業者が発信者番号としての表示を認めている番号が必要です。
- curl、jq、uuidgen。
Wixzel Voiceでこれを構築する手順は?
01SIPトランクを接続する
キーとAPIのベースURLを一度設定してから、トランクを作成します。ID以外に2つの値が必要なので、
teeでレスポンス全体を保存しておきます。shellexport WIXZEL_API_KEY="wv_live_..." API=https://api.voice.wixzel.com/v1 TRUNK_ID=$(curl -s $API/sip-trunks \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "My carrier", "host": "sip.your-carrier.example", "username": "your-sip-username", "password": "your-sip-password" }' | tee trunk.json | jq -r .id) jq -r '.platform_ip, .origination_uri' trunk.json通信事業者がIPで認証する場合は、
usernameとpasswordを省略します。いずれの場合も、通信事業者がプラットフォームからの通話を受け付けるようにplatform_ipを許可リストに追加してください。origination_uriは通信事業者が着信を送る先で、このガイドでは使いません。02発信に使う番号を登録する
ご自身の番号をE.164形式で指定します。
shellNUMBER_ID=$(jq -n --arg trunk "$TRUNK_ID" \ '{phone_number: "+14155550100", sip_trunk_id: $trunk}' | curl -s $API/phone-numbers \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Content-Type: application/json" \ -d @- | jq -r .id)03Gemini Liveのエージェントを作成する
音声は3つの段ではなく、1つのリアルタイムモデルです。
shellAGENT_ID=$(jq -n --arg number "$NUMBER_ID" '{ name: "Gemini Live", system_prompt: "You are a friendly assistant on a phone call. Keep answers to one or two sentences.", opening_message: "Hi, this is an automated assistant. Do you have a minute?", outbound_phone_number_id: $number, voice: { realtime: { model: "google/gemini-live", voice: "Charon" } } }' | curl -s $API/agents \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Content-Type: application/json" \ -d @- | jq -r .id)voice.realtimeは、聞く、考える、話すというターン全体をGemini Liveに任せるため、stt、llm、ttsのブロックはありません。両方の形を指定した音声はAPIに拒否されます。CharonはGeminiのプリセット音声の1つで、GET /v1/engines/gemini_live/voicesで、Googleによる一語の説明付きですべて一覧できます。outbound_phone_number_idはエージェントに発信者番号を設定します。これにより、次のリクエストでfrom_number_idを省略できます。04発信する
toの番号を、鳴らしたい電話の番号に置き換えます。shellCALL_ID=$(jq -n --arg agent "$AGENT_ID" '{to: "+14155551234", agent_id: $agent}' | curl -s $API/calls \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d @- | jq -r .id)APIはすぐに
201とstatus: "queued"を返し、少しして電話が鳴ります。ここではIdempotency-Keyが必須です。ネットワークのタイムアウトでは通話が発信されたかどうかがわかりませんが、同じキーで再試行すれば、二重に発信せずに最初の通話が返されます。再試行をスクリプトで行う場合はキーを保持しておいてください。最初の15秒分の料金を確保できない通話は、発信前に402で拒否されます。05結果を確認する
5つ目のリクエストで通話を読み取ります。
shellcurl -s $API/calls/$CALL_ID \ -H "Authorization: Bearer $WIXZEL_API_KEY" | jqExample response, shortened{ "id": "6a96a3ead6e886d42462dd3e", "object": "call", "session_id": "sip-5b0c7c0e-9d1f-4c52-8a9e-2f0d3a4b6c7d", "status": "completed", "direction": "outbound", "channel": "phone", "engine": "gemini_live", "to": "+14155551234", "duration_seconds": 94, "cost_micros": 76923, "failure_code": null, "failure_reason": null, "transcript": [ { "role": "assistant", "content": "Hi, this is an automated assistant. Do you have a minute?" }, { "role": "user", "content": "Sure, go ahead." } ] }statusはqueuedからringing、in-progressを経てcompletedになるか、failed、busy、no-answerのいずれかで終わります。cost_microsは通話の精算時に書き込まれ(1,000,000が$1.00)、接続されなかった通話は課金されないためnullのままです。通話が失敗した場合、failure_codeは通信事業者のQ.850原因コード(17は話し中、19は応答なし、21は通信事業者による拒否)で、failure_reasonには対処方法が書かれています。GET /v1/usage/events?session_id=…ですべての料金の内訳を確認できます。
Wixzel Voiceでこの構築にかかる費用は?
gemini-liveエンジンで3分の通話を行った場合のエンジン利用料で、接続1分あたり$0.0491、1通話あたり約$0.15です。 電話回線はお客様自身のトランクを通信事業者の料金で使うため、ここには含まれません。
| 月間の通話数 | 接続時間(分) | 月額のエンジン費用 |
|---|---|---|
| 300 | 900 | $44.19 |
| 1,500 | 4,500 | $221 |
| 6,000 | 18,000 | $884 |
1分あたりの金額は一般的な発話量でのもので、オーケストレーション料金を含みます。Gemini Liveは通話中に音声トークンで計測されるため、発話の少ない通話は見積もりより安く、多い通話は高くなります。上のレスポンス例は、94秒の通話を1分あたりの料金で計算したものです。回線料金は通信事業者から別途請求され、上乗せはありません。
前払い制で、サブスクリプションも無料プランもありません。$5からクレジットを追加すると、使用量に応じて消費されます。自分の使い方で見積もる。
この構築に関係するWixzel Voiceの制限は?
- 電話をかけるには、ご自身のSIPトランクが必要です。Wixzel Voiceは電話番号の販売、ポーティング、保有を行いません。コンソールから接続したTwilio、Telnyx、Plivo、Vobiz、Vonageのアカウントでは、番号を代わりに購入でき、料金は通信事業者から請求されます。
POST /v1/agents/{id}/test-callによるテスト通話は、1つのフレーズをclassicの音声パイプラインで話します。Gemini Liveには1フレーズだけ話すモードがないためです。Geminiの音声そのものを聞くには、通常の通話を発信してください。- デフォルトでは、1アカウントあたり同時に5件まで通話でき、申請により引き上げられます。
- レイテンシの数値は公表していません。リアルタイムエンジンの応答速度は、モデル自体の速度で決まります。Wixzel Voiceの動作の変更は、日付付きの
Wixzel-Versionヘッダーで切り替える形でリリースされます。
よくある質問
Gemini Liveで電話をかけられますか?
{"realtime": {"model": "google/gemini-live"}}のエージェントを作成すれば、POST /v1/callsがご自身のSIPトランク経由で実際の番号に発信し、Gemini Liveが電話口に出ます。Google CloudやGeminiのAPIキーは必要ですか?
wv_live_のAPIキー1つと前払い残高で、Gemini Liveを含むすべてのエンジンを使えます。通話でGemini Liveが使える音声はどれですか?
Charon、Kore、Puckなどです。GET /v1/engines/gemini_live/voicesですべて一覧できます。別のエンジンの音声を指定すると、エージェントの作成時に拒否されます。Gemini Liveの電話の料金はいくらですか?
Gemini Liveのエージェントは着信にも応答できますか?
PATCH /v1/phone-numbers/{id}で電話番号のinbound_agent_idをそのエージェントに設定し、通信事業者の着信ルートをトランクのorigination_uriに向けます。さらに詳しく
Wixzel Voiceについて
Wixzel Voiceは、自社のSIPトランク経由で実際の電話を発信・着信するAIエージェントや、Webアプリやモバイルアプリの中で人と話すAIエージェントを構築するための音声AI APIです。1つのAPIキーと1つの前払い残高ですべての音声エンジンを利用でき、実際の使用量に応じて秒単位で課金されます。
その他のガイド
Claude Codeまたはclaude.aiのClaudeが、ご自身のSIPトランク経由で実際に電話をかけ、文字起こしを読み上げます。発信の前には必ず確認が入ります。
Node.jsで作った、既存のTwilio番号に応答してAPIに予約を登録するAI受付。
Sarvamのインドの言語向けモデルで動く、ヒンディー語とマラヤーラム語の2つの電話エージェント。ご自身のSIPトランク経由で着信に応答したり発信したりします。
ユーザーがWebSocket経由で音声エージェントと話せるFlutterアプリ。APIキーはサーバーに置いたままで、電話番号は使いません。
ご自身のSIPトランク経由で、同時通話数の上限に合わせたバッチでエージェントが発信したリードの一覧と、各通話のステータスと文字起こし。
Webサイトの隅にいて、訪問者がブラウザから通話できる話すマスコット。指定したドメインと1日の上限の範囲内で動き、すべての発信者が一覧されます。
リアルタイム通話中にエージェントの声に合わせて口を動かすマスコットを表示するFlutterの画面。APIキーはサーバーに置いたままです。
最初の音声エージェントを構築

