피드로 돌아가기
From Piper to Polly: How I Built a Production-Ready Text-to-Speech API (and Everything That Broke Along the Way)
Dev.toDev.to
Backend

분산 락과 텍스트 Chunking 기반의 고효율 TTS API 설계

From Piper to Polly: How I Built a Production-Ready Text-to-Speech API (and Everything That Broke Along the Way)

elizabeththomas72026년 5월 14일13intermediate

Context

Piper, ElevenLabs 등 다양한 TTS 엔진을 거치며 발생한 캐릭터 제한 및 비용 문제 분석. 특히 대용량 텍스트 처리 시 발생하는 요청 실패와 Thundering Herd 현상으로 인한 시스템 불안정성을 해결해야 하는 상황.

Technical Solution

  • 문장 경계 기반의 Text Chunker를 설계하여 제공자별 Max Character Limit(예: Polly 3,000자) 준수 및 음성 단절 방지
  • Target/Max Threshold 이중 임계값 전략을 통한 최적의 청크 크기 제어 및 FFmpeg Concat Demuxer를 이용한 MP3 병합 구조 채택
  • Amazon Polly 도입을 통한 비용 최적화 및 500만 자 무료 티어 활용으로 운영 경제성 확보
  • Redis SET NX 기반의 Distributed Lock을 적용하여 동일 텍스트에 대한 중복 합성 요청을 차단하고 Thundering Herd 방지
  • Voice ID, Engine, Region을 포함한 복합 캐시 키 설계를 통해 TTS 결과물의 결정론적 특성을 활용한 Aggressive Caching 구현

- TTS 도입 전 서비스 제공자의 최대 글자 수 제한을 확인하고 문장 단위 분리 로직을 선제적으로 설계할 것 - 동일 입력에 대해 결과가 동일한 결정론적 API는 요청 파라미터 전체를 키로 하는 캐시 전략을 검토할 것 - 콜드 캐시 상황에서 발생하는 트래픽 폭증을 막기 위해 분산 락의 TTL 설정 및 finally 블록 내 락 해제를 필수적으로 적용할 것

원문 읽기