当選者・選曲の重複チェック、作業のリマインド
EP03

重複チェック・リマインド

当選者・選曲の重複チェック、作業のリマインド

プレゼント当選者管理、楽曲の重複チェック、作業リマインドを AI で自動化。ヒューマンエラーを減らす実用例を紹介。

企画詳細

第3回では、プレゼント当選者管理・楽曲の重複チェック・作業リマインドの3つを AI で自動化するフローを実演します。応募データから重複応募・過去当選者を照合し、オンエアログと照らして選曲の被りをフラグ。さらに番組制作の定型タスクをスケジュールに応じて自動通知します。ヒューマンエラーが起きやすい確認作業を AI に任せる価値を伝えます。

HOW IT WORKS

「選曲の被りチェック」を、11年分のデータとAIで一瞬にする仕組み

第3回のテーマは「確認作業の自動化」。番組でかける曲が最近すでにオンエアされていないかを、人の記憶に頼らずに一瞬でチェックするツールを作りました。 ここで紹介するのは、実際に動くアプリです。選曲リストのExcelを放り込むと、 過去約11年・64万曲のオンエア履歴と自動で照らし合わせ、被っている曲を色分けで教えてくれます。 専門用語が多く出てきますが、その都度かみくだいて説明するので、AIにくわしくない方も安心して読み進めてください。

選曲の被りチェック自動化 - 解説スライド

これまでは、記憶と手作業だのみでした

「この曲、最近かけたっけ?」を、これまではスタッフの記憶や手作業の確認に頼っていました。 過去の使用日をきちんと調べようとすると、専用サイトで日付を1日ずつ探すしかなく、事実上ほとんど調べられないのが実情でした。うっかり被りは、いつ起きてもおかしくなかったのです。 そこで、この「手間はかかるが頭は使わない確認作業」を、まるごとツールに任せることにしました。

そもそもの「お願いごと」

現場のルールはシンプルでした。整理すると、お願いはこうです。

そもそものお願いごと - 解説スライド

何を防ぎたい?

同じ曲を短い間隔でくり返しかけてしまう“被り”。

現場ルールは?

だいたい直近1週間で同じ曲がかかっていなければOK。

あると嬉しい

「過去にいつ使ったか」も分かると、判断の材料になる。

どう使う?

放送前に、その日の選曲リスト(Excel)でサッと確認したい。

先に、よく出る5つの言葉だけ

このあと何度も出てくる言葉を、先にやさしく押さえておきましょう。ここさえ分かれば、仕組みの話がぐっと読みやすくなります。

よく出る言葉 - 解説スライド

クローラー / スクレイピング

Webページを人の代わりにプログラムが自動で開いて、必要な情報を抜き出す技術が「スクレイピング」。それを定期的に巡回して集めるプログラムを「クローラー」と呼びます。今回は、FM大阪の楽曲オンエア情報が載っている「NOA(ノア)」というサイトから、過去にかかった曲を機械的に集めています。

データベース

集めた大量のデータをきちんと整理してためておく「専用の倉庫」。ノートに手書きするのと違い、何十万件あっても一瞬で検索・照合できます。今回は約11年分・およそ64万曲を、Supabase(スーパーベース)というクラウド上のデータベースにためています。

表記ゆれ / 正規化

同じ曲でも「Tricky」と「Tricky」、「サカナクション」と「sakanaction」のように、書き方が違うことがあります。これを機械が『同じ』と判断できるよう、全部そろった形に整える下ごしらえが「正規化」です。これをサボると、同じ曲を別の曲と見なして被りを見逃します。

あいまい検索(類似度)

文字が完全に一致しなくても「どれくらい似ているか」を点数で測り、近いものを見つける技術。正規化だけでは吸収しきれない“ちょっと違う表記”の曲を拾うために使います。

LLM(大規模言語モデル)/ Gemini

