みなさんこんにちは。
こちらは AI Lab Advent Calendar 6日目 の記事です。

CyberAgent AI Lab の大平です。
普段は対話システムエンジニアとして、研究成果の社会実装を行なっています。

2024年以降、生成AIの進化により、音声対話型のAIアシスタントが急速に社会に浸透しています。電話での問い合わせ対応、Webサイトでのカスタマーサポート、さらにはECサイトでの商品案内など、様々なシーンで音声AIが活用されるようになってきました。

少子高齢化の文脈で人手が足りないところをフォローする技術として、今急ピッチで社会実装が期待されている領域でもあります。チャットボットとは異なり、音声対話はより人間らしく、感情的なつながりを生み出しやすいという特徴があります。リアルタイムで自然な会話ができる音声AIは、単なる自動化ツールではなく、顧客との関係性を深める新しいコミュニケーション手段として注目されています。

そんな中、この領域の課題を一挙に解決するプラットフォームとして登場したのが「Vapi」です。本記事では、このVapiを実際に触ってみて、その可能性と課題を検証します。

なぜVapiに注目したか

Vapiとは

vapi top images

Vapiとは、リアルタイムの音声対話を実現するAIプラットフォームです。主に2つの使い方があります:

  1. Twilioと連携した電話AI: Twilioと連携することで、電話番号に音声AIエージェントを接続できます。電話をかけると、AIが自動的に応答し、音声対話を行うことができます。
  2. WebAPIとしての統合: WebアプリケーションにSDKを組み込むことで、ブラウザ上で音声対話を行うことができます。

昨今、LLMの活用はテキストから「リアルタイム音声対話」へと急拡大しています。特に2024年、Bessemer Venture Partners(TwilioやShopifyの初期投資家として知られる伝説的なVC)が、音声AIプラットフォーム「Vapi」に対し2,000万ドル(約30億円)のシリーズA出資を主導したことは、AIエンジニア界隈に大きな衝撃を与えました。

これは、Vapiが単なる便利ツールではなく、「Twilioに代わる次世代の音声インフラ(The Voice AI Infrastructure)」としてシリコンバレーで本命視されたことを意味するからです。

X(旧Twitter)等のSNSでも、Vapiと高速推論チップGroqを組み合わせた「人間よりも反応が速いAIデモ」などが数十万インプレッションを集め、「レイテンシーの壁」や「自然な割り込み(Turn-taking)」といった技術的課題を解決するソリューションとして注目されています。

対話システム設計者としての視点

せっかくなので、どういう特徴を持ったサービスなのかを、普段対話システム設計に携わる私の言葉で少し書いてみます。

  • ストリーミング処理の複雑さを抽象化: 音声対話はSTT->LLM->TTSのフローを踏んで応答が返ってきます。そして、応答速度を高速にするためには、それらをStream的に扱うことが必須になってきます。この処理や実装が結構難しいんです。ユーザが話し始めてからわずか1秒の間に大量のリクエストが発行され、それを並列で処理しながら確実な状態管理を行う必要があります。さらに、割り込みや判定ミスなどを考慮すればこれらの実装難易度はどんどん上がってきます。それを最初からできる状態で提供してくれているのが一つのメリットです。
  • 社会実装に必要な機能を網羅: 実社会に応用する上で必須となる機能がいくつかあります。例えばわかりやすいのが録音機能です。AIが話した言葉はその会社が話した言葉として扱われます。顧客に対して嘘や適切でない表現をしたかどうかを監視する体制が整っていなければ社会実装は厳しいです。他にも多言語対応したい、こういううちのキャラクターに合わせた音声にしてほしい。コストの見積もりを出して欲しいなど、「音声対話の社会実装で求められるようなあるあるの要件」を一通りカバーしています。
  • 柔軟なカスタマイズ性: 任意のSTT、LLM、TTSの組み合わせが可能です。また自社のDBと連携するためのカスタムAPIやRAGあたりの仕組みも整っており、Webサイトからの設定でカスタマイズや検証が可能です。

こんなところでしょうか。逆にこのサービスのイマイチな点は最後にまとめてみます。まずは触ってみましょう。

今回実装したデモ

今回は、Vapiの2つの使い方をそれぞれ実装してみました。デモは2つあります:

  1. 病院の受付コールセンター(電話AI): Twilioと連携した電話AIのデモ。電話をかけると、AIが病院の受付対応を行います。
  2. EC音声アシスタント(WebAPI): WebアプリケーションにSDKを組み込んだデモ。ECサイト上で音声アシスタントが商品案内を行い、カートに入れたらAIが営業してくる機能を実装しました。

検証1:電話AI

