Dockerized FastAPI 래퍼로 구현된 Kokoro-82M 음성 합성 모델
요약
Kokoro-82M TTS 모델을 Docker와 FastAPI로 래핑하여 OpenAI API와 호환되는 형태로 제공하는 프로젝트입니다. 이 솔루션은 다국어 지원, 사용자 지정 음성팩 생성, 그리고 SSML 및 타임스탬프 자막 기능 등을 포함합니다. 이를 통해 개발자들이 쉽게 고품질의 TTS 기능을 통합할 수 있도록 설계되었습니다.
핵심 포인트
- OpenAI API와 호환되는 Speech 엔드포인트 제공
- 다국어(영어, 스페인어 등) 및 사용자 지정 음성팩 지원
- SSML을 통한 고급 제어 및 다중 화자 생성 가능
- Docker 기반으로 배포가 용이하며 CPU/NVIDIA 환경 모두 지원

<a href="https://trendshift.io/repositories/13745?utm_source=repository-badge&utm_medium=badge&utm_campaign=badge-repository-13745"><img src="https://trendshift.io/api/badge/repositories/13745" alt="remsky%2FKokoro-FastAPI | Trendshift" width="164" height="36"/></a>
Kokoro-82M 텍스트-음성 변환(text-to-speech) 모델을 위한 Dockerized FastAPI 래퍼입니다. 몇 분 만에 수 시간 분량의 고품질 음성을 생성할 수 있습니다.
- OpenAI와 호환되는 Speech 엔드포인트, 다국어 지원
- 영어 (US/GB), 스페인어, 프랑스어, 힌디어, 이탈리아어, 일본어, 브라질 포르투갈어, 만다린 중국어
- Inno Clone-Tuner를 통한 사용자 지정 음성팩(Custom voicepacks)
- 선택적 통합 WebUI; 읽어주기 기능이 있는 장문 생성 지원
- 인라인 다중 화자 생성 및 음성 믹싱 + 리에이싱 가중치 조합, SSML 지원
- 단어별 또는 청크별 타임스탬프 자막 생성
- 포네메 엔드포인트: 텍스트에서 포네메를 생성하거나, 포네메에서 오디오를 생성할 수 있습니다.
- 사전 구축된 다중 플랫폼 이미지
- CPU 및 NVIDIA GPU (CUDA): linux/amd64 + linux/arm64
- AMD GPU (ROCm, 실험적): linux/amd64만 지원
- Apple Silicon (MPS) 지원: UV를 통해 직접 실행할 경우 (이미지 사용 안 함)
통합 및 가이드
- Home Assistant
- 앱 스토어 및 템플릿
- 리더 및 오디오북
- 어시스턴트 및 에이전트
- 브라우저
시작하기
<details> <summary>가장 빠른 시작 (docker run)</summary>모델이 내장된 사전 구축된 멀티 아키텍처 이미지.
:latest 태그를 사용할 수 있지만, 안정적인 사용을 위해서는 릴리스 태그로 고정하는 것이 좋습니다.
<sub><ins>GPU 없음</ins> (노트북, CPU 전용 서버)</sub>
docker run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu:latest
<sub><ins>NVIDIA</ins> (GTX 900 시리즈부터 RTX 40까지; cu126 포함)
docker run --gpus all -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-gpu:latest
<sub><ins>NVIDIA RTX 50-series / Blackwell</ins> (cu128 지원):</h3>
docker run --gpus all -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-gpu:latest-cu128
<sub><ins>NVIDIA arm64</ins> (Jetson, GH200; 동일 태그, cu129 지원):</h3>
docker run --gpus all -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-gpu:latest
<sub><ins>AMD GPU</ins> (ROCm, 실험적, x86_64 전용):</h3>
docker run --device=/dev/kfd --device=/dev/dri -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-rocm:latest
<sub><ins>Apple Silicon</ins> (네이티브 MPS 클론; CPU 이미지도 사용 가능):</h3>
./start-gpu_mac.sh
gpu:latest는 gpu:latest-cu126과 동일한 이미지입니다. 환경 변수를 통한 설정은 설정 가이드를 참조하세요.</details>
- 필수 사항을 설치하고 Docker Compose를 사용하여 서비스 시작하기 (UI 포함 전체 설정):
- Docker 설치
- 레포지토리 클론:
git clone https://github.com/remsky/Kokoro-FastAPI.git
cd Kokoro-FastAPI
...
[설정 가이드](docs/configuration.md)에는 이미지 vs 빌드, 볼륨 마운트, 환경 변수에 대한 내용이 포함되어 있습니다.
</details>
<details>
<summary>직접 실행 (uv를 통해)</summary>
1. 필수 전제 조건 설치:
- [astral-uv](https://docs.astral.sh/uv/) 설치
- 알 수 없는 단어/소리에 대한 폴백(fallback)으로 사용하려면 시스템에 [espeak-ng](https://github.com/espeak-ng/espeak-ng)을 설치합니다. 상위 라이브러리에서 이를 처리하려고 시도할 수 있지만, 결과는 다양했습니다.
- 저장소 클론:
```bash
git clone https://github.com/remsky/Kokoro-FastAPI.git
cd Kokoro-FastAPI
```
아직 수행하지 않았다면 [모델 다운로드 스크립트](https://github.com/remsky/Kokoro-FastAPI/blob/master/docker/scripts/download_model.py)를 실행합니다.
UV를 통해 직접 시작 (핫 리로딩 기능 포함)
Linux 및 macOS
```bash
./start-cpu.sh OR
./start-gpu.sh
```
Windows
```powershell
.\\\start-cpu.ps1 OR
.\\start-gpu.ps1
```
</details>
<details open>
<summary> 실행 및 확인? </summary>
OpenAI와 호환되는 음성 엔드포인트로 로컬에서 실행하기
```python
from openai import OpenAI
client = OpenAI(
...
-
API는 http://localhost:8880 에서 사용 가능합니다.
-
API 문서: http://localhost:8880/docs
-
웹 인터페이스: http://localhost:8880/web
기능 (Features)
핵심 (Core)
<details> <summary>OpenAI와 호환되는 음성 엔드포인트</summary># OpenAI의 Python 라이브러리 사용
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8880/v1", api_key="not-needed")
...
또는 Requests를 통해:
import requests
response = requests.get("http://localhost:8880/v1/audio/voices")
...
빠른 테스트 (다른 터미널에서 실행):
python examples/assorted_checks/test_openai/test_openai_tts.py # OpenAI 호환성 테스트
python examples/assorted_checks/test_voices/test_all_voices.py # 사용 가능한 모든 목소리 테스트
# OpenAI 호환 스트리밍
from openai import OpenAI
client = OpenAI(
...
또는 requests를 통해:
import requests
response = requests.post(
...
주요 스트리밍 지표 (Key Streaming Metrics):
- 청크 크기별 첫 토큰 지연 시간 (First token latency @ chunksize)
- ~300ms (GPU) @ 400
- ~3500ms (CPU) @ 200 (구형 i7)
- ~<1s (CPU) @ 200 (M3 Pro)
- 실시간 재생을 위한 조정 가능한 청크 설정
참고: 억양(intonation)의 아티팩트는 청크 크기가 작아질수록 증가할 수 있습니다.
</details> <details> <summary>다중 출력 오디오 형식 (Multiple Output Audio Formats)</summary>- mp3
- wav
- opus
- flac
- aac
- pcm
목소리 (Voices)
<details> <summary>목소리 조합 (Voice Combination)</summary>- 비율을 사용한 가중치 목소리 조합 (예:
음성 결합 및 오디오 생성:
import requests
response = requests.get("http://localhost:8880/v1/audio/voices")
voices = [v["id"] for v in response.json()["voices"]]
...
가중치 혼합(Weighted mixes)은 빠르게 길어질 수 있습니다. voice_aliases는 요청당 짧은 이름을 매핑하며, voice 필드와 [voice:...] 태그 모두에 사용됩니다:
- 별칭은 대소문자를 구분하지 않고 일치하는 것을 선호합니다 (일관성 유지를 위해 소문자로 유지하세요).
- 존재하지 않는 음성을 가리키는 별칭은 400 에러를 반환합니다.
- 웹 UI의 cast 내보내기(exports)도 동일한 형식으로 제공됩니다. 예:
{"voice_aliases": {...}}; API 호출에 상호 교환 가능합니다.
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8880/v1", api_key="not-needed")
...
또는
curl -X POST http://localhost:8880/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{...}
POST /dev/tune은 한 영어 화자의 3초에서 30초 길이의 클립을 받아, inno-kokoro를 통해 해당 음성으로 조정된 목소리를 생성합니다. 복제기(Cloner)가 아닌 튜너(Tuner)입니다: 일치보다는 비슷한 영역대를 기대하세요. 사용 권한이 있는 음성만 튜닝하세요.
curl -s http://localhost:8880/dev/tune -F [email protected] -F 'request={
- `request`는 `voice`를 제외한 `/v1/audio/speech` 본문입니다. 패키지는 `save_voice`가 이를 `VOICES_DIR`에 유지하지 않는 한 응답 길이 동안만 존재합니다.
- 이름은 기존 언어 접두사 패턴(`am_`, `bf_`, `ax_` 등)을 따르며, 저장된 음성에는 `_tuned` 접미사가 붙습니다. 번들링된 튜닝된 음성은 `_inno`로 끝납니다.
- 노브(Knobs): `prosody_head` (기본값 활성화), `fmax` 피치 천장(Hz) (기본값 자동)
- 기본적으로 비활성화:
- `ENABLE_INNO_TUNER=true`: 웹 플레이어 탭에서 활성화됩니다.
- `ALLOW_LOCAL_VOICE_SAVING=true`: 라이브 서버에 저장하는 것을 허용합니다.
- 전체 참조는 [docs/inno-tune.md](docs/inno-tune.md)를 참고하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Codex tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기