文章を理解して判断できるAI(ChatGPT の仲間)。今回は Google の「Gemini(ジェミニ)」を、ルールでは吸収しきれない表記ゆれ(英語表記とカタカナ表記など)に対して『これは同じ曲?別の曲?』と最終的に見極めさせる場面だけで使います。使うかどうかは任意です。

この道具は「4つの部品」でできている

1つのAIに全部やらせるのではなく、役割の違う部品を組み合わせています。人間の職場と同じで、得意なことに専念させたほうが良い結果が出るからです。

4つの部品 - 解説スライド

Python + Streamlit

画面・土台

人が操作する部分

「Streamlit(ストリームリット)」は、Python というプログラミング言語で操作画面をかんたんに作れる道具。選曲リストのExcelを放り込み、ボタンを押すと結果が色分けで出る画面はこれで作っています。担当者はブラウザでURLを開くだけで使えます。

Supabase(データベース)

履歴の倉庫

データをためる部分

過去のオンエア履歴(約11年・64万曲)をためておくクラウドの倉庫。ここにデータがあるおかげで「この曲、過去にいつかけた?」を一瞬で照合できます。アプリ本体とは分けて置いてあり、誰がどこから開いても同じ最新データを見られます。

requests + BeautifulSoup

情報あつめ

履歴を集める部分

NOAサイトを読みに行って、日付ごとのオンエア曲(時刻・曲名・アーティスト)を抜き出す(スクレイピングする)部品。人が1日ずつ手で調べていた作業の置き換えです。相手サイトに負担をかけないよう、ゆっくり巡回します。

3段マッチング + Gemini

照合エンジン+AI

被りを見つける部分

選曲リストと履歴の倉庫を突き合わせて、被りを見つける頭脳。完全一致 → あいまい検索 → AI精査、の3段構えで、表記のゆれた曲も取りこぼしにくくしています(次章でくわしく)。

全体の流れ:5つのステップ

放送前にツールを開いてから、結果が出るまで。裏側ではこの5ステップが上から順に動いています。それぞれ「何をして」「なぜ必要か」を見てみましょう。

全体の流れは5ステップ - 解説スライド
STEP 1

履歴データベースを最新にする

クローラー

なにをする?

「更新」ボタンを押すと、倉庫にたまっている最新の日付から今日までの“足りない分”だけを、NOAサイトから取りに行きます。放送前にこれを押すのが基本の使い方です。

なぜ必要?

被りチェックは「最新のオンエアまで入っていること」が命だから。古いデータのままだと、数日前にかけた曲を見逃します。だから検証の前に、まず倉庫を最新にします。

STEP 2

選曲リスト(Excel)を読み込む

プログラムで自動

なにをする?

番組フォーマットのExcelをドラッグ&ドロップすると、その中から「今回かける曲」だけを自動で抜き出し、曲名とアーティストに分けて一覧にします。放送日もExcelから自動で読み取ります。

なぜ必要?

Excelには曲以外の情報(ジングルや進行メモ)もたくさん入っています。そこから曲の行だけを正確に拾い出すのは、決まったルールで機械にやらせたほうが速くて確実です。

STEP 3

被りを照合する(3段構え)

照合エンジン + Gemini

なにをする?

抜き出した曲を1曲ずつ、履歴の倉庫と突き合わせます。①完全一致 → ②あいまい検索 → ③AI精査、の順で、表記のゆれも吸収しながら過去のオンエア日を探します。

なぜ必要?

曲名の書き方はバラバラ(全角・半角・英語・カタカナ)。単純な一致だけでは同じ曲を見逃すので、だんだん賢い方法に切り替える3段構えにしています(次章でくわしく)。

STEP 4

結果を色分けで表示する

プログラムで自動

なにをする?

曲ごとに🔴直近被り/🟡使用歴あり/🟢履歴なし/⚠️要確認、を色分けで表示。🔴には「いつかけたか」の日付も出ます。あわせて「DBは◯月◯日分まで」という倉庫の鮮度も必ず表示します。

なぜ必要?

