• ホーム
    • 企業別練習
    • 面接練習
    • 求人募集
    • 対策記事
    • Webテスト対策
    • メッセージ
  1. トップ
  2. /
  3. 対策記事
  4. /
  5. 中途向け
  6. /
  7. ケース面接
  8. /
  9. 技術設計面接の解説と模範解答|音声対話システム開発

技術設計面接の解説と模範解答|音声対話システム開発

ケース面接

2026/11/03

技術設計面接の解説と模範解答|音声対話システム開発

目次
  • より詳しい情報はこちら


  • 事前知識:音声対話の方式と最初の仮説


  • 患者が言い終えてから AI の声が出るまで


  • それぞれの方式で何が起きるか


  • 方式を比べる


  • どの方式でも要る 2 つの処理


  • 最初の仮説


  • お題と要件


  • 音声対話の方式の選び方に関わる前提


  • それ以外の前提


  • 隠れていた前提を見直す


  • 前提どうしのぶつかり


  • 仮説の答え合わせ


  • 解説:このお題の論点


  • 模範解答


  • 1. 作る範囲


  • 2. 見積もり


  • 3. データモデル


  • 4. 全体構成


  • 5. 深掘り:1 秒の内訳


  • 6. 深掘り:取り違えを防ぐ確認


  • 7. 深掘り:スタッフへつなぐ経路


  • 8. 障害への備えと監視


  • 9. 条件の変更への対応


  • まとめ:選んだものと捨てたもの


  • よくあるつまずき


  • 参照元


技術設計面接(システムデザイン面接)のお題「音声対話システム開発」を題材に、事前に押さえておく知識、面接で引き出せる前提、論点、模範解答、よくあるつまずきを順に解説します。

ほかのお題の解説は技術設計面接の解説と模範解答まとめにあります。

より詳しい情報はこちら

この記事で使う設計の基礎は、日本語のシステムデザイン面接の教材 SystemDesign InterviewCat で詳しく学べます。この記事の各節に関係する章は次のとおりです。

InterviewCat の章

この記事で関係する節

イントロダクション(無料)

SystemDesign InterviewCat の全体像

システムデザイン面接のコンプリートガイド

面接で見られることと進め方

リアルタイム双方向通信(WebSocket)

4. 全体構成(電話 API と音声をやり取りする)

ステートフル接続に対してスケーラブルな設計を行う

4. 全体構成、9. 条件の変更への対応(200 院への拡大)

ネットワークレイテンシを改善する

5. 1 秒の内訳

大量のリクエストを制限する

2. 見積もり、4. 全体構成(予約 API の流量制御)

リクエストのリトライ設計について

6. 取り違えを防ぐ確認、8. 障害への備え(登録を再試行しない理由)

チケット予約サービスの設計

6. 取り違えを防ぐ確認(Web 予約との枠の取り合い)

冗長化とフェイルオーバーによるシステムを切り替え

7. スタッフへつなぐ経路、8. 障害への備え

事前知識:音声対話の方式と最初の仮説

設計面接では、お題を聞いた時点で「たぶんこの作りだろう」という仮説を持ち、前提を聞くたびにそれを確かめたり崩したりします。電話で話す AI のお題なら、まず「患者の声を受けてから AI の声を返すまでを、どうつなぐか」の選択肢を押さえておきます。声を受けて声を返すまでを、文字を経由して順につなぐか(OpenAI は chained、一般にはカスケード方式と呼ぶ)、音声をそのまま扱うモデルに任せるかの選び方を、ここでは音声対話の方式と呼びます。

患者が言い終えてから AI の声が出るまで

患者が「来週の水曜の午前に空いてますか」と言い終え、AI が「水曜の午前ですね。10 時と 11 時が空いています」と返す場面を、方式ごとに時間の棒で並べます。横軸は患者が言い終えてからの時間で、点線が前提の 1 秒です。

患者が言い終えてから AI の声が出るまでを、3 つの方式で時間の棒に並べた図
上の 2 行の棒の長さは 5 の表の目安(Twilio)をもとにした大まかなもので、電話網の往復は含めていない。下の行は受け渡しが無いぶん短いことを示す模式で、目安の数字は無い
  • 話し終わりの判定:相手が話し終わったか、まだ続くかを見分ける処理
  • STT:声を文字に起こす音声認識
  • LLM:文字の会話を読んで、返事の文や予約 API の呼び出しを決める言語モデル
  • TTS:文字を声にする音声合成
  • ストリーミング:前の処理が全部終わるのを待たず、できた分から次の処理へ渡すこと

それぞれの方式で何が起きるか

同じ「来週の水曜の午前に空いてますか」に対して、方式ごとに裏で起きることを並べます。

順につなぐ方式(無音を待ってから処理する):無音が一定時間続くのを待ち、録った音声を STT に渡して文字にし、その文字を LLM に渡して返事を作り、「水曜の午前ですね。10 時と 11 時が空いています」が全部できてから TTS で声にします。部品ごとに製品を選べ、途中に文字が残るので、何を聞き取って何を答えたかを確かめられます。弱いところは、待ちが足し算になることです。図の 1 行目のように、無音の待ち、文字起こし、返事の全文、声の合成が順に並ぶので、1 秒には届きません。

順につなぐ方式(ストリーミングで重ねる):部品は同じですが、待ちを重ねます。STT には話している最中から音声を流して文字起こしを進めておき、LLM が「水曜の午前ですね」の 1 文を作った時点で TTS に渡して話し始めます。「10 時と 11 時が空いています」は、1 文目を話しているあいだに作ります。無音を待つ方式と比べると、途中に文字が残る良さを保ったまま、話し始めまでの時間を大きく縮められます。それでも、話し終わりの判定の待ちと、文字起こし、返事、声それぞれの最初の出力までの時間は残ります。

