설치형 로컬 TTS를 MeloTTS 한국어(MIT)로 채택하고 엔드포인트로 연결
Higgs Audio v3 는 연구/비상업 라이선스라 config.py 가 environment != dev 에서 차단하고 있었다. 그 가드를 푸는 건 법적 판단이라 코드로 결정할 수 없어서, 상업 사용이 허용된 설치형을 다시 찾아 MeloTTS Korean 으로 바꿨다. 결과적으로 가드를 건드릴 필요 자체가 사라졌다 — Higgs 가드는 그대로 두고 provider 만 melotts 로 두면 운영에서도 동작한다. 검토 결과: - MeloTTS MIT 한국어 지원 -> 채택. CPU 실시간, 사전학습 다화자 - Kokoro-82M Apache2.0 한국어 없음 -> 탈락. 공식 VOICES.md 언어 목록에 부재 - Piper GPL -> 탈락 - XTTS-v2 / Fish Speech 비상업 -> 탈락. Higgs 와 같은 문제 사전학습 다화자 모델이라 실존 인물 reference 를 쓰지 않는다. Higgs 경로가 P1 프리셋 한정이던 이유가 없으므로 모든 페르소나 프리셋에 적용된다. 구현: - scripts/melotts-server.py loopback HTTP 사이드카(/health, POST /tts -> WAV) - voice_tts_provider=melotts 경로와 VIGNETTE_MELOTTS_TTS_* 설정 - scripts/start-melotts.ps1 런처(설치 순서 안내 포함) 실측: - CPU 정상 상태 RTF 0.27~0.28(실시간 3.6배). 첫 실행 13.25 는 모델 다운로드 - POST /tts 200, WAV 350,566 bytes, 3.61s, 헤더 provider/model/license - 빈 텍스트 422, 미지 경로 404 로 fail-closed - 왕복 검증: MeloTTS 합성음을 로컬 faster-whisper 가 완전 일치 전사 "그렇게 느끼셨군요. 조금 더 이야기해 주실 수 있을까요?" (word timestamp 8개) 설치 함정 3가지를 decisions/local-voice-stack.md 에 남겼다. librosa 0.9.1 의 pkg_resources(setuptools<81), MeloTTS 가 언어와 무관하게 임포트하는 일본어 unidic 사전, Windows 한국어 g2p 의 eunjeon. G7 게이트의 TTS 허용목록에 melotts 를 추가했다. 선언/실제 불일치 차단과 배치 STT 배제는 그대로다. 검증: API 914 passed, 사이드카 melotts 16/16 + whisper 37/37, SSOT FAIL 0, ruff clean.
This commit is contained in:
parent
05aa7b312e
commit
2624d49984
15 changed files with 749 additions and 33 deletions
|
|
@ -1,15 +1,38 @@
|
|||
# 로컬 음성 스택 결정 — 노트북 faster-whisper STT + Higgs TTS
|
||||
# 로컬 음성 스택 결정 — 노트북 faster-whisper STT + MeloTTS TTS
|
||||
|
||||
Date: 2026-08-08
|
||||
Status: accepted (STT 구현 완료 · TTS 운영 사용은 라이선스 확인 대기)
|
||||
Date: 2026-08-08 (같은 날 TTS 재선정으로 개정)
|
||||
Status: accepted — STT·TTS 모두 구현·실측 완료, 라이선스 제약 없음
|
||||
Owner decision: 윤찬
|
||||
|
||||
## 결정
|
||||
|
||||
음성 캐스케이드의 양쪽을 **개발 노트북에 상주하는 로컬 모델**로 운영한다.
|
||||
둘 다 **허용적 라이선스(MIT)** 라 운영 사용에 제약이 없다.
|
||||
|
||||
- **STT(듣기)**: faster-whisper (`local_whisper` provider)
|
||||
- **TTS(말하기)**: Higgs Audio v3 TTS 4B
|
||||
- **STT(듣기)**: faster-whisper — MIT (`local_whisper` provider)
|
||||
- **TTS(말하기)**: **MeloTTS Korean — MIT** (`melotts` provider)
|
||||
|
||||
### TTS 재선정 (Higgs → MeloTTS)
|
||||
|
||||
처음에는 노트북에 이미 있던 Higgs Audio v3 TTS 4B를 쓰기로 했으나, 그 모델은 **연구/비상업
|
||||
라이선스**라 `config.py`가 `environment != dev`에서 차단하고 있었다. 그 가드를 제거하는 건 법적
|
||||
판단이라 코드로 결정할 수 없었다. 그래서 **상업 사용이 허용된 설치형**을 다시 찾았고 MeloTTS로
|
||||
바꿨다. 결과적으로 가드를 건드릴 필요 자체가 사라졌다 — Higgs 가드는 그대로 두고 provider 만
|
||||
`melotts`로 두면 운영에서도 동작한다.
|
||||
|
||||
검토한 대안과 탈락 이유:
|
||||
|
||||
| 후보 | 라이선스 | 한국어 | 판정 |
|
||||
|---|---|---|---|
|
||||
| **MeloTTS** | MIT | **지원** | **채택.** CPU 실시간, 사전학습 다화자 |
|
||||
| Kokoro-82M | Apache 2.0 | **미지원** | 탈락. 공식 `VOICES.md` 언어 목록에 한국어 없음 |
|
||||
| Piper | GPL | 제한적 | 탈락. 상업 배포에 부담 |
|
||||
| XTTS-v2 / Fish Speech | 비상업 | 지원 | 탈락. Higgs 와 같은 문제 |
|
||||
| Higgs Audio v3 4B | 연구/비상업 | 지원 | 보류. dev 전용 유지 |
|
||||
|
||||
MeloTTS는 **사전학습 다화자 모델**이라 실존 인물 음성 reference 를 전혀 쓰지 않는다. Higgs 경로가
|
||||
P1 프리셋 한정이었던 이유(권리 안전한 synthetic reference 를 P1만 보유)가 MeloTTS 에는 없으므로
|
||||
모든 페르소나 프리셋에 적용된다.
|
||||
|
||||
## 이 결정이 뒤집는 것
|
||||
|
||||
|
|
@ -45,6 +68,9 @@ Owner decision: 윤찬
|
|||
(`send_audio`/`finish`/`abort`)이라 WebSocket 라우트는 provider로 분기하지 않는다.
|
||||
- `VIGNETTE_VOICE_STT_PROVIDER=local_whisper` + `VIGNETTE_LOCAL_WHISPER_*` 설정.
|
||||
- 실행: `scripts/start-local-whisper-stt.ps1`.
|
||||
- `scripts/melotts-server.py` — loopback HTTP 사이드카(`/health`, `POST /tts` → WAV).
|
||||
`VIGNETTE_VOICE_TTS_PROVIDER=melotts` + `VIGNETTE_MELOTTS_TTS_URL` 설정.
|
||||
실행: `scripts/start-melotts.ps1`.
|
||||
|
||||
## 실측 증거 (2026-08-08)
|
||||
|
||||
|
|
@ -61,6 +87,39 @@ Owner decision: 윤찬
|
|||
`small` + CPU int8에서 한 글자(`안녕하세요`→`안녕하세여`) 차이였다. 회귀는 사이드카 37/37,
|
||||
API 전체 908 passed, gateway 58, G7 checker 23, ruff clean이다.
|
||||
|
||||
## MeloTTS 실측 증거 (2026-08-08)
|
||||
|
||||
설치: 전용 venv `C:\Users\encep\.venvs\vignette-melotts`, `melotts 0.1.2`.
|
||||
설치 중 걸린 것 3가지와 해법을 남긴다(다음 사람이 같은 데서 막힌다).
|
||||
|
||||
1. `librosa 0.9.1`(MeloTTS 핀)이 `pkg_resources` 를 쓰는데 설치가 올린 `setuptools 83` 에서
|
||||
제거됐다 → `pip install "setuptools<81"`.
|
||||
2. MeCab 이 일본어 `unidic` 사전을 요구한다(MeloTTS 가 언어와 무관하게 임포트) → `python -m unidic download`.
|
||||
3. 한국어 g2p(`g2pkk`)가 Windows 에서 `eunjeon` 을 요구한다 → `pip install eunjeon`.
|
||||
|
||||
성능(CPU, torch 2.13.0+cpu, GPU 미사용):
|
||||
|
||||
| 회차 | 텍스트 길이 | 오디오 길이 | 합성 시간 | RTF |
|
||||
|---|---|---|---|---|
|
||||
| 1 (웜업) | 22자 | 4.78s | 3.89s | 0.81 |
|
||||
| 2 | 13자 | 2.99s | 0.82s | 0.28 |
|
||||
| 3 | 31자 | 6.16s | 1.65s | 0.27 |
|
||||
|
||||
정상 상태 RTF 0.27~0.28 로 실시간의 약 3.6배 빠르다. 첫 실행의 13.25는 모델 다운로드가 섞인 값이다.
|
||||
|
||||
**왕복 검증** — 로컬 TTS 로 합성한 음성을 로컬 STT 로 되돌렸다. 둘 다 노트북 안에서만 돈다.
|
||||
|
||||
```
|
||||
입력 그렇게 느끼셨군요. 조금 더 이야기해 주실 수 있을까요?
|
||||
전사 그렇게 느끼셨군요. 조금 더 이야기해 주실 수 있을까요? (완전 일치, word timestamp 8개)
|
||||
```
|
||||
|
||||
**HTTP 엔드포인트** `POST /tts` 실측: 200, WAV 350,566 bytes, 3.61s,
|
||||
헤더 `X-Vignette-TTS-Provider: melotts` / `Model: melotts-korean` / `License: MIT`.
|
||||
빈 텍스트 422, 알 수 없는 경로 404 로 fail-closed. 이 응답 WAV 도 왕복 전사에서 완전 일치했다.
|
||||
|
||||
회귀: 사이드카 16/16, API 전체 914 passed, ruff clean.
|
||||
|
||||
## 알려진 제약
|
||||
|
||||
1. **cuDNN 부재로 GPU 추론 불가.** 이 노트북은 CUDA 장치가 보이지만 `cudnn_ops64_9.dll`이 없어
|
||||
|
|
@ -69,11 +128,9 @@ API 전체 908 passed, gateway 58, G7 checker 23, ruff clean이다.
|
|||
(`--self-check`)로 분리하고 `auto`에서 CPU(int8)로 폴백한다. 명시적 `--device cuda`는 조용히 강등하지
|
||||
않는다. **cuDNN 9를 설치하면** GPU float16으로 올라가고 `large-v3`도 실시간권에 들어온다. 설치는
|
||||
환경 변경이라 소유자 판단으로 남겼다.
|
||||
2. **Higgs 운영 사용은 아직 막혀 있다.** `apps/api/app/config.py`가 `environment != dev`에서
|
||||
`VIGNETTE_VOICE_TTS_PROVIDER=higgs`를 차단한다(Higgs Audio v3 4B 연구/비상업 라이선스). 이 가드는
|
||||
법적 판단이라 코드에서 임의로 제거하지 않았다. 산학협력 연구·교육 용도가 라이선스 범위에 들어가는지
|
||||
확인하고 그 근거를 이 문서에 추가한 뒤 가드를 조정한다. 그 전까지 Higgs는 dev 전용이고 운영 TTS는
|
||||
OpenAI `gpt-4o-mini-tts`를 유지한다.
|
||||
2. **Higgs 가드는 그대로 둔다.** `apps/api/app/config.py`는 계속 `environment != dev`에서
|
||||
`VIGNETTE_VOICE_TTS_PROVIDER=higgs`를 차단한다. MeloTTS 채택으로 이 가드를 풀 이유가 없어졌다.
|
||||
Higgs 를 굳이 운영에서 쓰고 싶어지면 그때 라이선스 근거를 이 문서에 추가하고 가드를 조정한다.
|
||||
3. **CPU 폴백 성능.** CPU int8에서는 `small`이 현실적이다. `large-v3`는 CPU에서 실시간 스트리밍에
|
||||
맞추기 어렵다.
|
||||
|
||||
|
|
@ -83,7 +140,7 @@ API 전체 908 passed, gateway 58, G7 checker 23, ruff clean이다.
|
|||
|
||||
```python
|
||||
ALLOWED_STT_PROVIDERS = ("local_whisper", "deepgram")
|
||||
ALLOWED_TTS_PROVIDERS = ("higgs", "openai")
|
||||
ALLOWED_TTS_PROVIDERS = ("melotts", "higgs", "openai")
|
||||
```
|
||||
|
||||
게이트를 약화시키지 않았다. 배치 STT(`openai`)는 interim/final 계약을 만족할 수 없어 목록에 없고,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue