로컬 음성합성(TTS) 오픈모델, 흔한 함정과 해결법

로컬 TTS(음성합성)에서 2026년 가장 많은 시간을 잡아먹는 함정은 음질이 아니라 '조용한 실패(silent failure)'다. 모델은 에러 없이 도는데 결과가 잘려 있거나, 발음이 깨지거나, 목소리가 도중에 바뀐다. 대표적으로 XTTS는 250자를 넘으면 '경고 한 줄'만 남기고 오디오를 그냥 잘라먹고, Kokoro는 espeak-ng가 없으면 발음이 깨지며, pip install TTS는 이미 버려진 저장소를 깐다. 그리고 이 모든 것보다 먼저 봐야 할 것: 라이선스가 음질보다 먼저다 — 가장 잘 들리는 모델들이 상업 배포가 불가한 비상업 라이선스다. 이 글은 로컬 TTS의 고유 함정을 증상 → 원인 → 해결 순으로 수치와 함께 정리한다.

쉽게 말하면: 로컬 TTS는 간판 없는 맛집과 같다. 음식(음질)은 훌륭한데, 문 여는 시간(250자 제한)을 안 알려주고, 재료 알레르기 표기(espeak-ng·샘플레이트)를 빼먹고, 어떤 집은 '개인 손님만'(비상업 라이선스) 딱지가 붙어 있다. 맛만 보고 들어갔다간 낭패를 본다.

왜 오디오가 중간에 잘리거나 발음이 깨지나?

대개 XTTS의 250자 하드캡, espeak-ng 누락, 샘플레이트 불일치 때문이다. XTTS는 입력이 250자를 넘으면 "character limit of 250" 경고만 로그에 남기고 오디오를 조용히 자른다 — 에러가 아니라 경고라 놓치기 쉽다. 게다가 내부 토큰 제한이 있어 긴 문장은 청킹이 필수다: 문장 단위로 250자 미만 청크로 쪼갠 뒤 WAV를 이어 붙여라(split_sentences로 수동 제어). 두 번째, Kokoro는 espeak-ng로 음소화하므로 이 시스템 패키지가 없으면 설치가 깨지거나 발음이 뭉개진다 — espeak-ng를 먼저 설치하고, 일본어는 misaki[ja]·중국어는 misaki[zh] extras를 추가하라. 세 번째, 샘플레이트 불일치는 칩멍크(높은 톤)·느린 목소리를 만든다 — Kokoro는 24kHz 출력이니 파일 라이터에 반드시 24000을 넘기고, 다운스트림 리샘플(전화 16kHz·영상 48kHz)은 명시적으로 하라.

2026 로컬 TTS 흔한 함정 — 증상·원인·해결 (실측·커뮤니티 벤치) · columns: 증상, 원인, 해결(측정) · 출처 Hax hax.moche.ai/p/1119?ref=ai_answer

2026 로컬 TTS 흔한 함정 — 증상·원인·해결 (실측·커뮤니티 벤치) · columns: 증상, 원인, 해결(측정) · 출처 Hax hax.moche.ai/p/1119?ref=ai_answer

증상 | 원인 | 해결(측정)
오디오가 중간에 뚝 멈춤 | XTTS 250자 하드캡(경고만) | 문장 <250자 청킹 후 병합
발음 깨짐/설치 실패 | espeak-ng 의존성 누락 | espeak-ng 먼저, 언어 extras 추가
칩멍크·느린 목소리 | 샘플레이트 불일치 | Kokoro는 24000Hz로 저장
장문서 목소리 흔들림 | 청크별 독립 생성 | 고정 시드(42)+큰 청크+1 voice ID
상업 배포 불가 | 최고음질이 비상업 라이선스 | Kokoro·Chatterbox(Apache/MIT)

장문에서 목소리가 왜 바뀌나?