音声をそのまま扱うモデル(speech-to-speech):声を受けたモデルが、文字を経ずに声で答えます。順につなぐ方式と比べると、処理を受け渡す時間が無いぶん速く、声の調子も返事に反映できます。ただし、話し終わりの判定は同じように要ります。弱いところは、返事の前に中身を確かめにくいことです。OpenAI の Realtime API では、患者の発話の文字起こしはモデルとは別の仕組みで非同期に作られるので(OpenAI Realtime client events)、返事より先に検査には使えません。返事の文を決まった型に差し替えたり、部品を 1 つだけ別の製品に替えたりすることもできません。

方式名は製品やフレームワークによって呼び方が変わりますが、設計面接で比べたいのは名前ではなく、どこで待ちが生まれ、返事の前に何を確かめられるかです。

方式を比べる

方式の違いは、「水曜の午前ですね。10 時と 11 時が空いています」と返すまでの時間と、聞き取った内容を返事の前に確かめる場面の 2 つに、「決まった手順を守らせやすいか」を加えて比べると分かりやすくなります。

方式

話し終わってから声が返るまで

聞き取った内容を返事の前に確かめる

決まった手順を守らせやすいか

順につなぐ(無音を待つ)

返事を全文作ってから話すので、無音の待ち、文字起こし、返事の全文、声の時間の足し算になる

できる(文字が残る)

守らせやすい

順につなぐ(ストリーミング)

「水曜の午前ですね」ができた時点で話し始めるので、話し終わりの待ちと、文字起こし、返事、声それぞれの最初の出力までの時間で済む

できる(文字が残る)

守らせやすい

音声をそのまま扱うモデル

話し終わりの待ちとモデルの最初の声までで、処理を受け渡す時間が無いぶん短い

難しい(文字起こしは返事と並行して別に作られるので、返事の前には使えない)

モデルの指示の守り方に頼る

表から分かるとおり、速さだけなら音声をそのまま扱うモデルが有利で、確かめやすさなら順につなぐ方式が有利です。順につなぐ方式でもストリーミングで重ねれば、速さの差はかなり縮まります。ただし、どの方式でも話し終わりの待ちは残ります。

どの方式でも要る 2 つの処理

話し終わりの判定:一番簡単な形は、VAD(音声に人の声が入っているかどうかだけを見分ける仕組み)で無音が一定時間続いたら話し終わりとみなすものです。無音の長さだけで決めると、待ちを短くすれば言いよどみの途中で割り込み、長くすれば返事が遅れます。そこで、文字起こしの途中経過と会話の流れから「この言い方なら続きがある」と見分けるモデルを VAD と併せて使う方法があります。「来週の、えっと」で止まったら待ち、「水曜の午前で」で止まったら早めに返す、という区別ができます。

割り込み:AI が話している途中で患者が話し始めることを割り込みと呼び、どの方式でも、割り込まれたらすぐ AI の声を止める処理が要ります。止め方の詳細は、模範解答の 5 で扱います。

最初の仮説

お題文だけを読んだ段階では、次の仮説を置きがちです。どれも筋は悪くありませんが、前提を聞くと一部が崩れます。答え合わせは「隠れていた前提を見直す」で行います。

仮説

中身

確かめること

1

音声をそのまま扱うモデル 1 つで作れば、速くて簡単

聞き取った内容を文字で使う場面があるか、答えてはいけない用件があるか、費用の上限

2

話し終わりは、無音が一定時間続いたら決めればよい

話し始めまでの許容時間、患者の話し方の特徴

3

聞き取った日時と名前をそのまま予約 API に登録すればよい

取り違えの重さ、聞き取りにくさ、ほかの経路と枠を取り合うか

4

AI が困ったらスタッフに転送すればよい

AI が止まったとき、転送先がいない時間帯、スタッフの人数

お題と要件

面接官から示されるお題は次のとおりです。

本日はシステムの設計方法についてディスカッションしたいと思います。今、歯科クリニックチェーンの電話の予約受付を自動化するために、音声で対話するAIを作ることを考えています。電話で予約の新規・変更・キャンセルを受け、予約台帳のAPIで空きを確認して登録し、判断できない用件はスタッフに転送するようにしたいです

▼このお題は CaseMatch の AI 面接で、面接官に前提を質問しながら練習できます。

前提は質問すれば答えてもらえます。面接で引き出せる前提を、音声対話の方式の選び方に関わるものとそれ以外に分けて並べます。種類の列は、機能要件、非機能要件、制約、将来のどれにあたるかです。設計への影響の列は、次の節の問いを考えてから読んでください。

音声対話の方式の選び方に関わる前提

事前知識の比較表の 3 つの比べ方(声が返るまでの時間、返事の前に確かめられるか、手順を守らせやすいか)と、どの方式でも要る話し終わりの判定と割り込みの扱いを決める前提です。

種類

前提

値

設計への影響

非機能

応答の速さ

相手の話し終わりから1秒以内に発話開始

無音を待ってから順に処理する作りでは届かない

機能

割り込み

患者が途中で話したらすぐ発話を止める

電話の側で再生を待つ音声まで捨てる

非機能

話し方

高齢患者が多く聞き取りにくい話し方もある

無音の待ちを短くすると言いよどみで割り込む

