잡음 제거 모델이 새 체크포인트를 출시합니다. TTS 음성이 더 많은 데이터로 재학습됩니다. 음성 복제 파이프라인이 보코더를 교체합니다. 각 경우마다 누군가는 답해야 합니다: 출력이 이전보다 나아졌는가, 나빠졌는가? “제게는 더 좋게 들려요”는 규모가 커지면 통하지 않습니다. 여러분이 하지 못하는 언어일 때, 비교할 체크포인트가 둘이 아니라 스무 개일 때, 혹은 그 변화를 손으로 한 번이 아니라 매 커밋마다 확인해야 할 때 무너집니다.
“더 좋게 들리는가”에 대한 엄밀한 답은 **평균 의견 점수(MOS)**입니다: 청취자 패널 앞에 오디오를 놓고, 각자 1에서 5로 평가하게 한 뒤 평균을 냅니다. MOS가 표준 음성 품질 지표인 이유는 정확히, 그것이 대체 지표가 아니라 정말 중요한 질문 — 인간이 이를 받아들일 만하다고 느낄 것인가 — 을 묻기 때문입니다. 하지만 비쌉니다. 패널을 모집하고, 일관되게 운영하며, 작은 팀이 출시하는 모든 언어, 모든 녹음 환경, 모든 모델 버전마다 이를 반복하는 것은 청취 패널이 따라갈 수 있는 일이 아닙니다.
speechonnxmetrics는 패널 없이 모든 빌드에서 그 판단을 근사하기 위한 라이브러리입니다. 지표를 세 계열로 묶으며, 상황에 맞는 계열을 고르는 것이 개별 숫자 하나보다 더 중요합니다.
세 계열, 세 가지 질문
참조 없는 MOS 추정기는 오디오만으로 청취 패널이 뭐라고 말할지 예측하도록 학습된 신경망입니다. 깨끗한 원본이 필요 없으며 — 판단하고 싶은 출력만 있으면 됩니다. 비교할 정답이 없을 때 이 계열을 사용하세요: TTS 시스템의 출력을 채점하거나, 잡음 제거 후 이미 열화된 실제 녹음을 확인할 때.
침습적 지표는 일치하는 깨끗한 참조가 필요하며 그것과 열화된 신호 사이의 거리를 측정합니다. 여러분이 스스로 열화를 만들어냈고 여전히 깨끗한 원본을 가지고 있을 때 이 계열을 사용하세요: 상태가 좋은 것으로 알려진 녹음을 코덱, 대역폭 확장 모델, 또는 음성 변환기에 통과시켰고, 출력이 원본에서 얼마나 벗어났는지 알고 싶을 때입니다.
ASR 기반 텍스트 지표는 음성 인식기로 출력을 전사하고 그 전사를 예상 텍스트와 비교합니다. 이는 다른 두 계열이 잡을 수 없는 것을 잡아냅니다: 완벽하게 자연스럽고 깨끗하게 들리지만 틀린 말을 하는 오디오입니다. 참조 없는 MOS 예측기는 자연스러움을 평가하지, 정확성을 평가하지 않습니다 — 유창한 오발음도 좋은 점수를 받습니다. 침습적 지표는 참조 문장이 아니라 참조 파형이 필요합니다. 오직 텍스트 비교만이 틀린 단어를 잡아냅니다.
이 라이브러리는 이를 하나의 함수로 노출합니다:
import speechonnxmetrics as s
# No-reference: only the output needed, no ground truth exists
s.score("output.wav", ["utmos"])
# Intrusive: needs a clean reference, ref= is required
s.score("degraded.wav", ["stoi", "mcd", "si_sdr"], ref="clean.wav")
텍스트 지표는 별도의 모듈인 speechonnxmetrics.asr에 있습니다. 오디오가 아니라 문자열을 비교하기 때문입니다 — s.score()는 파형을 받는 지표만 디스패치합니다.
참조 없는 MOS: 숫자 읽기
네 개의 MOS 추정기가 제공되며, 각각 사람 패널이 사용하는 것과 같은 척도인 1~5 척도로 값을 반환합니다(높을수록 좋음):
| 지표 | 차원 | 학습 데이터 | 상업적 사용 |
|---|---|---|---|
utmos | 자연스러움 점수 하나 | 합성 음성(VoiceMOS Challenge) | 가능 |
dnsmos | sig / bak / ovrl(음성 품질/배경 잡음/전체) | ITU-T P.835 | 가능 |
dnsmos_p808 | 크라우드소싱 청취 MOS 하나 | ITU-T P.808 | 가능 |
sigmos | 7개 차원(col, disc, loud, noise, reverb, sig, ovrl) | ITU-T P.804 | 가능 |
nisqa | mos와 noi/dis/col/loud 세부 항목 | NISQA-v2 | 불가 — CC BY-NC-SA 4.0 |
nisqa는 이 라이브러리 전체에서 비상업적 가중치를 가진 유일한 지표입니다. 나머지 네 개는 MIT 라이선스입니다. speechonnxmetrics는 이를 대신 걸러주지 않습니다. 라이선스를 명시하고 선택은 호출자에게 맡깁니다.
다음은 실제 오디오가 받는 점수입니다. 라이브러리 자체에 번들된 픽스처 — 깨끗한 녹음(source.wav)과 같은 클립의 신경 코덱 재합성(facodec_aria.wav) — 을 UTMOS로 실행하면:
>>> s.score("source.wav", ["utmos"])
{'utmos': 4.41}
>>> s.score("facodec_aria.wav", ["utmos"])
{'utmos': 3.21}
깨끗한 녹음은 척도의 상단 근처에 자리하는데, 이는 마땅합니다 — 합성이 아니라 실제 인간의 음성이니까요. 코덱 재합성은 1점 넘게 떨어집니다. 그 격차는 어느 한쪽 숫자보다 더 유용한 신호입니다: 코덱이 들을 수 있는 열화를 일으킨다는 것을 알려주며, 코덱이 조정됨에 따라 추적할 숫자를 제공합니다.
같은 깨끗한 녹음에 대한 DNSMOS:
>>> s.score("source.wav", ["dnsmos"])
{'dnsmos.sig': 3.45, 'dnsmos.bak': 3.60, 'dnsmos.ovrl': 2.93}
숫자 하나가 아니라 세 개이며, 서로 갈라집니다 — ovrl은 sig와 bak 둘 다보다 눈에 띄게 낮습니다. 그 갈라짐은 버그가 아니라 정보입니다: ovrl은 P.835의 전체 청취 경험 평가이며, 스튜디오 녹음이 아니라 실세계 녹음에서는 특히 각 구성 요소 점수가 시사하는 것보다 더 가혹하게 벌점을 주는 경향이 있습니다. bak이 낮으면 배경 잡음을 찾아보세요. sig가 낮으면 음성 수준의 아티팩트 — 클리핑, 드롭아웃, 로봇 같은 음색 — 을 찾아보세요. 같은 클립에 대해 하나 이상의 예측기를 보고하세요: 이들은 서로 다른 데이터로 학습되어 유익한 방식으로 의견이 갈리며, 같은 클립에서 두 독립적인 예측기 사이의 큰 격차는 직접 들어보라는 신호입니다.
침습적 지표: 숫자 읽기
열한 개의 참조 기반 지표가 깨끗한 원본으로부터의 거리를 측정합니다. 먼저 알아둘 만한 것들:
| 지표 | 범위 | 방향 | 측정 대상 |
|---|---|---|---|
stoi / estoi | 0–1 | 높을수록 좋음 | 단기 객관적 명료도 — 얼마나 자연스럽게 들리는지와 무관하게 내용이 얼마나 살아남는지 |
si_sdr / sdr / snr | dB, 무제한 | 높을수록 좋음 | 신호-왜곡비 / 신호-잡음비 |
mcd | dB, 무제한 | 낮을수록 좋음 | 멜-켑스트럼 왜곡 — 스펙트럼 포락선 거리, 고전적인 TTS/VC 품질 지표 |
log_f0_rmse | 무제한 | 낮을수록 좋음 | 음높이 윤곽 오차 |
lsd / msd | dB | 낮을수록 좋음 | 로그 스펙트럼 / 멜 스펙트럼 거리 |
방향이 뒤집힌다는 점에 유의하세요: STOI와 SDR 계열은 품질이 좋을수록 올라가고, MCD, 음높이 오차, 스펙트럼 거리는 내려갑니다. 표를 읽을 때 이를 혼동하기 쉽습니다.
같은 코덱 재합성을 깨끗한 원본에 대해 채점하면:
>>> s.score("facodec_aria.wav", ["stoi", "mcd", "si_sdr"], ref="source.wav")
{'stoi': 0.662, 'mcd': 10.46, 'si_sdr': -26.94}
1.0이 완벽한 일치인 0–1 척도에서 STOI 0.66은 명료도가 실제로 타격을 입었음을 말해줍니다 — 가볍게 처리된 녹음이 받을 점수보다 훨씬 낮습니다. 약 −27dB의 SI-SDR이 이를 확인해 줍니다: SI-SDR은 왜곡 에너지가 신호를 압도할 때마다 음수가 되며, 큰 음수는 단순한 잡음 추가가 아니라 큰 구조적 변화를 의미합니다. 10.46dB의 MCD는 높습니다. 명백히 합성처럼 들리지만 여전히 화자 일관성이 있는 공개된 TTS 시스템들은 대개 한 자릿수에 자리하므로, 10점 이상은 재합성과 원본 사이의 상당한 스펙트럼 포락선 표류를 가리킵니다.
ASR 기반 지표: 숫자 읽기
다섯 개의 텍스트 지표는 참조 전사와 가설(오디오가 실제로 무엇으로 전사되었는지) 사이의 하나의 레벤슈타인 정렬에서 나옵니다:
| 지표 | 범위 | 방향 | 의미 |
|---|---|---|---|
wer | ≥ 0 (대개 0–1, 1을 넘을 수 있음) | 낮을수록 좋음 | 단어 오류율: 치환 + 삭제 + 삽입을 참조 단어 수로 나눈 값 |
cer | 0–1 | 낮을수록 좋음 | 같은 발상을 문자 수준에서 적용 — 사소한 철자/토큰화 불일치에 더 관대함 |
mer | 0–1 | 낮을수록 좋음 | 일치 오류율 |
wil | 0–1 | 낮을수록 좋음 | 손실된 단어 정보 |
wip | 0–1 | 높을수록 좋음 | 보존된 단어 정보(1 − wil) |
실제 예: 참조 “the quick brown fox jumps over the lazy dog”를 가설 “the quick brown fox jumped over a lazy dog”와 비교(치환 하나, “jumps” → “jumped”, “the” 삭제 하나):
>>> from speechonnxmetrics import asr
>>> from speechonnxmetrics.asr import BASIC
>>> asr.wer(reference, hypothesis, normalizer=BASIC)
0.222
>>> asr.cer(reference, hypothesis, normalizer=BASIC)
0.116
WER 0.22는 대략 다섯 단어 중 하나가 틀렸다는 뜻입니다 — 눈에 띄며, 직접 들어볼 가치가 있습니다. 같은 쌍에서 CER이 더 낮은 이유는, 문자 수준 채점이 한 단어의 치환을 누락된 토큰 전체가 아니라 훨씬 긴 문자열 안의 몇 개의 문자 편집으로 취급하기 때문입니다. CER과 WER은 서로 다른 질문에 답하며 직접 비교할 수 없습니다. 자연스러운 음성에서 WER이 대략 0.3~0.4를 넘으면 대개 반올림 오차가 아니라 ASR 시스템이나 그것이 전사하는 오디오에 실제 문제가 있다는 뜻입니다.
speechonnxmetrics는 여러분을 대신해 텍스트를 정규화하지 않습니다 — 원시 비교는 대소문자와 구두점을 오류로 셉니다. 이는 정확한 전사 형식이 아니라 발음을 채점할 때는 대개 원하는 바가 아닙니다. 정규화기를 명시적으로 전달하세요: BASIC은 소문자화하고 공백을 정리하며, STRICT는 여기에 더해 축약형을 풀고 분음 부호, 구두점, 필러 단어를 제거합니다.
가장 중요한 주의사항
이 라이브러리의 모든 참조 없는 MOS 숫자는 사실의 측정이 아니라 모델의 예측입니다. UTMOS, DNSMOS, SIGMOS, NISQA는 각각 특정 언어와 녹음 환경의 특정 청취 테스트 데이터 집합으로 학습되었습니다. 주로 영어 스튜디오 녹음으로 학습된 예측기는 학습 중 본 적 없는 언어, 학습 패널이 평가한 적 없는 억양, 혹은 학습 분포 밖의 녹음 환경(전화 음성, 시끄러운 방, 저자원 마이크)을 잘못 판단할 수 있습니다. 모델이 거짓말을 하는 것이 아니라 외삽하는 것이며, 익숙하지 않은 입력으로부터의 외삽이야말로 신경망 예측기가 가장 신뢰할 수 없는 지점입니다.
예측된 MOS를 진실이 아니라 증거로 취급하세요. 이는 그것이 잘하는 것 — 큰 회귀를 잡아내고, 여러 후보를 서로 비교해 순위를 매기고, 사람이 직접 들어봐야 할 실행을 표시하는 것 — 에 대해서는 신뢰할 만합니다. 결정이 중요할 때 실제 청취 패널을 대체할 수는 없으며, 기반 모델이 판단하도록 학습되지 않은 언어나 환경에 대해 최종 결론이 되어서는 안 됩니다. 여러 예측기를 함께 보고하고, 그들 사이의 불일치를 평균으로 지워버릴 잡음이 아니라 직접 들어보라는 신호로 취급하는 것이 실용적인 완화책입니다.
이것이 비교를 쓸모 있게 만드는 이유
이 중 어느 것도 홀로는 유용하지 않습니다. 여러 엔진을 동등한 기준에서 비교해야 하는 순간 — 어떤 TTS 엔진, 어떤 STT 엔진, 어떤 향상 모델을 기본값으로 삼을지 — 에 유용해집니다. speechonnxmetrics가 평가하기 위해 만들어진 순수 ONNX 음성 라이브러리들 — TTS, ASR, 잡음 제거, 음성 복제 — 은 정확히 위의 지표들로 만들어진 엔진별 비교를 공개합니다: 정답이 없는 시스템에는 참조 없는 MOS, 깨끗한 참조가 존재하는 곳에는 침습적 지표, 전사의 정확성이 문제가 되는 곳에는 어디든 WER/CER을. 이것이 “우리는 이 엔진을 골랐습니다”를 다른 누군가가 확인할 수 있는 숫자로 바꿔주는 것입니다.
여러분의 프로젝트에 이런 방식으로 평가되어야 할 언어, 엔진, 또는 녹음 환경이 있는데 아직 다뤄지지 않았다면, 문의해 주시거나 저희 서비스를 확인해 보세요.