2P by GN⁺ | ★ favorite | 댓글 1개
  • Audio Decomposition은 음악을 악보로 옮기기 위해 오디오를 구성 음표와 악기로 나누려는 오픈소스 프로그램임
  • 악기 샘플은 University of Iowa Electronic Music Studios instrument database에서 가져오며, 각 파형의 푸리에 변환과 엔벨로프를 저장해 비교 기준으로 사용함
  • 음악 파일을 0.1초 단위로 분석해 스펙트로그램을 만들고, 저장된 악기별 푸리에 변환을 조합해 해당 구간의 악기별 크기를 추정함
  • 엔벨로프 분석은 attack·sustain·release 구간과 정적/동적 감쇠를 나눈 뒤, 필터링된 음표 대역에서 악기별 비용을 계산함
  • 결과는 오디오 재생성보다 matplotlib 산점도로 악보처럼 표시하는 방식을 택해 문제 해결과 희소 데이터 표시를 쉽게 만듦

악보 변환을 위한 오디오 분해

0.1초 단위 푸리에 변환

  • 악기 소리는 주로 푸리에 변환과 엔벨로프로 특징지을 수 있다고 보고, 두 정보를 이용해 어떤 악기가 어떤 음을 내는지 추정함
  • 음악 파일은 0.1초마다 푸리에 변환을 수행해 스펙트로그램 형태로 처리함
  • 각 0.1초 구간의 푸리에 변환을 재현하기 위해 저장된 악기별 푸리에 변환을 더함
  • 악기별 크기는 MSE 비용 함수의 주파수별 편미분에서 나온 행렬을 풀어 계산함
    • 행렬의 각 행은 cello, piano 등 각 악기에 대한 편미분에 해당함
    • 예시는 5Hz의 푸리에 변환 값 같은 주파수별 값에 대한 비용 계산임

엔벨로프와 음의 구간 분리

  • 엔벨로프는 파형의 상한선이며, 기존 함수들이 노이즈나 특정 파형에서 잘 동작하지 않는 경우가 있어 별도 방식을 사용함
  • 계산 과정은 파형을 청크로 나눈 뒤 각 청크의 최댓값을 취하는 방식임
  • 이후 엔벨로프가 원본 파형보다 낮은 지점을 찾아 새 점을 추가해 결과를 다듬음
  • 엔벨로프는 attack, sustain, release로 나눔
    • attack: 음의 초기 소리
    • sustain: 음이 유지되는 구간
    • release: 음이 멈추는 구간
  • 악기 샘플에서는 첫 번째 0이 아닌 값을 attack 시작점으로 사용함
  • attack과 sustain의 경계는 함수가 처음으로 아래로 오목하거나 감소하는 지점으로 정함
  • sustain과 release의 경계는 끝에서부터 보며 함수가 증가하거나 아래로 오목한 첫 지점으로 정함
  • release의 끝은 끝에서부터 보며 처음으로 0이 아닌 지점으로 찾음

감쇠 유형과 악기 매칭

  • 파형의 주요 형태를 구분하기 위해 정적 감쇠동적 감쇠를 고려함
  • piano 같은 일부 악기는 대체로 지수 감쇠 형태를 따르는 정적 감쇠를 가짐
  • violin 같은 일부 악기는 sustain 중에도 음량이 증가하거나 감소할 수 있음
  • 악기 샘플 중에는 소리가 자연히 사라질 때까지 유지된 파일도 있고, 일찍 release된 파일도 있음
  • 감쇠가 정적인지 동적인지는 감쇠 계수가 1보다 크거나 감쇠 곡선에서 너무 많이 벗어나는지로 구분함
  • 엔벨로프가 release를 갖는지, 즉 AS인지 ASR인지는 sustain과 release의 평균 변화율을 비교해 판단함
    • release의 변화율이 더 낮으면 release가 없는 것으로 봄
  • 음악 파일 처리에서는 각 음표 주파수에 대해 대역통과 필터를 적용함
  • 필터링된 파형에 대해 각 악기를 순회하며 정규화된 attack과 release의 상호상관을 계산해 음의 시작과 끝을 찾음
  • 이후 악기 파형과 필터링된 오디오의 MSE를 계산해 해당 시점의 악기 비용으로 사용함
  • 최종 크기는 푸리에 변환 단계의 크기와 엔벨로프 단계의 1 / 비용을 곱해 계산함

산점도 기반 결과 표시

  • 결과는 matplotlib의 scatter plot을 사용해 - 모양 점으로 악보처럼 나타냄
  • 원래는 계산된 크기에서 오디오를 재생성하려 했지만 문제가 많고 시간이 걸렸으며 디버깅도 어려웠음
  • matplotlib의 imshow도 시도했지만, 대부분의 값이 0인 상황에서는 매우 비효율적이었음
    • 화면을 이동하거나 확대·축소할 때 화면에 보이는지와 상관없이 모든 점을 다시 그려야 했기 때문임
  • 결과적으로 악보 재현을 더 잘 만드는 데 사용할 수 있으며, 특히 올바른 피치나 코드를 찾기 어려운 경우에 도움이 됨
  • 예시로 YouTube 영상을 바탕으로 Noteflight 악보를 재현하는 데 사용함
  • 실행 시간도 너무 오래 걸리지는 않는 수준임