電話AIとしてのVapiを試してみることにしました。といっても難しいことは何もなくノーコードで終わります。Twilioと連携してエージェントの設定をするだけですね。Twilioとの連携もVapi側がいい感じにしてくれます。それだけで電話番号に音声AIエージェントを接続できます。病院の受付コールセンターのデモとして実装してみました。

PhoneNumberの設定

VapiではTwilioとの連携により、電話番号を簡単に設定できます。Twilioアカウントと連携することで、実際の電話番号を取得し、その番号にかかってきた電話を自動的にVapiのAIエージェントが受け取るようになります。ボタン一つで電話番号を取得し、Assistantに割り当てることができるので、設定は非常に簡単です。

vapi twilio link setting

むしろTwilio側の設定が色々必要かもしれません。Vapi側のFree Phone Numberのような仕組みもあるのですが、現時点ではアメリカ国内限定のようです。日本で試すにはTwilioが必須になりそうです。

vapi phone number select form

日本の電話番号は取得要件が厳しく、屋号などが必須だからです。お遊びでやってみる感覚では取得できません。一方、アメリカの電話番号なら簡単に取得できます。たまたまTwilioのアメリカの電話番号を持っていたのでこれを使ってみます。

twilio setting page

ただし、アメリカから日本に向けて通話を発信するためには身分証明登録が必要です。パスポートか運転免許証を用意しましょう。

vapi phone number setting page

ここからかけてみることができるようですね。
CSVをアップロードすることで一斉にかけることもできるようです。

Assistantの設定

病院の受付コールセンター用のAssistant設定では、以下のような設定を行いました:

Model: GPT-4o Cluster
Voice: minimax audio
Transcriber: Deepgram
First Message: Thank you for calling Wellness Partners. This is Riley, your scheduling assistant. How may I help you today?

First Messageでは、通話が繋がってからどちらが何と話しかけるかを設定できます。
今回はAgentの方から話しかけますね。
この時点ではまだ手を入れてなくてデフォルトの英語のままになっています。
TTSには最近話題のminimax Audioを使ってみます。

vapi stt setting page

vapi llm setting page

vapi tts setting page

デモ動画(コールセンター)

病院のお問い合わせを行うコールセンターデモです。

ところどころ読みがおかしいですが、全体的にかなりナチュラルですね。

Vapiの共通機能

電話AIでもWebAPIでも共通して使える機能を紹介します。

Privacy設定(録音)

対話終了後の文字起こしや、対話中の音声の録音もここで設定できます。実際のサービスで運用する際は、顧客のプライバシー保護とコンプライアンス遵守のため、録音設定を適切に管理する必要があります。Vapiでは、録音の有効/無効、保存期間、アクセス権限などを細かく設定できます。

vapi assistant advanced setting page

CallLogs(通話ログ)

実際の音声データはCallLogsから確認できます。各通話の記録、文字起こしテキスト、音声ファイルへのリンク、通話時間、ステータス(成功/失敗)などが一覧表示されており、実際の対話内容を確認してAIの応答品質を検証できます。

vapi call log page

VoiceLibrary(音声ライブラリ)

Vapiには豊富な音声ライブラリが用意されており、様々な声質や言語から選択できます。日本語対応の音声だけでも数十種類あり、性別、年齢層、話し方のトーン(明るい、落ち着いた、プロフェッショナルなど)から選択できます。

音声の一覧が表示され、各音声のサンプルを再生できるので、実際に聞いてから選択できます。言語、性別、年齢層、トーンなどでフィルタリングも可能で、目的に合った音声を探しやすいです。

vapi voice library page

検証2:ECサイトでの能動的接客

WebAPIとしてのVapiも試してみることにしました。WebAPIなのでシンプルに組み込みやすく、人手がなくてできない話なので新しい体験ができるかと思い、ECサイトの音声アシスタントとして使ってみます。

せっかくなので、声をかけたら応答が返ってくるだけではなくて、ユーザーの操作状況のログを一部送り、AI側から能動的に(Proactively)提案できるようにしてみます。なんとなく商品に対する不安感があって少額でまずは試そうと思っている人に対して、アップセル(客単価向上)に繋げられると、AIを導入したメリットがあると言ってくれそうですね。

Assistantの設定(ECサイト)

ECサイト用のAssistant設定では、音声設定等は電話AIと同じですが、プロンプトだけEC販売員用に変更しました。実際の販売員として振る舞い、デモサイトであることは言及せず、カート追加時のみ積極的に購買促進を行うように設定しています。

デモ動画

ECサイトでの購買促進デモです。
商品を購入しようか悩んでいるユーザーに対して、販促を行うAIエージェントのデモです。

