Skip to content

Split View: tts-bench: 품질이 주관적일 때 로컬 TTS를 비교하는 법

|

tts-bench: 품질이 주관적일 때 로컬 TTS를 비교하는 법

들어가며 — TTS 비교가 어려운 이유

이번 주 GeekNews에서 화제가 된 tts-bench는 개발자 5uck1ess가 만든 로컬 벤치마크다. 손에 있는 하드웨어에서 직접 여러 TTS(text-to-speech) 모델을 비교하게 해준다. 도구 이야기에 앞서 문제부터 짚자. 음성 합성은 벤치마크하기가 유난히 까다롭다. "좋다"는 게 한 축이 아니기 때문이다. 목소리가 아름다워도 발음을 뭉개거나 단어를 빠뜨릴 수 있고, 또렷하게 알아들려도 밋밋하고 기계적일 수 있으며, 둘 다 좋은데 실시간 에이전트에 쓰기엔 너무 느릴 수도 있다. 자연스러움·명료성·속도는 서로 다른 방향으로 당기고, 앞의 둘은 주관적이다. 음성 인식의 WER처럼 딱 떨어지는 정답 수치가 없다. 저자도 분명히 말한다. "품질은 주관적이라, 진짜 기준은 당신의 귀다." 이 벤치가 읽을 가치를 갖는 이유는, 그 사실을 덮지 않고 오히려 그 위에 설계됐다는 데 있다.

프로젝트의 윤곽을 한자리에 모으면 이렇다.

  • 3개 장비에서 55개 모델 (윈도우 + RTX 5090, 리눅스 + RTX 3090, 애플 M4)
  • 사전 정의 음성 엔진 16개 + 제로샷 복제 모델 39개
  • CPU·CUDA·애플 실리콘(MPS)에서 구동
  • 벤치 코드는 MIT, 각 모델은 자체 라이선스를 따름

tts-bench가 실제로 재는 것

벤치는 세 개의 렌즈로 구성된다.

속도(Speed) 는 객관적이고 공개 가능한 부분이다. 콜드/웜 TTFA(첫 오디오까지의 시간), RTF(실시간 계수, 높을수록 실시간보다 빠름), 메모리를 CPU·CUDA·애플 실리콘에서 측정한다. 2026년 6월 기준 선두를 보면 감이 온다.

  • CPU(Ryzen 9 9950X3D): Piper — 웜 TTFA 107ms, 실시간 59배
  • CUDA(RTX 5090): Kokoro — 웜 TTFA 67ms, 104배
  • 애플 M4(16GB): Piper — 웜 TTFA 208ms, 32배

재현 가능한 측정값이고, 벤치가 대놓고 순위를 매기는 유일한 영역이다.

청취(Listen) 는 갤러리다. 모든 모델을 모든 프롬프트에 대해, 기본 목소리와 음성 복제(cloning) 두 방식으로 들려주고, 각각 인라인 <audio> 플레이어가 붙어 귀로 판단할 수 있다. 샘플은 장비에 독립적이다 — 가장 고품질 장비에서 한 번만 생성한다 — 음색과 아티팩트가 어느 기계에서 렌더링됐는지에 좌우되면 안 되기 때문이다. README의 표현대로, 품질과 아티팩트는 5초면 드러난다. 표로는 보여줄 수 없는 것이다.

점수(Scores) 는 모델별 객관적 품질 대리지표다. 자연스러움은 UTMOS, 명료성은 WER, 복제 충실도는 SIM으로, 벤치 프롬프트에 대해 seed-tts-eval 방식의 ASR과 화자 검증으로 계산한다. 모델 목록은 경량 사전 정의 음성 엔진(82M의 Kokoro, 약 15M의 Piper)부터 제로샷 복제 계열(F5-TTS, Coqui XTTS-v2, ChatterBox 등 다수)까지 걸쳐 있고, 두 그룹을 기본/복제 토글로 나눠 본다.

정직한 대목 — 숫자가 말해주는 것과 못 하는 것

tts-bench에서 가장 흥미로운 건 무엇을 주장하지 않는가다. "가장 좋게 들리는" 단일 순위는 없다. NAQ라는 객관적 품질 점수를 시제품으로 만들었다가 걷어냈는데, 저자 말로는 "주관적 순위를 충분히 잘 따라가지 못해 공개할 수 없었다"고 한다. 그래서 별도로 재설계 중이다. 벤치는 속도만 순위 매기고, 품질은 청취 렌즈와, 실시간 인간 선호 Elo 리더보드로 이어지는 블라인드 A/B 투표 아레나에 맡긴다. UTMOS·WER·SIM은 판결이 아니라 "객관적 백스톱"이라고 표현된다.

