Closed7

音声AIエージェント作成プラットフォーム「Retell AI」を試す

kun432kun432

以下のポッドキャストで紹介されていた。

https://open.spotify.com/episode/1DRzcvmyPClCtQNKxWssoK?si=Xdf-baRsT0SMC8y5snv2FQ

最近は音声対話をいろいろ試していて、今回のエピソードの内容は自分のやっていることとかなりリンクしていたのだけども、このRetell AIだけは知らなかった。

https://www.retellai.com/

ざっと見た感じだと音声AIエージェントを作れるプラットフォームというところなのだけども、以下の動画がわかりやすかった。

https://www.youtube.com/watch?v=pBm-3lBK4Ps

エージェントの会話フロー制御もできるようなので、有償プラットフォームではあるが少し試してみようと思う。

kun432kun432

とりあえず料金。基本的には従量ベースの課金になっていて、「分」単位の料金で記載されているが、実際の課金はミリ秒単位で計算される模様。

https://www.retellai.com/pricing

とりあえず$10(60分に相当)の無料クレジットがあるようなので試してみる。

kun432kun432

アカウントの登録

アカウント登録時に、携帯電話による確認が必要だった。

とりあえずアカウント作成後のダッシュボードの画面。無料クレジットが追加されているのがわかる。

kun432kun432

Get Started

公式ドキュメントに従って進めてみる

https://docs.retellai.com/get-started/quick-start

エージェントの作成。「Agent」メニューから「Create an agent」をクリック。いくつかテンプレートが選べるようだが、ドキュメント通り、「Multi-Prompt Agent」→「Lead qualification」を選択。

こんな感じの画面になる。ここでエージェントのプロンプトなどの設定を行う様子。

次に進む前に、どのような設定ができるか?を見ていこうと思う。まずプロンプト。

日本語に訳したものを以下に記載する。DeepL訳。

## アイデンティティ
あなたは、Retell Real Estate 社のクロエです。ユーザーに電話をかけています。あなたは、ユーザーを大切にする、親切でフレンドリーな受付係です。通話開始時にサムに挨拶します。「こんにちは、サム。Retell Real Estate 社のクロエです。お忙しいところ申し訳ありません。」

## スタイルガイドライン
簡潔に:1 つのトピックにつき、簡潔に回答してください。
多様性を重視:多様な表現や言い換えを用いて、内容を繰り返さずに明確さを高めてください。  
会話調:日常的な言葉遣いを用い、友人と話すような感覚で会話してください。  
積極的:会話をリードし、質問や次のステップの提案で締めくくるようにしてください。  
1つの回答に複数の質問を含めないでください。  
明確化:ユーザーが質問に部分的にしか回答しなかった場合、または回答が不明確な場合は、明確化を図るために追加の質問を続けてください。
日付はカジュアルな表現で参照してください(例:1月14日金曜日、または2024年1月12日火曜日午前8時)。

## 応答ガイドライン
適応と推測:転写ミスを含む可能性のあるトランスクリプトを理解するように努めてください。「転写ミス」という表現は応答で言及しないでください。
キャラクターを維持:会話は自分の役割の範囲内に留め、繰り返しを避けながら創造的に誘導してください。
スムーズな会話の流れを確保:役割に応じた直接的な応答で、スムーズな会話の流れを維持してください。

まあ普通のシステムプロンプトだね。

プロンプトの下に「Welcome Message」というのがある。

接続時にユーザとエージェントのどちらが会話を始めるのか?という設定みたい。エージェントが会話を始める場合は、メッセージを固定 or 動的にできるみたい。

また、一番下に「Edit prompt tree」というのがあって、これはどうやら会話の内容によって処理を振り分ける、というようなことが設定できるみたい。

ここには以下のようなプロンプトが設定されていた。

warm_introのプロンプト
## 物件に関する背景情報
所在地:524 Retell Lane
この物件は、スタンフォード大学に近いパロアルト地区に位置しています。
4ベッドルーム、4バスルーム、広い裏庭付き。総面積は3000平方フィートです。

