미분류글

문제해결 | 샤잠(shazam) 노래인식을 구현한 abracadabra 사용하기

히어로맛쿠키 2023. 4. 26. 22:01

깃허브 : https://github.com/notexactlyawe/abracadabra/

GitHub - notexactlyawe/abracadabra: Sound Recognition

Sound Recognition. Contribute to notexactlyawe/abracadabra development by creating an account on GitHub.

github.com

 
shazam의 해시기반 노래인식기술을 공부하다가
abracadabra가 그러한 sound recognition을 구현해놓았다는 것을 알게되었습니다.
 
shazam은 대략적인 노래 인식 기술에 대한 논문을 공개했는데, 직접 구현해보기에는 무리가 있습니다.
정보를 찾다가 너무 좋은 설명을 발견했습니다 : https://www.cameronmacleod.com/blog/how-does-shazam-work#why-is-the-fingerprint-based-on-spectrogram-peaks

abracadabra: How does Shazam work? - Cameron MacLeod

abracadabra: How does Shazam work? Sat 19 February 2022 Tutorials Your phone's ability to identify any song it listens to is pure technological magic. In this article, I'll show you how one of the most popular apps, Shazam, does it. The founders of Shazam

www.cameronmacleod.com

 
이렇게 abracadabra이 샤잠 기술을 구현해놓은 것을 찾았습니다.
 


깃헙에 들어가면 사용법이 나와있습니다.
 
>> 그렇지만 필요한 정보를 추가해서 한번 더 작성해둡니다.
1. clone한다.
2. ffmpeg를 설치한다.
3. setup.py가 있는 경로에서 pip install . 한다.
4. pip install simple-settings도 해준다.
5. song_recogniser --help 명령이 먹히는지 해본다.
 
결론적으로 시스템에 song_recogniser라는 명령어를 등록하게 되고, 이 명령어 기반으로 여러 기능을 수행할 수 있게 됩니다.
그런데 song_recogniser initialiser 명령 수행시 db connection 문제가 있었습니다. 애초에 setup.py가 있는 경로에서 pip install . 을 수행했을 때 hash.db가 생성되어야 하는데, 이 db파일이 생성되지 않았던 것입니다. 그래서 song_recogniser initialiser를 진행할 수 없었습니다.
 
디버깅을 통해 결국 모듈 경로 문제임을 알아냈습니다.
혹시 abracadabra의 샤잠 노래인식 구현 코드를 돌려볼 사람이 있을 지도 모르니 여기에 기록해둡니다.
 


1. 문제 발생

abracadabra의 song_recogniser를 테스트해보려고 했는데, song_recogniser initialise에서 실패했습니다.
아래와 같은 문제를 만났습니다.

  • song_recogniser initialise를 수행하면 connection 관련 오류가 뜬다. pip install . 후에 존재해야 할 hash.db파일이 안 만들어졌기 때문이다.
  • 임시로 hash.db를 만들고 직접 py를 수행해봐도, 어차피 settings.py를 못 찾는다.

 
 
모든 원인은

2. 모듈을 찾는 위치가 잘못되었기 때문입니다

- 올바른 상황:
이렇게 불러오려는 모듈들이 원하는 경로(abracadabra 하위)에서 잘 찾아와져야 합니다.
 

(잘 모르겠는 것: 원인은 module not found인데, module not found가 뜨지 않고 넘어간 이유)
 
 
- 잘못되었던 이전 상황:
원하는 경로(abracadabra)에서 원하는 py 모듈을 불러와야 하는데 그러지 못합니다.
 
기본적으로 파이썬 모듈은 sys.path에 등록된 곳에서 불러옵니다. 제 상황에서 기본적으로 sys.path에 등록된 경로는 lib/python3/dist-packages/ 입니다. 하지만 유감스럽게도 제 settings.py라는 모듈은 그 경로가 아닙니다.
그래서 불러오지 못했던 것입니다. No module named 'settings’
 
* sys.path
sys.path 는 파이썬에서 모듈을 검색하는 경로를 저장하는 리스트입니다. 파이썬이 모듈을 검색하는 경로를 설정하기 위해 사용됩니다.
그러나 sys.path는 일시적인 것으로, 프로그램이 종료되면 초기화됩니다. 그러므로 사용해야 할 모듈이 있다면 sys.path.append()를 통해 원하는 경로를 등록해줍시다.
 
 
 
?? 모듈경로 문제라며 그럼 connection 에러는 왜 뜬건데?
py 코드로 작성된 모든 설정을 install하고
‘song_recogniser’ 커맨드가 등록된 후에
‘song_recogniser initialiser’ 명령으로 initialiser() 메서드를 invoke하려고 하는 시점에서
db connection 관련 에러가 뜬 이유가 궁금한가요?
 
애초에 잘못된 곳에서 모듈을 찾았으니 hash.db가 만들어질 리가 없기 때문입니다.
db가 없으니 connection도 이루어질 수 없었습니다.
(잘 모르겠는 것: 원인은 module not found인데, module not found가 뜨지 않고 넘어간 이유)
 
 

해결 방법:

모듈을 찾기 위해 원하는 경로를 sys.path에 append해주면 됩니다.

sys.path.append('/home/os_202000828/Desktop/abracadabra/abracadabra')

그럼 모듈을 원하는 위치에서 찾을 수 있게 되었습니다!
이전에는 코드를 아무리 고치고 노력해봐도 settings.py를 올바르게 가져올 수 없었습니다.
내가 바라는 그 모듈의 경로가 sys.path에 등록되어있지 않았기 때문입니다.
 
프로그램상에 sys.path.append('/home/os_202000828/Desktop/abracadabra/abracadabra')와 같이, 사용할 모듈 경로를 append하는 코드를 추가합시다. 이제는 ‘import module_name’ 으로 원하는 모듈을 잘 불러올 수 있습니다.
 
import settings
import storage
import recognise
등..
 
삽입 예시

 

 

3. 이제 다시 install 합니다.

코드를 수정한 뒤, setup.py가 있는 경로에서 다시 pip install . 를 합니다.
잘못된 import문이 있는지 다 체크한 뒤 pip install . 해야합니다.

즉 import settings 하면 될 것을 import abracadra.settings라고 되어있는 부분을 다시 경우에 맞게 수정해주어야 한다는 말입니다.
[참고 : 아래 코드를 디버깅하면 꼼꼼히 찾아낼 수 있음. 3번 줄에 중단점 찍고 한줄씩 디버깅해보세요]

 
코드 잘 고치고, pip install . 한 후에
song_recogniser initialise 명령을 다시 시도해보면 Initialised DB를 성공할 것입니다!
 
(성공한 모습)

 
 (db에 뭐 넣어보고 따로 확인해봄)


이제 우리팀 상황에서 알맞게 전체적으로 뜯어고칠 것이고,
이것은 다른 팀원이 시도할 것이고, 잘 작동하는 우리만의 모듈로 커스텀할 예정입니다.
 
끝!
 
 
 
 

반응형