댓글과 토론

Hacker News 의견들
  • 제목이 조금 헷갈림. open-source separation이라고 쓰면 소스 분리(source separation)처럼 읽히지만, 실제로는 그게 아니라 피치 검출 알고리즘이고, 검출한 피치가 어떤 악기에서 나온 것인지 분류하는 방식임
    꽤 멋지지만, 정말 정확한 결과가 필요하다면 출력물을 고치는 시간이 수작업으로 하는 것보다 더 걸릴 수도 있어 보임

    • 작성자에게 공정하게 보자면 아직 고등학생임: https://matthew-bird.com/about.html
      그 나이에 만든 결과물로는 놀라움
    • source separation은 보통 stem separation이라고 더 많이 부르는 건지, 아니면 다른 개념인지 궁금함
      음악가들이 단일 오디오 파일에서 믹싱 전 원래 트랙에 가까운 것, 즉 스템을 복원하려 할 때는 후자를 더 자주 듣는 것 같음
    • 하이픈이 있어서 그런 식의 모호함은 완전히 사라진다고 봄
  • 글에서 직접 언급된 건 못 봤지만, 관심 있는 사람에게는 자동 음악 전사, 즉 오디오를 MIDI로 바꾸는 분야가 딥러닝과 음악 정보 검색에서 꽤 큰 하위 분야임
    멀티트랙 음악 전사에서도 성공적인 모델이 여럿 있었고, Google의 MT3 프로젝트가 있음: https://research.google/pubs/mt3-multi-task-multitrack-music...
    피아노 전사의 경우에는 아주 저품질 오디오에서도 이제 거의 완벽에 가까운 정확도까지 왔음: https://github.com/EleutherAI/aria-amt
    참고로 위 저장소의 작성자임

    • 여기서는 또 다른, 역시 꽤 어려운 문제도 풀려고 하는 중임. MIDI 데이터에서 정확한 악보를 도출하는 문제는 “쉬워 보이지만 실제로는 아닌” 유형임
      오디오-MIDI 전사기는 피치와 시작 시각은 잘 맞히지만, 길이와 세기는 훨씬 덜 안정적임
    • MT3의 보고된 점수는 매우 좋다는 걸 알지만, 직접 써봤을 때도 성공적이었는지 궁금함: https://replicate.com/turian/multi-task-music-transcription
      더 쉽게 쓰려고 그들의 Colab을 런타임으로 포팅했는데, MIDI 출력이 꽤 이상했음
      단순한 스템을 넣어도 일부 트랙은 MIDI 출력과 오디오가 잘 맞지 않고 타이밍 문제가 있어서 못 쓸 수준이었고, 다른 오디오에서는 괜찮게 동작하기도 했음
    • 피아노로 제한하면 이 문제가 어떻게 단순해지는지 궁금함
  • 오디오 분리나 스템 분리에 관심이 있다면 RipX를 볼 만함: https://hitnmix.com/ripx-daw-pro/
    분리된 트랙을 MIDI 파일로 내보낼 수도 있음. 아직 문제가 좀 있지만 꽤 잘 동작함
    스템 분리는 이제 음악 소프트웨어에서 표준 기능이 되어가고 있고 거의 모든 DAW가 제공함

    • RipX는 스템 분리를 하고 믹스 안의 음 높이를 다시 조정할 수 있어서, 그게 목적이라면 훌륭함
      내가 하는 작업에는 moises가 쓰기 쉬웠음: https://moises.ai/
      곡 전체의 조옮김이나 시간 늘이기를 지원하고, 스템 분리와 트랙별 음소거·볼륨 조절을 위한 단순한 인터페이스가 있음. 박자와 코드를 자동 감지함
      관련자는 아니고, 곡을 배우고 연습하려고 거의 매일 쓰는 만족한 사용자임. 원래 베이스 파트를 키우고 나머지는 10% 미만 볼륨으로 낮춰 베이스를 또렷하게 듣는데, 온라인 악보가 유료 포함 얼마나 자주 틀리는지 잘 드러남. 파트를 익힌 뒤에는 베이스를 음소거하고 원곡에 맞춰 베이시스트처럼 연주함
    • Stemroller[0]도 한동안 있었고, 무료이며 Meta 모델 기반임
      0: https://www.stemroller.com/
    • “거의 모든 DAW가 제공한다”기보다는, 거의 모든 DAW가 가져야 할 떠오르는 기능이지만 아직 대부분은 없음
      Ableton Live - 없음
      Bitwig - 없음
      Cubase - 없음
      FL - 있음
      Logic - 있음
      Pro Tools - 없음
      Reason - 없음
      Reaper - 없음
      Studio One - 있음
    • Polymath와 관련 있어 보임: https://github.com/samim23/polymath
      Polymath는 MP3에서 개별 악기 트랙을 분리하고 추출하는 데 효과적이고, 아주 잘 동작함
  • 정말 멋지지만, 단순한 푸리에 변환 템플릿으로는 잡히지 않을 실제 악기 물리가 있음. 예를 들어 트럼펫은 같은 피치라도 약하게 불 때와 세게 불 때의 배음 스펙트럼이 크게 달라질 수 있음
    트럼펫은 강한 배음을 가진 풍부한 배음렬을 만들기 때문에 푸리에 변환에서 기본 주파수의 정수배에 두드러진 피크가 나타남. 플루트 같은 악기는 더 순수한 톤을 내지만, 금관악기는 보통 더 높은 배음이 강해서 글에 나온 행렬 방정식의 편미분도 더 복잡해질 것임
    이 스크립트는 대역통과 필터링과 어택·릴리스 엔벨로프의 상호상관으로 음의 타이밍을 식별함. 금관악기는 연주 세기에 따라 배음 구성이 크게 바뀌는 비선형 동작을 보일 수 있으므로, pp와 ff에서 밝기가 달라지는 경우를 이 알고리즘이 어떻게 처리할지 잘 모르겠음. 정확도를 높이려면 악기별로 세기 의존 푸리에 템플릿을 추가하는 걸 고려하겠음

    • 믹싱 목적으로 일주일에 두 번 소스 분리를 쓰는 입장에서, “보컬” 같은 음색을 낼 수 있는 악기는 매우 많음
      악기가 전형적인 소리를 내지 않거나, 악기 간 분리가 최대화되도록 연주·믹싱되지 않은 밴드에서는 이런 모델들이 모두 잘 동작하지 않음. 예를 들어 왜곡된 배음의 전기 기타가 보컬과 같은 음을 치고, 드러머는 심벌에서 날카로운 소음만 내며, 베이시스트는 악기로 킥드럼 같은 타격음을 흉내 내는 경우가 있음
      이런 실험 음악에서는 소스 분리 결과가 완전히 예측 불가능해지고, 음악적 리밸런싱에 쓸 만할 수도 있고 아닐 수도 있음
  • Joshua Bird의 동생이 만든 작업처럼 보임. Joshua Bird도 예전에 HN에 올라온 인상적인 프로젝트들을 했음: https://www.youtube.com/@joshuabird333

    • 맞음, Matt는 Josh의 동생임. 그걸 알아챘다니 놀랍고 아주 반가움
  • 15년쯤 전 Audiosurf를 하던 기억이 떠올랐음. 시간 빠름
    https://en.wikipedia.org/wiki/Audiosurf

  • 내가 잘못 본 건지 모르겠지만, YouTube 데모 중 어느 것도 소스 분리를 보여주고 있지 않은 것 같음
    덧붙이면, 오디오 연구에서 소스 분리는 오디오를 별도 클립들로 분리하는 걸 뜻함

    • 여기서는 분해가 더 맞는 단어 같음. 이 경우의 source separation은 분해된 음들을 서로 다른 출처로 나눌 수 있다는 뜻으로 쓰인 것 같지만, 오해를 부르는 표현임
    • 여기서 “source”는 “open source”의 source에 붙는 말로 보임
  • Ultrastar Deluxe의 오래된 팬임. Singstar의 오픈소스 클론이고, 사람들이 곡을 따라 부르며 경쟁하는 노래방 게임
    부르는 음을 인식해서 해당 곡의 보컬 타이밍 매핑 파일과 비교하고, 선율에 더 잘 맞춰 부를수록 점수가 높아짐. 가사를 정확히 맞히는지는 중요하지 않음
    팬이 만든 곡 매핑 라이브러리가 많긴 하지만 늘 부족하고, 영어·스페인어 외 언어의 매핑 곡은 매우 적음. 전부 수작업으로 매핑하는 건 시간이 많이 들고, 나 자신도 거의 음치라 더 어려움
    오래전부터 이 과정을 더 쉽게 자동화할 수 있는 소프트웨어가 무엇일지 궁금했는데, 이 도구는 원곡에서 보컬 타이밍과 음을 잡아내는 데 아주 좋아 보임
    언젠가 내 모국어로 Singstar 재생목록을 만들고 친구들과 노래 파티를 여는 것이 버킷리스트임. 비슷한 도구 추천이 있으면 궁금함

    • 좋음. 이런 게 있는 줄 몰랐음
      텍스트 파일에는 타임스탬프와 함께 보컬·피치가 필요해 보이고, AI가 그 생성을 자동화할 수 있는 수준에 가까워지고 있음
      더 읽어보려고 방금 찾은 링크를 남김: https://www.reddit.com/r/karaoke/comments/x61kzy/modern_equi...
  • 내가 보기엔 일부 영상에는 오디오가 없는 것 같음

    • YouTube 링크에 이유가 적혀 있음. “저작권 때문에 오디오 없음”이라고 되어 있고, 함께 재생할 수 있는 오디오 링크도 있음