## タスク
1. まず、顧客であるサムに温かい挨拶をしてください。電話が都合の良い時間かどうか尋ねてください。
- 都合が悪い場合は、折り返し電話をするよう伝えてください。
2. サムに、この電話の理由は、最近524 Retell Laneの物件に興味を示されたため、さらにご支援できるかどうかを確認するためだと伝えます。
3. 物件についての感想を尋ねます。
4. 具体的な希望条件を尋ねます。
5. 家族の人数を尋ねます。
6. 予算を尋ねます。
7. ユーザーが現地見学に興味があるかどうかを確認します。
- はいと回答した場合、schedule_tour に移行します。
- いいえまたは迷っている場合、end_call 関数を呼び出して丁寧に電話を切り、他の興味深い物件があれば連絡すると伝えます。

タスクに含まれていない質問をされた場合、知らないと答えてください。回答を強く求める場合、transfer_call 関数を呼び出して人間担当者に転送します。
schedule_tourのプロンプト
## 物件に関する背景情報
所在地:524 Retell Lane
この物件は、スタンフォード大学に近いパロアルト地区に位置しています。
4ベッドルーム、4バスルーム、広々とした裏庭付き。総面積は3000平方フィートです。

## タスク
1. ユーザーに内覧可能な日時を確認します。
2. ユーザーが指定した時間帯の空き状況を調べるため、check_availability 関数を呼び出します。
- ユーザーが選択した時間帯に空きがある場合、空き状況(日付、時間、タイムゾーン)をユーザーに通知し、その中から選択するよう依頼します。ユーザーが詳細な空きスロットの中から選択したことを確認します。
- 近隣の時間帯に空きがある場合、ユーザーに近隣に空きがあることを通知します。日付、時間、タイムゾーンをユーザーに通知します。
- 空きがない場合、ユーザーに別の時間帯を選択するよう依頼し、ステップ2から繰り返します。
3. ユーザーが選択した日付、時間、タイムゾーンを確認します:「確認のため、予約は...でよろしいでしょうか?」この時間が利用可能なスロット内であることを確認してください。
4. 確認後、book_appointmen t関数を呼び出して予約を確定します。
- 予約が予約詳細を返した場合、予約は成功です。処理を続行してください。
- 予約がエラーメッセージを返した場合、ユーザーに予約が失敗した理由を通知し、ステップ1からやり直してください。
5. 予約が成功した場合、ユーザーに通知し、質問があるかどうかを確認します。回答できる場合は回答します。
- ユーザーに質問がない場合、end_call関数を呼び出して通話を終了します。
callbackのプロンプト
## 背景
営業時間:月曜日から金曜日 午前 9 時から午後 5 時(太平洋夏時間)。
現在の時刻は {{current_time}} です。過去の日時にコールバックを予約することはできません。

## タスク
1. ユーザーにコールバックを予約する都合の良い時刻を尋ねます。
2. ユーザーが指定した時刻が営業時間内であるかどうかを確認します。
- 営業時間外の場合は、ステップ 1 に戻って時刻を確認します。
3. ユーザーにコールバックがスケジュールされたことを通知し、end_call 関数を呼び出して通話を終了します。

最初のプロンプトと合わせて、不動産会社がユーザが興味を持っている物件についてフォローアップの電話をして、興味がありそうなら内覧のスケジューリングを行い、折り返し連絡する、というようなストーリーになっているみたい。

次に、モデルなどの設定。プロンプトの上に、使用するモデル・音声・言語を設定する箇所がある。

まず使えるモデルは以下。主要モデルプロバイダーのものになっている様子。

モデル名の横の歯車アイコンでtemperatureなどの設定もできる。

音声は、ElevenLabs・HT・PlayHT・OpenAIから選択できる。

また横の歯車アイコンから、音声のモデルや発話スピードなどが設定できる。

言語は多数対応しているようだけど、ここは使用する音声とも関連しそうな気がするな。PlayHTは確かビルトインで日本語モデルはなかったと記憶している

でこれらの組み合わせで、レイテンシーとコストが変わってくる。

今回は、

  • LLM: gpt-4.1-nano
  • TTS: OpenAI
  • 言語: 日本語

に設定してみた。言語設定もあるので、プロンプトはそのままでいいかなと。

で、右側でテストを行う。

ここでテスト時に使用するFunctionsやKnowledge Baseなどの設定も行える様子。ここも少し見ていく。

まずFunctionsはエージェントに与える機能を設定する。通話の終了、通話の転送、カレンダー、ボタン操作などがビルトインで用意されていて、カスタムで作ることもできる様子。

