문제해결 | 샤잠(shazam) 노래인식을 구현한 abracadabra 사용하기
깃허브 : https://github.com/notexactlyawe/abracadabra/
shazam의 해시기반 노래인식기술을 공부하다가
abracadabra가 그러한 sound recognition을 구현해놓았다는 것을 알게되었습니다.
shazam은 대략적인 노래 인식 기술에 대한 논문을 공개했는데, 직접 구현해보기에는 무리가 있습니다.
정보를 찾다가 너무 좋은 설명을 발견했습니다 : https://www.cameronmacleod.com/blog/how-does-shazam-work#why-is-the-fingerprint-based-on-spectrogram-peaks
이렇게 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에 뭐 넣어보고 따로 확인해봄)
이제 우리팀 상황에서 알맞게 전체적으로 뜯어고칠 것이고,
이것은 다른 팀원이 시도할 것이고, 잘 작동하는 우리만의 모듈로 커스텀할 예정입니다.
끝!