入荷検品で作業者が読み上げた品番・数量・ロットを音声で記録し、入荷予定との差をその場で拾う
入荷検品の作業者が、箱を手にしたまま品番・数量・ロット・異常を声で読み上げます。その声を文字にして検品記録の項目に取り出し、入荷予定と突き合わせて、数量やロットの違いをその場で作業者に返します。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI
- 対象業界
- EC/商社/小売/物流/製造
- 対象部門
- 物流
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 荷主から前日までに届いた入荷予定のCSVを、事務所がWMSに取り込み、検品表を印刷する
- トラックが着いたら、作業者が検品表を持って荷を下ろす
- 1行ずつ、品番を外箱と照らし、数を数え、ロットと賞味期限を検品表に書く
- 破損・濡れ・ラベルの違いがあれば、余白に書く
- 検品表を事務所に渡し、作業者は格納に移る
- 事務所が検品表を見ながら、数量・ロット・期限をWMSに打ち込む
- 予定と違う行があれば倉庫に電話し、作業者に数え直してもらう
- 自動前日夜、入荷予定のCSVから翌日の品番の一覧を作り、作業者の端末に配る
- 人作業者はヘッドセットを付け、端末で入荷予定の伝票を選んで検品を始める
- 人1行ごとに「品番、数量、ロット、期限、異常」の順で読み上げる
- 自動Azure AI Speech が読み上げを文字にし、確定した発話ごとに信頼度と一緒に返す
- 自動Azure OpenAI が文字にした発話から、品番・数量・ロット・期限・異常を項目に取り出す
- 自動取り出した値を入荷予定の行と突き合わせ、`match` / `qty_diff` / `lot_diff` / `unheard` / `not_in_plan` を付ける
- 自動結果を端末の画面に表示し、`match` 以外なら短い通知音を鳴らす
- 人`unheard` なら言い直し、`qty_diff` なら数え直して、もう一度読み上げる
- 人数え直しても差が残るものは、作業者が「差異確定」と読み上げて次へ進む
- 人事務所は差異の確定した行と異常の記録だけを見て、荷主への報告を作る
- 【人/自動】 事務所が確認した検品記録をWMSの入荷実績として取り込む
各工程の詳しい説明を読む
- 荷主から前日までに届いた入荷予定のCSVを、事務所がWMSに取り込み、検品表を印刷する
- トラックが着いたら、作業者が検品表を持って荷を下ろす
- 1行ずつ、品番を外箱と照らし、数を数え、ロットと賞味期限を検品表に書く
- 破損・濡れ・ラベルの違いがあれば、余白に書く
- 検品表を事務所に渡し、作業者は格納に移る
- 事務所が検品表を見ながら、数量・ロット・期限をWMSに打ち込む
- 予定と違う行があれば倉庫に電話し、作業者に数え直してもらう
(a)書くたびに手が止まる。 両手で箱を持ったまま検品表には書けません。箱を置き、ペンを取り、書き、またペンを置く。 1行ごとにこの動作が入り、入荷が重なる朝の時間帯ほど、書く量を減らそうとして記入が雑になります。
(b)同じ値を2回書いている。 作業者が紙に書いた値を、事務所がもう一度WMSに打ち込みます。手書きのロット番号の「0」と「O」、「1」と「7」の読み違いは、打ち込みの段階で入ります。賞味期限の年と月の取り違えも、ここで起きます。
(c)差異に気づくのが遅い。 予定との差が分かるのは、事務所が打ち込んだときです。荷が棚に入った後なので、確かめるには棚から下ろして数え直すことになります。 荷主への報告も翌日に回ります。
(d)異常の書き方が人によって違う。 「外箱つぶれ」「角へこみ」「破損あり」と、同じ状態が人ごとに違う言葉で書かれます。荷主ごとの破損の集計を取ろうとしても、言葉がそろっていないので数えられません。
- 【自動】 前日夜、入荷予定のCSVから翌日の品番の一覧を作り、作業者の端末に配る
- 【人】 作業者はヘッドセットを付け、端末で入荷予定の伝票を選んで検品を始める
- 【人】 1行ごとに「品番、数量、ロット、期限、異常」の順で読み上げる
- 【自動】 Azure AI Speech が読み上げを文字にし、確定した発話ごとに信頼度と一緒に返す
- 【自動】 Azure OpenAI が文字にした発話から、品番・数量・ロット・期限・異常を項目に取り出す
- 【自動】 取り出した値を入荷予定の行と突き合わせ、
match/qty_diff/lot_diff/unheard/not_in_planを付ける - 【自動】 結果を端末の画面に表示し、
match以外なら短い通知音を鳴らす - 【人】
unheardなら言い直し、qty_diffなら数え直して、もう一度読み上げる - 【人】 数え直しても差が残るものは、作業者が「差異確定」と読み上げて次へ進む
- 【人】 事務所は差異の確定した行と異常の記録だけを見て、荷主への報告を作る
- 【人/自動】 事務所が確認した検品記録をWMSの入荷実績として取り込む
8番目が、この設計の分かれ目です。 予定との差を返すのは、作業者がまだ箱の前にいるあいだです。数え直しが棚入れの前に終わるので、事務所から倉庫への電話がなくなります。
9番目で「差異確定」を作業者に言わせるのも意図してのことです。 機械は「予定と違う」と言えるだけで、本当に足りないのか数え間違いなのかは分かりません。数え直したうえでの差だと、記録の上で区別できるようにします。
02今回想定するシステム構成
入荷予定CSV(荷主から前日までに届く) │ 前日夜に翌日の品番一覧を作る ▼ 作業者の端末(ヘッドセット+Android端末の検品アプリ) │ Speech SDK でリアルタイムに文字起こし(ja-JP) │ フレーズリスト=その日の入荷予定の品番 ▼ Azure AI Speech ── 確定した発話・信頼度・単語ごとの時刻 ▼ Azure Functions ── 発話を受け取り、伝票と行の文脈を付ける ▼ Azure OpenAI(構造化出力)── 品番・数量・ロット・期限・異常を取り出す ▼ Azure Functions ── 入荷予定の行と突き合わせ、判定を付ける ▼ 端末に結果を返す(画面表示+通知音) ▼ 【事務所が差異と異常だけ確認】── WMSへ入荷実績として取り込む
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Azure AI Speech(Speech SDK のリアルタイム文字起こしとフレーズリスト) | Google Cloud Speech-to-Text、Amazon Transcribe |
| 生成AI | Azure OpenAI(Microsoft Foundry)(構造化出力で検品記録の項目を取り出す) | Claude API、Gemini API |
| 連携 | Azure Functions(発話の受け取り、入荷予定との突き合わせ、端末への返却) | Azure Logic Apps |
| 保管 | Azure Blob Storage(発話の音声と認識結果の控え) | 社内のファイルサーバー |
| 記録 | 倉庫管理システム(入荷予定の読み出しと入荷実績の取り込み) | 荷主ごとの入荷管理の仕組み |
倉庫管理システムは、新しく足すものではありません。 入荷予定はWMSから書き出し、確認済みの検品記録は既存の取り込み機能で入れます。この構成から直接WMSに書き込む経路は作りません。
土台になるのは、Azure AI Speech のリアルタイムの文字起こしです。 Speech SDK で音声を流し続けると、話している途中の推定(Recognizing)と、ひとまとまりの発話が終わったあとの確定した文字(Recognized)が順に返ります。発話の終わりは、末尾の無音で判断されます。 途中の推定は後から変わることがあるので、この構成では確定した文字だけを使います。
日本語(ja-JP)は、フレーズリストの対象になっています。 フレーズリストは、認識を始める直前に語句の一覧を渡すだけで効き、モデルの学習は要りません。 リアルタイムの文字起こしと高速文字起こしのAPIで使え、バッチ文字起こしでは使えません。 一覧は2,000語句以内に収めるよう案内されていて、長くするほど品質と待ち時間に影響するとされています。
SDK でリアルタイムに使う場合は、フレーズリストの重みを0.0から2.0の間で決められます。 1.0が既定で、2.0がいちばん強く効きます。重みは一覧全体にかかります。品番のように普通の言葉と似ていない語句ほど、重みを上げる意味があります。
03どうやって実装するのか
処理の起点を決める
作業者が端末で入荷伝票を選び、検品開始を押したときに認識を始めます。 常に聞き続ける設計にはしません。倉庫では周りの会話やフォークリフトの警告音も拾うため、検品の対象と時間を区切ったほうが、誤って記録される発話が減ります。
1行ずつの区切りは、発話の終わりです。Speech SDK は末尾の無音で発話の終わりを判断し、確定した文字を Recognized として返します。この構成では、確定した発話1つを「検品記録の1行の候補」として扱います。 途中の推定(Recognizing)は画面に薄く表示するだけで、判定には使いません。
もう一つのきっかけは、前日夜の入荷予定の取り込みです。 荷主から届いたCSVをWMSが取り込んだあと、翌日の伝票ごとに品番の一覧を作り、端末に配ります。この一覧が、翌朝のフレーズリストになります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 読み上げの音声 | 作業者のヘッドセットのマイクから流す音声 | 検品アプリ |
| 認識結果 | 確定した文字、発話の開始位置と長さ、信頼度、単語ごとの時刻 | Azure AI Speech |
| 入荷予定 | 伝票番号、行番号、荷主、品番、品名、予定数量、単位(ケース/バラ)、ロット指定の有無 | WMSから書き出したCSV |
| 品番の読み方の一覧 | 品番と、現場での呼び方(「エービーシー」「エーベーセー」など) | 自社で用意する一覧 |
| 異常の言葉の一覧 | 「外箱つぶれ」「濡れ」「ラベル違い」など、記録に使う言葉と言い換えの対応 | 自社で用意する一覧 |
質を決めるのは、下の2つです。 品番は、同じ「ABC-1207」でも人によって読み方が違います。読み方の一覧が無いと、文字になった「エービーシー いちにーぜろなな」が品番に戻せません。 異常の言葉の一覧が無いと、第3章の(d)がそのまま残ります。
信頼度は、Speech SDK の詳細な結果から取ります。 確定した結果には、候補の一覧と、それぞれの信頼度・表示用の文字・正規化した形が付きます。この構成では「聞き取れたか」の判断をこの数値に置きます。
データの取得方法を決める
認識は端末側で動かします。 検品アプリに Speech SDK を組み込み、ヘッドセットのマイクを入力にして、言語を ja-JP に設定して連続認識を始めます。音声をいったん録音してから送る形にしないのは、結果を数秒で作業者に返したいからです。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 確定した文字 | Recognized イベント | 項目の取り出しの入力 |
| 途中の推定 | Recognizing イベント | 画面に表示し、聞き取られていることを作業者に見せる |
| 信頼度 | 確定した結果の候補一覧 | unheard の判定 |
| 発話の開始位置と長さ | 確定した結果の Offset と Duration | 音声の控えとの対応付け |
| 単語ごとの時刻 | 単語単位のタイムスタンプを要求した結果 | 品番や数量がどこで言われたかを後から聞き直す |
単語ごとの時刻は、設定で要求しないと返りません。 SpeechConfig で単語単位のタイムスタンプを要求しておきます。事務所が「この数量は本当にそう言ったか」を確かめるとき、録音の該当箇所だけを再生できます。 時刻は100ナノ秒を1とする単位で、認識を始めた時点からの位置として返ります。
入荷予定は、伝票を選んだ時点で端末に読み込みます。 前日夜に配った一覧から、その伝票の行だけを取り出し、フレーズリストにはその伝票の品番と、品番の読み方の一覧から引いた呼び方を入れます。 伝票1枚の品番は多くて数十なので、2,000語句の目安には十分収まります。
AIへ渡す前に整形する
- フレーズリストを伝票ごとに作り直す … 伝票を切り替えるたびに、その伝票の品番と呼び方だけを入れ直します。1日分の全品番を入れると、似た品番どうしが候補に並びます
- 読み上げの順を固定する … 「品番、数量、ロット、期限、異常」の順で読むことを決め、検品アプリの画面にも表示します
- 数字の読み方をそろえる … 「いち、に、さん」で1文字ずつ読むのか、「じゅうに」とまとめて読むのかを品番と数量で分けて決めます
- 英字の読み方をそろえる … ロットの「O」と「0」、「I」と「1」が混ざらないよう、英字は「オー」ではなく「アルファベットのオー」と読む、などの規則を決めます
- 発話の文脈を付ける … 確定した発話を送るとき、伝票番号・いま検品している行の番号・直前に確定した行を一緒に付けます
- 短すぎる発話を除く … 「えー」「よし」など、1〜2語の確定発話は項目の取り出しに回しません
- 音声の控えを保存する … 発話ごとの音声を Blob Storage に置き、認識結果と同じIDを付けます
3番目と4番目を軽く見ないでください。 音声の認識は、聞こえた音を文字にするところまでです。「じゅうに」が「12」なのか「10と2」なのかは、読み方の規則が決まっていないと後段でも決められません。 現場で守れる規則を、最初に1枚の紙にします。
AIに処理させる
させるのは、確定した1つの発話から5つの項目を取り出し、根拠にした部分をそのまま書き出すことだけです。 予定と比べる判定はさせません。
| 取り出す項目 | 取り出し方 | 取り出せないときの扱い |
|---|---|---|
| 品番 | 発話の中の品番らしい部分を、渡した伝票の品番の候補から選ぶ | 候補に無ければ not_in_list、聞き取った文字はそのまま残す |
| 数量 | 数字と単位(ケース/バラ/個) | 単位が言われていなければ unit_unknown |
| ロット | 英数字の並び。読み方の規則で文字に戻す | 規則で戻せない文字があれば unclear |
| 賞味期限 | 年月日または年月 | 年が省略されていれば補わず partial |
| 異常 | 異常の言葉の一覧から最も近い語を選ぶ | 一覧に無ければ聞き取った言葉のまま other |
右端の列が大事です。 取り出せなかったことを、空欄ではなく理由の付いた値で返させます。空欄と「言われなかった」は違います。 異常を言わなかった行は「異常なし」ですが、期限を言わなかった行は「記録漏れ」です。
| させないこと | 理由 |
|---|---|
| 予定数量との比較 | 比較は規則で行う。AIに比べさせると、予定に合わせて数を読み替える |
| 品番の推測 | 候補に無いものを、似た品番に寄せない |
| 期限の年の補完 | 「3月」としか言っていないものを、今年や来年に決めない |
| 異常の重さの評価 | 受け入れるかは荷主との取り決めで、人が決める |
1行目がいちばん起きやすい失敗です。 予定数量を一緒に渡すと、聞き取りが曖昧な数量を予定どおりの数に寄せて返します。その瞬間、拾いたかった差異が消えます。 項目の取り出しには予定数量を渡しません。
指示内容を固定する
あなたは物流倉庫の入荷検品で、作業者の読み上げを検品記録の項目に取り出す係です。
音声認識が返した文字だけを見て取り出してください。推測で埋めないでください。
【取り出す項目】
1. item_code(品番)… 下の【この伝票の品番の候補】から選ぶ
2. quantity と unit(数量と単位)… 単位はケース/バラ/個のいずれか
3. lot(ロット)… 下の【読み方の規則】で英数字に戻す
4. best_before(賞味期限)… YYYY-MM-DD または YYYY-MM
5. anomaly(異常)… 下の【異常の言葉の一覧】から選ぶ。言われていなければ none
【厳守事項】
- 品番は候補の中から選んでください。候補に無い場合は item_code を空にし、
status を not_in_list として、聞き取った文字を heard に残してください。
似ている品番に寄せないでください。
- 数量は言われた数字だけを入れてください。計算や換算をしないでください。
単位が言われていなければ unit を空にし、status を unit_unknown にしてください。
- 期限の年が言われていなければ、年を補わずに status を partial にしてください。
- 異常が一覧に無い言葉なら anomaly を other とし、聞き取った言葉を heard に残してください。
- 1つの発話に2行分が含まれている場合は、lines に2つ並べてください。
- 検品と関係のない発話(「えー」「次いきます」など)は lines を空にしてください。
- evidence には、その項目の根拠にした部分を、認識結果からそのまま写してください。
- 予定と合っているか、受け入れてよいかは書かないでください。
【音声認識の結果】{recognized_text}
【この伝票の品番の候補と呼び方】{item_candidates}
【読み方の規則】{reading_rules}
【異常の言葉の一覧】{anomaly_terms}
「似ている品番に寄せない」を明記しないと、候補の中で最も近いものを選びます。 候補を渡す以上、AIはその中から答えようとします。候補に無いということ自体が、誤配送や荷主の予定の漏れを見つける手がかりです。
予定数量をプロンプトに入れていないのも同じ理由です。 比較の材料を渡さなければ、比較のしようがありません。
出力形式を固定する
Azure OpenAI の構造化出力で、次の形のJSONを受け取ります。 構造化出力は、呼び出しのときに渡したJSONスキーマに出力を従わせる機能で、型の合わない値や項目の抜けで後段の突き合わせが止まることを防げます。 スキーマではすべての項目を必須にし、additionalProperties を false にする必要があります。
{
"utterance_id": "",
"lines": [
{
"item_code": "",
"heard": "",
"quantity": 0,
"unit": "case | piece | each | ",
"lot": "",
"best_before": "",
"anomaly": "none | crushed | wet | label_mismatch | other",
"status": "ok | not_in_list | unit_unknown | partial | unclear",
"evidence": ""
}
]
}
1つ目の理由は、AIの取り出しと規則の判定を別の層に置けることです。 lines はAIが埋め、予定との突き合わせは Azure Functions が規則で行います。
| 判定 | 条件 |
|---|---|
unheard | 認識の信頼度がしきい値未満、または status が unclear |
not_in_plan | status が not_in_list(伝票に無い品番) |
qty_diff | 品番が一致し、数量または単位が予定と違う |
lot_diff | ロット指定のある行で、ロットが指定と違う |
match | 上のどれにも当たらない |
unheard を先に判定するのが要です。 信頼度が低い発話は、数量が予定と違って見えても qty_diff にしません。聞き取りの問題を、差異として記録しないためです。 しきい値は、最初の1か月の結果を見て決めます。
2つ目の理由は、端末の画面を項目ごとに組み立てられることです。 作業者には「品番 ABC-1207 / 12ケース / ロット A0315 / 期限 2027-03」と項目で返し、違う項目だけ色を変えます。自由文で返すと、どこが違うかを作業者が読み取らなければなりません。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 検品アプリ(端末) | Speech SDK | ヘッドセットの音声を流し、確定した発話と信頼度を受け取る |
| Azure Functions | HTTPの呼び出し | 確定した発話を受け取り、文脈を付けて項目の取り出しへ回す |
| Azure OpenAI | API呼び出し(構造化出力) | 発話から項目を取り出す |
| WMS | CSVの書き出しと取り込み | 入荷予定を読み、確認済みの検品記録を入荷実績として入れる |
| Blob Storage | ファイルの保存 | 発話の音声と認識結果の控え |
WMSへは直接書き込みません。 事務所が確認した検品記録だけを、既存の取り込み機能で入れます。音声の誤認識が、そのまま在庫数に入る経路を作らないためです。
端末への返却は、1つの発話ごとに行います。 伝票の全行が終わってからまとめて返すと、差異が分かるのは最後の箱を置いた後になり、数え直しのために荷を探し直すことになります。
人が確認する
作業者は、画面と通知音で全行を見ます。 ただし見るのは、match 以外の行だけで足ります。match の行は画面に緑で並ぶだけで、手を止める必要はありません。
unheardは言い直す … 画面に聞き取った文字が出るので、どこが違うかを見て、その項目だけ言い直しますqty_diffとlot_diffは数え直す … 荷がまだ目の前にあるうちに数え直し、同じなら「差異確定」と読み上げますnot_in_planは荷札を確かめる … 伝票違いの荷が混ざっていないかを見ます
事務所が見るのは、差異の確定した行と、異常の記録だけです。
- 差異の確定した行を見る … 必要なら単語ごとの時刻から録音の該当箇所を再生し、本当にその数を言ったかを確かめます
- 異常の記録を見る …
otherで残った言葉を一覧の語に直します - 取り込みを承認する … 確認が済んだ伝票だけをWMSに入れます
4番目を省かないでください。 数量の差異は、荷主への報告と請求に直結します。言い間違いや聞き間違いを差異として報告した1件は、荷主との次の月に残ります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 周りの騒音で認識が途切れる | 信頼度が下がり unheard になる。ヘッドセットのマイクの位置と、検品場所の配置を見直す |
| 1つの発話に2行分を続けて言う | lines に2つ並べる。分けられなかったものは unheard で言い直し |
| 伝票に無い品番が届く | not_in_plan。荷札と伝票を確かめ、事務所へ回す |
| 予定に無い荷主の荷が混ざる | 伝票の選び間違いを疑う。画面に伝票番号を大きく出しておく |
| 通信が切れる | 端末に発話の文字を一時保存し、つながったら送り直す。音声の控えは端末に残す |
| 作業者が読み上げの順を変える | 項目の取り出しは順に依存させない。ただし規則は守ってもらう |
| フレーズリストが渡っていない | 品番の not_in_list が急に増える。伝票の切り替えのたびに入れ直されているかを見る |
| ロットに読み方の規則外の文字がある | unclear で人へ。その荷主のロットの書式を規則に足す |
上から2行目までが、運用の初めの大半を占めます。 どちらもAIの問題ではなく、マイクと話し方の問題です。 判定の精度を上げるより、読み上げの規則を現場で守れる形にするほうが効きます。
記録を残す
- 発話ごとの音声と、確定した文字・信頼度・単語ごとの時刻
- 項目の取り出し結果(
lines)と、そのときに渡した品番の候補 - 予定との判定(
match/qty_diff/lot_diff/unheard/not_in_plan) - 言い直しと数え直しの記録 … どの行で、何回、どう変わったか
- 事務所が直した項目と、取り込みの承認者
- 作業者ごと・時間帯ごとの
unheardの発生率
4つ目で「どう変わったか」を残すのは、差異の確定の重みが変わるからです。 数え直して同じ数だった差異と、言い直して消えた差異は、荷主への報告の確からしさが違います。
最後の行は、マイクと配置を見直す材料になります。 特定の検品場所や時間帯だけ unheard が続くなら、理由は声ではなく周りの音にあります。
04実装レベルの3段階
最小構成では、現場では使えません。 録音してから文字にするので、作業者に差を返すことができません。 認識が成り立つかを確かめるための段階です。 半自動化で、1件4分が2.5分程度になります。 記入と打ち込みはなくなりますが、予定との突き合わせと倉庫への電話が事務所に残ります。本格構成で1.5分になり、この段階が本記事の想定です。 差が大きいのは、差異が棚入れの前に分かり、数え直しの電話がなくなるからです。 段階を飛ばさないでください。 半自動化を1か月回すと、unheard の多い作業者と検品場所、読み方の規則が守られにくい荷主のロットが先に分かります。そこを直してから差異を返す仕組みを足すほうが、作業者が通知音を無視するようにならずに済みます。
05工数削減シミュレーション
導入後 1,800件 × 1.5分 ÷ 60 = 45 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 段ボールやパレットを両手で扱いながら検品するため、紙やハンディ端末への記入で手が止まっている物流倉庫。入荷予定(事前出荷明細)のデータが前日までに届き、品番の一覧を事前に用意できる場合。ロット・賞味期限・製造番号を記録する必要がある食品・日用品・部品の入荷。検品後の事務所での転記が毎日の残業になっている場合。
- 入荷のほぼすべてがバーコードやRFIDで読み取れ、手で書く項目が残っていない場合。フォークリフトや搬送機の騒音が大きく、ヘッドセットのマイクでも声が拾えない現場。1日の入荷が数件で、紙の記入で足りる場合。なお、数量の差異を仕入先に請求するか、受け入れを拒むかといった判断はこの構成では行いません。
07最小構成で試す方法
- 過去の入荷伝票から、品番が20行ほどある伝票を1枚選ぶ
- 検品担当1名に、その伝票の品番・数量・ロット・期限を「品番、数量、ロット、期限、異常」の順で読み上げてもらい、スマートフォンで録音する
- Speech Studio のリアルタイムの文字起こしで録音を読み込ませ、そのまま文字にする
- 同じ録音を、伝票の品番を「;」区切りでフレーズリストに入れてもう一度文字にし、違いを見る
- 文字になった結果を手元のAIサービスに貼り、「品番・数量・単位・ロット・期限・異常を表にしてください。分からない項目は空欄にせず、分からないと書いてください」と指示する
- 出てきた表を、実際の検品表と突き合わせる
4番目は必ずやってください。 フレーズリストの有無で品番の認識がどれだけ変わるかが、この構成が現場で成り立つかどうかの分かれ目です。
| 出てきた内容 | 判断 |
|---|---|
| フレーズリストを入れると品番がほぼ正しく出る | 検品アプリへの組み込みに進む |
| 品番は出るが、ロットの英字と数字が混ざる | 読み方の規則で直る。構成は有効 |
| 周りの音で文字がほとんど出ない | マイクが先。 ヘッドセットで録り直す |
3行目が出ることは珍しくありません。 スマートフォンを胸ポケットに入れて録ると、倉庫ではたいていこうなります。口元にマイクのあるヘッドセットで同じ伝票を録り直し、どこまで変わるかを見てください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
聞き取りの誤りが qty_diff として記録される | 信頼度で unheard を先に判定する。 差異の判定より前に置く |
| 予定数量に合わせて数を読み替える | 項目の取り出しに予定数量を渡さない。比較は規則で行う |
| 品番が似た品番に寄せられる | 候補に無ければ not_in_list。寄せないことを指示に明記する |
| フレーズリストが長すぎて効きが落ちる | 2,000語句以内が目安。伝票ごとに入れ直す |
| バッチの文字起こしでフレーズリストが効かない | バッチでは使えない。 リアルタイムか高速文字起こしで使う |
| ロットの英字と数字が混ざる | 読み方の規則を決め、荷主ごとのロットの書式を一覧にする |
| 「じゅうに」が12か10と2か分からない | 数量と品番で数字の読み方を分けて決める |
| 期限の年を勝手に補う | 年が言われていなければ partial。補わない |
| 途中の推定で判定してしまう | 確定した Recognized だけを使う。 途中の推定は後から変わる |
| 通知音が多すぎて無視される | 半自動化の期間に unheard を減らしてから差異の通知を足す |
| WMSへ直接書き込んでしまう | 事務所の確認後に取り込む。 誤認識が在庫に入る経路を作らない |
上の2行が、この構成の失敗のほとんどです。 どちらも「予定と違う」の中身を取り違える失敗で、聞き取りの問題と本当の差異を混ぜると、作業者は数え直しの通知を信じなくなります。
下の2行も、同じくらい早く効いてきます。 通知音を無視する習慣は、一度付くと戻りません。通知の数を、作業者が全部に応じられる数まで減らしてから本格構成に進んでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 荷主の品番・数量・ロット・期限、そして作業者の声の録音です。
- 作業者の声を記録することを、先に説明する … 発話ごとの音声を控えとして残します。何のために、どれだけの期間残し、誰が聞けるのかを、作業者に説明してから始めます
- 録音を作業の評価に流用しない …
unheardの発生率は、マイクと配置を見直すための数字です。作業者個人の評価に使うと、話し方を変えて記録を避けるようになります - 荷主のデータの扱いを契約で確かめる … 3PLとして預かる荷主の入荷予定を外部のサービスに送ることになります。荷主との契約で、外部のサービスの利用が認められているかを確かめます
- 周りの会話を記録しない … 認識は検品開始から終了までに区切ります。休憩中や検品の合間の会話が録音に入らないよう、常時の録音にはしません
- 差異の扱いは人が決める … 数量の差異を荷主に請求するか、受け入れを拒むかは、荷主との取り決めと事務所の判断です。 この構成が出すのは、読み上げと予定が違ったという事実だけです
- WMSの在庫数を守る … 確認を経ずに取り込む経路を作らないことが、在庫の数字への信頼を守ることになります
誤りが起きた場合のリスクは、差異を見落として受け入れることと、差異でないものを荷主に報告することの2つです。 前者は unheard を match に混ぜると起き、後者は unheard を qty_diff に混ぜると起きます。どちらも同じ区別から出ているので、そこだけは設計で守ります。
10まず何から始めるか
1週目:読み上げの規則を1枚にする
検品担当と事務所で集まり、読み上げの順、数字の読み方、英字の読み方、異常の言葉を1枚にまとめます。荷主ごとのロットの書式もこのとき集めます。全荷主を一度に扱う必要はありません。行数の多い荷主1社から始めます。
2週目:20行の伝票で試す
第8章のとおり、20行の伝票を読み上げて録音し、フレーズリストの有無で品番の認識がどう変わるかを見ます。ヘッドセットとスマートフォンの両方で録り、マイクの差も確かめます。
3週目:品番の読み方の一覧を作る
2週目の結果から、認識が崩れた品番を拾い、現場での呼び方を一覧に足します。 あわせて、差異を荷主に報告する基準を事務所で決めます。
4週目:検品アプリで1名が使う
Speech SDK を組み込んだ検品アプリで、検品担当1名が荷主1社の入荷だけを読み上げで記録します。この時点では予定との突き合わせを出さず、記録の一覧だけを見ます。
2か月目: 予定との突き合わせを足し、unheard と qty_diff の件数を毎日数えます。3か月目以降: 対象の荷主と作業者を広げ、1件4分が何分になったかを実測します。作業者ごと・検品場所ごとの unheard の発生率を見て、マイクと配置を見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| フレーズリストが認識を始める直前に渡す語句の一覧で、モデルの学習が不要なこと。リアルタイムの文字起こし(Speech SDK 等)と高速文字起こしAPIで使え、バッチ文字起こしでは使えないこと。2,000語句を超えないよう案内され、長いほど品質と待ち時間に影響すること。SDK のリアルタイムの文字起こしで重みを0.0〜2.0(既定1.0)で設定でき、一覧全体にかかること | Microsoft Learn: Improve recognition accuracy with phrase list | 2026-10-06 |
Recognizing が途中の推定で後から変わりうること、Recognized が発話の完了後の確定した文字であること。発話の終わりが末尾の無音で判断されること。Offset と Duration が100ナノ秒単位で返ること。単語単位のタイムスタンプは SpeechConfig で要求すると返ること。詳細な結果に信頼度・表示用の文字・正規化した形が含まれること | Microsoft Learn: Get speech recognition results | 2026-10-06 |
| 日本語(ja-JP)の音声認識で、フレーズリストが対応する機能として挙げられていること | Microsoft Learn: Language and voice support for the Speech service | 2026-10-06 |
構造化出力がJSONスキーマに出力を従わせる機能で、旧来のJSONモードと異なること。すべての項目を必須にし、additionalProperties を false にする必要があること | Microsoft Learn: How to use structured outputs with Azure OpenAI | 2026-10-06 |
数量の差異を荷主にどう報告し、どう扱うかは、荷主との取り決めに従ってください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0598)についてのご相談はこちらから。
