光学楽譜認識(OMR)とは? 楽譜を読み取る仕組み
光学楽譜認識(OMR、Optical Music Recognition)は、文字の OCR の楽譜版です。プログラムが楽譜の画像を見て、どんな音符が書かれているかを割り出し、コンピューターで再生・編集・移調できるようにします。このページでは、その仕組みと、文字より難しい理由を説明します。
OMR がすること
入力は、スキャン・写真・PDF のページなどの画像です。出力は、コンピューターが扱える形の音楽で、ふつうは MusicXML(MusicXML とは)か MIDI です。その間でプログラムは、五線を見つけ、記号を一つひとつ見分け、小節・声部・パートに組み立てなければなりません。
楽譜が文字より難しい理由
- 位置に意味がある。同じ符頭でも、どの線・間にあるかで音の高さが変わり、音部記号や調号が違えばまた変わります。
- 楽譜は 2 次元。文字は 1 行ずつ読めますが、楽譜には縦に重なる和音、1 つの五線に複数の声部、ピアノの楽譜なら同時に読む 2 段があります。
- 記号が重なる。符頭は五線の上に乗り、連桁はいくつもの音符をつなぎ、スラーはあらゆるものの上を横切ります。
- 小さな記号の影響が大きい。音符の後の付点は長さを 1.5 倍にし、小節の途中のシャープはその小節の終わりまで、同じ線・間にある後の音にも効きます。
- 合計が合わなければならない。弱起の小節などの例外を除き、各小節の音符は拍子ぴったりの長さになる必要があり、旗を 1 本見落とすだけで小節が崩れます。
読み取りの手順
- 画像を整える:明るさとコントラストを調整し、明るい紙に暗いインクの画像にします。
- 五線を見つける:5 本線の五線を見つけ、段(ピアノなら上下 2 段の組)にまとめます。写真では、ページの曲がりや傾きに合わせて五線をまっすぐに直します。
- 記号を見分ける:符頭・符幹・連桁・休符・音部記号・臨時記号・小節線などを見つけます。
- 音楽として解釈する:音の高さを位置・音部記号・調号・臨時記号から、長さを形・旗・連桁・付点から割り出し、小節と声部に分けます。
- 結果を書き出す:MusicXML などの形式で保存します。
人が書く規則から機械学習へ
OMR は 1960 年代から研究されています。長い間、プログラムは人が書いた規則で動いていました。五線を消し、残った黒い塊の大きさを測り、記号ごとのひな形と比べる、という方法です。きれいな印刷のスキャンには効きますが、写真には弱いものでした。
最近の方式はニューラルネットワークを使います。セグメンテーションのネットワークが、画像の 1 ピクセルずつを五線・符頭・符幹などに分類するので、明るさのむらや汚れに強くなります。続いて、文字を 1 行ずつ読むのと同じような系列モデルが 1 段をまとめて読み、記号を順に書き出します。記号どうしの関係を規則ではなく学習で身につけます。
このアプリの仕組み
このアプリは、カメラで撮った楽譜の写真を読むために作られたオープンソースの OMR プログラム homr を使っています。homr は上の 2 つの考え方を組み合わせています。セグメンテーションのモデルがページの五線と記号を見つけ、五線を 1 段ずつ切り出してまっすぐに直し、トランスフォーマーのモデル(エンコーダーとデコーダー)が段ごとにリズム・音の高さ・臨時記号を並びとして書き出します。homr はその並びから MusicXML を作ります。
homr は Python で書かれています。このアプリは、それを手を加えずにブラウザの中で動かしています。Python は Pyodide で WebAssembly の上で、ニューラルネットワークは onnxruntime-web で動きます。2 つのモデルは、数値を 32 ビットから 8 ビットの整数にして約 4 分の 1 の大きさにしましたが、テスト用の楽譜では結果は変わりませんでした。初回に約 130MB をダウンロードするのはこのためで、その代わり楽譜を PC の外に出す必要がありません。
homr は音符は読みますが文字は読まないので、テンポの指定は文字認識プログラムの Tesseract で別に読み取っています。
OMR がまだ苦手なこと
よくできた OMR でも、ぼけた写真や傾いた写真、音の多いピアノ曲、小さな臨時記号、3連符、五線から離れた音符では間違えます。手書きは苦手で、歌詞とコードネームはこのアプリでは読み取りません。だからこのアプリでは、結果を聴いて直せるようにしています。撮り方のコツと読み取りミスの直し方もご覧ください。