음원으로부터 악보 만들기에 도전

추진계기

내가 AI 스터디를 하고 있는 것을 아는 한 지인이, 자신이 연습한 피아노곡의 악보를 그려줄 수도 있는 지 물어왔다. 피아노를 쳐가며 휴대폰으로 녹음한 곡을 그때그때 악보로 만들어주면 편하겠다는 것이다. 핸드폰으로 녹음한 원곡 음원은 m4a형식이었는데, 간단한 요청처럼 보였다. 나는 지피터스에서 스터디하는 동안은 뭐든 경험하는 게 좋겠다고 생각하고 있었고, 실패해도 부담이 전혀 없는 도전이라고 생각하던 차였기에 흔쾌히 부탁을 수락했다.

챗GPT에게 음원파일을 주면 악보를 pdf로 작성해주는 앱을 만드는게 가능한 지 물어보니, 당연히 가능하다고 자신있다고 하며 어떻게 하면 좋은지 구체적인 절차까지 자세히 제시해주었다.

이건 피아노를 쳐가며 곡을 만들고 있는 건데, 악보를 만들어서 계속 개선시켜나아갈 원곡 음원이야. 이걸 악보로 만들어줘. 원곡음원과 다르지 않게 충실하게 만들어야 하고, 4/4 박자에 C장조 곡이야. 결과물은 pdf파일로 만들어주면 돼

초기 계획: "외부 도구를 활용한 완전 자동화"

초기 계획은 명확하고 깔끔했다:

음원(m4a) → WAV → MIDI → MusicXML → PDF(MuseScore)

나는 음악에 대해서는 suno 밖에 아는 바가 없어서, Agent가 알려주는 대로 따라해 보기로 했다.

음원 변환 계획 수립

Agent가 만들어준 오디오-악보 변환 파이프라인은 다음과 같은 함수들로 구성되었다

a) 오디오 전처리 (Audio Preprocessing)

  • convert_m4a_to_wav(): 아이폰 등에서 주로 사용되는 M4A 형식의 파일을 WAV(44.1kHz) 로 변환. 분석에 적합한 표준 규격으로 음질을 맞추는 단계다.

b) 오디오 채보 (Audio Transcription)

  • transcribe_audio_to_midi(): Spotify에서 개발한 Basic-Pitch 모델을 활용하여, 피아노 연주 소리를 분석하고 음의 높낮이와 길이를 담은 MIDI 데이터로 추출하는 단계다.

c) 음악 데이터 가공 (Music Processing)

  • process_midi_to_musicxml(): 추출된 MIDI 데이터를 악보 형식에 맞게 정리한다.

    • MIDI 로드: 데이터를 프로그램으로 불러와서

    • 박자 설정: 노래의 박자를 고정하고

    • 조 옮김: 연주된 키에 상관없이 연주하기 쉬운 다장조(C Major) 로 변환(선택 사항)한다.

    • 조표 추가: 적절한 키 시그니처를 삽입하고 MusicXML 형식으로 내보낸다.

d) PDF 악보 생성 (PDF Generation)

  • musicxml_to_pdf(): 생성된 MusicXML 파일을 MuseScore 엔진을 통해 사람이 읽을 수 있는 깔끔한 PDF 악보로 최종 렌더링한다.

e) 메인 오케스트레이션 (Main Orchestration)

  • convert_piano_audio_to_sheet_music(): 위 모든 과정을 하나로 묶어 실행하는 메인 함수.

    • 디렉토리 구조 생성: 결과물이 저장될 폴더를 구성한다.

    • 한글 경로 처리: 파일 이름에 포함된 한글 캐릭터가 깨지지 않도록 인코딩한다.

    • 진행 피드백: 현재 어떤 단계가 진행 중인지 사용자에게 실시간으로 알려준다

예상되는 문제 및 해결방안

Agent는 오디오-악보 변환 파이프라인 상에서 예상되는 문제와 해결방안도 함께 제시해줬다.

1. 채보(Transcription) 정확도 문제

  • 문제점: AI(Basic-Pitch)가 복잡한 화음이나 페달링이 섞인 연주를 100% 완벽하게 인식하지 못할 수 있음.

  • 해결책:

    • 중간단계 파일 보존: 변환 과정에서 생성된 MIDI와 MusicXML 파일을 모두 유지하여 데이터 손실을 방지한다.

    • 수동보정 지원: 최종 PDF 생성 전, 사용자가 MuseScore에서 MusicXML을 직접 열어 수정할 수 있게 한다.

    • 모델 교체 고려: 정확도가 낮을 경우 Google의 'Magenta Onsets and Frames' 같은 대안 모델 도입을 검토한다.