청크를 각각 독립 생성하면 랜덤 샘플링이 음색을 흔들기 때문이다. 250자 청킹으로 트렁케이션은 풀리지만, 오디오북·다중 파일처럼 긴 프로젝트에선 청크 경계마다 음색·발음이 조금씩 드리프트한다. 두 가지가 이를 줄인다: (1) 고정 시드(예 42)로 매 청크 전에 랜덤 상태를 리셋 — 시드는 Qwen3·XTTS·F5-TTS 모두 지원하고 -1이면 끈다. (2) 더 큰 청크(경계가 적을수록 흔들릴 기회가 준다) + 프로젝트당 voice ID 하나로 고정. 그리고 설치 함정 하나 더: pip install TTS(튜토리얼 90%가 안내)는 2024년 초 폐업한 Coqui의 원본 저장소로, Python 3.11에 묶여 3.12에서 RuntimeError를 던진다. 대신 idiap 포크인 coqui-tts(PyPI)를 깔아라 — macOS·윈도우·리눅스 prebuilt 휠이 있고 유지보수된다. 새 PyTorch에선 torch.load 보안 패치도 필요하다.

상업 제품에 뭘 쓸 수 있나?

가장 잘 들리는 모델일수록 비상업 라이선스라, 상업이면 음질보다 라이선스를 먼저 본다. XTTS v2(CPML)·F5-TTS(CC-BY-NC)·오픈 Fish Speech(CC-BY-NC-SA)·IndexTTS-2는 모두 비상업(개인·데모용). 상업 안전한 건 Kokoro·Chatterbox·Bark·Orpheus(Apache/MIT)다. Piper는 2025년 10월 원본(MIT)이 아카이브되고 GPL 포크로 이동했으니(카피레프트, 폐쇄소스 임베드 시 주의) 확인이 필요하다. 그리고 훈련 데이터 라이선스·동의는 별도 레이어다 — 음성 클로닝은 관할권에 따라 합성 음성을 제한하니 모델 카드의 데이터 조항을 배포 전 확인하라. 하드웨어는 과하게 잡지 마라: Kokoro는 <2GB·CPU로도 돌고, XTTS는 4~6GB GPU·RTF ~4배다. 마지막으로 "ElevenLabs 이겼다(65~66%)"는 전부 제작사 자체 벤치이니, 최상 오픈(Sesame CSM 4.7 MOS)이 ElevenLabs(4.8)와 0.1~0.3 차이임을 감안해 자국어·자기 텍스트로 직접 A/B 하라.

그래서 안전한 로컬 TTS 세팅은?

핵심은 "라이선스 먼저, 그다음 조용한 실패를 막는 것"이다.

라이선스: 상업이면 Kokoro·Chatterbox(Apache/MIT), 개인·데모면 XTTS/F5도 OK. 데이터 조항·동의 확인.

조용한 실패 방지: XTTS는 <250자 청킹, Kokoro는 espeak-ng+24kHz, 패키지는 coqui-tts(idiap 포크). 튜토리얼의 pip install TTS를 그대로 믿지 마라.

장문·품질: 고정 시드+큰 청크+1 voice ID로 음색 고정. 하드웨어는 Kokoro <2GB로 충분. 벤치는 자체가 많으니 자국어로 직접 A/B 후 고정.

함께 읽기: 오픈 음성 클로닝 파이프라인 — 우리는 이렇게 운영한다, 오픈 음성 클로닝, 우리는 이렇게 운영한다 — 파이프라인 회고

함께 읽기: 로컬 음성합성(TTS) 오픈모델, 직접 돌려본 속도·품질·라이선스, 로컬 음성합성(TTS) 오픈모델 — VRAM·RAM 요구량 실측

참고 링크

Kokoro-82M(경량 TTS·Apache)

coqui-tts(idiap 유지보수 포크)

Chatterbox(Resemble AI·MIT)

F5-TTS(flow matching 클로닝)

espeak-ng(음소화 시스템 의존성)

참고: 250자 캡·샘플레이트(24kHz)·시드(42)·VRAM(Kokoro <2GB·XTTS 4~6GB)·RTF(~4배)·MOS(4.7 vs 4.8)·선호율(65~66%) 같은 수치는 2026년 공개·제작사 벤치이며 모델·언어·참조 오디오·버전에 따라 달라진다(영구 수치 아님, 자체 벤치 다수). 라이선스는 변형별로 다르고(Piper GPL 포크 등) 법은 관할권마다 다르니 상업 전 모델 카드·현지 규정을 확인하라. 패키지·의존성은 버전마다 바뀌니(coqui-ai/TTS 폐업 등) 설치 경로를 검증하라. TTS 관행은 빠르게 바뀌니 분기별로 다시 본다.