非機能

発音

方言や入れ歯で発音が不明瞭な患者もいる

番号を声の聞き取りに頼れない

制約

予約 API の速さ

予約APIは1回1〜2秒、毎秒10リクエストまで

待つあいだに話すことが要り、呼び出しを全通話で分け合う

機能

答えない用件

症状の相談や治療内容の質問には答えず、スタッフへ転送する

返事の前に中身を確かめられる作りが要る

機能

転送時の画面

転送したときは、AIが聞き取った用件をスタッフの画面に出したい

聞き取った内容を文字で持つ

制約

費用

費用は1通話あたり50円以内

方式ごとの単価と通話の長さで比べる

それ以外の前提

取り違えの防ぎ方、予約台帳とのやり取り、転送、個人情報、規模のように、どの方式を選んでも別に設計が要る前提です。

種類

前提

値

設計への影響

機能

目標

受付スタッフの電話対応を半分に減らし、来院した患者の対応に回したい

予約の電話の大半を AI が最後まで終える必要がある

非機能

取り違え

予約の日時や患者の取り違えはゼロにしたい。迷ったらスタッフへ転送してよい

登録の前に必ず確かめる手順を置く

非機能

通話の量

首都圏に40院、1院あたり電話は1日60〜80件で、うち予約関連が約7割

AI が終えるべき割合が決まる

非機能

同時通話

ピーク同時100通話

予約 API の上限とぶつかる

非機能

ピークの時間

ピークは平日の9〜10時と、昼休み明けの14時台

スタッフも忙しい時間に転送が集まる

機能

患者の特定

患者は診察券番号、または氏名・生年月日・電話番号で特定する

番号はプッシュ入力で受ける

制約

枠の取り合い

同じ空き枠をWeb予約と取り合うことがある

確定の直前に空きを照会し直す

制約

電話の転送

各院の代表番号はクラウドPBXにあり、外部の電話APIへ転送できる

停止時の転送を電話の側に持たせられる

制約

予約台帳 API

予約台帳はSaaSで、APIは空き照会と登録・変更・取消のみ

登録の結果が分からないとき、予約を読み返して確かめられない

制約

録音

通話は既存の仕組みで録音しており、3年保存の決まりがある

録音は既存の仕組みに任せ、AI の側で音声を持たない

制約

停止時

停止しても電話は必ずつながる

AI の外に転送の経路を持つ

制約

急患

痛い・腫れているなどの急患の当日枠はスタッフが判断

急患は予約を取らずに転送する

制約

症状の扱い

症状は要配慮個人情報にあたり、外部に保存する場合は同意が要る

症状の中身を記録に残さない

制約

転送先

受付スタッフは1院2名、転送先は各院の内線

転送が出られないときの扱いが要る

機能

夜間と休日

夜間・休日も予約を受けたいが、その時間は転送先がいない

転送の代わりに折り返しを受け付ける

将来

拡大

1年後に全国200院へ広げる

同時通話が増え、予約 API の上限が先に詰まる

隠れていた前提を見直す

お題文は「電話で予約を受けて、空きを確認して登録し、判断できなければ転送する」としか言っていません。前提の表は、質問して初めて出てきたものです。設計への影響を見る前に、あらためて前提を読み直し、お題文の裏に何が隠れていたかを考えます。先に次の問いを考えてから、前提の表の「設計への影響」の列と見比べてください。

  1. 前提のうち、互いにぶつかっている 2 つの組を 3 組挙げてください。
  2. 話し終わりの待ちを短くしたい理由と、長くしたい理由を、前提から 1 つずつ挙げてください。
  3. 最初の仮説 1〜4 のうち、どれがどの前提で崩れますか。
  4. お題文からは読み取れなかったのに、設計を一番大きく変えた前提はどれですか。

前提どうしのぶつかり

前提の多くは単独では難しくありません。難しいのは 2 つが互いに逆を向いているところで、このお題では次の 3 組です。これがそのまま、面接の後半で詳しく問われる 3 つの論点(深掘り)になります。

ぶつかる前提

なぜぶつかるか

解き方

1 秒以内に発話開始 × 聞き取りにくい話し方

無音の待ちを短くすると言いよどみで割り込み、長くすると 1 秒を超える

話し終わりを言い方から見分け、処理を重ねる

取り違えゼロ × 聞き取りにくい話し方、Web 予約と枠を取り合う

聞き取りを信じて登録すると誤り、聞き直しを重ねると通話が長くなり、確かめた枠もすぐ埋まりうる

番号はプッシュ入力にし、日時と患者は復唱で確かめ、確定の直前に空きを照会し直す

停止しても電話は必ずつながる × 電話を AI が受ける、夜間は転送先がいない

AI が電話を最初に受けるので AI が止まると電話もつながらず、夜間は転送先もいない

転送の経路を AI の外(電話 API とクラウド PBX)に持たせ、夜間は折り返しの依頼として受ける

仮説の答え合わせ

仮説

崩した前提

置き換え

1. 音声をそのまま扱うモデル

症状には答えない、取り違えゼロ(復唱の文を型で固定したい)

STT、LLM、TTS を順につなぎ、ストリーミングで重ねる(音声をそのまま扱うモデルは代わりの案に回す)

2. 無音で話し終わりを決める

1 秒以内、聞き取りにくい話し方、方言や入れ歯

VAD に、意味から話し終わりを見分けるモデルを足す。番号のように聞き違えると困るものはプッシュ入力にする

3. 聞き取ったまま登録