이 신중함이 왜 정당한지는 복제 결과에서 드러난다. 32개 복제 모델 중 28개에 대한 397건의 블라인드 투표에서 음성 일치 상위 세 모델은 이랬다.

  • OmniVoice — 음성 일치 1위(24-1-3), 다만 "단어를 뭉개거나 빠뜨릴 수 있음"
  • Echo-TTS — 근소차 공동 1위(21-1-6), 깨끗한 44.1kHz
  • IndexTTS-2 — 3위(16-2-5), 억양 유지

함정은 첫 줄에 있다. 음색 중심의 A/B 투표는 뭉개진 단어를 벌하지 않는다. 즉 레퍼런스와 가장 비슷하게 들리는 모델이 동시에 올바른 단어를 말하는 데서는 질 수 있다는 뜻이고, 이게 바로 객관적 WER 점수가 잡아내려는 간극이다. 숫자 하나만 보면 엉뚱한 모델을 고르게 된다.

새겨둘 주의점이 하나 더 있다. 벤치는 공정성을 위해 모든 모델에 같은 평범한 프롬프트를 먹인다. 그래서 감정 태그, 음성 묘사, 스타일 노브 같은 표현 기능은 어떤 점수에도 반영되지 않는다. 당신의 용도가 바로 그런 기능에 기댄다면, 리더보드는 정작 가장 중요한 것에 대해 침묵한다.

로컬에서 돌려 보고, 내 용도로 평가하기

설치에는 uv와 Python 3.11이 필요하고 10~15분쯤 걸린다. 전체 세트는 무겁다.

  • 모델별 가상환경 약 39GB (저장소 안)
  • 모델 가중치 약 125GB (Hugging Face 캐시, 저장소 아님)
  • 다 합쳐 약 165GB

하지만 55개를 다 깔라는 게 아니다. 원하는 것만 넘기면 된다. ./install.sh kokoro piper miso(윈도우는 .ps1), 그리고 bench.py는 가상환경이 있는 모델만 돌린다. 빠른 감 잡기용으로 python speak.py kokoro, 한 방 A/B 비교로 python compare.py "문장"이 있다.

이 부분 설치 방식이 핵심이다. 전역 리더보드를 믿는 대신 로컬에서 돌려야 하는 이유는, TTS 품질이 용도에 따라 달라지기 때문이다. 당신의 프롬프트, 목표 목소리, 언어, 지연 예산, 하드웨어에 달려 있다. 깨끗한 영어 문장에서 Elo 1위인 모델이 당신 도메인의 전문 용어나 특정 복제 레퍼런스에서는 무너질 수 있다. 익숙한 "자기 데이터로 평가하라"는 원칙을 도구로 옮긴 셈이다. 벤치는 하네스를 손에 쥐여주고, 솔직하게, 직접 들어보라고 말한다.

마치며

tts-bench의 진짜 미덕은 객관성이 어디서 끝나는지에 대한 절제다. 속도는 재고 순위를 매기고, 품질은 보여주되 판단은 맡기며, 복제 선호는 블라인드 투표로 모으되 명료성이 아니라 선호라고 이름 붙인다. 주관적인 것을 벤치마크하는 정직한 방법이다.

실용적 교훈은 작고 구체적이다. 점수 하나 보고 승자를 정하지 마라. 실제로 고려 중인 두세 모델만 깔아, 배포할 바로 그 기계에서 당신의 텍스트와 레퍼런스 목소리를 먹여 보고, 귀로 결정하라. WER과 RTF는 정답이 아니라 백스톱으로 두고.

참고 자료

tts-bench: comparing local TTS models when quality is subjective

Introduction — why comparing TTS is hard

Trending on GeekNews this week: tts-bench, a local benchmark by the developer 5uck1ess for comparing text-to-speech models on whatever hardware you put it on. Before the tool, the problem. Text-to-speech is unusually hard to benchmark because "good" is not one axis. A voice can be gorgeous but slur or drop words; a model can be perfectly intelligible but flat and robotic; another can be both and still too slow for a live agent. Naturalness, intelligibility, and speed pull in different directions, and the first two are subjective — there is no ground-truth scalar the way there is for, say, WER on a speech-recognition set. The author is blunt about it: "Quality is subjective, so the ground truth is your ears." What makes this bench worth reading is that it is built around that admission rather than papering over it.

