전체 프로젝트

Slyric

수면 유도 음원을 생성해 재생하는 알람 앱

외주NeuroMoment2024.09 – 2024.124개월

배경

사용자가 설정한 수면 구간에 맞춰 동작하는 알람 앱. Flutter iOS/Android 앱과 백엔드까지 혼자 만들어 출시

맡은 핵심은 해당 구간의 수면 사이클과 단계 시퀀스를 산출해 비가청 대역 유도 주파수를 만들고 가청 음원과 합성하는 로직

수면 음원 한 곡은 기본 7시간 분량으로, 기존 Python 합성 로직으로는 한 곡당 50분이 소요됨. 재생까지의 대기 시간 단축이 선결 과제

해결/진행 과정

  1. 병목 프로파일링 결과 시간을 잡아먹는 것은 음성 합성 연산이 아니라 ffmpeg 서브프로세스 실행과 S3 입출력
    • 문제는 CPU가 아니라 I/O로 판명
  2. 생성 파이프라인을 동시성에 강한 Go(Fiber)로 이관하고 생성 요청은 잡 큐로 받아 비동기 처리
  3. ffmpeg 프로세스 풀로 동시 실행 수 제한
    • 무제한으로 띄우면 7시간 분량에서 자원 경합으로 오히려 지연
  4. 가용 메모리에 따라 배치 크기를 동적으로 조절(세그먼트 10~100개, 배치당 200MB 이내)해 긴 음원에서도 메모리 압박 없이 처리
  5. 주파수와 길이를 키로 세그먼트를 캐싱해 반복 구간의 재계산 제거
수면 음원 한 곡이 만들어지는 경로
  1. 잡 큐요청은 즉시 반환, 생성은 뒤에서
  2. 세그먼트 생성캐시 히트 시 생략
  3. 배치 묶기메모리에 맞춰 10~100개
  4. ffmpeg 인코딩프로세스 풀로 동시 실행 제한 — 병목이던 구간
  5. S3 업로드서명 URL 반환

결과

  • 수면 음원 한 곡(기본 7시간) 생성 시간 50분 → 약 4.5분, 11배 단축
수면 음원 한 곡(기본 7시간)을 만드는 데 걸리는 시간
기존 Python50분
Go 이관 후약 4.5분

사용 기술

FlutterPythonFastAPIGoFiberffmpegRedisAWS S3