取り違えゼロ、Web 予約との取り合い、API に予約の読み出しが無い

復唱で確かめてから登録し、確定の直前に空きを照会し直す。登録の結果が分からないときはスタッフに回す

4. 困ったら転送

停止しても必ずつながる、夜間は転送先がいない、1 院 2 名

AI が止まっても電話 API の側で内線へ転送する。内線が出ないときと夜間は折り返しの依頼として受ける

このお題は、音声認識と LLM をつないで予約を取るだけのシステムに見えます。しかし実際に問われるのは、「1 秒以内に話し始める」速さと、「日時と患者を取り違えない」「止まっても電話がつながる」確かさを、聞き取りにくい電話の音声の上で両立させる設計です。

解説:このお題の論点

論点は 3 つあり、重さの順に 1 秒の内訳、取り違えを防ぐ確認、スタッフへつなぐ経路です。どれも前提のうち 2 つが互いにぶつかっており、どちらをどう守るかを自分で決めて説明できるかが問われます。予約台帳の側の作りには深入りしなくてかまいません。

模範解答の深掘り(5〜7)では、論点ごとに「弱い答え」「よい答え」「より良い答え」を並べ、何が足りないかを示しています。

模範解答

面接での問答の順には合わせず、このお題への答えを 1 つの設計としてまとめた解答例です。設計の筋は、STT、LLM、TTS をストリーミングで重ねて 1 秒に収め、予約台帳には復唱で確かめた内容だけを送り、AI が止まっても電話の側で内線へつなぐ、というものです。前提に無いことは仮定として置き、その旨を書いています。

1. 作る範囲

前提を確かめたうえで、最初に作る範囲を次のように切ります。

  • 作る:電話 API との音声のやり取り、話し終わりの判定と割り込みの扱い、予約の新規、変更、取消の会話、復唱とプッシュ入力による確認、予約台帳 API の呼び出しと流量制御、スタッフへの転送と用件の表示、夜間と休日の折り返しの受け付け、通話と用件の記録
  • 作らない:症状の相談や治療内容への回答、予約台帳そのもの、Web 予約、通話の録音(既存の仕組みを使う)

LLM には会話の聞き取りと言い換えだけを任せ、予約台帳に何を送るか、いつ転送するかは、会話の状態を持つ自前のコードで決めます。

2. 見積もり

見積もりで出すのは、構成を決める 3 つの数字だけです。どれも前提の値から計算できます。

見積もり

計算

決まること

AI が最後まで終える割合

0.5 ÷ 0.7 ≒ 0.7(予約の電話の 7 割)

転送は予約の電話の 3 割までに抑え、転送の理由を数える

スタッフに残る電話

60〜80 件 × 0.5 = 1 院 1 日 30〜40 件

2 名で受けきれない時間に備え、内線が出ないときの折り返しを置く

予約 API の呼び出し(上限を全院で共有すると仮定)

10 回/秒 ÷ 100 通話 = 1 通話あたり 10 秒に 1 回

全院で共有する流量制御を置く

3. データモデル

予約台帳の正となるデータは SaaS の側にあり、自前で持つのは「1 本の通話で何を聞き取り、何を確かめ、台帳に何を送ったか」の記録だけです。中心になる表は次の 4 つです。

表

主な項目

書き換え

通話

通話 ID、院 ID、発信者番号、開始と終了の日時、結果(AI で完了、転送、折り返し)

通話の終わりに結果を書く

用件

通話 ID、種類(新規、変更、取消)、患者 ID、希望の日時、項目ごとの確認状態(未確認、復唱済み、プッシュ入力済み)

会話の進みに合わせて更新する

予約操作

操作 ID、用件、送った内容、結果(成功、枠が埋まっていた、結果不明)

追記のみ

転送と折り返し

通話 ID、理由(急患、答えない用件、聞き取れない、障害)、転送先、用件の要約、折り返しの状態

折り返しの状態だけを更新する

予約操作の表は、すべての項目が確認済みになった用件からしか作れないようにします。用件の要約には「症状の相談あり」のような種類だけを書き、症状の中身は残しません。

4. 全体構成

患者との会話は、通話ごとに 1 つの音声エージェントが最初から最後まで受け持ちます。予約台帳との通信と記録は、その裏で流量制御を通して行います。

通話は電話 API から音声エージェントへ届き、予約は流量制御を通して台帳へ送る
全体構成:通話の流れと、予約と転送の裏側

色を付けた音声エージェントがこの設計の要で、会話の状態と「何が確認済みか」をここで持ちます。

  1. クラウド PBX と電話 API:各院の代表番号への着信を外部の電話 API へ転送し、電話 API が音声を WebSocket で音声エージェントへ流します。電話の音声は 8kHz なので、STT にはその前提で精度を測ったものを選びます。
  2. 音声エージェント(自前):1 通話に 1 つ立ち上がり、話し終わりの判定、STT と LLM と TTS の受け渡し、割り込みの扱い、会話の状態(用件と確認状態)を受け持ちます。通話のあいだ接続を持ち続けるので、空きのあるエージェントへ新しい通話を振り分け、通話の数に合わせて台数を増やします。
  3. STT、LLM、TTS:外部のサービスを使い、どれもストリーミングで呼びます。LLM には症状に答えないこと、予約に必要な項目を聞き取ることだけを指示し、復唱の文は LLM に作らせずテンプレートで組み立てます。
  4. 予約ツールと流量制御:音声エージェントから呼ばれ、確認済みの用件だけを予約台帳 API に送ります。全院の呼び出しを 1 つの流量制御に通し、確定の直前の照会と登録を、先回りの照会より優先します。
  5. 停止時の応答:電話 API に、音声エージェントが応答しないときに使う予備の指示を登録しておき、その中身は「院の内線へ転送する」だけにします。AI のサーバーが丸ごと止まっても、この指示は電話 API の側で動きます。
  6. スタッフ画面と記録:転送の前に用件の要約を画面に出してから内線を鳴らします。夜間と休日の折り返しの依頼も同じ画面に並べ、翌朝スタッフが順にかけ直します。

