openai-edge-tts
무엇인가
openai-edge-tts는 자체 호스팅 HTTP 서버로, OpenAI의 음성 합성 API 규격을 그대로 노출한다. 모델을 직접 실행하는 추론 엔진이 아니라 텍스트를 받아 외부 TTS 서비스로 넘기고 오디오를 돌려주는 중계 계층에 속한다. 클라이언트 입장에서는 base_url만 바꾸면 OpenAI TTS를 쓰던 코드가 그대로 동작한다.
어떻게 동작하나
요청은 POST /v1/audio/speech로 들어온다. 서버는 input, model, voice, response_format, speed, stream_format을 파싱한다. voice가 alloy·echo·fable·onyx·nova·shimmer 중 하나면 edge-tts 음성으로 매핑하고, 그 외에는 edge-tts 음성 이름을 그대로 받는다. 합성은 edge-tts 라이브러리가 Microsoft Edge의 온라인 TTS 서비스를 호출해 수행한다. 응답은 기본적으로 원시 오디오 바이트이며, stream_format을 sse로 지정하면 JSON 이벤트를 Server-Sent Events로 흘려보낸다. mp3 이외 포맷은 ffmpeg로 변환한다. 설정은 루트의 .env 파일에서 읽고 서버는 5050 포트에서 대기한다.
무엇과 다른가
대체 대상은 OpenAI, Azure, ElevenLabs의 유료 TTS API다. 이들은 API 키와 사용량 과금을 요구하지만 이 서버는 로컬에서 돌고 키가 필요 없다. 합성 자체를 Microsoft Edge의 무료 온라인 서비스에 위임하기 때문이다. 대신 음성 모델을 소유하지 않는다. OpenAI의 여섯 음성 이름은 edge-tts 음성으로의 별칭일 뿐이고 실제 음색은 edge-tts 쪽 음성 목록이 결정한다. /v1/models와 /v1/voices 엔드포인트로 사용 가능한 모델과 음성을 조회한다.
어떻게 쓰나
Docker Compose 기준으로 저장소를 클론한 뒤 .env를 만들고 docker compose up --build로 띄운다. 기본 설정으로 5050 포트에 서비스가 뜬다. mp3 외 포맷이 필요하면 빌드 인자 INSTALL_FFMPEG_ARG=true를 주거나 Docker Hub의 latest-ffmpeg 태그를 쓴다. Python으로 직접 돌리려면 가상환경을 만들고 requirements.txt를 설치한 뒤 서버를 실행한다. 호출은 curl로 /v1/audio/speech에 JSON을 보내 파일로 저장하거나 ffplay로 바로 재생하는 방식이다.
전제와 한계
입력 텍스트는 4096자까지다. speed는 0.25에서 4.0 사이이고 기본값은 1.0이다. response_format은 mp3, opus, aac, flac, wav, pcm을 지원하며 mp3 외에는 ffmpeg가 있어야 한다. voice 기본값은 en-US-AvaNeural이다. OpenAI 규격의 instructions 파라미터는 지원하지 않는다. 합성이 Microsoft의 온라인 서비스 호출이므로 네트워크 연결이 전제이며 Docker 또는 Python 실행 환경이 필요하다.