2. FFmpeg 경로 설정 오류

  • 문제점: 시스템 환경 변수에 FFmpeg가 등록되어 있지 않으면 Python의 pydub 라이브러리가 오디오 변환을 수행하지 못할꺼라고 한다.

  • 해결책:

    • pydub 설정 코드 내에서 AudioSegment.converter와 ffprobe 경로를 직접 지정하여 환경변수 의존성을 제거한다.

3. MuseScore 연동 이슈

  • 문제점: 악보 렌더링 라이브러리인 music21이 설치된 MuseScore 실행파일을 자동으로 찾지 못하는 경우가 있다.

  • 해결책:

    • music21.environment.UserSettings()를 사용하여 MuseScore의 실행경로(mscore.exe 등)를 수동으로 설정해준다.

4. 양손 악보 분리 (Hand Separation)

  • 문제점: MIDI 파일은 기본적으로 한 트랙에 모든 음이 섞여 있어, 높은음자리표와 낮은음자리표가 적절히 나누어지지 않을 수 있다.

  • 해결책:

    • 가온 도(Middle C) 기준 분할: 특정 음고(Pitch)를 기준으로 높은 음은 윗단(Treble), 낮은 음은 아랫단(Bass)으로 배정하는 로직으로 구현한다.

    • 보이스 분석: music21의 makeVoices 기능을 활용해 리듬에 따른 성부를 분리한다 하지만 잘 짜여진 계획처럼 보였지만, 현실은 다르게 진행되었다.

구현과정에서의 애로

예상치 못한 의존성 충돌

Python 패키지 설치부터 장벽에 가로막혔다

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-with-dependency-conflicts

Basic-Pitch는 TensorFlow에 의존하고 있었고, TensorFlow는 Python 3.13을 아직 완벽히 지원하지 않기 때문이었다. 가상환경을 만들고 Python을 다운그레이드한 후, Spotify Basic-Pitch 웹사이트에서 직접 MIDI를 생성하고, 나머지는 Python으로 처리하는 것으로 개발계획을 수정했다.

MIDI의 변환