通話の録音は既存の仕組みに任せ、音声エージェントは音声を保存しません。STT の文字起こしも、記録に残すのは用件の項目だけにして、会話の全文は残しません。

実例:OpenAI は音声エージェントの作り方として、音声をそのまま扱うモデルと、STT、LLM、TTS を順につなぐ方式の 2 つを挙げ、後者の利点に処理ごとの中身が見えること、決まりの検査や会話の記録を残しやすいことを、弱みに遅延が増えることを挙げています(OpenAI Voice agents)。電話 API の例として Twilio の Media Streams は、通話の音声を 8kHz の μ-law で WebSocket に流し、こちらから返した音声を再生します(Twilio Media Streams)。

代わりの案:STT、LLM、TTS の代わりに、音声をそのまま扱うモデルを使う構成もあります。話し始めまでの時間は縮まりますが、復唱の文をテンプレートで固定すること、症状の相談を返事の前に止めることがしにくくなります。採るなら、モデルが予約ツールを呼ぶときの引数を文字の用件として受け取ってスタッフ画面にも出し、確認と登録の手順は自前のコードに残します。1 通話 50 円に収まるかは、どちらの方式も通話の平均の長さと各サービスの単価で計算して比べます。

5. 深掘り:1 秒の内訳

1 秒は、処理を順に待つと超え、重ねても余裕の無い長さです。話し終わりの判定、STT、LLM、TTS のそれぞれで「何を待っているか」を分け、待ちを重ねるか短くします。最初の仮説の 1 と 2 は、ここで崩れます。

答えの段階

答え

足りないところ

弱い答え

低遅延のモデルを使います

どこに時間がかかるかを言っておらず、1 秒に収まる根拠が無い

よい答え

STT、LLM、TTS の処理ごとの時間を見積もり、LLM の出力を文ごとに TTS へ渡します

話し終わりを決める待ちと、予約 API の 1〜2 秒の扱いが無い

より良い答え

処理ごとに重ね、話し終わりは意味から見分け、決まった文は作り置きの声で返し、予約 API を待つあいだは先に一言話します

なし(中身は下の表と 4 つの項目)

処理ごとの目安は次のとおりです。数字は Twilio が公開している目安で、製品と条件で変わるので、作るときは自分で計測し直します。

処理

何を待つか

目安

縮め方

話し終わりの判定

無音が続くのを待つ

無音の待ちの長さそのもの

意味から見分けるモデルで、言い切った発話では待ちを短くする

STT

最後の言葉の文字起こしが確定する

約 350ms

話している最中から音声を流し、文字起こしを先に進めておく

LLM

返事の最初の文字が出る

約 375ms

指示を短くし、復唱や定型のあいさつは LLM を通さず固定の文で返す

TTS

最初の音が出る

約 100ms

LLM の出力を文ごとに渡し、定型の文は声を作り置く

電話網と通信

声が行って戻る

Twilio の目標では、処理側 885ms と、話し手の声が相手の耳に届くまでの 1,115ms の差の約 230ms

音声エージェントを電話 API と近い地域に置く

3 つの処理の目安を足すと約 825ms、電話網を含めると 1 秒を超えます。目安どおりでも 1 秒には余裕が無いので、話し終わりの待ちを意味から見分けて短くし、決まった文は作り置きの声で返します。

  • 話し終わりは意味から見分ける:VAD に加えて、文字起こしの途中経過から「まだ続くか」を見分けるモデルを使います。「来週の、えっと」なら待ちを長く、「水曜の 10 時でお願いします」なら短くします(OpenAI の Realtime API でも、無音で区切る server_vad とは別に、話し終わった確からしさを中身から見積もる semantic_vad を選べます。OpenAI Voice activity detection)。高齢の患者の言いよどみで割り込まないことと、言い切った発話にすぐ返すことを、無音の長さ 1 つで両立させなくて済みます。
  • 予約 API を待つあいだは先に話す:空き照会は 1〜2 秒かかるので、呼び出すと同時に「空きを確認しますね」と固定の文を流します。この文は作り置きの声なので、LLM も TTS も待ちません。照会が終わったら結果を話します。
  • 割り込まれたら、電話の側の音声まで捨てる:患者が話し始めたら、TTS と LLM の生成を止め、電話 API の側で再生を待っている音声も消します。会話の記録は患者に実際に聞こえたところまでで切ります。「はい」「ええ」のような相づちでは止まらないよう、相づちと割り込みを見分ける仕組みも使います。
  • 話す速さをゆっくりにする:高齢の患者が多いので、TTS の話す速さを落とし、1 文を短くします。1 文が短いほど最初の文が早くでき、割り込まれたときに聞き逃す量も減ります。

この構成で 1 秒を超えやすいのは、LLM が予約ツールを呼ぶかどうかを決めてから話す場面です。ツールを呼ぶと決めた時点で固定の文を先に流し、ツールの結果を待つ時間を会話の間に隠します。

