飲食店にかかってくる予約の電話を通話の文字起こしから予約台帳の下書きにし、聞き漏れを折り返しの確認事項にまとめる
店舗のスタッフが受けた予約の電話を録音から文字起こしし、日時・人数・名前・連絡先・要望を予約台帳の下書きにします。聞けていない項目があれば、折り返して確かめる事項として一覧にします。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI
- 対象業界
- 宿泊/飲食
- 対象部門
- 営業
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 電話を受け、予約の希望日時・人数・名前・連絡先を聞きながらメモ帳に書く
- コース・飲み放題・アレルギー・お祝いの有無・席の希望などを、思い出した順に聞く
- 予約台帳の画面で空き状況を見て、受けられるかをその場で答える
- 電話を切った後、メモを見ながら予約台帳に入力する。ピーク時は営業後にまとめて入力する
- メモに抜けがあれば、お客様に折り返して確かめる
- 宴会の場合は、人数とコースを厨房に伝える
- 人電話を受け、これまでどおり予約の内容を聞いて空き状況を答える。メモは最小限でよい
- 自動通話が終わると、クラウドPBXが録音ファイルを保存場所へ書き出す
- 自動録音の保存をきっかけに処理が動き、店舗・着信番号・通話時刻をファイルから取り出す
- 自動音声認識が録音を文字起こしし、話者を分けたうえで、発話ごとの時刻と信頼度を返す
- 自動生成AIが文字起こしから、日時・人数・名前・連絡先・コース・要望を項目に取り出す
- 自動通話した日を基準に日付を確定し、予約台帳の既存の予約と照らして、新規・変更・取消を見分ける
- 自動聞けていない項目と、聞き取れなかった項目を分けて一覧にする
- 自動予約台帳に「確認待ち」の下書きとして登録し、店舗のタブレットに通知する
- 人受けたスタッフが下書きを開き、録音の該当箇所を必要に応じて聞いて、確定する
- 人折り返しの確認事項があれば、お客様に電話して聞き、台帳を直す
各工程の詳しい説明を読む
- 電話を受け、予約の希望日時・人数・名前・連絡先を聞きながらメモ帳に書く
- コース・飲み放題・アレルギー・お祝いの有無・席の希望などを、思い出した順に聞く
- 予約台帳の画面で空き状況を見て、受けられるかをその場で答える
- 電話を切った後、メモを見ながら予約台帳に入力する。ピーク時は営業後にまとめて入力する
- メモに抜けがあれば、お客様に折り返して確かめる
- 宴会の場合は、人数とコースを厨房に伝える
(a)聞く順番が人によって違う。 店長は必ずアレルギーを聞きますが、アルバイトリーダーは聞かないことがあります。聞き漏れは、聞いた人の経験でほぼ決まります。 漏れていたことは、当日の来店時か、前日の確認の電話で分かります。
(b)メモが後から読めない。 受話器を肩に挟んで書いたメモは、名前のカタカナと電話番号の数字が崩れます。営業後に打ち直すとき、書いた本人でも読めない数字があります。 その場合は、着信履歴から番号を探し直します。
(c)入力が営業の後ろにずれる。 ピークの時間帯に受けた予約は、台帳への入力が数時間遅れます。その間に別のスタッフが同じ時間帯の予約を受けると、席が重なります。
(d)変更と取消が埋もれる。 「人数が2人増えた」という電話はメモが短く、台帳のどの予約の変更かを探す手間がかかります。
- 【人】 電話を受け、これまでどおり予約の内容を聞いて空き状況を答える。メモは最小限でよい
- 【自動】 通話が終わると、クラウドPBXが録音ファイルを保存場所へ書き出す
- 【自動】 録音の保存をきっかけに処理が動き、店舗・着信番号・通話時刻をファイルから取り出す
- 【自動】 音声認識が録音を文字起こしし、話者を分けたうえで、発話ごとの時刻と信頼度を返す
- 【自動】 生成AIが文字起こしから、日時・人数・名前・連絡先・コース・要望を項目に取り出す
- 【自動】 通話した日を基準に日付を確定し、予約台帳の既存の予約と照らして、新規・変更・取消を見分ける
- 【自動】 聞けていない項目と、聞き取れなかった項目を分けて一覧にする
- 【自動】 予約台帳に「確認待ち」の下書きとして登録し、店舗のタブレットに通知する
- 【人】 受けたスタッフが下書きを開き、録音の該当箇所を必要に応じて聞いて、確定する
- 【人】 折り返しの確認事項があれば、お客様に電話して聞き、台帳を直す
9番目が、この設計の分かれ目です。下書きは自動で確定しません。 予約は席と仕込みの量を決めるもので、1件の誤りがそのまま当日の席の重なりや食材の不足になります。 確定のボタンを押すのは、電話を受けた本人か店長です。
6番目で新規・変更・取消を見分けないと、台帳に同じ団体が2件並びます。 着信番号と名前で既存の予約を引き、候補を下書きに添えます。
02今回想定するシステム構成
予約の電話(店舗のスタッフが受ける) │ 通話の録音 ▼【トリガー】クラウドPBXが録音ファイルを書き出す Azure Blob Storage(録音の保管) ▼ 保存を検知 Azure Functions ├──▶ 店舗・着信番号・通話時刻の取り出し、音声形式の確認 ▼ Azure AI Speech(高速文字起こし API、ja-JP) │ 発話ごとの文字・時刻・信頼度・話者を返す ▼ Azure OpenAI(構造化出力) │ 日時・人数・名前・連絡先・コース・要望を項目に取り出す │ 話していない項目/聞き取れなかった項目を分ける ▼ Azure Functions ── 日付の確定、予約台帳の既存予約との照合(新規/変更/取消) ▼ 予約台帳に「確認待ち」の下書き + 店舗のタブレットへ通知 ▼ 【人が確認して確定】 ──▶ 折り返しの確認事項は人が電話
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Azure AI Speech(高速文字起こし API) | Google Cloud Speech-to-Text、Amazon Transcribe |
| 生成AI | Azure OpenAI(Microsoft Foundry)(構造化出力で項目を取り出す) | Claude API、Gemini API |
| 連携 | Azure Functions(録音の保存を起点に処理を動かし、台帳と照合する) | Azure Logic Apps |
| 保管 | Azure Blob Storage(録音と文字起こしの結果) | 社内のファイルサーバー |
| 電話 | クラウドPBX(通話録音と書き出し) | 各社のPBX |
予約台帳と電話は、新しく足すものではありません。 予約台帳には「確認待ち」の状態で下書きを入れ、確定は台帳の画面で人が行います。クラウドPBXから録音を書き出す方法は製品ごとに違うため、この部分は利用環境に応じた個別実装になります。 書き出しのAPIがある製品、保存先のストレージを指定できる製品、管理画面から一括でダウンロードする製品があります。
土台になるのは、Azure AI Speech の高速文字起こし API です。 リアルタイムよりも同期的かつ高速に結果を返し、予測可能な低遅延を提供するとされています。入力できる音声の形式は WAV、MP3、OPUS/OGG、FLAC、WMA、AAC、ALAW、MULAW、AMR、WebM、SPEEX で、ファイルは最大500MB、長さは最大5時間です。日本語(ja-JP)は、音声テキスト変換の言語一覧で高速文字起こしの対応が示されています。
バッチ文字起こしを使わない理由は、待ち時間です。 ピーク時には処理が始まるまでに最大30分、完了までに最大24時間かかる場合があるとされ、それではスタッフは結局メモから台帳を打ってしまいます。
返ってくる結果は発話の単位に分かれています。 phrases の要素ごとに、開始位置(offsetMilliseconds)、長さ(durationMilliseconds)、文字、信頼度(confidence、0.0〜1.0)、話者分離を有効にしたときは話者(speaker)が付きます。この信頼度が、第1章で書いた「話していない」と「聞き取れなかった」を分ける材料になります。
03どうやって実装するのか
処理の起点を決める
クラウドPBXが録音ファイルを保存場所へ書き出したことを起点にします。 保存場所は Azure Blob Storage のコンテナーにし、Azure Functions の Blob ストレージ トリガーで受けます。
トリガーには2つの実装があり、イベントベースのほうが遅延が小さいため推奨とされています。ポーリング型は、従量課金のプランで関数アプリがアイドル状態になっていると、新しいファイルの処理まで最大10分の遅れが出ることがあるとされています。電話を切ってから下書きが届くまでの時間がこの構成の価値なので、イベントベースを選びます。
書き出しの単位は1通話1ファイルにし、ファイル名かメタデータに店舗コード・着信番号・通話の開始時刻を入れてもらいます。付けられないときは、通話の履歴を別に取り出して時刻で突き合わせます。
予約に関係のない電話も録音されます。ここでは振り分けず、AIに「予約の電話か」を最初に判定させます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 通話の録音 | 1通話1ファイル。音声の形式、長さ、チャンネル数 | クラウドPBXの書き出し → Blob Storage |
| 通話の情報 | 店舗コード、着信番号、通話の開始時刻と長さ、受けたスタッフの内線番号 | ファイル名・メタデータ、またはPBXの通話履歴 |
| 文字起こしの結果 | 発話ごとの文字・時刻・信頼度・話者 | Azure AI Speech |
| 店舗の決まり | 定休日、営業時間、席数、宴会の最少人数、コースと飲み放題の一覧、聞くべき項目の一覧 | 店舗ごとの設定表 |
| 既存の予約 | 同じ着信番号・同じ名前の予約、通話日から先の予約 | 予約台帳 |
質を決めるのは、下の2つです。 店舗の決まりが無ければ、「金曜の7時から」が営業時間内か、コース名が実在するかを照らせません。既存の予約が無ければ、変更の電話を新規として登録してしまいます。 聞くべき項目の一覧は、宴会の多い店舗とカウンター中心の店舗で違うため、店舗ごとに持ちます。
データの取得方法を決める
録音は、Blob ストレージ トリガーが渡すファイルをそのまま使います。同じファイルで関数が2回呼ばれないよう、実行環境が処理済みの記録(Blob の受領記録)を持つとされています。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 録音ファイル | Blob ストレージ トリガー | 文字起こしの入力 |
| 発話ごとの文字・時刻・信頼度 | 高速文字起こしの phrases | 項目の根拠と、聞き取れなかった箇所の特定 |
| 話者 | speaker(モノラルの録音で話者分離を有効にしたとき) | お客様の発話とスタッフの発話を分ける |
| 通話全体の文字 | combinedPhrases | 生成AIへ渡す本文 |
| 既存の予約 | 予約台帳のAPIまたは書き出し | 新規・変更・取消の見分け |
話者の分け方は、録音のチャンネル数で決まります。 PBXが送話と受話を左右に分けたステレオで録るなら、channels に [0, 1] を指定してチャンネルごとに文字起こしします。既定ではすべてのチャンネルがモノラルにまとめられます。モノラルで録るなら、話者分離を有効にし、最大話者数(2〜35の範囲)を2にします。 話者分離はモノラルの音声だけが対象です。
ステレオで録れるなら、ステレオを選びます。 話者を推定する必要がなく、スタッフが復唱した人数とお客様が言い直した人数が違うときに、どちらの発言かを取り違えません。
予約台帳との照合は、着信番号を先、名前を後に引きます。名前は表記ゆれで外れるからです。非通知のときだけ名前と予約日で引きます。
AIへ渡す前に整形する
- 形式の確認 … 第6章の対応形式かを確かめ、PBXが独自の形式で書き出す場合は変換します
- 長さとサイズの確認 … 最大500MB・最大5時間です。予約の電話で超えることはまずありませんが、通話の長さが10秒未満のものは無言電話や切断として処理しません
- 冒頭の案内の除去 … 録音の冒頭に流れる「この通話は録音されています」の案内は、文字起こしの後に定型文として取り除きます
- ロケールの指定 …
localesにja-JPを指定します。既知のロケールを指定すると精度が上がり、遅延が最小化されるとされています。外国語のお客様が多い店舗だけ、候補を複数指定します - 店舗の決まりの読み込み … 店舗コードから、定休日・営業時間・コース一覧・聞くべき項目を引いておきます
- 通話日を基準日にする … 「来週の金曜」「今週末」を解釈する基準として、録音の日付ではなく通話の開始日時を渡します
語句を登録して認識を助けるフレーズリストという機能もありますが、日本語で使えるかは公式の言語一覧で確認できなかったため、前提にしません。 コース名の表記ゆれは、後段で生成AIにコース一覧を渡して寄せます。
6番目を軽く見ないでください。 書き出しが翌朝になる製品では、ファイルの日付を基準にすると「明日」の予約が1日ずれます。
AIに処理させる
させるのは、文字起こしから予約の項目を取り出し、項目ごとに「話されたか」「聞き取れたか」を記録することです。 受けられるかどうかの判断はさせません。
| 取り出すもの | 取り出し方 | 判断できないときの扱い |
|---|---|---|
| 予約の電話か | 予約の新規・変更・取消、問い合わせのみ、予約以外 | 迷えば inquiry(問い合わせのみ)にして人へ |
| 来店日 | 発話の表現をそのまま残し、基準日から日付を計算する | 「来週あたり」など幅があれば ambiguous |
| 来店時刻 | 「7時」は営業時間から19時と解釈する | 午前と午後のどちらも営業していれば ambiguous |
| 人数 | 最後に合意した人数。大人と子どもを分ける | 言い直しがあり最後が分からなければ ambiguous |
| 名前 | お客様が名乗った表記(カタカナ) | 信頼度が低ければ unreadable |
| 連絡先 | 着信番号と別の番号を言われたときは両方 | 数字が欠けていれば unreadable |
| コース・飲み放題 | 店舗のコース一覧のどれに当たるか | 一覧に無い名前なら原文のまま ambiguous |
| 要望 | アレルギー、お祝い、席の希望、子ども用の椅子など | 話されていなければ空の配列 |
右端の列で、missing と unreadable を分けます。 missing は通話の中でその項目が話されていないということ、unreadable は話されているが文字として確定できないということです。前者は折り返して聞くもの、後者は録音を聞き直せば済むものです。 分ける材料は、文字起こしが返した発話ごとの confidence です。
| させないこと | 理由 |
|---|---|
| 受けられるかの判断 | 席の割り振りは店舗の判断。台帳を見て人が決める |
| 名前の漢字の推測 | 「サトウ」を「佐藤」にしない。漢字はお客様に確かめる |
| 電話番号の補完 | 着信番号から欠けた桁を埋めない |
| アレルギーの重さの判断 | 「えびが苦手」を「アレルギーなし」にも「重度」にもしない。原文のまま残す |
| コース名の新規作成 | 一覧に無いコース名を作らない |
4行目がいちばん大事な制約です。 「苦手」か「アレルギー」かで厨房の対応は変わるため、重さは店長が電話で確かめます。
指示内容を固定する
あなたは飲食店の予約担当です。電話の文字起こしから、予約台帳の下書きを作ります。
文字起こしに書かれていることだけを使ってください。推測で埋めないでください。
【まず判定すること】
call_type を次から1つ選んでください。
- new ......... 新しい予約
- change ...... 既存の予約の変更(人数・時刻・コースなど)
- cancel ...... 既存の予約の取消
- inquiry ..... 空き状況やコースの問い合わせのみで、予約は成立していない
- not_reservation ... 予約と関係のない電話
迷ったときは inquiry を選んでください。
【取り出す項目】
visit_date / visit_time / party_size / guest_name / contact /
course / requests
【status の選び方】
- ok ......... 通話の中で話され、値として確定できる
- missing .... 通話の中で話されていない
- unreadable . 話されているが、文字起こしの信頼度が低く値を確定できない
- ambiguous .. 値の候補が複数あり、1つに決められない
迷ったときに ok を選ばないでください。
【厳守事項】
- 日付は基準日 {call_datetime} から計算し、value に YYYY-MM-DD で入れてください。
お客様の言い回しは spoken に原文のまま入れてください。
- 時刻は営業時間 {business_hours} の範囲で解釈してください。
範囲内に候補が2つあるときは ambiguous にしてください。
- 人数は、通話の中で最後に双方が合意した値を入れてください。
言い直しがあった場合は、evidence に両方の発話を写してください。
- 名前は、お客様が名乗った読みをカタカナで入れてください。漢字に直さないでください。
- 電話番号は、話された数字だけを入れてください。桁を補わないでください。
- コースは、次の一覧のどれに当たるかを選んでください:{course_list}
一覧に無い名前なら、原文のまま入れて ambiguous にしてください。
- アレルギーや苦手な食材は、お客様の言い回しをそのまま requests に入れてください。
「苦手」と「アレルギー」を言い換えないでください。重さを判断しないでください。
- 受けられるかどうか、席が空いているかは書かないでください。
- 各項目の evidence には、根拠にした発話をそのまま写し、
その発話の offset_ms と speaker と confidence を添えてください。
- 店舗が聞くべき項目 {required_items} のうち、missing のものを
callback_items に並べ、お客様に聞く一文を添えてください。
【文字起こし】{phrases}
【既存の予約の候補】{existing_reservations}
「迷ったときに ok を選ばない」を明記しないと、人数や日付が埋まります。 文字起こしの中には「4名」「5名」がどちらも出てくることがあり、何も言わなければ最初か最後のどちらかを選んで ok にします。言い直しを evidence に両方残させることで、確認する人が録音の該当箇所へすぐ飛べます。 「漢字に直さない」も同じ理由で、確かめていない漢字が台帳に載ることを防ぎます。
出力形式を固定する
次の形のJSONで受け取ります。
{
"call_id": "",
"store_code": "",
"call_type": "new | change | cancel | inquiry | not_reservation",
"matched_reservation_id": null,
"fields": [
{ "item": "party_size", "status": "ok | missing | unreadable | ambiguous",
"value": "", "spoken": "",
"evidence": [ { "text": "", "offset_ms": 0, "speaker": "", "confidence": 0 } ] }
],
"requests": [ { "category": "allergy | celebration | seating | other", "spoken": "" } ],
"callback_items": [ { "item": "", "question": "" } ],
"draft_status": "ready_to_confirm | needs_callback | needs_listen"
}
fields には、visit_date / visit_time / party_size / guest_name / contact / course の6つの要素を並べます。
構造化出力を使う理由の1つ目は、台帳の項目にそのまま流し込めることです。 json_schema に strict: true を指定し、渡した JSON スキーマに従わせます。すべてのフィールドを required にする必要があり、省略してよい項目は null との組み合わせの型で表すとされています。matched_reservation_id が null を取るのはこのためです。
2つ目は、status と draft_status を別の層に置けることです。 fields はAIが埋め、draft_status は Azure Functions が規則で決めます。
draft_status | 条件 |
|---|---|
ready_to_confirm | 店舗が聞くべき項目がすべて ok |
needs_listen | unreadable または ambiguous が1つでもある(録音を聞けば解決する見込み) |
needs_callback | 聞くべき項目に missing が1つでもある |
3つ目は、スキーマで書けない制約をコードで確かめられることです。 構造化出力では、文字列の pattern や format、minLength などのキーワードが使えないとされています。電話番号の桁数や日付の形式は、受け取った後に Azure Functions で検査します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| クラウドPBX | 製品の書き出し機能 | 録音ファイルを Blob Storage へ置く(個別実装) |
| Azure Blob Storage | Blob ストレージ トリガー(イベントベース) | 保存を検知して関数を動かす |
| Azure AI Speech | 高速文字起こし API | 発話ごとの文字・時刻・信頼度・話者を返す |
| Azure OpenAI | 構造化出力 | 予約の項目と聞き漏れを返す |
| 予約台帳 | 台帳のAPI、または取り込み用のファイル | 「確認待ち」の下書きを登録し、既存の予約を引く |
| 店舗のタブレット | 台帳の通知、またはチャットへの投稿 | 下書きが届いたことを知らせる |
予約台帳へは「確認待ち」の状態でしか書き込みません。 確定済みの予約を上書きする経路は作りません。変更の電話でも、既存の予約はそのままにし、変更の下書きを横に並べます。 人が確定したときに初めて既存の予約が書き換わります。
人が確認する
人が見るのは、すべての下書きです。 ただし、見る深さを draft_status で変えます。
ready_to_confirmは一覧で確かめて確定する … 日時・人数・名前・連絡先を目で見て、台帳の空き状況と照らして確定します。録音は聞きませんneeds_listenは該当箇所だけ聞く …evidenceのoffset_msから録音の該当箇所を再生し、値を直して確定しますneeds_callbackは折り返す …callback_itemsの一文を見ながらお客様に電話し、聞けた値を入れて確定します- AIの値を直したら記録する
1番目を「確定するだけ」にしないでください。 下書きの日時が正しくても、その時間帯にすでに貸切が入っていることがあります。確認は、電話を受けたスタッフが内容を覚えているうちに、営業の合間に行います。
例外に対処する
| 起きること | 対応 |
|---|---|
| 録音の形式が対応外 | 変換して再投入。変換できなければ担当へ通知して手入力 |
| 通話が10秒未満 | 無言電話・切断として処理しない |
| 予約以外の電話 | not_reservation として下書きを作らず、件数だけ記録 |
| 店内の音で信頼度が全体に低い | needs_listen。続くなら受話器の位置を見直す |
| 変更・取消の元の予約が見つからない | matched_reservation_id を null にし、人が探す |
| 同じ通話が二度書き出された | 開始時刻と着信番号で重複を見て、二重に下書きを作らない |
| 文字起こしで429や5xxが返る | 最大5回まで、2・4・8・16・32秒の間隔を空けて再試行。400・401・422は再試行しない |
| 関数が何度も失敗する | 既定で5回の再試行の後、webjobs-blobtrigger-poison のキューに入る。毎朝このキューを見る |
最後の行は運用で拾います。下書きが来ない電話は、スタッフにとって「AIに任せたはずの予約」です。 失敗の一覧を店舗ごとに毎朝出します。
記録を残す
- 録音ファイルと、店舗コード・着信番号・通話の開始時刻
- 文字起こしの結果の全文(
phrasesの文字・時刻・信頼度・話者) - 生成AIが返したJSON(
fields、requests、callback_items) - 規則で決めた
draft_statusと、そのとき参照した店舗の決まり(コース一覧・聞くべき項目) - 人が値を直した記録 … どの項目を、どの値からどの値に直したか
- 店舗ごと・時間帯ごとの
unreadableの発生率
4つ目で店舗の決まりを残すのは、宴会のコースが季節で入れ替わるためです。
録音の保存期間は先に決めます。 名前と電話番号を含む音声を無期限に残す理由はありません。
04実装レベルの3段階
最小構成では件数がさばけません。 1本ずつ文字起こしして貼り付けるので、月1,200件には使えません。確かめるための段階です。 半自動化で、1件5分が3分程度になります。 文字起こしと項目の取り出しは自動になりますが、一覧から予約台帳へ打ち直す作業と、変更の電話がどの予約のものかを探す作業が残ります。本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、台帳への打ち直しと既存の予約の照合が、1件ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、unreadable の多い店舗と時間帯が先に分かります。そこを直してから台帳につなぐほうが、手直しが減ります。
05工数削減シミュレーション
導入後 1,200件 × 2分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の店舗を持つ居酒屋・レストラン・宴会場、レストランを併設する宿泊施設など、予約の多くがいまも電話で入り、営業中のスタッフが受話器を取っている場合。電話を受けながら紙に書き、営業の合間に予約台帳へ打ち直している場合。人数・アレルギー・コースの聞き漏れで、当日になって慌てることがある場合。通話を録音できるクラウドPBXを使っているか、入れ替えを検討している場合。
- 予約の大半がネット予約で入り、電話は1日に数本しかない場合。通話の録音ができない電話機を使い続ける場合。席の割り振りや予約の受け付けそのものをAIに確定させたい場合(この構成は下書きまでで、確定は人が行います)。お客様に通話の録音を案内できない事情がある場合。
07最小構成で試す方法
- 先月の予約の電話から20本の録音を選ぶ(うち数本は、聞き漏れや言い直しがあったと分かっているものを入れる)
- その20本について、当時の予約台帳の登録内容を書き出しておく
- 録音を Azure AI Speech の Foundry の画面などで文字起こしし、結果をテキストにする
- 手元の生成AIの画面に文字起こしを貼り、「日時・人数・名前・連絡先・コース・要望を取り出してください。話されていない項目と、聞き取れない項目を分けてください。名前を漢字に直さないでください」と指示する
- 出てきた値を、当時の台帳の内容と突き合わせる
組む前に、「この店の電話の音で文字起こしが使えるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 台帳と同じ値が出て、聞き漏れも当時と一致した | トリガーと台帳の連携に進む |
| 名前を漢字に直した、人数の言い直しを片方だけ取った | 指示の書き方で直る。構成は有効 |
| 店内の音で文字起こしの信頼度が全体に低い | 録音の環境が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 厨房の換気扇やレジの音が入る店舗では、受話器の位置を変えるかヘッドセットに替えて、同じ条件で録り直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 「明日」の予約が1日ずれる | 録音ファイルの日付ではなく通話の開始日時を基準日にする |
| 人数の言い直しで、最初の値を取る | 最後に合意した値を取らせ、evidence に両方を残す |
missing と unreadable が混ざる | 発話の信頼度で分ける。混ぜると、お客様に同じことを聞き直す |
| 名前がそれらしい漢字になる | カタカナのまま残すことを指示に明記する |
| 「苦手」が「アレルギー」に言い換わる | 原文の言い回しを残させ、重さは人が確かめる |
| 変更の電話が新規として登録される | 着信番号で既存の予約を先に引き、候補を添える |
| 話者が入れ替わって記録される | ステレオで録れるならチャンネルを分ける。 モノラルなら最大話者数を2にする |
| 下書きが営業後まで放置される | 営業の合間に見る運用にする。まとめて見ると Before に戻る |
| 処理に失敗した録音に誰も気づかない | 失敗の一覧を毎朝店舗へ出す |
| 予約台帳を自動で確定させたくなる | 確定は人が行う。 席の判断は台帳を見る人の仕事 |
上の3行が、この構成の失敗のほとんどです。 どれも下書きの値がそれらしく埋まって見えます。根拠を発話と信頼度に置くことで防ぎます。
最後の行は、運用が回り始めた頃に出てきます。 そこで確定を外すと、誤った下書きがそのまま当日の席になります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様の名前、電話番号、来店の日時と人数、アレルギーや持病に関わる発言、お祝いの内容、そして通話の音声そのものです。
- 録音していることをお客様に知らせる … 録音の冒頭に、通話を録音している旨と、その目的(予約内容の確認)を案内します。目的に予約台帳の作成が含まれることを、案内の文言に入れておきます
- 録音と文字起こしの保存期間を決める … 予約の日を過ぎて一定期間たったものは削除します。アレルギーの発言を含む音声を、目的を超えて残さないでください
- アレルギーの判断を機械に委ねない … 取り出すのは言い回しまでです。厨房に伝える前に、店長がお客様に確かめます。 取り違えはお客様の健康に関わります
- 予約以外の電話の扱いを決める … 仕入先や求人の電話も文字起こしされます。予約以外と判定したものは、結果を早めに消す設計にできます
- 保管場所へのアクセスを店舗ごとに分ける … 録音と下書きは、その店舗のスタッフと本部の担当だけが見られるようにします
- 生成AIへ渡す範囲を通話の文字起こしと店舗の決まりに限る … 予約台帳の全件や顧客の一覧を渡す必要はありません。既存の予約は、着信番号で引いた候補だけを渡します
誤りが起きた場合のリスクは、予約の内容が違って登録されることと、聞き漏れを見落とすことの2つです。 前者は確定を人が行うことで、後者は missing を折り返しの確認事項として必ず出すことで防ぎます。
10まず何から始めるか
1週目:店舗ごとの決まりを表にする
8店舗それぞれについて、営業時間・定休日・コースと飲み放題の一覧・電話で必ず聞く項目を表にします。聞く項目は、店長に「当日困ったことがある項目」を挙げてもらうと早く決まります。この表が、聞き漏れの判定の基準になります。
2週目:20本で試す
宴会の多い店舗の先月の録音から20本を選び、文字起こしして手元の生成AIに貼り付けます。当時の台帳の内容と突き合わせ、名前を漢字に直していないか、人数の言い直しを正しく取れているかを最優先で見ます。
3週目:録音の書き出しと台帳の取り込みの方法を確かめる
クラウドPBXで、1通話1ファイルで書き出せるか、着信番号を付けられるか、ステレオで録れるかを確かめます。予約台帳に「確認待ち」で登録する方法も確かめます。
4週目:1店舗で文字起こしから一覧までをつなぐ
1店舗の録音を Blob Storage に置き、Azure Functions から文字起こしと項目の取り出しを呼んで、下書きを一覧に書き出すところまで作ります。この時点では台帳に書き込まず、一覧だけを見ます。
2か月目: 予約台帳との照合と「確認待ち」の下書きの登録を足し、needs_listen と needs_callback の件数を毎週数えます。3か月目以降: 残りの店舗へ広げ、1件5分が何分になったかを実測します。店舗ごとの unreadable の発生率を見て、録音の環境を見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
高速文字起こし API がリアルタイムより同期的かつ高速に結果を返すこと。対応形式(WAV、MP3、OPUS/OGG、FLAC、WMA、AAC、ALAW、MULAW、AMR、WebM、SPEEX)、最大500MB・最大5時間。ロケール指定で精度が上がること。話者分離の最大話者数が2〜35で、モノラル音声のみが対象であること。channels でステレオをチャンネルごとに処理でき、既定ではモノラルにまとめられること。出力の phrases に開始位置・長さ・信頼度・話者が付くこと。再試行の推奨(最大5回、2〜32秒の指数バックオフ、429と5xxは再試行し400・401・422は再試行しない) | Microsoft Learn: 高速文字起こし API | 2026-10-06 |
| バッチ文字起こしがベストエフォートでスケジュールされ、ピーク時は開始まで最大30分、完了まで最大24時間かかる場合があること | Microsoft Learn: バッチ文字起こしの概要 | 2026-10-06 |
音声テキスト変換で ja-JP が対応し、高速文字起こしにも対応していること | Microsoft Learn: Speech service language support | 2026-10-06 |
構造化出力が json_schema と strict: true で JSON スキーマに従わせること。全フィールドを required にし、省略可能な値は null との組み合わせで表すこと。additionalProperties: false が必要なこと。プロパティ合計100個・入れ子5段まで。pattern・format・minLength などが使えないこと | Microsoft Learn: Structured outputs(Azure OpenAI) | 2026-10-06 |
Blob ストレージ トリガーにイベントベースとポーリング型があり、イベントベースが低遅延で推奨されること。ポーリング型は従量課金プランでアイドル時に最大10分遅れること。Blob の受領記録で同じファイルの二重実行を防ぐこと。既定で5回失敗すると webjobs-blobtrigger-poison キューに入ること | Microsoft Learn: Azure Blob storage trigger for Azure Functions | 2026-10-06 |
クラウドPBXから録音を書き出す方法と、予約台帳への登録の方法は、使っている製品の仕様を確かめてください。 本記事は Microsoft Learn で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0546)についてのご相談はこちらから。
