ko-tts-human-eval / README.md
xbuzz's picture
한국어 TTS 사람 청취평가 — 의원 접수대 100문장 × TTS 2종 블라인드 평가
dcf8942 verified
|
Raw
History Blame Contribute Delete
4.2 kB
---
title: 한국어 TTS 사람 청취평가
emoji: 🎧
colorFrom: indigo
colorTo: pink
sdk: gradio
sdk_version: 5.49.1
app_file: app.py
pinned: false
license: cc-by-nc-4.0
---
# 한국어 TTS 사람 청취평가
합성음을 **블라인드로 듣고 받아쓰기 + 0~10점**을 남기는 앱.
[Open Ko-S2S Leaderboard](https://huggingface.co/spaces/baryonlabs/open-ko-s2s-leaderboard)
의 TTS 발음 지표를 사람 귀로 검증하기 위해 만들었다.
## 왜 만들었나
리더보드의 TTS 발음 점수는 합성음을 ASR(`faster-whisper-large-v3-turbo`)로
되받아쓴 CER 이다. RTX 4090 실측에서 이 지표가 **발음이 아니라 숫자 표기**
재고 있다는 것이 드러났다.
| 구분 | n | CER |
| --- | ---: | ---: |
| Qwen3-TTS 전체 (기존 20문장) | 20 | 11.08% |
| ├ 숫자 표기 문장 | 9 | **23.67%** |
| └ 숫자 없는 문장 | 11 | **0.50%** |
`삼십 분``30분`, `십이 퍼센트``12%` 처럼 **발음은 정확한데 표기가 달라서**
CER 이 올랐다. 20문장 중 실제 발음 오류는 1건뿐이었다.
허용 표기(`variants`) 최소거리 채점을 도입해 이 편향을 걷어내자 숫자문장 CER 이
23.67% → 3.09% 로 떨어졌다.
| 모델 | 전체 | 숫자문장 | 숫자없음 |
| --- | ---: | ---: | ---: |
| Qwen3-TTS-12Hz-1.7B-CustomVoice | **1.50%** | 3.09% | 1.02% |
| MMS-TTS-Korean | 6.28% | 7.74% | 5.84% |
**그래도 자동 지표만으로는 확정할 수 없다.** 보정이 과한지 부족한지, 남은
오차가 정말 발음 문제인지는 사람이 들어봐야 안다. 그래서 이 앱을 만들었다.
## 무엇을 듣는가
**의원(1차 의료기관) 접수대 100문장 × TTS 2종 = 200 샘플.**
음성봇이 가장 먼저 투입되는 구간이 병원 접수대인데, 이 도메인의 공개 한국어
TTS 발음 벤치마크가 없다(CoreaSpeech 는 범용·gated, 상용 데이터는 비공개).
문장은 실제 한국어 의료 코퍼스에서 어휘를 채굴하되 **창구 발화로 새로 썼다**
원본은 환자 질문이거나 시험 문항이라 그대로 쓸 수 없다.
범주는 접수·안내·수납·서류·응대 각 20문장이고, 한국어 TTS 가 실제로 틀리는
지점(한자어 연음 52, 숫자+단위 23, 고유명사 15, 받침 연음 11, 외래어 10)을
의도적으로 심었다.
## 측정하는 것
- **사람 CER** — 받아쓴 내용 vs 원문. 숫자 표기를 정규화한 값과 원문 그대로의
값을 함께 기록해서, **둘의 차이가 곧 표기가 만드는 오차의 크기**다.
- **주관 점수(0~10)** — 자연스러움·명료도.
리더보드의 `tts_naturalness` 는 이름과 달리 발음 정확도이고 UTMOS 는 미구현이다.
사람 점수가 이 부문의 첫 실제 자연스러움 데이터가 된다.
## 설계
- **블라인드**: 모델명과 정답 문장을 제출 전에는 감춘다. 정답을 먼저 보여주면
받아쓰기가 베끼기가 되어 명료도 측정이 무의미해진다.
- **표기 통제**: 사람도 `삼십 분` 을 듣고 `30분` 이라 적는다. 안내로 한글 표기를
요청하고, 채점에서도 숫자를 정규화하며, 참조에 허용 표기가 있으면 그중 최소
거리를 쓴다. 리더보드 `metrics.py` 와 같은 원리를 사람 평가에도 일관 적용했다.
- **출제**: 아직 안 들은 항목 우선, 그 안에서 응답 수가 적은 항목 우선.
## 저장
`HF_TOKEN`(write) 시크릿을 설정하면 응답이 데이터셋 repo 에 누적된다.
없으면 컨테이너 로컬에만 임시 저장되며 화면에 경고가 표시된다 —
조용히 유실되지 않게 하기 위함이다.
| 변수 | 기본값 | 설명 |
| --- | --- | --- |
| `HF_TOKEN` | (없음) | write 권한 토큰. 없으면 임시 저장 |
| `EVAL_DATASET_REPO` | `baryonlabs/ko-tts-human-eval-votes` | 응답 누적 대상 |
## 오디오
`audio/manifest.json` 에 (모델, 문장, 범주, 난이도 태그, 허용 표기, 파일) 매핑이
있다. 모든 음성은 RTX 4090 에서 리더보드 하네스와 동일한 백엔드로 생성했다 —
Qwen3-TTS 는 `faster-qwen3-tts`(ggml), MMS 는 transformers `VitsModel`.