ラジオ局から届く放送されたCMの録音を文字にして発注した原稿と照らし、読み違い・抜け・社名や価格の誤りを拾って広告主への放送報告にそろえる
ラジオ局から届く放送されたCMの録音を Azure AI Speech で文字にし、発注した原稿と照らします。生CMの読み違いと抜け、社名・価格・期間の誤り、差し替え前の素材の放送を拾い、広告主への放送報告にそろえます。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI
- 連携・自動化
- Python
- 対象業界
- 不動産/小売/広告
- 対象部門
- マーケティング
- 対象業務
- 内容確認・チェック/書類作成
- 主な課題
- 人手が足りない/書類作成に時間がかかる/確認ミスが多い
- AIで行う処理
- 校正
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 局から届いた放送確認書を開き、出稿の管理表と放送の日時・枠を突き合わせる
- 録音のファイルを開き、どの放送のものかを放送確認書と合わせる
- 原稿を横に置いて録音を聞き、社名・価格・期間・問い合わせ先を目で追う
- 違いがあれば、時刻と内容をメモする。聞き取れなければ巻き戻して聞き直す
- 完成した素材のCMは、冒頭と価格の部分を聞いて素材が正しいかを確かめる
- 違いがあったものは、局に確認と対応を依頼する
- 月末に、広告主ごとの放送報告を表計算でまとめて送る
- 人局から届いた放送確認書と録音のファイルを、局ごとの受付フォルダに保存する
- 自動放送確認書の行と録音のファイルと出稿の管理表を、局・日時・枠で結びつける
- 自動Azure AI Speech の高速文字起こしで、録音を文字にする
- 自動原稿と文字起こしの数字・記号の書き方をそろえ、差異を計算する
- 自動生成AIが、差異を `key_term_error` / `omission` / `wording` / `asr_suspect` などに分ける
- 自動完成した素材のCMは、新旧の素材の原稿のどちらに近いかを判定し、差し替え前の素材の放送を拾う
- 自動重要な差異のある放送を、時刻つきの確認の一覧にする
- 人担当者が一覧の箇所だけを聞き、放送の誤りか、音声認識の誤りかを決める
- 人放送の誤りと決めたものを、局へ確認と対応を依頼する
- 自動確定した結果から、広告主ごとの放送報告の下書きを作る
- 人放送報告を確かめて広告主へ送る
各工程の詳しい説明を読む
- 局から届いた放送確認書を開き、出稿の管理表と放送の日時・枠を突き合わせる
- 録音のファイルを開き、どの放送のものかを放送確認書と合わせる
- 原稿を横に置いて録音を聞き、社名・価格・期間・問い合わせ先を目で追う
- 違いがあれば、時刻と内容をメモする。聞き取れなければ巻き戻して聞き直す
- 完成した素材のCMは、冒頭と価格の部分を聞いて素材が正しいかを確かめる
- 違いがあったものは、局に確認と対応を依頼する
- 月末に、広告主ごとの放送報告を表計算でまとめて送る
(a)1本ずつ聞く時間が足りない。 3番目は、20秒のCMでも原稿と照らしながら聞くと数分かかります。月600本を5名で聞くと、放送の確認だけで月50時間になります。 忙しい月は、完成した素材のCMの確認が省かれます。
(b)価格や期間を聞き漏らす。 「1,980円」と「1,890円」、「31日まで」と「30日まで」は、原稿を目で追いながら聞くと、読み手が言ったつもりの数字に聞こえます。 誤りは、広告主の店舗に問い合わせが来て初めて分かります。
(c)差し替え前の素材の放送に気づかない。 5番目で冒頭だけを聞くと、価格だけが違う新旧の素材を見分けられません。差し替えた日の翌日以降に古い価格が流れていても、報告は「放送済み」になります。
(d)放送報告の作成が月末に集中する。 7番目は、1か月分のメモを集めて表にする作業です。誤りの対応が終わったかどうかを、メモから追い直すことになります。
4つに共通するのは、録音を聞く人の耳と注意に、確認の質が任されていることです。 確認する本数を増やしても、重要な語を聞き分ける仕組みが無ければ、誤りは同じだけ通り抜けます。
- 【人】 局から届いた放送確認書と録音のファイルを、局ごとの受付フォルダに保存する
- 【自動】 放送確認書の行と録音のファイルと出稿の管理表を、局・日時・枠で結びつける
- 【自動】 Azure AI Speech の高速文字起こしで、録音を文字にする
- 【自動】 原稿と文字起こしの数字・記号の書き方をそろえ、差異を計算する
- 【自動】 生成AIが、差異を
key_term_error/omission/wording/asr_suspectなどに分ける - 【自動】 完成した素材のCMは、新旧の素材の原稿のどちらに近いかを判定し、差し替え前の素材の放送を拾う
- 【自動】 重要な差異のある放送を、時刻つきの確認の一覧にする
- 【人】 担当者が一覧の箇所だけを聞き、放送の誤りか、音声認識の誤りかを決める
- 【人】 放送の誤りと決めたものを、局へ確認と対応を依頼する
- 【自動】 確定した結果から、広告主ごとの放送報告の下書きを作る
- 【人】 放送報告を確かめて広告主へ送る
8番目が、この設計の分かれ目です。人が聞くのは全部の放送ではありません。 重要な差異が無い放送は一覧で流し見て、差異のあった数秒だけを聞きます。 全部を聞き直す設計にすると、50.0時間はほとんど減りません。
5番目と8番目を分けているのは、文字起こしの誤りを放送の誤りにしないためです。 AIが付けるのは差異の種類までで、放送の誤りかどうかは、録音を聞いた人が決めます。
02今回想定するシステム構成
ラジオ局(放送確認書のPDF+放送の録音の音声ファイル) │ 局ごとの受付フォルダに保存 ▼【トリガー】ファイルの保存 Azure Functions(中継の処理) ├──▶ 放送確認書の行・録音・出稿の管理表を結びつける ├──▶ 広告主名・商品名・店舗名から語句の一覧を作る ▼ Azure AI Speech(高速文字起こし+フレーズリスト) │ 文と単語ごとの時刻・信頼度 ▼ Python(difflib) ── 数字の書き方をそろえ、原稿との差異を計算 ▼ Azure OpenAI(Microsoft Foundry) ── 構造化出力 │ 差異の種類/新旧の素材の判定 ▼ 確認の一覧(時刻つき) ──【担当者が該当の数秒を聞いて確定】 ├──▶ 局への確認と対応の依頼 └──▶ 広告主ごとの放送報告の下書き
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Azure AI Speech(高速文字起こし、フレーズリスト、単語ごとの時刻) | Google Cloud Speech-to-Text、Amazon Transcribe |
| 差異計算 | Python(difflib の SequenceMatcher) | 文字単位の差分を取る他のライブラリ |
| 生成AI | Azure OpenAI(Microsoft Foundry)(構造化出力で差異を分類する) | Claude API、Gemini API |
| 連携 | Azure Functions(ファイルの監視、放送確認書との結びつけ、報告の下書き) | Azure Logic Apps |
出稿の管理表と放送報告の様式は、新しく足すものではありません。 足すのは受付フォルダの監視、音声認識、差異の計算と分類、確認の一覧です。最初の準備は、原稿ごとに「重要な語」の一覧を持たせることです。 社名、商品名、価格、期間、電話番号、URL、注意書きの文です。
文字起こしには、Azure AI Speech の高速文字起こしを使います。 Microsoft Learn では Azure Speech in Foundry Tools とも表記されている音声サービスの機能で、音声ファイルを渡すと同期で結果を返します。対象は5時間未満・500MB未満の音声で、日本語(ja-JP)に対応しています。 結果には文ごとの時刻と信頼度が付き、単語ごとの時刻も返ります。 差異の箇所の時刻を担当者に渡せるのは、この単語ごとの時刻があるからです。
話者の分離は使いません。 CMは1人か2人の声で、誰が読んだかは確認の対象ではないからです。番組のパーソナリティの前後の話が録音に入っている場合は、原稿との照合で範囲を決めます。
03どうやって実装するのか
処理の起点を決める
局ごとの受付フォルダに、放送確認書か録音のファイルが保存されたことを起点にします。 放送確認書と録音は別々に届くことがあるので、両方がそろった放送から順に処理します。 片方しか無い放送は、待ちの一覧に置きます。
放送の翌営業日には結果が出るようにします。 生CMの読み違いは、次の放送の前に局へ伝えられれば、同じ誤りが次の回で繰り返されるのを止められます。 月末にまとめて確かめる運用では、それができません。
3営業日たっても録音が届かない放送は、待ちの一覧から局への催促の候補に移します。 放送確認書だけで報告すると、第3章の(c)の確認ができないからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 放送の録音 | CM1本ごと、または番組の該当箇所の音声ファイル | 局ごとの受付フォルダ |
| 放送確認書 | 局・番組・放送日時・枠・素材番号 | 局ごとの受付フォルダ(PDF) |
| 出稿の内容 | 広告主、放送枠、生CMか完成した素材か、使う原稿・素材の番号と期間 | 出稿の管理表 |
| 原稿 | 生CMの原稿、完成した素材の原稿(新旧の両方) | 出稿の管理表にひもづく原稿のファイル |
| 重要な語の一覧 | 社名、商品名、価格、期間、電話番号、URL、注意書きの文 | 原稿ごとに担当者が付ける |
質を決めるのは、重要な語の一覧と、新旧の素材の原稿です。 重要な語が決まっていないと、差異のどれが広告主にとって困るものかを決められません。完成した素材の新旧の原稿がそろっていないと、差し替え前の素材が流れたことを判定できません。
放送確認書のPDFは、表の行を読み取って使います。 局ごとに様式が違うため、局ごとに列の並びを決めた読み取りの設定を作ります。 読み取りに自信のない行は、担当者が出稿の管理表と見比べて結びつけます。
データの取得方法を決める
文字起こしは、高速文字起こしのAPIに音声とその定義を送ります。
| 指定するもの | 値 | 理由 |
|---|---|---|
locales | ["ja-JP"] | 言語が決まっているので指定する |
phraseList | 広告主名・商品名・店舗名・キャンペーン名 | 固有名詞の聞き違いを減らす |
profanityFilterMode | None | 既定は Masked。広告の文言が伏せ字にされるのを避ける |
| 返ってくる値 | phrases の文ごとの時刻・confidence と、words の単語ごとの時刻 | 差異の箇所の時刻、聞き取れなかった文の印 |
POST https://{リソース名}.cognitiveservices.azure.com/speechtotext/transcriptions:transcribe?api-version=2025-10-15
audio = 放送IDを名前にした音声ファイル
definition = {
"locales": ["ja-JP"],
"profanityFilterMode": "None",
"phraseList": { "phrases": ["<広告主名>", "<商品名>", "<店舗名>",
"<キャンペーン名>"] }
}
profanityFilterMode を None にするのは、照合のためです。 既定の Masked のままだと、不適切な語と判定された語が伏せ字になり、原稿との照合で「抜け」と出ます。 広告の文言は原稿で確かめてあるので、伏せ字にする理由がありません。
フレーズリストは、認識の直前に渡す語句の一覧で、モデルの学習は要りません。 2,000語句を超えないようにし、長いほど品質と待ち時間に影響するとされています。その放送の広告主の語句だけを渡し、価格や電話番号の数字は入れません。 数字をフレーズリストに入れると、原稿の数字に寄せて認識され、読み違いを見逃すおそれがあるためです。
AIへ渡す前に整形する
- 数字の書き方をそろえる … 高速文字起こしの結果は表示形式(ディスプレイ形式)だけで返ります。「千九百八十円」「1980円」「1,980円」を同じ形にそろえます。原稿の側も同じ規則でそろえます
- 日付と期間の書き方をそろえる … 「10月31日」「十月三十一日」「31日」を、原稿の期間から月を補わずに、読まれたままの形でそろえます
- 記号と空白を落とす … 句読点、かぎ括弧、全角と半角の違いを落としてから比べます
- CMの範囲を決める … 番組の前後の話が入っている録音は、原稿の最初と最後の文に近い位置で切ります
- 聞き取れなかった文に印を付ける …
confidenceがしきい値を下回る文をlow_confidenceにします
1番目を、原稿と録音の両方に同じ規則で行うのが要です。 片方だけをそろえると、数字が合っているのに差異と出るか、違っているのに一致と出ます。 規則は中継の処理の中の1か所に置き、両方から呼びます。
2番目で月を補わないのは、読み違いを消さないためです。 パーソナリティが「31日まで」と読んだのを、原稿の「10月31日まで」に合わせて補うと、月を読み落としたことが分からなくなります。
AIに処理させる
差異そのものは、AIに見つけさせません。 そろえた原稿と文字起こしを Python の difflib の SequenceMatcher で比べ、get_opcodes() が返す replace / delete / insert の箇所を差異として取り出します。比べる文字数が200を超えると既定の自動の除外が働くため、autojunk=False を指定します。
AIにさせるのは、取り出した差異の1つずつに種類を付けることだけです。
| 種類 | 内容 | 担当者の扱い |
|---|---|---|
key_term_error | 重要な語(社名・商品名・価格・期間・電話番号・URL)が違う | 必ず聞く |
omission | 原稿の文や注意書きが録音に無い | 必ず聞く |
addition | 原稿に無い内容が足されている(価格や条件を含む) | 価格・条件を含めば聞く |
wording | 意味の変わらない言い回しの違い | 聞かない |
asr_suspect | low_confidence の文の中の差異で、音が似ている語 | 重要な語なら聞く |
asr_suspect を別に立てるのが、第1章の「聞き違え」への答えです。 原稿の「ご来店」が「ご来展」と出ていれば、ほぼ認識の誤りです。ただし重要な語に当たる差異は、asr_suspect でも担当者が聞きます。 価格の聞き違いと読み違いは、文字では区別できないからです。
| させないこと | 理由 |
|---|---|
| 放送の誤りかどうかの確定 | 録音を聞いた人が決める |
| 原稿の正誤の判断 | 原稿は広告主が確かめたもの。直すのは広告主 |
| 局への補填や再放送の要否 | 局との契約と広告主の意向で決める |
| 差異の箇所の追加 | 差異は difflib が出したものだけ |
| 文字起こしの修正 | 聞き違いを直すと、読み違いも消える |
指示内容を固定する
あなたは広告会社でラジオCMの放送を確認する担当の補助です。
放送の文字起こしと、発注した原稿の差異の一覧を受け取り、
差異の1つずつに種類を付けてください。差異を新しく探さないでください。
【CMの種別】{cm_type}(live:生CM/recorded:完成した素材)
【重要な語の一覧】{key_terms}
社名、商品名、価格、期間、電話番号、URL、注意書きの文
【種類の選び方】
- key_term_error … 重要な語の一覧にある語が、文字起こしで違う語・数字になっている
- omission ……… 原稿の文や注意書きが、文字起こしに無い
- addition ……… 原稿に無い内容が足されている
- wording ……… 意味が変わらない言い回しの違い(語順、助詞、「です」と「でございます」など)
- asr_suspect … low_confidence の文の中で、音が似ている別の語になっている
【厳守事項】
- 重要な語に当たる差異は、音が似ていても key_term_error にしてください。
asr_suspect にしてよいのは、重要な語に当たらない差異だけです。
- 価格・日付・電話番号の数字が1桁でも違えば key_term_error です。
- 足された内容に価格・割引・期間・条件が含まれる場合は、addition にして
has_condition を true にしてください。
- 原稿が正しいか、放送が正しいかを判断しないでください。
- 迷ったときに wording を選ばないでください。
- 各差異に、差異の番号 diff_id と、根拠にした文字起こしの文番号を付けてください。
【差異の一覧(diff_id・原稿側・文字起こし側・文番号・low_confidence)】{diffs}
【原稿の全文】{script}
「迷ったときに wording を選ばない」を明記しないと、生CMの差異をまとめて言い回しの違いにします。 生CMは原稿とずれているのが普通なので、生成AIは「よくある崩し」として流しがちです。 迷ったものが聞く側に寄るようにしておきます。
重要な語を asr_suspect にさせないのは、聞き違いの判定が楽観に傾くからです。 「1,890円」が認識の誤りか読み違いかは、AIにも分かりません。分からないものは人が聞きます。
出力形式を固定する
次の形のJSONで受け取ります。 Azure OpenAI の構造化出力で、このスキーマに従わせます。
{
"broadcast_id": "",
"cm_type": "live | recorded",
"diffs": [
{ "diff_id": 0,
"category": "key_term_error | omission | addition | wording | asr_suspect",
"key_term": null, "has_condition": false,
"sentence_id": 0 }
],
"version_match": null
}
構造化出力では、すべての項目を必須にし、省略したいものは null との共用体型で表します。 オブジェクトには additionalProperties: false が必要です。version_match は完成した素材のCMだけに使い、生CMでは null にします。
完成した素材のCMの新旧の判定は、規則で行います。 文字起こしを新旧の原稿のそれぞれと SequenceMatcher で比べ、ratio() の値と重要な語の一致を見ます。
| 判定 | 条件 | 確認の一覧での扱い |
|---|---|---|
current | 新しい原稿の重要な語がすべて一致 | 一覧で流し見る |
previous | 古い原稿の重要な語に一致し、新しい原稿と違う | 差し替え前の素材の放送として必ず聞く |
unknown | どちらとも重要な語が一致しない | 担当者が聞いて素材を確かめる |
中継の処理は、確認の一覧に時刻を付けます。 差異の箇所の単語の offsetMilliseconds から、前後2秒を含む再生の範囲を作ります。担当者は一覧の行を押すと、その数秒だけを聞けます。
確認の一覧の行は、次のような形になります。
| 放送 | 種類 | 原稿 | 文字起こし | 再生の範囲 |
|---|---|---|---|---|
| A局 土曜 9:40 生CM | key_term_error(価格) | 1,980円 | 1,890円 | 00:12.4〜00:16.1 |
| A局 土曜 9:40 生CM | omission | 価格は税込です。 | (なし) | 00:18.0〜00:22.0 |
| B局 日曜 17:20 素材 | previous | 11月3日まで | 10月31日まで | 00:09.2〜00:13.5 |
1行目と3行目は、どちらも数字の違いですが、意味が違います。 1行目は読み違いか聞き違いかを聞いて決めるもの、3行目は素材の取り違えで、同じ枠のその後の放送もすべて確かめるものです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 局ごとの受付フォルダ | 中継の処理の監視 | 放送確認書と録音のファイルの保存を検知する |
| 出稿の管理表 | 読み取り | 放送枠、原稿・素材の番号、重要な語、差し替えの日 |
| Azure AI Speech | API呼び出し | 文と単語ごとの時刻・信頼度つきの文字起こし |
| Azure OpenAI | API呼び出し(構造化出力) | 差異の種類 |
| 確認の一覧 | 中継の処理が作る画面 | 時刻つきの差異と、再生の範囲 |
| 放送報告 | 確定後に下書きを作る | 広告主ごとの放送日時・枠・素材・確認結果・対応 |
出稿の管理表には書き込みません。 確認の結果は確認の一覧と放送報告の側に残し、出稿の管理表は発注の記録として変えずにおきます。
局への確認と対応の依頼は、担当者が送ります。 依頼の文面の下書きは出しますが、補填や再放送を求めるかどうかは、局との取り決めと広告主の意向で決まるからです。
人が確認する
人が聞くのは、確認の一覧に載った箇所だけです。 次の順に見ます。
previousを先に見る … 差し替え前の素材の放送は、同じ誤りが続いているおそれがあります。その日以降の同じ枠もまとめて確かめますkey_term_errorとomissionを聞く … 該当の数秒を聞き、放送の誤りか、音声認識の誤りかを決めますadditionで条件を含むものを聞く … 原稿に無い割引や期間が足されていないかを確かめます- 結果を確定する … 放送の誤りと決めたものに、局への依頼の要否を付けます
確認の画面には、原稿と文字起こしを並べ、差異の箇所に色を付けます。 聞く前に何が違うのかが分かっていれば、数秒の再生で判断がつきます。
wording を全部聞き直さないでください。 聞き直す運用にすると、第10章の1分には収まりません。最初の1か月だけ、wording から無作為に1割を選んで聞き、誤って言い回しの違いにされた重要な差異が無いかを確かめます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 録音が届かない | 3営業日で局への催促の候補に。放送確認書だけで「確認済み」にしない |
| 放送確認書の行と録音が結びつかない | 担当者が出稿の管理表と見比べて結びつける |
| 番組の話が長く入っていてCMの範囲が決まらない | 担当者が範囲を指定する |
BGMが大きく low_confidence の文が多い | 重要な語を含む文は担当者が聞く |
| 新旧どちらの素材とも合わない | unknown。局に放送した素材の番号を確かめる |
| 生CMで原稿に無い価格や割引が読まれた | addition で has_condition。広告主に確かめる |
| 高速文字起こしが429を返す | 公式の案内に沿って間隔を空けて再送する |
| 原稿のファイルが見つからない | 照合せずに担当者へ。出稿の管理表の原稿のひもづけを直す |
上から6行目は、放送の誤りとして見落とされやすいものです。 パーソナリティの善意の一言でも、広告主が出していない割引は、店舗での説明の手間を生みます。 原稿に無いことを足したかどうかも、確認の対象にします。
記録を残す
- 元の録音のファイルと放送確認書、受け取った日時
- 文字起こしの全文と、文と単語ごとの時刻・信頼度
- そろえた後の原稿と文字起こし、difflib が出した差異の一覧
- 生成AIの分類と、担当者が確定した結果(放送の誤り/音声認識の誤り)
- 局への依頼と、その回答・対応
- 広告主へ送った放送報告
4つ目で「音声認識の誤り」と確定した件数は、フレーズリストを直す材料になります。 特定の店舗名がいつも聞き違えられるなら、その語をフレーズリストに足します。
録音の保存の期間は、局との取り決めに合わせます。 放送の録音は局から受け取ったもので、使ってよい範囲と期間は契約で決まっています。
04実装レベルの3段階
最小構成では、本数がさばけません。 1本ずつ貼るので、月600本には使えません。確かめるための段階です。 半自動化で、1件5分が2分程度になります。 差異の一覧は出ますが、時刻が付いていないので録音の中を探して聞くことになり、放送報告への書き写しも残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、該当の数秒を探す時間と、報告への書き写しが、1本ごとの手作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、数字のそろえ方の例外と、聞き違えられやすい店舗名が分かります。そこを直してから確認の一覧を作るほうが、担当者が聞く箇所が少なくなります。
05工数削減シミュレーション
導入後 600件 × 1分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 地域の小売・不動産・自動車販売などの広告主から、複数のラジオ局のスポットCMと生CMをまとめて受注している広告会社。放送の後に局から放送確認書と放送の録音を受け取り、担当者が1本ずつ聞いて原稿と照らしている場合。月の途中で価格やキャンペーンが変わり、素材の差し替えが多い広告主を抱えている場合。広告主へ毎月の放送報告を出している場合。
- 扱うラジオCMが月に数十本で、聞いて確かめれば足りる会社。局から放送の録音を受け取れず、放送確認書だけで報告している会社。CMがすべて同じ完成素材の繰り返しで、差し替えも生CMも無い場合。なお、局への補填や再放送の求め方、広告主への説明の仕方は、この構成では決めません。
07最小構成で試す方法
- 先月の放送から、生CMを15本、完成した素材のCMを15本選ぶ(誤りがあったと分かっているもの、差し替えのあった広告主のものを入れる)
- その30本の原稿と、当時の確認のメモを用意する
- 録音を Speech Studio などで文字にし、原稿と一緒に手元のAIサービスに貼り付ける
- 「この原稿と放送の文字起こしを比べ、社名・商品名・価格・期間・電話番号の違いと、原稿の文の抜けを挙げてください。言い回しの違いは別にしてください」と指示する
- 挙がった違いを、当時のメモと録音で突き合わせる
30本は必ずやってください。 差異の計算と分類を組む前に、「数字の違いを拾えるか」と「言い回しの違いに埋もれないか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の確認と同じ誤りが挙がった | 差異の計算と確認の一覧の構築に進む |
| 言い回しの違いが多すぎて誤りが埋もれた | 差異の計算と分類を分ければ直る。構成は有効 |
| 価格が原稿どおりなのに違いと出た | 数字の書き方をそろえる規則が先。 AIの問題ではない |
3行目はほぼ必ず出ます。 文字起こしの数字の書き方と原稿の書き方がそろっていないからです。この30本で、そろえる規則の例外を集めておくと、本番の誤検知が減ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 数字の書き方の違いが差異として大量に出る | 原稿と文字起こしの両方を同じ規則でそろえる |
| 価格の聞き違いが「認識の誤り」として流される | 重要な語の差異は asr_suspect にさせない |
| 生CMの差異がまとめて言い回しの違いにされる | 迷ったら wording にしないと明記する |
| 広告の文言が伏せ字になる | profanityFilterMode を None にする |
| 数字をフレーズリストに入れて読み違いが消える | フレーズリストには固有名詞だけを入れる |
| 長い原稿で差異が不自然に出る | difflib の autojunk=False を指定する |
| 差し替え前の素材を見分けられない | 新旧の原稿の両方を出稿の管理表にひもづける |
| 放送確認書だけで確認済みになる | 録音が届かない放送は待ちの一覧に置く |
| 期間の月の読み落としが消える | 文字起こしの側で月を補わない |
| 局への依頼が自動で飛ぶ | 下書きまでにする。 送るのは担当者 |
上の3行が、この構成の失敗のほとんどです。 どれも、差異が多すぎるか少なすぎるかの失敗です。多すぎれば担当者は全部聞き直し、少なすぎれば誤りが報告をすり抜けます。 数字のそろえ方と分類の指示で、その間に収めます。
上から5行目は、善意で入れたくなる設定です。 フレーズリストに価格を入れれば認識は原稿に近づきますが、近づくのは読み違えた放送も同じです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: ラジオ局から受け取った放送の録音、広告主の原稿、出稿の内容と価格、局への依頼のやり取りです。個人の情報はほとんど含みませんが、放送前の原稿には公表前の価格やキャンペーンが含まれます。
- 放送の録音を使ってよい範囲を、局との取り決めで確かめる … 確認のために受け取った録音を、クラウドで文字にしてよいか、いつまで持つかを確かめます
- 公表前の原稿を外部に出さない設定にする … 生成AIに渡すのは、その放送の原稿と差異の一覧だけにします
- 放送の誤りを自動で確定しない … AIが付けるのは差異の種類までで、放送の誤りかどうかは録音を聞いた担当者が決めます
- 局への依頼と広告主への報告を自動で送らない … どちらも取引の関係に直接ひびきます。下書きまでにします
- 原稿の正誤に踏み込まない … 原稿に誤りがあっても、直すのは広告主です。気づいた点は担当者が広告主に伝えます
誤りが起きた場合のリスクは、誤った価格の放送を見逃すことと、正しく放送されたものを誤りとして局へ伝えることの2つです。 前者は重要な語の差異を言い回しや認識の誤りに分類すると起き、後者は音声認識の誤りを放送の誤りとして扱うと起きます。前者は分類の指示で、後者は担当者が数秒を聞く確認で、設計で防ぎます。
10まず何から始めるか
1週目:重要な語の一覧と新旧の原稿をそろえる
出稿の多い広告主5社について、原稿ごとに重要な語の一覧を付け、完成した素材の新旧の原稿を出稿の管理表にひもづけます。
2週目:30本で試す
生CMと完成した素材のCMを15本ずつ文字にし、手元のAIサービスで原稿との違いを挙げさせます。数字の違いを拾えるか、言い回しの違いに埋もれないかを最優先で見ます。
3週目:数字のそろえ方の規則を作る
試した30本で出た書き方の違いを集め、原稿と文字起こしの両方に使う規則を1つにまとめます。
4週目:1局の受付フォルダから差異の一覧までをつなぐ
最初の1局について、受付フォルダの監視から文字起こし、差異の計算と分類までをつなぎます。この時点では確認の一覧に時刻を付けず、差異の一覧が多すぎないかだけを見ます。
2か月目: 時刻つきの確認の一覧と新旧の素材の判定を足し、key_term_error と previous の件数を毎週数えます。3か月目以降: 残りの局に広げ、放送報告の下書きを足して、1件5分が何分になったかを実測します。放送の翌営業日に誤りを局へ伝えられるようになり、月末の放送報告が確定した結果の書き出しだけになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
高速文字起こしが同期のAPIで、音声が5時間未満・500MB未満であること。表示形式(ディスプレイ形式)の文字起こしだけを返すこと。locales、phraseList(API バージョン 2025-10-15)、profanityFilterMode(None/Masked/Removed/Tags。既定は Masked)を指定できること。結果の phrases に文ごとの時刻と confidence、words に単語ごとの時刻が付くこと。429への対処が案内されていること | Microsoft Learn: Use the fast transcription API | 2026-10-08 |
| フレーズリストが認識の直前に渡す語句の一覧で、モデルの学習が要らないこと。高速文字起こしで使えること。2,000語句を超えないようにし、長いほど品質と待ち時間に影響すること | Microsoft Learn: Improve recognition accuracy with phrase list | 2026-10-08 |
| 日本語(ja-JP)が音声認識の高速文字起こしに対応していること | Microsoft Learn: Language and voice support for the Speech service | 2026-10-08 |
構造化出力でモデルが指定したJSONスキーマに従うこと。すべての項目を必須にし、省略したいものは null との共用体型で表すこと。additionalProperties: false が必要なこと | Microsoft Learn: Azure OpenAI で構造化出力を使用する方法 | 2026-10-08 |
SequenceMatcher が2つの列を比べ、get_opcodes() が replace/delete/insert/equal の区間を返すこと。ratio() が一致の度合いを0から1で返すこと。2つ目の列が200要素以上のとき既定の自動の除外が働き、autojunk=False で止められること | Python ドキュメント: difflib | 2026-10-08 |
放送の録音の受け取り方と使ってよい範囲は、各ラジオ局との取り決めで確かめてください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0976)についてのご相談はこちらから。
