
Twilio Video Room に ConversationRelay の AI 参加者を入れて会話してみた
はじめに
オンライン会議に AI を 1 人の参加者として加えたとき何が起こるでしょうか。
Twilio は 2026 年 8 月に、Programmable Video の Room へ ConversationRelay の AI を参加させる構成例を公開しました。本記事では、この構成で AI と日本語で会話し、1 対 1 の音声通話と比べた体験の違いを確かめました。
結果として、Room の中でも AI との会話は成立し、応答までの待ち時間も 1 対 1 と同程度でした。一方、Room では、AI 宛てではない発話にも AI が答えてしまう場面がありました。
ConversationRelay とは
ConversationRelay は、Twilio の音声通話で音声認識と音声合成を担い、テキストの送受信だけで音声 AI を作れるようにする仕組みです。開発者は WebSocket サーバーで、認識された発話を受け取り、応答のテキストを返します。
検証環境
- Twilio Programmable Video (Group Room)
- Twilio Video JavaScript SDK 2.36.0
- Twilio Voice JavaScript SDK 2.18.5
- ConversationRelay (音声認識と音声合成はいずれも Google)
- Amazon API Gateway (WebSocket API) と AWS Lambda (Node.js 22)
- Amazon Bedrock の Claude Haiku 4.5
- macOS と Google Chrome
対象読者
- ConversationRelay で音声 AI を作った経験がある方
- 会議やグループでの会話に AI を加える用途を検討している方
参照
- Add an AI Voice Assistant to a Twilio Video Room with Conversation Relay (Twilio Blog)
- Adding Programmable Voice Participants to Video Rooms (Twilio Docs)
- TwiML Voice: <ConversationRelay> (Twilio Docs)
背景と課題
ConversationRelay は、電話をかけてきた 1 人と AI が話す場面を前提に作られています。相手は 1 人なので、届いた発話はすべて AI 宛てと考えてかまいません。
Twilio 公式では、この ConversationRelay を Voice 通話ごと Video Room につなぐ構成が紹介されています。本記事では実際にそれを試し、同じ AI を 1 対 1 から複数人の会話の場に移したときの、会話の体験の変化に焦点を当てて観察してみようと思います。
構成
AI 参加者は、1 本の Voice 通話でつながる 2 つの通話区間 (leg) で作ります。片方の leg が <Connect><Room> で Room に音声参加し、もう片方の leg が TwiML App を経由して ConversationRelay につながります。Room の音声は ConversationRelay で文字になり、自前のサーバーへ届きます。
AI を招待する処理は、calls.create を 1 回呼ぶだけです。次のコードは、検証に使ったコードの変数名を簡略化したものです。twiml が Room に参加する側の leg、to の app: が ConversationRelay へつながる側の leg になります。
async function inviteAi(room) {
const twiml = new twilio.twiml.VoiceResponse();
twiml.connect().room({ participantIdentity: 'ai-assistant' }, room);
return client.calls.create({ from: aiFromNumber, to: `app:${twimlAppSid}`, twiml: twiml.toString() });
}
TwiML App の Voice URL は、ConversationRelay の TwiML を返します。日本語で話すため、言語と音声を指定しました。interruptible="speech" は、AI の読み上げ中に話すと読み上げを止める設定です。
<Response>
<Connect>
<ConversationRelay url="wss://<WebSocket API の URL>" language="ja-JP" ttsProvider="Google" voice="ja-JP-Chirp3-HD-Kore" transcriptionProvider="Google" interruptible="speech" welcomeGreeting="AIアシスタントです。何かお手伝いできることはありますか。" />
</Connect>
</Response>
WebSocket サーバーの役割は公式記事のサンプルと同じです。受け取った発話を Bedrock に渡し、生成されたテキストを少しずつ ConversationRelay へ返します。AI への指示は、2 文以内の短い話し言葉で答えるものだけにしました。
検証方法
ブラウザから人間と擬似参加者の 2 人で Room に入り、AI 参加者を招待して自由に会話しました。擬似参加者は、あらかじめ用意した日本語の音声ファイルをボタンで再生する参加者です。
比較のため、同じサーバーに Voice JavaScript SDK でブラウザから発信し、AI と 1 対 1 でも会話しました。
検証結果
1 対 1 での会話
次の会話は、ConversationRelay が書き起こした発話と、AI の応答の抜粋です。途中で割り込んだ応答は、割り込まれるまでに読み上げた部分を示します。
人間: 日本で1番高い山はどこですか?
AI: 日本で一番高い山は富士山で、標高は3776メートルです。(ここで割り込み)
人間: あ、ちょっと待って 天気のいい日におすすめの過ごし方が知りたい。
AI: 天気のいい日は、公園でピクニックをしたり、ハイキングに行ったり、海や川で遊ぶのが (ここで割り込み)
人間: 今日の会議の予定教えて。
AI: 申し訳ありませんが、私はあなたの予定表にアクセスできないので、今日の会議の予定は確認できません。(後略)
割り込むと読み上げが止まり、AI は次の質問へすぐに答えました。感想としては、違和感なく会話でき、ConversationRelay で作る音声 AI の普段の体験と変わらないという形です。
Room での会話
Room でも、人間と擬似参加者のどちらの質問にも AI が答えました。
人間: 来週の会議の議題が3つ 考えて。
AI: 来週の会議の議題として、まず上半期の売上目標の進捗状況を確認することはどうでしょうか。次に、新しいプロジェクトのスケジュール調整と、チームメンバーの業務分担の見直しを議題にするのがいいと思います。
(中略)
擬似参加者: あ、アシスタントさん 天気の良い日におすめの過ごし方を1つ教えてください。
AI: 天気がいい日は、外に出て散歩をするのがおすすめです。(後略)
発話が終わってから AI が話し始めるまでの待ち時間は、3.1 秒から 4.2 秒でした。事前に自動で計測した値でも、1 対 1 と Room の待ち時間に大きな差は見られませんでした。
一方、AI 宛てではない発話にも AI は答えました。次の会話では、擬似参加者が人間に向けて話しかけています。
擬似参加者: ところで、昨日の資料はもう見ましたか?
AI: 申し訳ありませんが、私はAIアシスタントなので資料を見ることはできません。ただ、もし資料の内容について質問があれば (ここで割り込み)
擬似参加者: ところで、昨日の資料はもう見ましたか?
人間: 見ました。
AI: そうですか、ありがとうございます。資料について何か質問や気になる点があれば、いつでも聞いてくださいね。
最後の発話は、擬似参加者がもう一度流した問いかけと、人間の返事「見ました」がつながり、1 つの発話として AI に届いたものです。AI 参加者には、ほかの参加者全員の声を混ぜた 1 本の音声が届きます。そのため、AI は話者を区別できません。
AI が参加しているのは面白い一方、質問を投げると分からなくても答えてしまうので、制御が難しそうだと感じました。会議の中では「AI のあなたに聞いたわけじゃないんだけど」となりそうです。
割り込み
割り込むと AI は読み上げを止めますが、すぐには止まりません。体感としては、1 秒から 2 秒の遅れがあってから止まるというものでした。Room での割り込み 3 件について、割り込みの発話を始めてから AI の音声が止まるまでの時間をブラウザで計測しました。
| 割り込んだ発話 | AI の音声が止まるまで |
|---|---|
| 人間「ちょっと待って」 | 2.2 秒 |
| 擬似参加者「ところで、昨日の資料はもう見ましたか」 | 4.1 秒 |
| 擬似参加者の同じ問いかけと、人間の返事「見ました」 | 8.4 秒 |
サーバーのログでは、Room と 1 対 1 の割り込み 6 件のうち 5 件で、割り込みの通知 (interrupt) が、その発話の書き起こし (prompt) の 6 から 101 ミリ秒前に届いていました。3 件目では、AI が 2 人の発話に重ねて 8 秒ほど話し続けました。
考察
Room で AI を使うなら、呼びかけの語を含む発話にだけ答えるよう AI に指示したり、参加者ごとの音声を別々に扱える構成をとったり等、宛先を判断させる設計を組み込む必要があると思いました。
それでも、複数人の会話の中に AI がいる体験は面白いものでした。たとえば、呼びかけられたときだけ答える議事の補助役のように役割を絞れば、ビデオ会議に新しい体験を加えられそうだと感じています。
まとめ
Twilio Video Room に ConversationRelay の AI 参加者を入れ、1 対 1 の音声通話と比べながら日本語で会話しました。Room の中でも会話は成立し、待ち時間も 1 対 1 と同程度でした。一方、AI はすべての参加者の声を区別せずに受け取るため、宛先の判断を設計に組み込むことが Room で使う際の課題になります。本記事が、複数人の会話に AI を加える際の判断材料になれば幸いです。