この機能により、商品単価を上げることができる可能性があります。ユーザーがカートに追加したタイミングで、適切な数量提案を行うことで、購入金額の向上が期待できます。

実装の仕組み

ユーザーが商品をカートに追加すると、JavaScriptでカート追加を検知し、Vapi SDKのsend()メソッドでシステムメッセージを送信します。addCart sum: X形式で累計個数を送信することで、AIが累計個数に応じて適切な提案を行います。

実際のgithubはこちらです。みなさんもよければ試してみてください。
https://github.com/CyberAgentAILab/ecommerce-proactive-sales-agent

APIキーはこの画面から取得できます。プライベートキーではなく公開キーの方を使用するようにしてください。
本番環境で運用するならドメイン制限など、セキュリティ対策をちゃんと講じてください。

vapi api key page

累計個数に応じて、送料無料や割引などの提案を行います。少ない個数の場合は送料無料を提案し、ある程度の個数になると割引と送料無料を組み合わせた提案を行います。店員の考え方としては、ボタンを押してくれた直後はユーザーがボタンをわざわざ押そうと思った原因に対して答える、商品の魅力を伝えることに終始し、一つでも勝ってくれそうならすかさず「たくさん買うと良い理由を伝えて売り上げを目指す」という方針でやってみます。

技術的な実装詳細

Vapi SDKの統合

APIはこんな感じで呼び出します。まず、window.vapiSDK.run()でVapi SDKを初期化します。これにより、通話チャネルが開かれ、ユーザーが音声でAIと対話できるようになります。

// Vapi SDKの初期化
vapiInstance = window.vapiSDK.run({
    apiKey: apiKey,
    assistant: assistantId,
    config: {
        position: "bottom-right",
        offset: "40px",
        width: "70px",
        height: "70px",
        zIndex: 9999,
        idle: {
            color: "#007bff",
            type: "pill",
            title: "AIに電話する",
            subtitle: "音声でご案内します"
        }
    }
});

通話チャネルを開くこと以外にも、vapiInstance.send()メソッドを使って、任意のタイミングでAIに発話を指示することもできます。これが今回の実装の肝となる部分です。

カート追加時には、システムメッセージを送信して、AIに購買促進を促します。type: "add-message"でメッセージを追加し、role: "system"でシステムメッセージとして送信します。これにより、AIが通常の会話とは区別して、カート追加というイベントを認識できます。

// カート追加時のメッセージ送信
vapiInstance.send({
    type: "add-message",
    message: {
        role: "system",
        content: `addCart sum: ${totalQuantity}\n提案: あと${additionalForFree}個追加で送料無料\n必ず追加のご注文をお勧めする`
    }
});

このように、Webサイト上のユーザーの操作(カート追加、ボタンクリックなど)に応じて、リアルタイムでAIに指示を送ることができます。例えば、「商品詳細ページを見た」「決済画面に進んだ」などのタイミングで、適切な提案や案内をAIにさせることが可能です。

カートの累計個数はlocalStorageに保存して管理します。カート追加時には、累計個数を計算してaddCart sum: Xという形式でVapiに送信します。

// カートに追加
const quantity = parseInt(document.getElementById('quantity').value) || 1;
cartCount += quantity;
localStorage.setItem('cartCount', cartCount.toString());

// Vapiに累計個数を送信
triggerVapiThankYou(cartCount, quantity);

重要なポイントは、カート追加時のみ購買促進を行うことです。通常の会話では商品の魅力を伝えるだけに留め、押し付けがましくならないよう配慮しています。addCart sum: Xという形式のシステムメッセージを使用することで、AIが通常の会話とカート追加を明確に区別でき、適切なタイミングでのみ購買促進を行うことができます。

使ってみてわかった課題

とりわけ社会実装の文脈では、LLMの処理能力に胡座を描くような実装は無理があります。世の中はクラシックなソフトウェアと運用で動いており、LLMはそれらと密結合することで初めてアウトプットの機会を得て、その先に初めて「ユーザー」と出会うことになります。この「実システムとLLMの密結合を泥臭く頑張る」ことが短いスパンで見た時に、LLMを用いたシステムを社会実装する上では重要かもしれません。

今回実装してみて、いくつか課題や未検証の部分も見えてきました。

まず、音声認識の詳しいカスタマイズまでできるかどうかは未検証です。読み間違えや認識ミスにどう対処するか、そもそもできるのか、という点は実際のサービスで運用する際には重要な課題になります。

