악보 인식(OMR)은 어떻게 동작하나요
악보 사진을 음악 데이터로 바꾸는 기술을 광학 음악 인식(OMR, Optical Music Recognition)이라고 합니다. 글자를 읽는 OCR과 이름이 비슷하지만 훨씬 어려운 문제입니다. 악보 연주기가 악보를 읽는 방식과, 어디서 틀리기 쉬운지 설명합니다.
왜 글자 인식(OCR)으로는 안 되나요?
글자는 왼쪽에서 오른쪽으로 한 줄씩 읽고, 모양만 보면 무슨 글자인지 정해집니다. 악보는 다릅니다.
- 위치가 뜻입니다. 똑같은 검은 음표도 오선의 어느 높이에 있느냐에 따라 도, 레, 미가 됩니다.
- 앞의 기호가 뒤를 바꿉니다. 줄 맨 앞의 조표나 마디 안의 임시표가 뒤에 나오는 음의 높이를 바꿉니다.
- 겹쳐 있습니다. 음표가 오선 위에 겹쳐 있고, 화음은 세로로 쌓이고, 붙임줄과 이음줄이 여러 음표를 가로지릅니다.
그래서 Tesseract 같은 글자 인식기에 악보를 넣으면 제목이나 빠르기말 같은 글자만 읽고 음표는 읽지 못합니다. 악보에는 전용 인식기가 필요합니다.
악보 연주기가 읽는 순서
악보 연주기는 오픈소스 악보 인식기 homr를 브라우저 안에서 그대로 실행합니다.
- 다듬기: 종이 바깥 배경을 잘라 내고 폭을 일정하게 맞춘 뒤, 밝기 대비를 고르게 합니다.
- 그림 분석: 첫 번째 AI 모델이 그림의 픽셀마다 오선, 음표 머리, 기둥·쉼표, 음자리표·조표, 그 밖의 기호 중 무엇인지 나눕니다.
- 오선과 마디 찾기: 오선 조각을 이어 다섯 줄 오선을 찾고, 세로줄로 마디를 나눕니다. 굽은 오선은 반듯하게 펴고, 피아노처럼 묶인 두 줄 오선을 알아봅니다.
- 줄마다 읽기: 오선 한 줄씩 잘라 두 번째·세 번째 AI 모델(트랜스포머)에 넣습니다. 이 모델이 그림을 보고 "4분음표 솔, 8분음표 라…"처럼 기호를 차례로 적어 냅니다.
- 악보로 묶기: 읽은 기호를 마디와 성부로 정리해 MusicXML 악보로 만듭니다.
이 모든 과정이 이용자의 브라우저 안에서 일어납니다. 파이썬으로 된 homr를 브라우저용 파이썬 실행기(Pyodide)에서 돌리고, AI 모델은 ONNX Runtime Web으로 실행합니다. 처음에 약 130MB를 받는 것은 이 실행기와 모델 때문입니다.
자주 틀리는 곳
- 셋잇단음표: 작은 숫자 3을 놓치면 음표 길이가 틀어져 마디가 넘칩니다.
- 한 줄 안의 두 성부: 온음표 위아래에 다른 선율이 겹치면 두 성부를 한 줄로 이어 버리기도 합니다.
- 쉼표 길이: 8분쉼표와 4분쉼표처럼 모양이 비슷한 쉼표를 헷갈립니다.
- 붙임줄과 이음줄: 둘 다 곡선이라 구별이 어렵습니다. 악보 연주기는 같은 음을 바로 잇는 곡선을 붙임줄로 고쳐 줍니다.
- 진행 기호: D.S., 코다, 세뇨는 읽지 않고, 도돌이표 시작이나 1·2번 괄호를 놓치기도 합니다.
마디 안 음표 길이의 합이 박자표와 맞지 않는 마디를 노란색으로 표시하는 것은 위와 같은 오류를 찾기 쉽게 하기 위해서입니다. 다만 음 높이만 틀리고 길이는 맞는 오류는 표시되지 않으므로, 원본과 비교하며 들어 보는 것이 가장 확실합니다.
정확도는 어느 정도인가요?
컴퓨터로 만든 깨끗한 악보에서는 대부분의 마디를 맞게 읽습니다. 예를 들어 시험해 본 52마디짜리 가요 리드 시트 사진에서는 49~50마디가 박자까지 정확했고, 틀린 곳은 셋잇단음표와 두 성부가 겹친 마디였습니다. 사진 상태가 나쁘거나 음표가 빽빽한 곡일수록 정확도는 떨어집니다. 사진을 잘 찍는 요령은 악보를 잘 인식시키는 사진 찍는 법을 보세요.