本文へスキップ
ガイド

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

最後には、既存のTwilio番号への電話に、ご自身で作ったAI受付が応答するようになります。発信者にあいさつし、プロンプトに基づいて答え、APIから読み返せる予約を登録します。Node.jsで、TypeScriptとJavaScript向けのwixzel-voice SDKとTwilio Elastic SIPトランクを使い、約30分で作れます。classicエンジンのエンジン利用料は接続1分あたり$0.0867、3分の通話で約$0.26で、前払い残高から秒単位で課金されます。トランクの通話時間はTwilioから直接請求され、上乗せはありません。

執筆 · 公開日 · 更新日

所要時間
約30分
エンジン
classic
エンジン利用時間
接続1分あたり$0.0867

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

  • Elastic SIP Trunkingが使えるTwilioアカウントと、Twilioの電話番号。
  • Wixzel VoiceのAPIキー(wv_live_…)と、アカウントのクレジット。最低チャージ額は$5です。
  • Node.js 20以降。

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

  1. 01TwilioでElastic SIPトランクを作成する

    Twilioのコンソールで「Elastic SIP Trunking」を開き、トランクを作成します。「Termination」で、your-clinic.pstn.twilio.comのような「Termination SIP URI」を決めます。このホスト名が、次の手順で接続するトランクのhostになります。

    Twilioのコンソールは開いたままにしておいてください。APIから入力用の2つのアドレスを受け取ったら、また戻ってきます。

  2. 02SDKをインストールしてトランクを接続する

    SDKをインストールし、APIキーを環境変数に設定します。

    shell
    npm install wixzel-voice
    export WIXZEL_API_KEY="wv_live_..."
    trunk.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    const trunk = await client.sipTrunks.create({
      name: 'Twilio',
      host: 'your-clinic.pstn.twilio.com', // your Termination SIP URI
      port: 5060,
      transport: 'udp',
    });
    
    console.log('TRUNK_ID', trunk.id);
    console.log('Allowlist at Twilio:', trunk.platform_ip);
    console.log('Origination URI:', trunk.origination_uri);

    ここでユーザー名とパスワードを指定しないのは、Twilioが送信元IPで認証するためです(次の手順で設定します)。代わりにTwilioの「Credential List」を使う場合は、そのusernameとpasswordを渡してください。パスワードは暗号化して保存され、APIから再び返されることはありません。

  3. 03TwilioをWixzel Voiceに向ける(発信と着信の両方)

    Twilioでは発信と着信を別々に設定します。どちらかが欠けていても、エラーは表示されずに失敗します。

    「Termination」の「Authentication」で、上で出力されたplatform_ipを「IP Access Control List」に追加します。これがないと、Twilioは約1秒で通話を拒否し、切断原因21を返します。

    「Origination」で、上で出力されたorigination_uriを「Origination SIP URI」として追加します。これがないと、番号への着信はエージェントに届かず、通話がTwilioの外に出ないため、どちらのログにも何も記録されません。

    最後に、「Numbers」でTwilioの番号をこのトランクに割り当てます。

  4. 04受付エージェントを作成する

    エージェントは、プロンプト、冒頭のあいさつ、音声エンジンで構成されます。appointment_booking_enabledを有効にすると、通話中に予約の一覧、登録、キャンセルができるようになります。提示してよい曜日、時間帯、枠の長さはプロンプトで指示します。

    agent.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    const agent = await client.agents.create({
      name: 'Reception',
      system_prompt: [
        'You are the receptionist for Riverside Dental, answering the phone.',
        'Keep every reply to one or two short sentences, and never read out lists.',
        'You can book, move and cancel check-ups and cleanings.',
        'Offer appointments Monday to Friday, 09:00 to 17:00, 30 minutes each.',
        'Before booking, ask for the full name of the caller and repeat the day and time back.',
        'For a dental emergency, tell the caller to hang up and ring the emergency number.',
        'If you cannot help, take a message and promise a callback.',
      ].join('\n'),
      opening_message: 'Riverside Dental, this is the automated assistant. How can I help?',
      appointment_booking_enabled: true,
      voice: {
        stt: { model: 'deepgram/nova-3', language: 'en-US' },
        llm: { model: 'openrouter/gpt-4o-mini' },
        tts: { model: 'elevenlabs/eleven_flash_v2_5' },
      },
    });
    
    console.log('AGENT_ID', agent.id);

    これはclassicエンジンです。Deepgram Nova-3、GPT-4o-mini、ElevenLabs Flash v2.5の組み合わせで、英語向けの信頼できる構成の中では最も安く、1分あたり$0.0867です。話者を選ぶにはttsブロックにvoiceを追加します。使える音声はclient.engines.voices('classic')で一覧できます。

    冒頭のあいさつでは、相手が自動アシスタントと話していることを伝えています。法律でその告知や通話録音の告知が求められる場合は、冒頭のあいさつに入れるのが適切です。

  5. 05番号を受付エージェントにつなぐ

    トランクに番号を登録し、応答するエージェントを指定します。

    number.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    const number = await client.phoneNumbers.create({
      phone_number: '+14155550100', // your Twilio number, in E.164
      sip_trunk_id: process.env.TRUNK_ID,
      inbound_agent_id: process.env.AGENT_ID,
    });
    
    console.log('NUMBER_ID', number.id);

    inbound_agent_idがない番号への着信は拒否されます。同じエージェントにリマインダーやテスト通話の発信もさせるには、client.agents.update(agentId, { outbound_phone_number_id: number.id })でその番号を発信者番号に設定します。

  6. 06電話をかけて、通話と予約を確認する

    携帯電話からTwilioの番号に電話をかけ、枠を予約します。電話を切ると、通話と予約の両方がAPIに記録されています。

    results.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    // Lists are newest first.
    const calls = await client.calls.list({ direction: 'inbound', limit: 1 });
    const latest = calls.data[0];
    if (latest) {
      const call = await client.calls.retrieve(latest.id);
      console.log(call.status, call.duration_seconds + 's', (call.cost_micros ?? 0) / 1e6, 'USD');
      for (const line of call.transcript) console.log(line.role + ': ' + line.content);
    }
    
    const appointments = await client.appointments.list({ limit: 5 });
    for (const a of appointments.data) {
      console.log(a.date_time, a.client_name, a.phone_number, a.status);
    }

    date_timeは常にUTCです。予約ごとにappointmentBooked Webhookも送信されるので、これを使えば予約が入った時点で自社のカレンダーにコピーできます。