また、相槌のたびに応答が止まってしまうのは非常にストレスです。英語圏の対話モデルではTurn-taking(話者交代)が明確な傾向がありますが、日本語の自然な会話では「相槌(Back-channeling)」が頻繁に発生し、かつオーバーラップ気味に発話されることが許容されます。現在のVapiのVAD(発話検知)設定では、相槌を打つとAIが話すのを止めてしまうことがあります。Vapiの設定(Interruption Thresholdなど)である程度調整できる可能性はありますが、調整が難しい・完璧ではないというのが現状です。この問題を解決するために、独自ルールやAIモデルが組み込めるのかもわからないですね。

他にも、コスト面での検証や、大量の同時接続時のパフォーマンス、エラーハンドリングなど、実際のサービスで運用する際には検証が必要な点がまだまだあります。

一方で、対話終了後のpost processでLLMに色々任せる機能もあるようです。要約したり、Objectiveを出力したりできるので、対話以外にも数値出力などもできるかもしれません。これらを活用すれば、対話の内容を自動的に分析して、次のアクションに繋げることもできそうです。

今回実装した機能は、ほとんどノーコードで実現できました。VapiのダッシュボードでAssistantを設定し、WebサイトにSDKを組み込むだけで、音声AIアシスタントが動き始めます。電話AIも、Twilioと連携するだけで、ボタン一つで電話番号を取得してAIエージェントに接続できます。

従来、音声対話システムを構築するには、STT、LLM、TTSを個別に実装し、ストリーミング処理や状態管理、割り込み処理など、非常に複雑な実装が必要でした。それが、Vapiを使うことで、ノーコードでここまでできるようになったのは、大きな進歩だと思います。

特に重要なのは、適切なタイミングでのみ購買促進を行うことです。vapiInstance.send()でシステムメッセージを送ることで、Webサイト上のユーザーの操作に応じて、リアルタイムでAIに指示を出せます。これにより、ユーザー体験を損なわずに売上を向上させることができます。

今回のデモはいかがでしたか?実際に使ってみて、音声AIの可能性を感じていただけたでしょうか。ノーコードでここまでできるようになったのは確かですが、社会実装にはまだ課題があります。今後、これらの課題が解決されていけば、音声AIの社会実装がさらに進むのではないでしょうか。

最後に宣伝

弊社では、対話エージェントがユーザーのフォローを行う無人受付システム Escort AI の開発を行っています。
日本語の特性に合わせた、実環境で動くことに特化したマルチモーダルエージェントシステムです。
もし興味があれば、HPも見に来てください。

escortai homepage

https://dev.escort-ai.cyberagent.ai/


実運用に向けて考慮すべきこと

最後に、本デモをこのまま実サービスとしてリリースする場合の「落とし穴」と、その対策について触れておきます。

1. セキュリティとインフラ

まずセキュリティ面では、APIキーをバックエンドに隠蔽するか、最低でもドメイン制限をかけ、予期せぬアクセス集中に備えてレートリミット等の設定を忘れないようにしてください。

2. 音声・AIの「壁」とUX調整

ユーザー体験(UX)においては、以下の特性を理解した実装が必要です。

  • 「名前」と「読み」の壁:
    音声認識は人名の聞き取りが苦手ですし、TTS(読み上げ)も漢字の読みを誤る(例:「角」を「かど」ではなく「かく」と読む等)可能性があります。
    対策:辞書登録機能の実装に加え、LLMへのプロンプトで「読み上げ用のテキストはカタカナで出力する」と指示して読み間違いを未然に防ぐテクニックも非常に有効です。
  • AIの嘘(ハルシネーション):
    AIがもっともらしく誤った情報を話すリスクはゼロになりません。「AIの回答は参考情報です」という免責表示をUIに組み込むなど、期待値のコントロールが必要です。

3. クリティカルな業務での「有人監視」と「切り替え」

予約確定や契約関連など、ミスが許されないタスクに適用する場合は、AIだけに任せきりにしない運用設計が不可欠です。

  • リアルタイム監視と介入:
    管理画面等で通話内容をリアルタイムにテキスト化して監視し、AIの回答精度が落ちたり、ユーザーの不満(怒りなど)を検知した場合には、即座に有人オペレーターに会話を引き継ぐ(ハンドオーバーする)仕組みを用意してください。
  • フェイルセーフ:
    システム障害時やAIの応答が不安定な場合に、自動的に人間の担当者へ電話転送するフローも併せて検討する必要があります。

画像の引用元について
本記事内で使用しているスクリーンショット画像は、以下のWebサイトおよび管理画面より引用・撮影したものです。
・Vapi: https://vapi.ai/
・Twilio: https://www.twilio.com/

・EscortAI: https://dev.escort-ai.cyberagent.ai/