개요
Kyutai의 Pocket TTS는 단 1억 개의 파라미터만을 갖춘 컴팩트한 텍스트 음성 변환 라이브러리로, CPU 추론을 위해 특별히 설계되었습니다. 다국어, 음성 복제, 오디오 스트리밍 및 저지연 생성을 지원합니다. Python API와 명령줄 인터페이스를 제공하여 사용하기 쉽습니다.
README 미리보기
# Pocket TTS\n\n\n\nA lightweight text-to-speech (TTS) application designed to run efficiently on CPUs.\nForget about the hassle of using GPUs and web APIs serving TTS models. With Kyutai's Pocket TTS, generating audio is just a pip install and a function call away.\n\nSupports Python 3.10, 3.11, 3.12, 3.13 and 3.14. Requires PyTorch 2.5+. Does not require the gpu version of PyTorch.\n\n[🔊 Demo](https://kyutai.org/pocket-tts) | \n[🐱💻GitHub Repository](https://github.com/kyutai-labs/pocket-tts) | \n[🤗 Hugging Face Model Card](https://huggingface.co/kyutai/pocket-tts) | \n[⚙️ Tech report](https://kyutai.org/blog/2026-01-13-pocket-tts) |\n[📄 Paper](https://arxiv.org/abs/2509.06926) | \n[📚 Documentation](https://kyutai-labs.github.io/pocket-tts/)\n\n\n## Main takeaways\n* Runs on CPU\n* Small model size, 100M parameters\n* Audio streaming\n* Low latency, ~200ms to get the first audio chunk\n* Faster than real-time, ~6x real-time on a CPU of MacBook Air M4\n* Uses only 2 CPU cores\n* Python API and CLI\n* Voice cloning\n* Multi-language support: english, french, german, portuguese, italian, spanish\n* Can handle infinitely long text inputs\n* [Can run on client-side in the browser](#in-browser-implementations)\n\nAdditional languages may be added in the future.\n\n## Trying it from the website, without installing anything\n\nNavigate to the [Kyutai website](https://kyutai.org/pocket-tts) to try it out directly in your browser. You can input text, select different voices, and generate speech without any installation.\n\n## Trying it with the CLI\n\n### The `generate` command\nYou can use pocket-tts directly from the command line. We recommend using\n`uv` as it installs any dependencies on the fly in an isolated environment (uv installation instructions [here](https://docs.astral.sh/uv/getting-started/installation/#standalone-installer)).\nYou can also use `pip install pocket-tts` to install it manually.\n\nThis will generate a wav file `./tts_output.wav` saying the
FAQ (5)
문제 해결소규모 데이터셋으로 PocketTTS finetuning 시 발생하는 오류 "no readable samples ... (0 failures)"를 어떻게 해결하나요?
매니페스트 경로는 대체로 문제가 없습니다. 길이 버킷팅 로더는 각 로더 샤드에 최소 num_bucket_batches × batch_size개의 샘플이 채워질 때까지 배치를 내보내지 않습니다. 이전 기본값에서는 GPU당 20 × 64 × 6 = 7,680개의 발화가 필요했습니다. 이보다 작은 샤드는 오해를 불러일으키는 0 failures 오류를 발생시켰습니다.
기본값을 num_bucket_batches: 5와 loader_procs: 3으로 낮추고 시작 시 학습/검증 매니페스트를 검증하는 PR #342가 포함된 버전으로 업그레이드하세요.
매우 작은 파인튜닝 데이터셋의 경우 finetune.yaml에서 버킷팅을 비활성화하고 로더 프로세스 수를 줄이세요:
data:
num_bucket_batches: 1 # 1로 설정하면 길이 버킷팅이 비활성화됩니다
loader_procs: 1
batch_size: 8 # 가장 작은 학습/검증 샤드보다 크지 않아야 합니다
GPU당 요구 사항은 다음과 같습니다:
num_bucket_batches × batch_size × loader_procs
num_bucket_batches: 1과 loader_procs: 1로 설정하면 각 분할에는 최소 batch_size개의 읽을 수 있는 항목만 있으면 됩니다. 검증에는 학습 배치 크기가 사용되므로 검증 매니페스트도 이 크기를 충족하는지 확인하세요. 그렇지 않으면 첫 번째 검증 단계에서 실행이 실패합니다. 또는 검증 샘플을 추가하거나 데이터셋 크기를 늘리세요.
문제 해결Pocket TTS에서 프랑스어 한두 단어 발화가 뭉개지거나 잘리는 문제를 해결하는 방법
이 문제는 조기 EOS 종료로 인해 발생합니다: 일부 프랑스어 음성에서는 시작 부분의 무음 구간 동안 EOS logit이 약 -3까지 도달하여 음성이 생성되기 전에 기본 임계값 -4를 넘어서므로, 짧은 텍스트가 너무 일찍 끝납니다.
PR "Ignore EOS on the first 6 generated frames"와 새로운 프랑스어 모델이 포함된 릴리스로 업데이트하여 수정하세요. 그런 다음 둘 중 하나를 사용하세요:
- --language french — 새로운 6-layer 프랑스어 모델을 로드합니다
- french_24l — 새로운 24-layer 프랑스어 모델을 로드합니다
업데이트할 수 없는 경우 즉시 적용 가능한 해결 방법: 세 단어 미만은 절대 합성하지 마세요. 스트리밍 모드에서는 너무 짧은 청크를 합성하기 전에 다음 청크와 연결하세요. 이 방법으로 보고된 실패율이 1–2단어에서는 약 40%에서 3단어 이상에서는 약 2%로 감소했습니다.
리드인 필러 단어를 추가하는 것은 도움이 되지 않았으며, quantize=True는 Apple Silicon에서 문제를 더 악화시켰습니다.
문제 해결왜 스페인어, 프랑스어 또는 english_2026-01 TTS 모델은 temperature 0.7을 사용하고 불규칙한 운율을 생성하나요?
배포된 YAML 설정 파일들은 default_temperature를 생략하므로, TTSModel.load_model()이 튜닝된 영어 값 0.3 대신 스키마 기본값 0.7로 폴백합니다. 이 수정 사항은 스키마 기본값을 0.3으로 변경하여, 설정별 재정의는 여전히 허용하면서 모든 배포 모델이 0.3으로 샘플링되도록 합니다. #322 수정이 포함된 릴리스로 업그레이드한 후 다음으로 확인하세요:
m = TTSModel.load_model(language="spanish")
print(m.temp) # 0.3이어야 함이전 버전에서의 임시 해결 방법으로, 영향을 받는 설정 파일(예:
spanish.yaml, french.yaml 또는 english_2026-01.yaml)에 다음을 추가하세요:default_temperature: 0.3문제 해결클라이언트가 /tts 스트리밍 도중 연결을 끊었을 때 Pocket TTS 생성을 중지하려면 어떻게 해야 하나요?
PR #228이 포함된 Pocket TTS 릴리스로 업그레이드하세요. 이 수정은 요청별로 threading.Event를 생성하고, 이를 generate_audio_stream()에 전달하며, 클라이언트 연결이 끊어질 때 해당 이벤트를 설정합니다. generate_data_with_state의 생성 루프는 이 이벤트를 확인하고, 남은 텍스트를 디코딩하는 대신 정상적인 종료 경로를 통해 빠져나갑니다. 수정을 수동으로 적용하는 경우: 1) 각 요청에 대해 stop_event = threading.Event()를 생성하고, 2) 이를 generate_audio_stream(..., stop_event=stop_event)에 전달하고, 3) 연결 끊김/취소 핸들러에서 stop_event.set()을 호출하고, 4) 생성 루프 내부에서 이벤트를 확인하여 다음 tts_model 요청을 실행하기 전에 중지하세요. 이를 통해 CPU 낭비를 방지하고 thread-safe하지 않은 모델의 동시 사용을 피할 수 있으며, 보고된 인터럽트 후 다음 응답까지의 지연 시간이 약 7.9초에서 0.27초로 감소했습니다.
문제 해결유효하지 않은 Hugging Face 토큰으로 인해 pocket-tts export-voice가 실패하는 문제를 어떻게 해결하나요?
이 오류는 오래된 HF_TOKEN 환경 변수로 인해 발생할 수 있습니다. 이를 제거하고 내보내기를 다시 실행하세요.
PowerShell (현재 터미널):
Remove-Item Env:HF_TOKEN
Windows 사용자 환경에서 영구적으로 제거하려면:
[Environment]::SetEnvironmentVariable("HF_TOKEN", $null, "User")
터미널을 다시 시작하고 echo $env:HF_TOKEN으로 비어 있는지 확인한 후 다음을 다시 실행하세요:
pocket-tts export-voice .\turtle_sample.wav turtle.safetensors
음성 복제에 인증이 필요한 경우, 오래된 토큰을 Hugging Face에서 발급받은 유효한 토큰으로 교체하세요:
$env:HF_TOKEN = "hf_your_valid_token"또는
[Environment]::SetEnvironmentVariable("HF_TOKEN", "hf_your_valid_token", "User")로 영구적으로 설정하고 터미널을 다시 시작하세요.