見た瞬間に判断できるように。とくに『倉庫がいつまでの分か』を必ず見せるのは、古いデータのまま“被りゼロ”と安心してしまう事故を防ぐためです。

STEP 5

必要ならCSVで書き出す

プログラムで自動

なにをする?

判定結果の一覧を、Excelなどで開けるCSVファイルとして保存できます。

なぜ必要?

画面で確認するだけでなく、記録として残したり、他のスタッフと共有したりできるように。最後の選曲判断はあくまで人間が行う、という前提の“材料”です。

このツールの心臓部:なぜ「3段構え」で照合するのか

曲名の書き方は本当にバラバラです。「Tricky」と「Tricky」、「サカナクション」と「sakanaction」、 「Official髭男dism」と「OFFICIAL HIGE DANDISM」。単純な文字くらべだけでは、同じ曲を“別の曲”と見なして被りを見逃します。 そこで、かんたんで速い方法から、賢いけれど手間のかかる方法へ、だんだん切り替える3段構えにしました。

第1段

完全一致で照合

正規化 + 完全一致

まず、曲名とアーティスト名を正規化(表記をそろえる下ごしらえ)してから、履歴の倉庫にピッタリ同じものがないか探します。速くて確実。大半の曲はここで判定できます。曲名だけでなくアーティストもセットで見るのは、同じ曲名の“別の曲”を間違って被り扱いしないためです。

第2段

あいまい検索で候補さがし

類似度スコア

第1段で見つからなかった曲だけを対象に、『どれくらい似ているか』を点数で測って、近い候補を倉庫から拾います。英語表記とカタカナ表記のような大きく違うケースも、ここでローマ字に直して比べることで拾えるようにしています。

第3段

AIが“同じ曲か”を見極める

Gemini(任意)

第2段で見つけた“似ている候補”を、AI(Gemini)に『これは同じ曲か、別の曲か』と最終判断させます。ルールでは吸収しきれない表記ゆれを、文章を理解するAIの力で見極める段です。ただしAIの鍵(APIキー)を入れないときはこの段を飛ばし、候補を『⚠️要確認』として人に見せます。AIの判定も鵜呑みにせず、根拠を必ず併記します。

なぜ全部をAIにやらせないの?

AIは賢いですが、呼び出すたびに時間もお金もかかります。大半の曲は速くて無料の「完全一致」で判定できるのに、 全部AIに回すのは無駄。かんたんな方法で片づく曲はさっさと片づけ、本当に難しい曲だけAIに回す。この“適材適所”が、速さと正確さと安さを両立させるコツです。

結果はこう出る:5つのしるし

照合が終わると、曲ごとに次のしるしが付きます。ひと目で「どう対応すべきか」が分かるようにしています。

🔴

直近被り

決めた期間(初期は直近7日)以内にかかっている。差し替えを検討。いつかけたかの日付も出ます。

🟡

使用歴あり

過去にかけたことはあるが、直近ではない。基本はそのままでOK。過去の使用日は判断材料に。

🟢

使用歴なし

倉庫の中に記録がない。OK(ただしNOAに載らない曲もある点は前提として)。

⚠️

要確認

表記ちがいの“似た曲”が見つかった。同じ曲かどうかを人が最終確認する。

このほか、曲名が書かれていない「リクエスト対応」などの枠は➖ 抽出対象外として、照合できないことを正直に表示します。 そして結果の上には必ず「倉庫は◯月◯日分まで」という鮮度が出ます。

システムの地図:どこで動いて、データはどこにあるか

このツールは「操作画面」「履歴の倉庫」「情報の取り込み口」の3つが、それぞれ別の場所で連携して動いています。 少し技術的ですが、“アプリ”と“データ”を分けて置くという考え方は、 いろんなツールに共通する大事な設計です。

システムの地図 - 解説スライド

Streamlit Community Cloud

操作画面(アプリ)

担当者が触る画面そのもの。インターネット上に置いてあり、担当者は配られたURLをブラウザで開くだけ。自分のPCに何かをインストールする必要はありません。

