캡스톤디자인 학부 최우수상 수상

하모나이즈

  • Java
  • Spring
  • Android
  • React

사용자 목소리 기반 노래방 음악 추천시스템


하모나이즈는 사용자의 목소리를 분석하여, 부르기 좋은 노래를 추천해주는 음악 추천 서비스입니다.

이 프로젝트에서는 사용자가 목소리를 낼 수 있는 음역대와 장르 등 개인 선호에 기반해서, 노래방에서 부르기 좋은 노래를 추천해주는 서비스를 만드는 걸 목표로 하였습니다.

졸업 캡스톤 디자인 프로젝트로 발표 및 전시 하였으며, 학부 최우수상을 수상하였습니다.

기간 및 참여 인원

  • 기간: 2024-02 ~ 2024-11
  • 인원: 3인

역할

⚙️ Backend 개발 (기여도 60%, 2명 중 1명)

  • 음악 및 가수 관리 API 개발
  • 검색 및 기타 조회 기능
  • XLSX 파일을 통한 음악 벌크 업로드
  • 소켓 통신 문제 해결을 위해 Kafka 이용 분석 요청 전송
  • JUnit을 통한 테스트 작성 및 Github Actions 이용 테스트 자동화


📱 Android 개발 (기여도 100%)

  • 앱 전체 기능 개발 담당


🧠 추천시스템 (기여도 40%)

  • 잠재 요인 협업 필터링 구현 (선호 평점 예측에 따른 노래 추천 기능)
  • 콘텐츠 기반 필터링 구현 (유사한 음악 추천 기능)
  • 추천시스템 병렬 처리 구현


문제 해결 및 성능 개선

API 서버에서 음악 분석 모델로의 요청 전송 문제

문제 배경

초기에는 Spring 기반 API 서버가 Python 음악 분석 모델에 소켓 통신을 통해 요청을 전달하도록 구성했음. 그러나 서버 간 실행 순서나 타이밍 문제로 인해 요청이 간헐적으로 누락되거나 처리되지 않는 불안정한 상황이 발생함.

Kafka 도입 이유

이러한 통신 신뢰성 문제를 해결하기 위해 Kafka를 메시지 브로커로 도입함. Kafka는 큐 기반의 안정적인 메시지 전달 방식을 제공하며, 요청이 유실되지 않고 정확하게 전달되도록 보장할 수 있음.

결과

Kafka 도입 이후 큐 역할을 통해 요청 유실 문제가 해결되었음. 또한 서버 간 실행 순서에 영향을 받지 않고 비동기적으로 안정적인 요청 전송이 가능해짐.

추천시스템의 요청 병렬 처리 문제

문제 배경

초기 추천 시스템은 한 번에 하나의 요청만 처리할 수 있는 구조로 개발함. 이로 인해 여러 사용자가 동시에 추천 결과를 요청할 경우, 대기 시간이 발생하고 상태를 확인할 수 없는 문제가 있었음.

개선 방법

Python에서 ThreadPoolExecutor를 활용하여 Kafka로부터 수신한 각 메시지를 별도의 쓰레드에서 처리하도록 구조를 변경함. 이를 통해 요청을 병렬로 처리할 수 있도록 하여 시스템의 응답성과 처리량을 향상시킴.

결과

하나의 요청이 완료될 때까지 다른 요청이 대기하던 병목 현상이 제거되었고, 동시에 다수의 추천 요청을 원활히 처리할 수 있게 되었음.

테스트 자동화 및 테스트 환경 통합

문제 배경

프로젝트 진행 중 기능 구현에 중점을 두고, 테스트 코드에 대한 고려가 부족해 테스트 코드에 부족한 점이 많았음. 이로 인해 테스트 누락이나 예기치 못한 오류로 이어질 수 있었음.

개선 방법

리팩터링 과정에서 테스트 코드를 작성하여 기능별 검증을 자동화하고, Github Actions를 도입하여 커밋 시 테스트가 자동으로 실행되도록 CI 환경을 구성함. 더불어, 테스트 환경을 통합하고 ApplicationContext의 중복 생성을 방지하는 방식으로 테스트 속도와 효율성을 높임.

결과

코드 변경 시 즉시 기능 정상 여부를 검증할 수 있어 협업 시 안정성이 크게 향상됨.

ApplicationContext 생성 횟수 4회 -> 2회

음악 분석 중 음높이 예측 이상치 제거

문제 배경

음악 분석 시스템은 음원의 보컬을 추출한 후 시간대별 음높이를 예측하는 구조였음. 그러나 SPICE 모델을 통해 얻은 음높이 예측값이 지나치게 들쭉날쭉하여 신뢰도가 낮았고, 특히 배경음이 남아 이상치를 유발하는 문제가 있었음.

개선 방법

소리가 작은 구간을 제거하여 배경음을 줄이고, SPICE 외에도 CREPE, PESTO 등 다양한 모델의 결과를 시각화하여 비교함. 그 중 SPICE 모델을 선택한 뒤, 출력값의 신뢰도를 높이기 위해 8개의 인접 값을 평균내는 방식으로 대표값을 도출하는 방법을 고안함.

결과

이상치가 줄어들며 예측값의 안정성이 향상되었고, 그래프 시각화 결과에서도 변동성이 줄어든게 확인됨. 결과적으로 보다 신뢰할 수 있는 음높이 분석 결과를 얻을 수 있었음.




사용 기술

  • Application: Java Android
  • Frontend: React
  • Backend: Java Spring boot JPA Spring Security
  • DB: MariaDB
  • 메시지큐: Kafka
  • 분석 모델 및 추천시스템: Python Tensorflow


*음악 추천에는 고전적인 추천 방법인 잠재요인 협업필터링과 콘텐츠 기반 필터링 방식을 사용


구조

* 주요 담당 파트 : API 서버, 안드로이드 앱


결과물