Wixzel Voiceでこの構築にかかる費用は?

classicエンジンで3分の通話を行った場合のエンジン利用料で、接続1分あたり$0.0867、1通話あたり約$0.26です。 電話回線はお客様自身のトランクを通信事業者の料金で使うため、ここには含まれません。

このガイドの構築にかかる月額のエンジン費用
月間の通話数接続時間(分)月額のエンジン費用
200600$52.02
1,0003,000$260
3,0009,000$780

Wixzel Voiceが請求するのはエンジン利用料だけで、通話の秒数に応じて前払い残高から差し引かれます。Elastic SIP Trunkingの通話時間は、Twilioがお客様のTwilioアカウントにTwilioの料金で請求します。Wixzel Voiceがその料金を目にしたり、上乗せしたりすることはありません。

前払い制で、サブスクリプションも無料プランもありません。$5からクレジットを追加すると、使用量に応じて消費されます。自分の使い方で見積もる。

この構築に関係するWixzel Voiceの制限は?

  • 受付エージェントは営業時間をプロンプトから知ります。v1 APIには空き状況のエンドポイントがないため、実際のカレンダーは参照できません。APIですでに予約された時間は拒否されますが、他の場所で管理している予約はエージェントからは見えません。
  • 予約はアカウントのタイムゾーンで読み取られます。変更していない限りUTCで、v1 APIではまだ変更できません。最初の数件の予約のdate_timeを確認してから運用し、事業がUTCで動いていない場合はaqeel@wixzel.comまでご連絡ください。
  • デフォルトでは、1アカウントあたり同時に5件まで通話できます。それ以上の通話は1件終わるまで拒否されます。上限は申請により引き上げられます。
  • 番号はTwilioに残ります。Wixzel Voiceは電話番号の販売、ポーティング、保有を行いません。
  • Wixzel Voiceの動作の変更は、日付付きのWixzel-Versionヘッダーで切り替える形でリリースされます。

よくある質問

TwilioでAI受付を作れますか?

はい。Twilio Elastic SIPトランクをWixzel Voiceに接続し、「Termination」でプラットフォームIPを許可リストに追加し、「Origination SIP URI」を設定して、Twilioの番号をinbound_agent_id付きで登録します。これで番号への着信にエージェントが応答し、トランクの料金は引き続きTwilioから直接請求されます。

番号をTwilioから移す必要がありますか?

いいえ。番号はTwilioアカウントに残り、Elastic SIPトランクに割り当てられたままです。Wixzel Voiceは電話番号の販売、ポーティング、保有を行いません。

Twilioの番号への着信がエージェントに届かないのはなぜですか?

多くの場合、「Origination SIP URI」が設定されていないか、番号がトランクに割り当てられていません。着信の配信は発信とは別に設定するもので、これがないとTwilioには通話の送り先がなく、どちらのログにも何も残りません。URIはトランクのorigination_uriと一致している必要があり、番号にはinbound_agent_idが必要です。

AI受付の通話料金はいくらですか?

classicエンジンでは接続1分あたり$0.0867、3分の通話で約$0.26で、前払いクレジットから秒単位で課金されます。Twilioのトランクの通話時間は、Twilioがお客様の料金で請求します。

JavaScript以外の言語のSDKはありますか?

公式SDKは2つあります。TypeScriptとJavaScript向けのnpmのwixzel-voiceと、DartとFlutter向けのpub.devのwixzel_voiceです。その他の言語では、https://docs.voice.wixzel.com/api-reference のOpenAPIドキュメントで定義されている同じHTTP APIを直接呼び出します。

さらに詳しく

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

    Twilioのセクション。IP ACL、Termination URI、発信者番号、Origination URI。

  • エージェントドキュメント

    プロンプト、冒頭のあいさつ、各フィールドの値の出どころ、テスト通話。

  • Webhookドキュメント

    appointmentBooked、callCompleted、署名、再試行。

  • SDKドキュメント

    TypeScriptとDartのSDK。

エージェント型電話のための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のsarvamエンジンで作るヒンディー語とマラヤーラム語の電話エージェント

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

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

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

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

4つのcURLリクエストで、ご自身のSIPトランク経由で実際の電話を鳴らすGemini Liveのエージェントと、文字起こしと料金を含むその通話記録。

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

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

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

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

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

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

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