本文へスキップ
ガイド

Wixzel VoiceのAPIでGemini Liveを実際の電話につなぐ

4つのHTTPリクエストで、空のアカウントから、GoogleのGemini Liveモデルが電話口に出る状態まで進みます。SIPトランクを接続し、番号を登録し、リアルタイムのエージェントを作成し、発信します。5つ目のリクエストで、文字起こしと通話料金を含む記録を読み取ります。通信事業者の設定が済んでいれば約10分です。Gemini Liveエンジンは接続1分あたり$0.0491(価格表で最安)で、3分の通話は約$0.15です。前払い残高から秒単位で課金され、これに通信事業者の料金が加わります。

執筆 · 公開日 · 更新日

所要時間
通信事業者の設定が済んでいれば約10分
エンジン
gemini-live
エンジン利用時間
接続1分あたり$0.0491

始める前に何が必要ですか?

  • クレジットのあるWixzel VoiceのAPIキー。最低チャージ額は$5です。
  • 通信事業者のSIPトランクと、そのトランク上の番号。通信事業者が発信者番号としての表示を認めている番号が必要です。
  • curl、jq、uuidgen。

Wixzel Voiceでこれを構築する手順は?

  1. 01SIPトランクを接続する

    キーとAPIのベースURLを一度設定してから、トランクを作成します。ID以外に2つの値が必要なので、teeでレスポンス全体を保存しておきます。

    shell
    export 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は通信事業者が着信を送る先で、このガイドでは使いません。

  2. 02発信に使う番号を登録する

    ご自身の番号をE.164形式で指定します。

    shell
    NUMBER_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)
  3. 03Gemini Liveのエージェントを作成する

    音声は3つの段ではなく、1つのリアルタイムモデルです。

    shell
    AGENT_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を省略できます。

  4. 04発信する

    toの番号を、鳴らしたい電話の番号に置き換えます。

    shell
    CALL_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で拒否されます。

  5. 05結果を確認する

    5つ目のリクエストで通話を読み取ります。

    shell
    curl -s $API/calls/$CALL_ID \
      -H "Authorization: Bearer $WIXZEL_API_KEY" | jq
    Example 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です。 電話回線はお客様自身のトランクを通信事業者の料金で使うため、ここには含まれません。

このガイドの構築にかかる月額のエンジン費用
月間の通話数接続時間(分)月額のエンジン費用
300900$44.19
1,5004,500$221
6,00018,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で電話をかけられますか?

Gemini Liveはモデルであり、電話サービスではありません。Wixzel Voiceがこの2つをつなぎます。音声が{"realtime": {"model": "google/gemini-live"}}のエージェントを作成すれば、POST /v1/callsがご自身のSIPトランク経由で実際の番号に発信し、Gemini Liveが電話口に出ます。

Google CloudやGeminiのAPIキーは必要ですか?

いいえ。ホスト版のプラットフォームでは、プロバイダーのアカウントはWixzel Voiceが保有しています。wv_live_のAPIキー1つと前払い残高で、Gemini Liveを含むすべてのエンジンを使えます。

通話でGemini Liveが使える音声はどれですか?

Gemini Liveのプリセット音声で、Charon、Kore、Puckなどです。GET /v1/engines/gemini_live/voicesですべて一覧できます。別のエンジンの音声を指定すると、エージェントの作成時に拒否されます。

Gemini Liveの電話の料金はいくらですか?

一般的な発話量で接続1分あたり$0.0491、3分で約$0.15です。前払いクレジットから秒単位で課金され、これに通信事業者の料金が加わります。接続されなかった通話は無料です。

Gemini Liveのエージェントは着信にも応答できますか?

はい。PATCH /v1/phone-numbers/{id}で電話番号のinbound_agent_idをそのエージェントに設定し、通信事業者の着信ルートをトランクのorigination_uriに向けます。

さらに詳しく

  • クイックスタートドキュメント

    同じ4つのリクエストを、TypeScriptとDartのSDKでも。

  • 音声エンジンドキュメント

    リアルタイムの音声の形、音声の一覧、言語。

  • SIPトランクドキュメント

    許可リストへの追加、着信のルーティング、各失敗コードの意味。

  • べき等性ドキュメント

    POST /v1/callsにキーが必要な理由と、再送の仕組み。

エージェント型電話のためのAPI

Wixzel Voiceについて

Wixzel Voiceは、自社のSIPトランク経由で実際の電話を発信・着信するAIエージェントや、Webアプリやモバイルアプリの中で人と話すAIエージェントを構築するための音声AI APIです。1つのAPIキーと1つの前払い残高ですべての音声エンジンを利用でき、実際の使用量に応じて秒単位で課金されます。

Wixzel VoiceのMCPサーバーでClaudeに実際の電話回線を持たせる

Claude Codeまたはclaude.aiのClaudeが、ご自身のSIPトランク経由で実際に電話をかけ、文字起こしを読み上げます。発信の前には必ず確認が入ります。

Wixzel VoiceとNode.jsでTwilioのAI受付を作る

Node.jsで作った、既存のTwilio番号に応答してAPIに予約を登録するAI受付。

Wixzel Voiceのsarvamエンジンで作るヒンディー語とマラヤーラム語の電話エージェント

Sarvamのインドの言語向けモデルで動く、ヒンディー語とマラヤーラム語の2つの電話エージェント。ご自身のSIPトランク経由で着信に応答したり発信したりします。

Wixzel VoiceでWebSocket経由のFlutter音声エージェントを追加する

ユーザーがWebSocket経由で音声エージェントと話せるFlutterアプリ。APIキーはサーバーに置いたままで、電話番号は使いません。

Wixzel VoiceでAIによるリード選別キャンペーンを実行する

ご自身のSIPトランク経由で、同時通話数の上限に合わせたバッチでエージェントが発信したリードの一覧と、各通話のステータスと文字起こし。

Wixzel VoiceでWebサイトに話すAIマスコットを追加する

Webサイトの隅にいて、訪問者がブラウザから通話できる話すマスコット。指定したドメインと1日の上限の範囲内で動き、すべての発信者が一覧されます。

Wixzel VoiceのエージェントのマスコットをFlutterアプリに表示する

リアルタイム通話中にエージェントの声に合わせて口を動かすマスコットを表示するFlutterの画面。APIキーはサーバーに置いたままです。

最初の音声エージェントを構築