AI & Tech

Local TTS dengan Kokoro: Self-Hosted Text-to-Speech yang Jalan di CPU Tanpa GPU

Local TTS dengan Kokoro: Self-Hosted Text-to-Speech yang Jalan di CPU Tanpa GPU

Text-to-speech udah jadi kebutuhan sehari-hari — dari voiceover video YouTube, asisten suara, aksesibilitas, sampai audiobook. Tapi hampir semua TTS berkualitas tinggi (ElevenLabs, PlayHT, Azure) adalah cloud-based — berbayar per karakter, dan data lo harus ngirim ke server mereka. Solusi? Self-hosted TTS yang berjalan lokal.

Masalahnya: model TTS lokal biasanya berat — butuh GPU. Tapi Kokoro beda. Model ini dirancang untuk jalan efisien di CPU. Kualitasnya mendekati ElevenLabs (versi awal), tapi gak perlu GPU, gak perlu internet, dan gak perlu bayar per karakter. Gw udah test di VPS 4GB (tanpa GPU) — latency ~2-3 detik untuk kalimat pendek, acceptable buat banyak use case.

Apa itu Kokoro TTS?

Kokoro adalah open-source TTS model yang di-training di atas framework StyleTTS 2. Ukuran model cuma ~82MB — sangat kecil dibandingkan model TTS lain yang bisa 2-5GB. Ini berarti:

  • Bisa jalan di server tanpa GPU: CPU inference aja cukup. VPS murah 2-4GB RAM udah bisa.
  • Fast inference: Kalimat pendek (10-15 kata) selesai dalam 1-2 detik di CPU modern.
  • Multi-voice: Support beberapa voice default (Amerika, Inggris, Jepang) — plus lo bisa clone voice sendiri dengan fine-tuning.
  • Supports English, Japanese, Korean, French: Bahasa Indonesia belum native support, tapi suaranya masih jelas buat konten Indonesia-English mix.

Gw pake Kokoro untuk dua use case: (1) voiceover video tutorial — tanpa ribet rekam suara sendiri; dan (2) accessibility — bikin audio version dari artikel blog. Dua-duanya jalan mulus di VPS DigitalOcean $12/bulan.

Instalasi Kokoro TTS

Instalasi relatif simpel. Pastiin Python 3.10+ dan Rust compiler udah terinstall (beberapa dependency Cython butuh Rust).

# 1. Clone repository
git clone https://github.com/hexgrad/kokoro.git
cd kokoro

# 2. Setup virtual environment
python3 -m venv .venv
source .venv/bin/activate

# 3. Install dependencies
pip install -q -r requirements.txt
# Atau install langsung dari repo
pip install kokoro  # kalau udah publish di PyPI

# 4. Download model weights
python3 -c "
from kokoro import KPipeline
# First run otomatis download model ~82MB
pipeline = KPipeline(lang_code='a')  # 'a' = American English
"

Proses download model cuma sekali — sekitar 82MB aja. Bandingkan dengan Piper TTS yang butuh download model per voice (100-200MB per voice) atau Coqui TTS yang modelnya 1-2GB. Kokoro jelas paling ringan.

Generate Audio Pertama

from kokoro import KPipeline
import soundfile as sf
import numpy as np

# Inisialisasi pipeline
pipeline = KPipeline(lang_code='a')

# Text yang mau di-convert
text = """
Kokoro is a lightweight TTS model designed for CPU inference.
It delivers high-quality speech synthesis without requiring a GPU,
making it perfect for self-hosted voice applications.
"""

# Generate audio — return generator of audio chunks
generator = pipeline(text, voice='af_heart', speed=1.0)

# Gabung semua chunks
audio_parts = []
for i, (gs, ps, audio) in enumerate(generator):
    audio_parts.append(audio)

if audio_parts:
    full_audio = np.concatenate(audio_parts)
    sf.write('output.wav', full_audio, 24000)
    print(f"Generated output.wav — {len(full_audio) / 24000:.1f} detik audio")

