몇 년 전만 해도 로컬에서 현실적인 음성 합성은 상상하기 어려웠습니다. Ariya Hidayat은 그 판단이 이미 뒤집혔다고 말합니다. 그가 지난 글에서 다룬 GTX 1080 Ti 머신에서, GPU는 LLM 추론에 통째로 내주고 음성 합성은 CPU에만 맡긴 채로 돌렸는데요. 결과물 품질은 로컬이라는 제약이 무색할 만큼 좋았고, 무엇보다 클라우드로 텍스트를 한 글자도 보내지 않았습니다.
그 일을 해낸 모델이 Kokoro입니다. 파라미터가 겨우 82M(8,200만)인데 영어·중국어(만다린)·힌디어 등 여러 언어의 음성을 현실적으로 뽑아냅니다. 음성은 약 50종이고, 영어에 주로 최적화돼 있어요. 요즘 LLM 파라미터가 억 단위를 우습게 넘기는 걸 생각하면, 이 크기로 사람 목소리에 가까운 음성이 나온다는 게 이 모델의 전부입니다.
컨테이너 한 줄로 서버가 뜬다
세팅 방법은 여럿이지만 가장 단순한 건 Kokoro-FastAPI 컨테이너입니다. 음성 모델을 이미 안에 담아둔 탓에 이미지가 5GB로 큰 편인데요. 대신 받자마자 바로 돕니다.
podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu
Docker든 Podman이든 이 한 줄이면 됩니다. 제대로 떴는지 보려면 localhost:8880/web에 들어가면 되는데요. 텍스트를 넣고 음성을 생성해 바로 재생까지 해주는 간단한 웹 UI가 있습니다.
출처: Ariya Hidayat — Local, CPU-Friendly, High-Quality TTS with Kokoro
OpenAI 호환 API라 base URL만 바꾸면 된다
웹 UI 말고, 이 컨테이너는 OpenAI 음성 API와 호환되는 TTS 인터페이스를 /v1에 함께 띄웁니다. 기존에 OpenAI 음성 API를 쓰던 프로그램이라면 손댈 게 거의 없다는 뜻이에요. Ariya Hidayat이 github.com/remotebrowser/speak에 JavaScript·Python 예제를 올려뒀는데요. 저장소를 클론하면 아래 데모를 그대로 따라 할 수 있습니다.
환경변수로 API 주소와 음성을 지정하고 문장을 넘기면 끝입니다.
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1
export TTS_VOICE="am_eric"
./speak.js "Good morning! How are you today?"
생성된 음성은 MP3로 저장됩니다. 머신에 SoX(sox.sf.net)가 깔려 있으면 자동으로 재생까지 해줘요. 쓸 수 있는 음성 전체 목록은 Kokoro 공식 페이지에 있습니다.
12년 된 CPU가 문단 하나를 4.7초에 읽는다
속도가 실용적이냐가 관건이겠죠. 원문에서는 am_eric 음성으로 짧은 문단 하나를 읽혀 CPU별 생성 시간을 쟀습니다(3회 중 최고 기록).
Jupiter is the largest and most massive planet in our solar system. This gas giant, made mostly of hydrogen and helium, is known for its Great Red Spot—a massive storm observed for centuries.
- Intel Core i7-4770K: 4.7초
- Apple M2 Pro: 4.5초
- AMD Ryzen 7 8745HS: 1.5초
목록 맨 위 CPU는 12년 전에 나온 물건인데요. 원문의 표현을 그대로 옮기면 이렇습니다.
“그 낡은 CPU가 멀쩡히 해낸다면, 이게 얼마나 유능한 TTS인지 짐작이 갈 것이다.” (“If that ancient CPU can do the job just fine, you know that this is a highly capable TTS system.”)
TTS와 STT를 한 번에 원한다면 Speaches
OpenAI 호환 컨테이너 대안으로는 Speaches(speaches.ai)가 있습니다. Kokoro-FastAPI와 달리 음성 가중치가 이미지에 안 들어 있어 API로 직접 받아야 하는 번거로움이 있는데요. 대신 OpenAI의 Whisper STT를 함께 담고 있습니다. 음성 합성(TTS)과 음성 인식(STT)을 둘 다 써야 하는 애플리케이션이라면 하나로 해결돼요.
여기에 로컬 LLM을 엮으면 그림이 완성됩니다. 원문의 마지막 문장 그대로, “LLM 답변을 읽는 대신 들으며 즐길 수 있다”(you can enjoy listening to LLM answers instead of reading them). GPU는 모델 추론에, CPU는 음성에 — 클라우드 청구서도, 유출 걱정도 없이.
Loading comments...