Sheet Music Player

光学楽譜認識(OMR)とは? 楽譜を読み取る仕組み

光学楽譜認識(OMR、Optical Music Recognition)は、文字の OCR の楽譜版です。プログラムが楽譜の画像を見て、どんな音符が書かれているかを割り出し、コンピューターで再生・編集・移調できるようにします。このページでは、その仕組みと、文字より難しい理由を説明します。

OMR がすること

印刷された楽譜のページ。ピアノ用の「歓喜の歌」、2 段の大譜表が 3 段
入力:印刷された楽譜のページ(このサイトで使っている見本)。

入力は、スキャン・写真・PDF のページなどの画像です。出力は、コンピューターが扱える形の音楽で、ふつうは MusicXML(MusicXML とは)か MIDI です。その間でプログラムは、五線を見つけ、記号を一つひとつ見分け、小節・声部・パートに組み立てなければなりません。

楽譜が文字より難しい理由

読み取りの手順

  1. 画像を整える:明るさとコントラストを調整し、明るい紙に暗いインクの画像にします。
  2. 五線を見つける:5 本線の五線を見つけ、段(ピアノなら上下 2 段の組)にまとめます。写真では、ページの曲がりや傾きに合わせて五線をまっすぐに直します。
  3. 記号を見分ける:符頭・符幹・連桁・休符・音部記号・臨時記号・小節線などを見つけます。
  4. 音楽として解釈する:音の高さを位置・音部記号・調号・臨時記号から、長さを形・旗・連桁・付点から割り出し、小節と声部に分けます。
  5. 結果を書き出す: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連符、五線から離れた音符では間違えます。手書きは苦手で、歌詞とコードネームはこのアプリでは読み取りません。だからこのアプリでは、結果を聴いて直せるようにしています。撮り方のコツと読み取りミスの直し方もご覧ください。