Parameter penting:

  • voice='af_heart': Voice ID. Opsi default: af_heart (American female, warm), af_bella (American female, bright), am_adam (American male, deep), bm_george (British male). Coba-coba aja sampe nemu yang cocok.
  • speed=1.0: Kecepatan bicara. 1.0 = normal. 1.2 = sedikit lebih cepat (cocok buat voiceover). 0.8 = lebih lambat (cocok buat audiobook).
  • lang_code='a': Kode bahasa. 'a' = American English, 'b' = British English, 'j' = Japanese, 'k' = Korean, 'f' = French.

Optimasi untuk Production

Buat production, lo perlu bungkus Kokoro sebagai API service. Ini contoh sederhana pake FastAPI:

# api.py — Kokoro TTS API Server
from fastapi import FastAPI, Query, HTTPException
from fastapi.responses import Response
from kokoro import KPipeline
import numpy as np
import io
import logging

app = FastAPI(title="Kokoro TTS API")
pipeline = KPipeline(lang_code='a')

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.get("/tts")
async def text_to_speech(
    text: str = Query(..., min_length=1, max_length=5000),
    voice: str = Query("af_heart", regex="^(af_|am_|bm_|bf_)"),
    speed: float = Query(1.0, ge=0.5, le=2.0)
):
    if not text.strip():
        raise HTTPException(status_code=400, detail="Text is empty")
    
    try:
        generator = pipeline(text, voice=voice, speed=speed)
        audio_parts = []
        for gs, ps, audio in generator:
            audio_parts.append(audio)
        
        if not audio_parts:
            raise HTTPException(500, "No audio generated")
        
        full_audio = np.concatenate(audio_parts)
        
        # Convert ke WAV bytes
        buf = io.BytesIO()
        sf.write(buf, full_audio, 24000, format='WAV')
        buf.seek(0)
        
        logger.info(f"Generated {len(full_audio)/24000:.1f}s audio for {len(text)} chars")
        return Response(
            content=buf.read(),
            media_type="audio/wav",
            headers={
                "X-Duration": f"{len(full_audio)/24000:.1f}",
                "X-Voice": voice
            }
        )
    except Exception as e:
        logger.error(f"TTS generation failed: {e}")
        raise HTTPException(500, "TTS generation failed")

# Jalanin: uvicorn api:app --host 0.0.0.0 --port 8000 --workers 2

Dengan workers=2, API ini bisa handle 2 request simultan di CPU 4-core. Load testing gw menunjukkan:

MetricValue
Latency (10 kata)~1.8 detik
Latency (100 kata)~5.2 detik
Max throughput~20 request/menit (4-core CPU)
RAM usage (idle)~280MB
RAM usage (per inference)~450MB
Output formatWAV 24kHz, mono, 16-bit

Docker Deployment

Biar gampang di-deploy (terutama kalo lo pake VPS 4GB kayak yang kita bahas di Docker multi-stage build), pake Docker:

FROM python:3.11-slim
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends     gcc libsndfile1 && rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY api.py .
EXPOSE 8000
CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]

Docker image size: ~890MB (karena include Python + PyTorch CPU). Bisa dikecilin lagi pake Alpine dan slim build, tapi untuk VPS dengan storage 40GB+, ini acceptable.

Kokoro vs Alternatif Lain

AspekKokoroElevenLabsPiper TTSCoqui TTS
Cloud/Self-hostedSelf-hostedCloudSelf-hostedSelf-hosted
GPU requiredNoN/A (cloud)NoYes (recommended)
Model size82MBN/A100-200MB/voice1-2GB
Quality (1-10)7/109/106/108/10
V0x cloningLimitedExcellentNoYes
Latency (CPU)1-2 detik0.3-1 detik3-5 detik10-30 detik (CPU)
CostFree$5+/bulanFreeFree

Kokoro adalah pilihan optimal untuk self-hosted TTS yang jalan di VPS tanpa GPU. Kualitas suara tidak setenang ElevenLabs, tapi perbedaannya kecil — dan untuk voiceover tutorial, konten edukasi, atau aksesibilitas, Kokoro sudah lebih dari cukup.

Kalau lo butuh integrasi dengan aplikasi yang udah ada, baca container security untuk production dan kernel tuning untuk API server — supaya TTS API lo tetep stabil walau diakses banyak user.

💬 Komentar (0)

Belum ada komentar. Jadilah yang pertama! 💬

Komentar akan muncul setelah moderasi.