Knowledge BaseはいわゆるRAGのナレッジベース。別の画面でドキュメントを登録しておくとおそらく検索できるようになるのだろう。

Speech Settingsでは、発話に関する設定ができる。ここの設定はちょっと興味深い。

  • Backgroud Sound: BGMを設定できる。ビルトインで用意されているものから選択する。
  • Responsiveness: ユーザ発話終了からエージェントにどれだけ速く応答させるか
  • Interruption Sensitivity: ユーザの発話に対して、エージェントの発話を停止させる感度。いわゆる割り込み。
  • Enable Backchanneling: ユーザの発話中にエージェントが相槌を打つか。有効にすると、相槌の頻度や相槌のフレーズなどを設定できる。
  • Transcription Mode: 文字起こしの精度とスピードのバランスを設定できる。
  • Boosted Keywords: 特定のキーワードにバイアスを掛けて認識精度を上げる。固有名詞などを想定。
  • Enable Speech Normarization: 数値・通貨・日付などを正しく発話するように変換する。
  • Enable Transcript Formatting: デフォルトだと電話番号などの数値はプレーンな単語でもジオ湖押しされる、これをフォーマットする。
  • Reminder Message Frequency: ユーザが無音の場合にエージェントから話しかける頻度
  • Pronounciation: 特定の単語の発話をカスタマイズする

相槌なんかは面白そう。ただ、相槌の頻度やフレーズを設定する、というところを踏まえると、意図を理解した相槌ではなく、機械的なものなのかなーという気がする。あとで確認してみる。

Call Settingsは、通話に関する設定。留守電時に音声を残すか、通話時間、など。全般的にRetellは電話というのがターゲットになっているような感がある。

Post-Call Analysisは、通話終了後に通話内容から特定の情報を抽出するもの。ElevenLabsのConversational AIなどにも同様の機能があった。参考

Security & Fallback Settingsは、データのオプトイン・オプトアウトや、TTS音声が使用できないときの予備などを設定できる。

Webhook Settingsでは受電時やエージェントの特定の処理時にWebhookを叩くことができる。

色々設定はあるけども、個人的に興味があったSpeech Settingsで以下の項目を設定した。

  • Background Sound: "Coffee Shop"
  • Enable Backchanneling: 有効
    • Backchannel Frequency: 0.8
    • Backchannel Words: うんうん,なるほど,そうですね,そうなんですね

では、テストしてみる。「Test」をクリック。

ブラウザベースで確認ができるようで、マイクの使用許可が求められる。

が、これ一瞬で終わってしまう上、英語で応答が返されていた。

とりあえず以下のようにプロンプトを日本語に変えて、あと、どうやらFunctionのEnd Callで通話が会話が終了していたようなので、一旦これを削除した。

再度試してみた。

https://youtu.be/_r59cZvTBow?si=aaiXwdKLNzUAJN92

いろいろ変なところもあるけど、まあそれっぽいものにはなってる。相槌は効いてるのか効いてないのかわからないな。

kun432kun432

印象としては以前試した以下と同じような感じで、

https://zenn.dev/kun432/scraps/0deaedc901087f

  • ユーザ発話の認識精度があまり良くない。
  • TTSはちょいちょい読み間違える。

まあこのあたりは日本語の難しさという気もする。この手のサービスをいくつか日本語で試した感覚からすると結構厳しい印象を持っているのだけど、英語ではそれなりに使える感じになってるのかな???

あと、今回気になっていた相槌だけども、これエージェント側の発話の最初にちょっと組み込まれる感じだな。ユーザ側で長々と喋っている間に相槌を入れてくれるようなものを期待してたのだけど、そうではなかった。でもまあ多少相槌やフィラー的なものはあったほうがより会話してる感が出てくるとは思う。レイテンシーを緩和するような使い方もできるとは思うし(Retellの場合はあまりそういう用途ではなかった缶があるけども)

いずれにせよ、いろいろ音声エージェント系のSaaSあるけど、日本語で使おうと思うと改めて現状まだまだ厳しいかなと感じた。

kun432kun432

とはいえ、ある程度会話のタスクの方向性が固まっているならば、サービスという形でコーディング不要で作れるのは良いと思う。よりグラフィカルに会話フローをつくることもできるみたい。

また、SDKを使ってエージェント部分をコードで書くということもできる様子。

https://docs.retellai.com/get-started/sdk

このスクラップは4ヶ月前にクローズされました