Supabase(クラウドDB)

履歴の倉庫

約11年・64万曲のオンエア履歴が入った倉庫。アプリとは“別の場所”に置いてあるのがポイント。だから誰がどこから開いても同じ最新データを見られ、担当者のPCを閉じてもデータは生き続けます。

NOA サイト → クローラー

情報の取り込み口

最新のオンエア情報の出どころ。「更新」ボタンを押したときだけクローラーが動き、足りない日数分を取りに行って倉庫に足します。毎朝自動で動かす手もありましたが、“押したときだけ動く”シンプルな形を選びました。

「アプリ」と「データ」を分けると、何がうれしい?

もしデータをアプリの中に閉じ込めると、担当者のPCでしか使えず、そのPCを閉じたら止まってしまいます。 データを別の倉庫(クラウド)に置くことで、誰がどこから開いても同じ最新データが見られ、24時間いつでも使えるようになります。 今回のツールは、担当者は配られたURLを開くだけ。準備もインストールもいりません。

作る前に決めた6つのルール(=要件定義のキモ)

AIやプログラムは、指示したとおりにしか動きません。逆にいえば「どんなルールで作るか」がこのツールの良し悪しを決めます。現場のことを考えて実際に決めた、大事なルールを6つ紹介します。

作る前に決めた6つのルール - 解説スライド
1

最後の選曲判断は、必ず人間がする

このツールがやるのは「この曲、最近かかっていますよ」という注意喚起まで。差し替えるかどうかはディレクターが決めます。何を大事にするかは番組ごとの判断で、機械に決めさせるものではないからです。第1回・第2回と同じ、いちばん大事な考え方です。

2

倉庫の“鮮度”を必ず見せる

結果画面に「DBは◯月◯日分まで」と必ず表示します。倉庫が古いまま『被りゼロ』と出ても、それは“最近の分が入っていないだけ”かもしれない。古いデータで安心してしまう事故を防ぐための、いちばん現実的な工夫です。

3

「見落としゼロ」は保証しない、と正直に伝える

生演奏やジングルなど、そもそもNOAに載らない曲は倉庫に入らず『履歴なし』と出ます。表記ゆれ対策も3段構えで頑張りますが、100%ではありません。できないことを正直に共有するのも、道具の信頼の一部です。

4

曲名だけで判定しない

世の中には同じ曲名の“別の曲”がたくさんあります。曲名だけで照合すると、無関係な曲を被りと誤検出してしまう。だから必ず曲名とアーティスト名をセットで突き合わせます。

5

相手のサイトに迷惑をかけない

情報を集めるとき、NOAサイトへは決められた間隔(数秒に1回)を空けてアクセスし、サイトが定めたルール(robots.txt)も守っています。便利さのために相手へ負担をかけないのは、この手のツールの最低限のマナーです。

6

AIは任意。鍵は保存も送信もしない

表記ゆれを見極めるAI(Gemini)は“使いたいときだけ”。その合言葉(APIキー)は画面で毎回入力する方式で、どこにも保存せずサーバーにも送りません。AIなしでも、候補を『要確認』として見せる形でちゃんと動きます。第2回と同じ設計思想です。

うっかりの確認は機械に。最後の選曲は人間に。

第3回のツールがやっているのは、あくまで「被っていないかの“確認作業”」です。 11年分・64万曲の履歴と一瞬で照らし合わせ、人の記憶では追いきれない“うっかり被り”を拾い上げます。 そして「この曲でいく」という最後の判断は、必ず人間が行う。 AIは仕事を奪う道具ではなく、人がミスなく、本当に大切な判断に集中するための“相棒”です。第1回・第2回と、根っこは同じ考え方なんです。

確認は機械、選曲は人間 - 解説スライド

※ この仕組みは、実際に動くオンエア楽曲 重複チェックツール(Python + Streamlit + Supabase 製)として作られています。

RELATED BLOG

関連ブログ記事