The shape of the project, in one place:

  • 55 models across three rigs (Windows + RTX 5090, Linux + RTX 3090, Apple M4)
  • 16 predefined-voice engines plus 39 zero-shot cloning models
  • Runs on CPU, CUDA, and Apple Silicon (MPS)
  • Bench code is MIT-licensed; each model keeps its own license

What tts-bench actually measures

The bench is organized as three lenses.

Speed is the objective, publishable part: cold and warm TTFA (time to first audio), RTF (real-time factor; higher means faster than realtime), and memory, measured on CPU, CUDA, and Apple Silicon. The June 2026 leaders give the flavor:

  • CPU (Ryzen 9 9950X3D): Piper — 107ms warm TTFA, 59x realtime
  • CUDA (RTX 5090): Kokoro — 67ms warm TTFA, 104x realtime
  • Apple M4 (16 GB): Piper — 208ms warm TTFA, 32x realtime

These are reproducible measurements, and they are the only part the bench is comfortable ranking outright.

Listen is the gallery: every model on every prompt, in both a default voice and a voice-cloning setting, each with an inline <audio> player so you can judge by ear. Samples are rig-independent — sourced once from the highest-fidelity rig — because timbre and artifacts should not depend on which box rendered them. As the README puts it, quality and artifacts are obvious in about five seconds, in a way a table cannot show.

Scores are objective quality proxies per model: UTMOS for naturalness, WER for intelligibility, and SIM for cloning fidelity, computed over the bench prompts with seed-tts-eval-style ASR and speaker-verification. The model list spans lightweight predefined-voice engines (Kokoro at 82M, Piper at ~15M) through zero-shot cloning systems (F5-TTS, Coqui XTTS-v2, ChatterBox, and many more), with a Default/Cloning toggle over the two groups.

The honest part — what the numbers can and cannot tell you

The most interesting thing about tts-bench is what it refuses to claim. There is no single "best sounding" ranking. An objective quality score (called NAQ) was prototyped and then pulled — in the author's words it "didn't track subjective ranking closely enough to publish," so it is being redesigned separately. The bench ranks speed; quality is left to the Listen lens and to a companion blind A/B voting arena that feeds a live human-preference Elo leaderboard. UTMOS, WER, and SIM are described as "objective backstops," not the verdict.

Why that caution is warranted shows up in the cloning results. Across 397 blind votes over 28 of 32 cloning models, the top three on voice-match were:

  • OmniVoice — best voice match (24-1-3), but it "can garble or drop words"
  • Echo-TTS — near-tied for first (21-1-6), clean 44.1 kHz
  • IndexTTS-2 — third (16-2-5), accent held

The catch is in the first line. A timbre-focused A/B vote does not penalize garbled words, so the model that wins on sounding like the reference can simultaneously lose on saying the right words — precisely the gap the objective WER score exists to catch. Read one number and you would ship the wrong model.

One more caveat worth internalizing: the bench feeds every model the same plain prompts for fairness, so expressive features — emotion tags, voice descriptions, style knobs — are not exercised in any score. If your use case leans on that, the leaderboard is silent on the thing you care about most.

Running it locally, and evaluating for your own case

Setup needs uv and Python 3.11 and takes about 10-15 minutes. The full set is heavy:

  • ~39 GB of per-model virtualenvs (in the repo)
  • ~125 GB of model weights (in your Hugging Face cache, not the repo)
  • ~165 GB all in

But you are not meant to install all 55. Pass the ones you want: ./install.sh kokoro piper miso (or the .ps1 on Windows), and bench.py only runs models whose venv exists. For quick feel-testing there is python speak.py kokoro, and python compare.py "your phrase" for a one-shot A/B.

That subset workflow is the point. The reason to run this locally rather than trust a global leaderboard is that TTS quality is use-case-specific: your prompts, your target voice, your language, your latency budget, your hardware. A model that tops the Elo on clean English sentences can fall apart on your domain jargon or your particular cloning reference. This is the familiar "evaluate on your own data" principle, turned into a tool — the bench hands you the harness and, honestly, tells you to listen for yourself.

Closing

What is genuinely good about tts-bench is its discipline about where objectivity ends. Speed it measures and ranks; quality it presents and lets you judge; cloning preference it collects through blind votes and labels as preference, not intelligibility. That separation is the honest way to benchmark something subjective.

The practical takeaway is small and concrete. Do not read a single score and pick a winner. Install the two or three models you are actually considering, feed them your text and your reference voice on the box you will deploy on, and decide by ear — with WER and RTF as backstops, not as the answer.

References