実例:Twilio は、STT、LLM、TTS を順につなぐ音声エージェントの遅延を処理ごとに分け、STT 約 350ms、LLM の最初の出力まで約 375ms、TTS の最初の音まで約 100ms を目標に挙げ、LLM がストリーミングで返さないなら採用しない、としています(Twilio, 2025)。LiveKit は、無音の長さだけで話し終わりを決めると短ければ割り込み、長ければ遅れると指摘し、過去の会話から話し終わりを見分けるモデルで意図しない割り込みを 85% 減らしたと報告しています(LiveKit, 2024)。電話の側では、Twilio の Media Streams に clear を送ると、再生を待っている音声がすべて消えます(Twilio Media Streams)。

6. 深掘り:取り違えを防ぐ確認

予約台帳に送るのは、患者と日時と操作の種類がすべて確認済みになった用件だけです。確認のしかたは項目ごとに変え、聞き取りにくい項目ほど声に頼りません。

答えの段階

答え

足りないところ

弱い答え

聞き取った内容を確認してから登録します

どの項目をどう確かめるかが無い

よい答え

患者と日時を復唱し、「はい」をもらってから登録します

番号の聞き違いと、確かめたあとに Web 予約で枠が埋まる場合が残る

より良い答え

番号はプッシュ入力で受け、患者と日時は復唱し、確定の直前に空きを照会し直します

