音声予約エージェント
「15時に歯科を予約して、そこまでの配車もお願い」といった発話を受け取り、カレンダーを確認し、実際に予約を取り、配車を手配し、SMSで確認まで送る自然言語の音声インターフェース。

担当領域
フルスタックで構築。音声処理のパイプライン、会話のステートマシン、外部APIとの連携をすべて担当した。
期間
2か月
年
2024
技術スタック
ステータス
稼働中「15時に歯科を予約して、そこまでの配車もお願い」といった発話を受け取り、カレンダーを確認し、実際に予約を取り、配車を手配し、SMSで確認まで送る自然言語の音声インターフェース。
予約はいまだに、使いづらいフォームを操作し、電話をかけ、カレンダーを手で突き合わせる作業を伴う。クリニックのような小規模な事業者は、患者が煩雑な予約フローを途中で諦めるために潜在的な予約の15〜20%を失い、受付は1日4時間以上を電話対応に費やしている。
予約に関わる一連の流れを、会話だけで完結させる自然言語の音声インターフェースを構築した。「15時に歯科を予約して、そこまでの配車もお願い」と伝えれば、カレンダーの空きを確認し、予約を取り、移動手段を手配し、確認を送る。エラーからの復帰と、例外時に人へ引き継ぐ経路も備えている。
自然な会話の流れ
Deepgram Nova-2が98.7%の精度と120msのレイテンシで音声を認識するため、従来のIVRのような機械的なやり取りにならず、自然な往復の会話が成り立つ。
賢いエラーリカバリー
希望の時間が埋まっている場合は、こちらから代替を提示する。「15時はすでに予約が入っています。14時半か16時なら空いていますが、どちらがよいですか」のように返す。
複数サービスの連携
1つの音声指示から、Googleカレンダー、配車、Twilio SMS、予約サービスへの操作が連鎖する。依存関係を解決し、移動手段が予約時刻より前に到着するよう調整する。
会話の記憶
会話履歴を保持して文脈を引き継ぐため、「前回と同じ歯科で」と言えば、正しい医院、希望の時間帯、保険情報まで解決される。
このプロジェクトを形づくった技術選定と、それぞれを選んだ理由。
Deepgram Nova-2
AI・MLリアルタイム用途にはWhisperではなくDeepgramを選んだ。Whisperのバッチ処理が2〜3秒かかるのに対し、120msのストリーミングで返る。医療用語の認識精度も12%高く、医院の予約では重要だった。
ElevenLabs v3
AI・ML入手できるTTSの中で最も自然な音声だったため採用した。ユーザーテストでは85%の参加者が、人の受付との違いを判別できなかった。音声中心のインターフェースでは信頼感に直結する。
LangGraph 0.2.5
AI・ML複数ターンの対話管理にはLangGraphの会話グラフを使った。明示的なステートマシンにすることで、空き確認を経ずに予約を確定するといった不正な状態に入れなくなる。
Twilio
インフラSMS通知には、到達確認とリトライの仕組みがあるため、キャリアのAPIを直接叩くのではなくTwilioを選んだ。通知の取りこぼしは無断キャンセルにつながり、医院にとって1件$150以上の損失になる。
会話状態の管理と複数サービスの連携を軸にした、音声起点のパイプライン。
音声入力
ユーザーの発話 → Deepgram Nova-2のストリーミングSTT(レイテンシ120ms)
意図の抽出
Claude 3.5 Sonnetが意図を分類し、時間・サービス・担当者といった要素を抽出
ステートマシン
LangGraphの会話グラフが予約フローの状態(空き確認 → 予約 → 確定)を管理
サービスの実行
カレンダー確認 → 予約登録 → 配車手配 → SMS通知(依存関係に沿って順次実行)
音声での応答
確認文 → ElevenLabs v3のTTS → 自然な音声でユーザーへ返答
開発中にぶつかった難所と、どう乗り越えたか。
周囲の騒音への対応
移動中や騒がしい場所から予約を取るユーザーが多い。実環境の検証ではDeepgramの精度が98.7%から76%まで落ち、予約時刻や氏名の誤りにつながっていた。
Deepgramへ音声を送る前に、RNNoiseによるノイズ抑制の前処理を挟んだ。さらに認識の確信度が85%を下回った場合は、抽出した内容を読み上げてユーザーに確認する仕組みを入れた。
騒がしい環境での精度は76%から94%へ改善した。実環境での予約ミスは82%減った。
サービス間の時刻調整
歯科の予約時刻に間に合うよう配車するには、時間の扱いが異なる2つのAPIを揃える必要があった。初期は予約の20分前に車が着いて待機料金が発生したり、5分後に着いて遅刻したりしていた。
Google Maps APIで移動時間を算出し、設定可能なバッファ(既定10分)を加えて、予約時刻から逆算して配車する時間推論の層を作った。渋滞の状況が大きく変わった場合は自動で再手配する。
時間内に到着する割合は62%から96%へ上がった。予約前の待ち時間も平均7分に収まった。