다행히 Basic-Pitch 웹사이트 (https://basicpitch.spotify.com/)에서 m4a 파일을 업로드하면 자동으로 MIDI를 생성해줬다. API는 제공하지 않았기 때문에 자동화까지는 어려웠지만, 원곡의 특징을 담아낸 MIDI 파일을 생성하는 데까지는 문제가 없었다 이제 남은 건 MIDI 파일로부터 악보 PDF롤 변환하면 될 꺼라고 생각했는데, 이것도 쉬운 일이 아니었다.

MusicXML 문제

Python의 music21 라이브러리를 사용해 MIDI를 처리했다:

  • 4/4 박자 강제 설정:

  • C장조 조옮김:

  • MusicXML 생성: 생성된 musicxml 파일을 MuseScore에서 열려고 했는데, 생각대로 되지 않았다.

결과는 PDF 파일이 생성되지 않는 실패였다. 에러 메시지도 없었다. MuseScore가 도와주지 않아 조용히 실패하는 듯했다. 이제 MuseScore 유료로 전환하고 시도해 보던가, 아니면 수동으로 변환해야 했다. 이 시점에서 당초 자동화 계획은 모두 다 무너져버린 것 같았다.

구현 전략 변경

프로젝트가 거의 실패 직전까지 갔다고 생각했는데 , 한 가지 아이디어가 떠올랐다. "Python 라이브러리 만으로 PDF를 생성할 수 있지 않을까?" 이미 설치되어 있던 라이브러리들을 다시 살펴봤다. 그리고 다르게 접근해보기로 했다.

  1. music21: MIDI 처리, 로드

  2. 음악 정보 추출 (박자, 조, 음표)

  3. reportlab: 직접 PDF 생성

  4. PIL: 이미지 처리 이렇게, 간단하지만 PDF를 생성하는 새로운 스크립트가 작성할 수 있었다.

마침내, 성공 !?

python midi_to_pdf_simple.py

터미널에 메시지가 흘러내렸다:

📢 MIDI → PDF 변환 중...
  1단계: MIDI 로드 중...
    ✓ 289개 음표 감지됨
  2단계: 4/4 박자 설정 중...
    ✓ 박자 설정 완료
  3단계: C장조 설정 중...
    감지된 조: C major
  4단계: 악기 설정 중...
    ✓ 피아노 악기 설정 완료
  5단계: MusicXML 생성 중...
    ✓ MusicXML 생성
  6단계: PDF 생성 중...
    ✓ PDF 생성 완료

그리고 마지막 줄:

✅ PDF 생성 완료!
PDF 위치: ...\output\첫 자작곡.pdf
악보가 적힌 악보

성공 !!! 프로그램 리팩토링과 배포만 남겨둔 채, pdf 로 만들어진 악보를 기쁜 마음으로 지인에게 보내주었다. 그런데 . . . 의뢰인 왈,

악보가 깨끗하게 잘 만들어졌네요.
그런데 악보가 제가 처음 부탁했던 곡과 많이 달라요. AI가 만든거 맞나요?

망치로 한 대 맞은 것 같았다. 세션리밋까지 당해가며 애써서 만들었건만, 최종 결과물의 품질이 사용자 요구수준을 충족시키지 못한 것이다 !!! 그 후로 두 번이나 다시 시도해 봤지만, 악보의 품질은 복구되지 않았다. 결국 프로젝트는 이렇게 실패하고 말았다.

교훈

음원 변환에 필요한 도구 (정리)

프로젝트는 실패로 끝났지만, 음원을 다루어야 할 프로젝트는 또 생길 것이다. 이번 경험이 도움이 되도록, 어떤 도구와 라이브러리들이 필요했고 왜 필요했는지, 유의할 점은 무엇인지 정리해본다.

도구

목적

설치 방식

역할

결과

배운 점

Python 3.13

프로그래밍 환경

시스템 설치

전체 스크립트 작성 기반

✅ 성공

최신 버전도 모든 라이브러리를 지원하지 않음

Spotify Basic-Pitch (웹)

음성 → MIDI 인식

웹사이트 (https://basicpitch.spotify.com/)

M4A 파일을 정확한 MIDI로 변환

✅ 완벽

파이썬 패키지로는 설치 불가 → 웹사이트 사용

Basic-Pitch (Python)

MIDI 자동화

pip 설치 시도

로컬에서 음성 인식 자동화

❌ 실패

Python 3.13 + TensorFlow 호환성 문제

music21

MIDI 처리

pip install music21

박자, 조, 음표 설정 및 MusicXML 변환

✅ 성공

안정적이고 신뢰할 수 있는 라이브러리

MuseScore 4

PDF 렌더링

윈도우 설치 파일

MusicXML → PDF 변환 (CLI 방식)

❌ 실패

커맨드라인이 신뢰할 수 없음 (오류 없이 실패)

reportlab

PDF 생성

pip install reportlab

Python에서 직접 PDF 파일 생성

✅ 성공

외부 도구 대신 순수 Python으로 해결 가능

pydub

오디오 처리

pip install pydub

M4A ↔ WAV 변환 (미사용)

⏸️ 준비만

웹사이트 MIDI 사용으로 불필요

librosa

음성 분석

pip install librosa

음성 신호 분석 (미사용)

⏸️ 준비만

웹사이트 MIDI 사용으로 불필요

numpy

수치 계산

pip install numpy

음악 데이터 처리

✅ 설치됨

필수 의존성

PIL (Pillow)

이미지 처리

pip install pillow

PDF 내 이미지 처리

✅ 설치됨

이미지 통합에 유용

배운점

다시 깨달은 점도 있다. 완벽한 계획도 현실에서는 붕괴될 수 있다. 이 프로젝트는 다음을 가르쳐주었다:

  • 복잡한 외부 의존성은 가능하면 최소화시켜야 한다.

  • 구현된 자동화 자산들(대부분 Python 라이브러리들)을 AI로부터 독립시켜야 토큰 수렁으로부터 자유로울 수 있다.

  • 계획이 실패했을 때 다시 일어설 수 있는 유연성이, 완벽한 계획보다 중요하다.

계획이 완벽해도 현실은 그렇지 않다. 하지만 각 실패에서 배우고, 고정관념을 버리고, 새로운 각도에서 보면 항상 길이 있다.

1

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요