Kokoro로 로컬 CPU에서 고품질 TTS 실행하기
(ariya.io)- 로컬 음성 생성은 이제 전용 GPU 없이도 충분히 현실적인 품질을 낼 수 있으며, 예시 환경에서는 GPU를 LLM 추론에 남기고 TTS를 CPU가 처리함
- Kokoro는 82M 파라미터 모델이지만 영어, 중국어, 힌디어 등 여러 언어를 지원하고 약 50개 음성을 제공하며 영어에 가장 최적화되어 있음
- 가장 쉬운 구성은 Kokoro-FastAPI 컨테이너를 실행하는 방식이고, 음성 모델이 미리 포함되어 이미지 크기가 약 5GB임
- OpenAI speech API와 호환되는 인터페이스를 제공해 기존 음성 API 기반 프로그램을 로컬 TTS로 비교적 쉽게 바꿔 쓸 수 있음
- 짧은 문단 합성은 Intel Core i7-4770K 4.7초, Apple M2 Pro 4.5초, AMD Ryzen 7 8745HS 1.5초 수준이라 로컬 LLM 응답을 읽지 않고 듣는 사용 방식이 가능함
CPU만으로 실행하는 Kokoro TTS
- 몇 년 전만 해도 현실적인 로컬 음성 생성은 어려웠지만, 지금은 개인정보를 외부 서비스에 맡기지 않고 높은 품질의 음성을 만들 수 있음
- 예시는 이전에 다룬 로컬 LLM용 GTX 1080 Ti 머신에서 실행됨
- 해당 머신의 전용 GPU는 LLM 추론에 예약됨
- 음성 합성은 CPU만 사용함
- 사용 모델은 Kokoro
- 82M 파라미터 모델임
- 영어, 중국어, 힌디어 등 여러 언어의 현실적인 음성을 생성함
- 약 50개 음성을 제공하며, 주로 영어에 최적화되어 있음
- 가장 간단한 서버 설정은 Kokoro-FastAPI 컨테이너 이미지를 쓰는 방식임
- 미리 다운로드된 음성 모델이 포함되어 있음
- 이 때문에 컨테이너 이미지 크기는 약 5GB임
- Docker 또는 Podman 실행 명령:
podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu - 실행 후 웹 UI는
localhost:8880/web에서 열 수 있으며, 텍스트를 넣어 오디오를 생성하고 자동 재생할 수 있음
OpenAI 호환 API와 예제 실행
- Kokoro-FastAPI 컨테이너는 웹 UI 외에도 OpenAI speech API 호환 TTS 인터페이스를 제공함
- 기존 OpenAI speech API 사용 프로그램을 쉽게 맞춰 쓸 수 있음
- JavaScript와 Python 예제 코드는 github.com/remotebrowser/speak에 있음
- JavaScript 실행 예:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.js "Good morning! How are you today?" - Python 실행 예:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.py "Good morning! How are you today?" - 생성된 오디오는 MP3 파일로 저장됨
- SoX 또는 Sound eXchange가 설치되어 있으면 오디오가 자동 재생됨
- SoX 정보는 sox.sf.net에서 확인할 수 있음
- 다른 음성을 고르려면
TTS_VOICE환경 변수를 설정함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?" - 사용 가능한 전체 음성 목록은 Kokoro VOICES.md에 있음
CPU별 합성 시간과 대안
am_eric음성으로 짧은 테스트 문단을 합성한 결과, 3회 실행 중 최선 기록 기준 생성 시간은 다음과 같음- Intel Core i7-4770K: 4.7초
- Apple M2 Pro: 4.5초
- AMD Ryzen 7 8745HS: 1.5초
- 목록의 첫 CPU는 12년 전에 출시된 모델이며, 오래된 CPU에서도 작업을 처리할 수 있음
- OpenAI 호환 컨테이너형 TTS 대안으로 Speaches도 있음
- Kokoro-FastAPI와 달리 컨테이너 이미지에 음성 가중치가 포함되지 않으며, API로 명시적으로 다운로드해야 함
- Whisper를 포함해 고품질 STT 기능도 제공함
- 애플리케이션에 TTS와 STT가 모두 필요하면 한 곳에서 처리하는 선택지가 될 수 있음
- 로컬 LLM과 결합하면 LLM 답변을 읽는 대신 음성으로 듣는 사용 방식이 가능함
댓글과 토론
Hacker News 의견들
-
접근성 제품에 Kokoro를 꽤 많이 써봤는데, 비슷한 품질의 여러 TTS가 요구하는 NVidia GPU가 없어도 돼서 작업하기 좋았음
특히 IPA 발음 가이드를 수동으로 넣을 수 있는 점이 마음에 듦. 중요한 단어가 동형이의어라 Kokoro가 잘못 발음하는 경우가 있었기 때문임
다만 한두 단어만 말하게 하면 약해짐. 예를 들어 "six"만 말하게 하면 거의 항상 "ah-six-ah"처럼 말함. 대신 "The word is: six"처럼 긴 문장을 넣으면 제대로 읽고, Kokoro API가 문장 내 각 단어의 타임스탬프를 주기 때문에 Python 스크립트로 원하는 단어만 잘라낼 수 있음. 억양은 조금 평평하지만 매우 안정적임
Discord에서 물어보니 작은 매개변수 규모의 한계라고 들었고, Kokoro를 옹호하자면 eleven-labs 음성도 가끔 이런 문제가 생김- 다른 여러 도구에서도 같은 요령을 씀. Wispr나 Google에 "Knight"라고 말하면 "night"로 나오지만, "Knight to f3"라고 말한 뒤 "to f3"만 지우면 됨
- 실제로 TTS 모델의 흔한 약점임
내 사용처는 거의 전부 단일 단어라서, 입력과 출력을 이어 붙이거나 분할하는 처리를 굳이 다루고 싶지 않아 맞지 않음
-
이건 실제로 관심 있는 주제라 재미있음
예전에는 whisperx를 따로 유지했는데, 단순 전사뿐 아니라 자막 같은 용도에 필요한 타이밍과 화자 식별도 중요하다고 보기 때문임. 다만 pyannote에 의존하고, 라이선스가 애매해서 설치 자동화도 더 까다로움
그래서 더 나은 전사를 제공하면서 화자 분리까지 지원하는 것을 찾다가, 전사는 parakeet, 화자 분리는 softformer로 정했음. 하지만 사용 가능한 엔진 대부분은 softformer를 포함하지 않음
softformer를 지원하는 parakeet-rs용 OpenAI 호환 서버를 만들었고(https://github.com/altunenes/parakeet-rs), 여러 편의 기능을 처리하는 데스크톱 전사 앱 OpenWhispr와 함께 쓰는 중임
GPU는 다른 일에 쓰고 있어서 아직 GPU 경로를 추가하지 않았고, 지금은 CPU만으로 전사하지만 원할 때 로컬에서 전사를 돌릴 수 있다는 점이 매우 강력하게 느껴짐- 이건 텍스트 음성 변환이고, 그쪽은 음성 텍스트 변환임
하려는 작업에는 parakeet과 함께 Senko를 쓰면 화자 분리가 아주 잘 됨. 내 MacBook에서는 Pyannote와 whisper보다 더 빠르고 정확했음 - 단순한 whisper.cpp로도 비슷하게 가능함
- 이건 텍스트 음성 변환이고, 그쪽은 음성 텍스트 변환임
-
이 모델이 정말 좋음. GPU가 부족해서 로컬 모델을 거의 못 만져본 게 아쉬웠는데, 한 달쯤 전 GTX1650에 Kokoro를 설치해 글 읽기용 TTS를 만들었음
간단한 WebUI에서 URL이나 복사한 텍스트 덩어리를 붙여 넣으면 Python이 정리해서 Kokoro에 보내 TTS를 만들고, 그 결과를 Apple Podcasts용 RSS로 제공함. 아침 운전할 때 모아둔 글이나 블로그 글을 따라잡는 데 씀
언젠가는 여러 음성을 나눠 써서, 모아둔 뉴스 항목을 라디오 아침 방송처럼 들려주는 NotebookLM 같은 것도 만들어보고 싶음- Open Notebook을 확인해보면 좋음: https://github.com/lfnovo/open-notebook
-
몇 달 전에 어떤 웹페이지에서든 이걸 해주는 Chrome 확장을 만들었고, 읽는 문장을 동시에 하이라이트함
컨테이너를 띄우는 단계와 웹사이트 내용을 복사해 붙여 넣는 단계를 모두 건너뛸 수 있어서, Kokoro를 더 편하게 쓰려는 사람에게 유용할 수 있음
https://chromewebstore.google.com/detail/local-reader-ai-on-... -
TTS는 정말 많이 발전했고 선택지도 많음. Kokoro도 있고, Pocket TTS는 100M짜리 작은 모델이면서 음성 복제도 가능함
Chatterbox Turbo는 조금 더 크지만 음성의 감정 제어를 더 잘 지원하고, Fish Audio S2는 더 크지만 톤과 감정을 사실상 제한 없이 훨씬 세밀하게 제어할 수 있음. 이 모든 것이 MacBook에서 쉽게 돌아감 -
TTS 모델 비교를 시작하기 좋은 저장소는 https://github.com/5uck1ess/tts-bench임
Kokoro는 1.5년 전에 공개된 모델이라는 점을 고려하면 정말 좋은 모델이고, 크기에 비해 성능이 뛰어남: https://5uck1ess.github.io/tts-bench/scores.html -
예전에 로컬 TTS로 Piper를 써봤는데, Kokoro도 흥미로워 보임
-
매우 멋짐. Linux를 쓰고 있어서 Aqua나 Whipsrflow 등을 못 써서, 1월부터 직접 만든 해법을 쓰고 있음
최근에 정리해서 설치하기 쉽게 만들었음. 관심 있으면 여기서 볼 수 있음: https://github.com/Hugo0/voiceio
시간이 지나며 스스로 개선되고, 로컬 머신에서 돌아가며, 전반적으로 쓸 만한 소프트웨어임. 요즘 내 PC 상호작용의 60%는 순수 음성 입력임- 이건 텍스트 음성 변환이고, 그건 음성 텍스트 변환임. 그래도 STT는 흥미로워 보임
-
Kokoro를 정말 좋아함. 오디오북이 없는 전자책을 읽게 하는 데 쓰고 있고, 그 용도로 꽤 잘 작동함
epub/html을 읽고 모델을 실행한 뒤 mp3를 쓰는 Python 스크립트를 만들어뒀음
Kokoro가 지원하는 언어 수는 제한적이라 네덜란드어 지원에는 다른 모델을 써야 했는데, 품질이 그만큼 좋지 않음. 보통 훨씬 느리고 더 크기도 해서 8GB VRAM에는 너무 큼
결국 Windows 내장 TTS까지 써봤는데 자연스럽게 들리지는 않지만, 적어도 대부분의 단어를 발음할 수 있고 매우 빠름 -
하루 동안 AI를 만지작거리며 Kokoro에서 비싼 계층을 빼봤고, 휴대폰 CPU와 MNN에서 3배 빠르게 돌아감
품질은 매우 비슷함. 환경에 따라 달라질 수 있지만 스크립트는 여기 있음: https://github.com/DavidVentura/translator-rs/blob/master/sc...