【音ツツ】リザルトから曲名等を読み取る方法を考える 【音ゲーツールを作ろう】#006
[2024/07/24]
1か月以上ぶりのこの企画。
前回が途中で終わってしまったので、やっぱり続きを書くべきかと悩んでいたんですが違う話です。
コードを書くだけがプログラミングじゃない
一人でツールを作る以上、「こういうものを作りたい」から「どうやったらできるのか」や「実際に動くコードを書く」まですべてをやらないといけません。
以前にも「プログラミング=コードを書くだけではない」と書きましたが、自分はいつもこういうツールができないかなぁと考えています。半分妄想みたいなものですかねw
今回は「こういうものを作りたい」のアイディアの話が中心です。
スコアツールのスコア登録
世の中には音ゲーのスコアを登録して一覧表示できるサイトが複数あります。
AC IIDXやSDVXのように自分のスコアデータを公式サイトで見れたり、なんだったらCSVでダウンロードできたりすれば登録は比較的簡単にできます。
でもすべての音ゲーがそうではありません。スコアデータが取得できないとなれば、人力で「手打ち」するしかありません。ただ、登録する曲数が多いと非常に手間がかかる。
何とかして「楽にスコア登録できないか?」と考えました。
そこで思いついたのがリザルト画像からスコアを登録するという仕組みです。
①OCRで読み取りの前準備
最近ではGoogleレンズなどカメラで文字を読み取ると翻訳してくれるようなアプリも存在します。
画像から文字を読み取るのをOCRと言いますが、OCRの精度を上げるポイントは元画像にあります。カメラで読み取った画像から文字を取り出すのは結構難しいんですが、ゲーム画面(リザルト)みたいに決まった位置に文字があるときは比較的簡単です。
前準備として、曲名やアーティスト名、スコアが書かれている座標だけを切り取り、その切り取った画像をグレースケールにしコントラストを上げるような加工をします。リザルト画像はもともとが奇麗な画像なのでノイズ除去はあまり効果がありません。シャープネスはそのゲームのリザルト(フォントとか)次第です。
②OCRで文字として認識させる
Google Cloud VisionやAmazon Textractといったサービスを使うと優秀だと思いますが、一定数を超えると有料です。
Tesseractなどを使って頑張って認識させましょうw
ここでの識字率(制度)を上げるために前準備が重要です。なるべく大きく(何だったら拡大する)、はっきりした色(白地に黒文字が一番精度高いっぽい)にするのがポイント。
ただし、音ゲーの曲名のようにアルファベット、日本語、記号などが混ざっている文字は完璧に認識させるのは難しいです。
③正しい曲名を探す
OCRでそれっぽい曲名のテキストデータが取得出来たら、正しい曲名にします。
スコアツールであれば、当然曲リストのデータを持っています。OCRで取得した曲名を元に正しい曲名を探せばいい訳です。
いわゆるところの「あいまい検索」に近い感じです。よく使われるのがLevenshtein距離。
「Levenshtein距離」は文字列を比較して、どれだけ似ているかを数値化してくれるというものです。
これを使えば正しい曲名を探せる…と思ったんですが、これだけだと完璧にならないこともあります。それが似た曲名の曲です。
例えばSDVXには「VOLTEXES II」と「VOLTEXES III」という曲があります。この辺を曲名だけで判別させるのは難しいです。シリーズ曲なのでアーティスト名も一緒。
④対象曲を減らす
順番としてはこちらが先なのかもしれませんが、説明の都合上④としています。
似た曲名から正しい曲を選ぶアプローチとして、全曲から探すのではなく曲を絞り込んでから探すという方法があります。
画像で認識した時に、譜面難易度(IIDXのB/N/H/A/LやSDVXのNOV/ADV/EXH/MXMなど)や曲レベルを取得すると対象曲をぐっと減らすことができます。
先ほどの「VOLTEXES II」なのか「VOLTEXES II」なのかも「EXHAUST」で「16」となれば「VOLTEXES III」は対象になりますが、「VOLTEXES II」は対象から外れます。
まとめ
①~④の方法を使えば、リザルト画像から高精度で曲を特定することは可能だと思います。
ただ、スコアに関しては正解と照会するということができないため、ひたすらOCRの精度を上げるしかありません。
スコアは数値だけなので、ホワイトリストとして0-9のみにしたり、フォントを学習させて独自の学習データを準備することで精度は上がるはず。
最終手段としてユーザーに修正を任せましょう。
「INFINITAS用打鍵カウンタ」というツールがありますが、確かスクリーンショットからOCRで文字を読み取っていたと思います。また、「レーベンシュタイン距離を改造して音ゲーの曲名をあいまい検索する」ということをやってる人もいました。
さいごに

これらはブラウザ版JavaScript(フロントエンド)で実装可能です。やってること自体はそんなに重くないと思うけど、でも端末スペックにも依存するのでサーバーサイドで処理も考えてもいいのかもしれない。