なし(中身は下の流れと 3 つの項目)

  1. 患者を特定します。診察券番号は声ではなく電話のボタンで押してもらい、桁数と終わりのキー(#)を決めて受けます。診察券が手元に無ければ、生年月日をボタンで受け、発信者番号と合わせて患者を絞ります。最後に氏名を AI から読み上げ、「はい」をもらいます。
  2. 日時を復唱します。「11 月 5 日、水曜日の午前 10 時」のように日付と曜日を両方言い、「来週の水曜」のような言い方は AI の側で日付に直してから読み上げます。復唱の文はテンプレートで作り、LLM に言い換えさせません。
  3. 確定の直前に、その枠の空きを照会し直します。埋まっていたら、近い空きを 2 つほど提案して 2 に戻ります。
  4. 登録して、結果を「ご予約を承りました。11 月 5 日、水曜日の午前 10 時です」のように日時を添えて伝えます。
  • 聞き取れないときの扱い:同じ項目を 2 回聞き直しても確かめられなければ、3 回目は聞かずにスタッフへ転送します。前提が「迷ったら転送してよい」なので、聞き直しを重ねて通話を長くするより、転送したほうが取り違えも患者の負担も減ります。
  • 登録を自動で再試行しない:予約台帳 API には予約を読み出す機能が無いので、登録が時間切れになると、予約が入ったかどうかを確かめられません。もう一度送ると二重に入るおそれがあるので、結果不明の登録は再試行せず、患者には「確認してスタッフから折り返します」と伝え、スタッフ画面に回します。照会は何度送っても台帳を変えないので、再試行してかまいません。
  • 変更と取消:対象の予約を、患者と、患者が言う元の日時で指します。元の日時も復唱し、取り消す予約を取り違えないようにします。変更は「新しい枠の登録」と「元の枠の取消」の 2 つの操作になるので、新しい枠の照会し直しを先に済ませます。変更の API が 1 回で済むかは前提に無いので、面接では確かめたい点として面接官に聞きます。

Web 予約と枠を取り合う問題は、予約台帳 API に枠を仮押さえする機能が無いので、こちらでは完全には防げません。確定の直前に照会し直すことで取り合いが起きる時間を 1〜2 秒に縮め、それでも登録が「埋まっていた」で返ったら別の枠を提案します。

実例:Twilio の Gather は、電話のボタン入力(DTMF)を受け取る指示で、受け取る桁数と、入力の終わりを示すキー(デフォルトは #)を決められます(Twilio Gather)。番号のように聞き違えると困る項目を、声の聞き取りから外す方法になります。

7. 深掘り:スタッフへつなぐ経路

転送の経路は、AI が正常に動いているときと止まったときで別々に持ちます。止まったときの経路は AI に頼らず、電話 API の側だけで完結させます。

答えの段階

答え

足りないところ

弱い答え

困ったらスタッフに転送します

何をきっかけに転送するか、AI が止まったらどうするかが無い

よい答え

急患、症状の相談、聞き取れないときに転送します

AI 自体が止まったときに電話がつながらない

より良い答え

AI が止まったら電話 API の予備の指示で内線へ転送し、転送先がいないときは折り返しで受けます

なし(中身は下の 4 つ)

  • 転送のきっかけ:「痛い」「腫れている」のような急患の言葉、症状や治療内容の質問、同じ項目を 2 回聞き取れないとき、患者が人と話したいと言ったとき、予約台帳 API が失敗したときです。急患は予約を取らずにすぐ転送します。
  • AI が止まったとき:電話 API に、音声エージェントが応答しないときの予備の指示を登録し、その中身を「その院の内線へ転送する」だけにします。音声エージェントの空きが足りないときも、同じように内線へ回します。電話 API 自体が止まったときは、クラウド PBX の側で外部への転送が失敗したら内線を鳴らす設定にします。この設定ができるかは PBX の製品によるので、面接では確かめたい点として面接官に聞きます。
  • 内線が出ないとき:受付スタッフは 1 院 2 名で、ピークの 9〜10 時は来院した患者の対応とも重なります。内線を呼ぶ時間に上限を決め、出なければ AI に戻して折り返しの依頼として受けます。
  • 夜間と休日:AI だけで終わる予約の新規、変更、取消はそのまま受けます。転送が要る用件は折り返しの依頼として用件と連絡先を聞き、翌朝のスタッフ画面に並べます。急患には、院が決めた夜間の案内(休日夜間に急患を診る医療機関など)を流します。この案内の中身は院ごとに決めてもらう前提です。

転送の前には、スタッフ画面に用件の要約(種類、患者、希望の日時、転送の理由)を出してから内線を鳴らします。スタッフは電話を取った時点で用件が分かり、患者は同じことを 2 回話さずに済みます。症状の相談で転送するときは、画面に出すのは「症状の相談」という種類までにし、症状の中身は患者から直接聞いてもらいます。症状を外部のサービスに保存しないためです。

実例:Twilio では、電話番号ごとに主の応答先とは別に予備の URL を登録でき、主の応答先から指示を取れないときや実行できないときは、すぐに予備の URL を呼び、そこで返した指示で通話を続けます(Twilio Availability and Reliability)。転送の Dial では、相手が出るまでの待ち時間(デフォルト 30 秒)と、終わったあとに結果を送る先を指定でき、結果には出なかった(no-answer)や話し中(busy)が入るので、そこから折り返しの受け付けに戻せます(Twilio Dial)。Google Duplex も、自分だけで終えられない予約を見分けたら人のオペレーターに合図して引き継ぎます(Google, 2018)。

8. 障害への備えと監視

どこが止まっても、患者の電話はスタッフか折り返しの受け付けにつながります。例外は予約の登録の結果が分からないときで、AI の側では片付けずにスタッフへ回します。

止まるもの

患者に見えること

手当て

音声エージェント全体

AI ではなく院の内線につながる

電話 API の予備の指示で内線へ転送する。AI のサーバーに頼らない

STT、LLM、TTS のどれか

返事が遅れる

決めた時間を超えたら「担当者におつなぎします」と固定の声を流して転送する。別の事業者への切り替えも用意しておく

予約台帳 API の遅れと失敗

「確認に時間がかかっています」と言われる

照会は再試行し、登録は再試行しない。結果不明の登録はスタッフ画面に回す

予約台帳 API の上限

空きの確認を待たされる

流量制御で確定の直前の照会と登録を先に通す。待ちが長いときは折り返しの依頼として受ける

院の内線

転送したがスタッフが出ない

呼ぶ時間に上限を決め、出なければ折り返しの依頼として受ける

監視するのは、話し終わりから発話開始までの時間(中央値と遅いほうの 5%)、転送の割合と理由、割り込みで止まった回数、予約台帳 API の失敗と結果不明の数です。転送の割合は、見積もりで出した「予約の電話の 3 割まで」と並べて見ます。

9. 条件の変更への対応

面接の後半では、運用で起きた不具合や将来の要望という形で条件が足されます。答え方は、今の設計でなぜ起きたか、何をきっかけに何をどう処理して直すか、変えずに済むところはどこか、の順です。

例 1:同じ患者の予約が、同じ日時に 2 件入っていた

  • 原因:予約台帳 API の登録が時間切れになり、予約ツールが自動で登録を送り直した。1 回目の登録は台帳に届いていたが、こちらには結果が返っていなかった。
  • 直し方:登録の時間切れをきっかけに、再試行せず予約操作を「結果不明」で記録し、スタッフ画面に回します。スタッフが台帳で確かめて、患者に折り返します。予約台帳の SaaS に、同じ要求を 2 回送っても 1 件しか登録しない仕組み(冪等キー)や予約の読み出しがあるかを確かめ、あれば結果不明を自動で片付けます。
  • 変えずに済むところ:音声の流れ、確認の手順、転送の経路です。

例 2:1 年後に全国 200 院へ広げたら、空きの確認で待たされる患者が増えた

  • 原因:同時通話が院の数に比例しておよそ 500(100 × 200 ÷ 40)に増えたのに、予約台帳 API の上限は毎秒 10 回のままで、上限を全院で共有していると 1 通話あたり 50 秒に 1 回しか呼べなくなった。
  • 直し方:まず予約台帳の事業者に、上限がチェーン全体か院ごとかを確かめ、全体なら引き上げか院ごとの上限にできるかを相談します。こちらでは、同じ院と日付の空き照会の結果を数秒だけ全通話で共有し、先回りの照会をそこから返します。確定の直前の照会だけは共有せず、毎回台帳に問い合わせます。
  • 変えずに済むところ:音声エージェントは 1 通話に 1 つなので、台数を増やすだけで済みます。確認と転送の手順も変わりません。

まとめ:選んだものと捨てたもの

判断

選んだ案

捨てた案、代わりの案

理由

音声対話の方式

STT、LLM、TTS をストリーミングで重ねる

代わりの案:音声をそのまま扱うモデル。捨てた案:無音を待ってから順に処理する

途中の文字で確認と画面表示ができ、重ねて待ちを削れば 1 秒に近づけられる

話し終わりの判定

VAD と、意味から見分けるモデルの併用

無音の長さだけで決める

言いよどみで割り込まずに、言い切った発話には早く返せる

予約 API の待ち

呼び出しと同時に固定の文を流す

何も話さずに待つ

1〜2 秒の沈黙を会話の間に隠せる

患者の特定

番号はプッシュ入力、氏名は読み上げて確かめる

番号も声で聞き取る

方言や入れ歯でも番号を取り違えない

登録の確かめ方

復唱、確定の直前の照会し直し、結果不明はスタッフへ

聞き取ったまま登録、登録の自動再試行

取り違えと二重登録を出さない

停止時の経路

電話 API の予備の指示で内線へ転送

AI が自分で転送する経路だけ

AI が止まっても電話がつながる

夜間と休日

AI で終わる予約は受け、残りは折り返しの依頼

夜間は電話を受けない

転送先がいなくても予約の電話を取りこぼさない

よくあるつまずき

つまずき

なぜ弱いか

抜け出す一手

面接の最初から構成図を話し始める

1 秒、取り違えゼロ、停止時の扱いなど、設計を決める条件を取りこぼす

応答の速さ、取り違えの重さ、止まったときの扱いを先に聞く

低遅延のモデルを使う、とだけ言う

どこに時間がかかり、なぜ 1 秒に収まるかを言えない

話し終わりの判定、STT、LLM、TTS の処理ごとに時間を並べる

話し終わりを無音の長さだけで決める

短いと言いよどみで割り込み、長いと遅れる

意味から見分けるモデルを足し、番号はプッシュ入力にする

割り込まれたら TTS を止める、で終わる

電話の側で再生を待つ音声が流れ続け、会話の記録も聞かせていない文を含む

電話の側の音声を消し、聞かせたところまでで記録を切る

聞き取った内容をそのまま登録する

聞き違いと Web 予約との取り合いで、取り違えが起きる

項目ごとに確かめ方を決め、確定の直前に照会し直す

登録が失敗したら再試行する、と言う

台帳に届いていた場合、二重に予約が入る

照会と登録を分け、結果不明の登録はスタッフに回す

困ったら転送する、とだけ言う

AI が止まったときと夜間に、電話がつながらない

AI の外に転送の経路を持たせ、夜間は折り返しで受ける

会話の全文を保存する

症状は要配慮個人情報で、外部に保存するには同意が要る

録音は既存に任せ、記録には用件の項目だけを残す

▼解説を読んだら、同じお題を AI 面接官を相手に通しで解いてみましょう。

参照元

海外の技術ブログと技術文書です。どれも開いて内容を確かめています。LiveKit と Twilio の記事は自社製品の紹介を兼ねています。

節

記事

参照した内容

事前知識

Realtime client events(OpenAI)

入力の文字起こしはモデルとは別に非同期で作られ、モデルが聞いた内容そのものではない

事前知識, 4

Voice agents(OpenAI)

音声をそのまま扱うモデルと、STT、LLM、TTS を順につなぐ方式(chained)の利点と弱み

4, 5

Media Streams - WebSocket Messages(Twilio)

8kHz の μ-law の音声、clear で再生待ちの音声を消す

5

A Guide to Core Latency in AI Voice Agents(Twilio, 2025)

STT、LLM、TTS の処理ごとの遅延の目標、処理側と電話網を含めた全体の目標、ストリーミングが必須であること

5

Using a transformer to improve end of turn detection(LiveKit, 2024)

無音の長さだけで決める問題と、会話から話し終わりを見分けるモデル

5

Voice activity detection (VAD)(OpenAI)

server_vad と semantic_vad

7

Google Duplex(Google, 2018)

人のオペレーターへの引き継ぎ

6

TwiML Voice: <Gather>(Twilio)

ボタン入力の桁数と終わりのキー

7, 8

Availability and Reliability(Twilio)

主の応答先が使えないときの予備の URL

7

TwiML Voice: <Dial>(Twilio)

転送の待ち時間と、出なかったときの結果

▼ほかのお題の解説

技術設計面接の解説と模範解答まとめ

コラム

サカモトエンジニア

サカモトエンジニア監修

外資系企業のソフトウェアエンジニア。エンジニアのキャリアや面接について X や note で発信し、テック企業を目指すエンジニア向けの面接対策プラットフォーム InterviewCat を運営しています。

CaseMatch

公式アカウント

CaseMatch編集部

CaseMatch編集部は、就活・転職における面接対策やキャリア選択に役立つ情報を発信する編集チームです。AI面接練習サービス「CaseMatch」の運営で得た知見や、企業選考・ケース面接・自己分析に関する実践的なノウハウをもとに、候補者が納得感を持って選考に臨めるコンテンツをお届けします。

1分で新規登録完了

新規登録をすると、会員限定の記事や対策情報、面接を見れます。

ログインはこちら
​
​

カテゴリー

年収・手取り

年収

転職体験談

ITコンサルタント体験談戦略コンサルタント体験談

転職の進め方

税金・手取り年収交渉スカウトサービスエージェントの選び方入社手続き退職交渉・手続き在職中の転職活動転職の流れ

属性別ガイド

第二新卒30代20代

職種別ガイド

コンサルタント営業

企業別ガイド

金融コンサル

選考対策

ケース面接人物面接webテスト職務経歴書業界分析自己分析

面接練習で、選考を有利に進めよう。

新卒・中途向けナビゲーションバッジ

1分で完了

他の記事も見る
コンサル2026/10/21
bcg 中途採用は未経験でも応募できる?応募条件・職種選び・面接対策を解説
#中途対策 #企業選考 #戦略コンサル
コンサルタント2026/10/21
ロジックツリー テンプレート|3種類の型とExcel・PowerPointでの作り方
#中途対策
ケース面接2026/10/21
ケース面接 失敗を次に生かす対策|詰まったときの立て直しと練習法
#選考対策 #中途対策 #ケース対策
ケース面接2026/10/21
ケース面接 比較で分かる評価の違いと解き方|例題・練習法を解説
#選考対策 #中途対策 #ケース対策