Slyric
수면 유도 음원을 생성해 재생하는 알람 앱
배경
사용자가 설정한 수면 구간에 맞춰 동작하는 알람 앱. Flutter iOS/Android 앱과 백엔드까지 혼자 만들어 출시
맡은 핵심은 해당 구간의 수면 사이클과 단계 시퀀스를 산출해 비가청 대역 유도 주파수를 만들고 가청 음원과 합성하는 로직
수면 음원 한 곡은 기본 7시간 분량으로, 기존 Python 합성 로직으로는 한 곡당 50분이 소요됨. 재생까지의 대기 시간 단축이 선결 과제
해결/진행 과정
- 병목 프로파일링 결과 시간을 잡아먹는 것은 음성 합성 연산이 아니라 ffmpeg 서브프로세스 실행과 S3 입출력
- 문제는 CPU가 아니라 I/O로 판명
- 생성 파이프라인을 동시성에 강한 Go(Fiber)로 이관하고 생성 요청은 잡 큐로 받아 비동기 처리
- ffmpeg 프로세스 풀로 동시 실행 수 제한
- 무제한으로 띄우면 7시간 분량에서 자원 경합으로 오히려 지연
- 가용 메모리에 따라 배치 크기를 동적으로 조절(세그먼트 10~100개, 배치당 200MB 이내)해 긴 음원에서도 메모리 압박 없이 처리
- 주파수와 길이를 키로 세그먼트를 캐싱해 반복 구간의 재계산 제거
- 잡 큐요청은 즉시 반환, 생성은 뒤에서
- 세그먼트 생성캐시 히트 시 생략
- 배치 묶기메모리에 맞춰 10~100개
- ffmpeg 인코딩프로세스 풀로 동시 실행 제한 — 병목이던 구간
- S3 업로드서명 URL 반환
결과
- 수면 음원 한 곡(기본 7시간) 생성 시간 50분 → 약 4.5분, 11배 단축
기존 Python50분
Go 이관 후약 4.5분