
Twilio 音声通話のリアルタイム処理:生成 AI との連携を見据えた ConversationRelay 入門
概要
本記事では、Twilio が提供する ConversationRelay 機能を用いて、電話音声をリアルタイムにアプリケーションで処理するための実装手順と活用指針を体系的に紹介します。
ConversationRelay は、Twilio の音声通話を WebSocket を通じてアプリケーションに中継する機能です。従来の TwiML <Gather>
を超えた自然な会話体験を実現するための仕組みであり、音声 AI や LLM と組み合わせたリアルタイム対話システムを見据え導入されました。本稿では、Twilio 公式ドキュメント の構成に基づき、どのように WebSocket サーバーを構築し、リアルタイム処理と連携するか、実装ベースでわかりやすく整理します。
対象読者
- Twilio Voice を用いた電話自動応答システムを設計・運用する開発者
- 音声 AI、LLM、音声ボットなどの技術を電話チャネルで実現したい方
- WebSocket によるリアルタイム音声処理の構成に関心のあるアーキテクト
想定されるユースケース
- ChatGPT や Claude などと連携する電話 AI オペレーターの構築
- FAQ ボットや音声ナビゲーションなど自然な会話型 IVR
- 既存 PBX との連携による音声業務自動化の実証実験(PoC)
本記事のゴール
- ConversationRelay の仕組みと必要な Twilio 設定項目を体系的に整理する
- WebSocket サーバーの構築例とメッセージ形式を具体的に解説する
- 実際の TwiML 記述・動作確認方法までを一通り理解できるようにする
参考
はじめに:Twilio で「電話の自然対話」を実現するには
音声インターフェースへの期待と課題
音声による問い合わせや対応業務は、今なお多くの業種で重要なチャネルとして活用されています。問い合わせ窓口、予約受付、FAQ ナビゲーション、IVR(自動音声応答)など、通話を起点とする体験は根強く残っており、音声 AI や LLM(大規模言語モデル)と連携した「会話型の自動応答」への関心も高まっています。
一方で、こうした音声インターフェースを構築するには、多くの課題がありました。
従来の Twilio Voice API の限界
Twilio の Voice API を用いた従来の構成では、通話中にユーザーの音声入力を扱うために <Gather>
要素を使い、音声認識(Speech Recognition)をトリガーとして入力内容を取得します。しかし、この方法では次のような制約があります。
- 入力完了まで待たなければならない
- 発話の区切りを明示する必要がある
- 認識結果を即座に評価・反映できない
その結果、自然な会話の流れを構成することが難しく、自由度の高い対話には不向きでした。
Conversation Relay が提供する新しい選択肢
Twilio が新たに提供する ConversationRelay は、Twilio 通話の音声をリアルタイムに WebSocket を通じてアプリケーションに中継し、テキストの生成や読み上げまでを一連のフローとして処理できる新しい音声インターフェース基盤です。ConversationRelay を用いることで、以下のような処理が可能になります。
- 通話音声を逐次テキスト化し、即時に LLM などへ入力
- LLM や API の応答結果を動的に音声合成して返答
- セッション中の発話タイミングや会話制御をリアルタイムにハンドリング
これにより、「電話で ChatGPT に話しかける」 「口頭でフローを案内されながら操作を進める」といった、これまで一部でしか実現できなかったユースケースが、Twilio 上で比較的簡潔に構成できるようになります。
本記事の位置づけと進め方
本記事では、Twilio ConversationRelay を用いて、実際に音声通話とアプリケーションをリアルタイムに接続するまでの手順を、構成設計・TwiML 記述・WebSocket 実装の3つの観点から順を追って解説します。
具体的には、Twilio 公式の Onboarding Guide の流れをベースに、以下のような構成で進行します。
- Twilio 側の設定(TwiML App、番号設定、AI/ML 機能の有効化)
- TwiML の記述方法と
ConversationRelay
の基本属性 - 動作検証のための最小構成例とログ確認の手順
また、Twilio の ConversationRelay は 音声認識・テキスト生成・音声合成といった機能を内部的に扱いつつ、開発者側にはシンプルなメッセージハンドリングの形で提供されます。この抽象度の高さは、OpenAI API や外部システムとの連携、動的な業務ロジックの組み込みを行う上でも非常に扱いやすく、音声チャネルにおける AI 活用の実装ハードルを一気に下げるものです。
TwiML の記述と各属性の意味
Twilio ConversationRelay を利用するには、Twilio からの着信リクエストに対して返す TwiML に <Connect><ConversationRelay>
要素を含める必要があります。このセクションでは、TwiML の基本構文と、使用可能な属性について解説します。
ConversationRelay の基本構文
以下は最小構成の TwiML 例です。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Connect>
<ConversationRelay
url="wss://mywebsocketserver.com/websocket"
/>
</Connect>
</Response>
この TWiML を Twilio に返すことで、Twilio 側は WebSocket 接続を開始し、以降の音声ストリームや会話制御はその接続先に委ねられます。
属性一覧と役割
<ConversationRelay>
要素で指定できる属性の一部を紹介します。 (参考)
属性名 | 必須 | 説明 |
---|---|---|
url |
x | 接続先の WebSocket URL(wss:// 必須) |
welcomeGreeting |
通話開始時に自動で再生される音声。テキストを指定すると Twilio が TTS(音声合成)で読み上げる | |
language |
使用する言語。 en-US 、 ja-JP など |
会話処理の流れ
ConversationRelay を使った通話の処理は、次のような流れで進行します。
着信から接続までの流れ
- ユーザーが Twilio 番号に発信
- Twilio が TwiML App に指定された URL にリクエスト
- サーバー側で
<Connect><ConversationRelay>
を含む TwiML を返す - Twilio が指定された
url
(WebSocket)に接続を開始
会話中のやりとり
- WebSocket 経由でユーザーの音声を文字起こしした結果が送信される
- WebSocket サーバーは
prompt
イベントを受け取る - Twilio がそのテキストを音声合成(TTS)して通話相手に再生
Twilio 側の初期設定
Twilio ConversationRelay を利用するには、通常の Voice API 構成とは異なるいくつかの事前設定が必要です。特に、AI/ML 機能の利用に関するオプトインと、TwiML App の準備が重要なステップとなります。
AI/ML Addendum の有効化
Conversation Relay は、音声認識・テキスト生成・音声合成などの AI 処理を内部で実行するため、Twilio の「Predictive and Generative AI/ML Features Addendum」の有効化が必要です。
- Twilio Console にログイン
- 左メニューより Voice > Settings > General を開く
- Predictive and Generative AI/ML Features Addendum を Enabled にする
Twilio Function でエンドポイントを作成する
ConversationRelay を有効にするには、TwiML App(Twilio Markup Language Application) を作成し、通話リクエスト時に Webhook 経由で動的に TwiML を返す必要があります。これを実現するため、まずは TwiML を返す Function を作成します。
- Functions and Assets > Services に移動
- 「Create Service」をクリックしてサービスを作成(例:
conversation-relay-twiml
) - 作成したサービス内で「Add +」→「Add Function」を選択
- 以下の内容で Function (例:
/twiml
)を作成// /twiml exports.handler = function (context, event, callback) { const response = new Twilio.Response(); response.appendHeader('Content-Type', 'text/xml'); response.setBody(` <?xml version="1.0" encoding="UTF-8"?> <Response> <Connect> <ConversationRelay url="wss://twilio-ws-test.fly.dev" welcomeGreeting="こんにちは。AIと会話を始めます。" language="ja-JP" /> </Connect> </Response> `.trim()); callback(null, response); };
- Save ボタン(または Ctrl + S)で保存し、 Deploy All ボタンで公開します
- Copy URL でエンドポイント URL を控えておきます
TwiML App にエンドポイントを設定する
作成した Function を TwiML App から呼び出すようにします。
- Twilio Console 左メニューで Phone Numbers > Manage > TwiML Apps に移動
- 新しい TwiML App を作成
- 必要な情報を入力:
- Friendly Name:任意(例: ConversationRelayApp)
- Request URL:TwiML を返す Webhook エンドポイント(例:
https://example.com/voice
) - HTTP Method:
POST
電話番号との紐付け
通話の着信時に適用する TwiML App を指定します。
- Twilio Console → Phone Numbers → Manage → Active Numbers に移動
- 使用する電話番号を選択
- Voice Configuration で下記の設定を行います。
- Configure with: TwiML App
- TwiML App: 上で作成した App を選択
WebSocket サーバーの実装
Twilio ConversationRelay を利用する際、開発者は「WebSocket サーバー」の実装を通じて、Twilio から中継される音声データを処理し、テキスト応答を返す役割を担います。このセクションでは、WebSocket サーバーの役割と最低限の構成、Twilio とのメッセージプロトコル、および セキュリティ上の注意点を解説し、最後に Node.js による最小構成例を提示します。
ConversationRelay を通じて Twilio から接続される WebSocket サーバーは、以下の処理を担います。
- 接続要求の受け入れと初期レスポンス
- Twilio から送られる各種メッセージの受信
- 必要な応答(テキスト)を生成し、Twilio に返信
- 会話の終了・中断への対応
Twilio 側の音声認識・合成処理は自動で行われ、開発者はテキストベースで会話を制御する形になります。
Node.js による最小構成例
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });
wss.on('connection', (ws, req) => {
console.log('New connection from:', req.socket.remoteAddress);
ws.on('message', (msg) => {
const data = JSON.parse(msg);
console.log('Received:', data);
if (data.type === 'prompt') {
const reply = {
type: 'text',
token: `あなたは「${data.voicePrompt}」と言いましたね。`,
last: true,
};
ws.send(JSON.stringify(reply));
}
});
ws.on('close', () => {
console.log('Connection closed');
});
});
動作確認とテスト
ここまでで、Twilio 側の設定と WebSocket サーバーの構築が完了しました。このセクションでは、実際に電話をかけて ConversationRelay が正常に動作するかを確認する手順について紹介します。以下は最小構成での検証ステップです。
WebSocket サーバーの起動
実装した WebSocket サーバーを公開します。公開 URL(例:wss://example.com
)を TwiML 内の <ConversationRelay url="...">
に指定します。
Twilio 番号に電話をかける
- 登録済みの Twilio 番号に発信
- Twilio が TwiML App 経由で WebSocket URL に接続
- 通話開始と同時に
welcomeGreeting
が読み上げられるこんにちは。AIと会話を始めます。
- たとえば「こんにちは。音声認識してください。」と発話
- 「あなたは『こんにちは。音声認識してください。』と言いましたね」という応答が返ってくる
応答ログの確認
WebSocket サーバーのログには、たとえば次のような出力が確認できます。
Received: {
type: 'prompt',
voicePrompt: 'こんにちは。音声認識してください。',
lang: 'ja-JP',
last: true
}
おわりに:ConversationRelay を用いた音声対話システムの可能性
本記事では、Twilio が提供する ConversationRelay 機能を活用し、電話音声をリアルタイムに WebSocket 経由でアプリケーションに接続するための一連の手順と実装上の留意点を解説しました。従来の <Gather>
を用いた静的な対話構成とは異なり、ConversationRelay では Twilio 音声通話とアプリケーション間の対話をストリーミングベースで構成できるため、より自然で柔軟な音声インターフェースの実現が可能となります。
主要なポイントは以下のとおりです。
- ConversationRelay の基本的な概念と構成要素の整理
- Twilio Console 上における AI/ML 機能の有効化および TwiML App の設定手順
<ConversationRelay>
要素の TwiML 記述と各属性の意味- Node.js による WebSocket サーバーの最小構成とイベント処理の流れ
- 実際の通話を用いた動作検証の方法と確認すべきログのポイント
今後の展望
Twilio ConversationRelay は、単なる音声中継機能にとどまらず、以下のような高度な応用にも十分に対応可能なアーキテクチャを提供しています。
-
音声対話の状態管理とセッション制御
- 複数ターンにわたる発話を前提としたステートフルな対話設計
- 会話の履歴や文脈を保持した上での応答生成および分岐処理
-
外部 API・業務システムとの統合
- 音声入力に基づいたデータベース照会や外部サービス呼び出し
- CRM・予約管理・FAQ 知識ベースなどと連携した業務自動化基盤の構築
-
LLM(大規模言語モデル)との連携による自然対話の高度化
- OpenAI API や Claude などを用いた文脈理解・応答生成の高度化
- ユーザーの自由入力に柔軟に対応する自然言語インターフェースの提供
これらの方向性は、音声 IVR、電話オペレーター支援、自動応答チャネルの刷新といった幅広いユースケースにおいて、今後ますます重要性を増していくものと考えられます。