@@ -12,34 +12,30 @@ last_update:
1212
1313---
1414
15- PoC 를 통해 환각이 적고 사용 가능한 것으로 faster-whisper-large-v3 선정을 하기로 하였다. (사용 가능률/환각 비율 측정)
15+ PoC 통해 모델 별 비교 및 성능 테스트 해보았다.
1616
1717<!-- truncate-->
1818
19- 간단히 요약하면
19+ 그 과정에서 어떠한 최적화를 하였으며, 코드 수정을 어떤걸 하였나 기재하였다.
2020
21- 1 . transcribe 실행 하여 Specch-to-Text 진행. segment 결과 추출
22- 2 . for 루프 검사, 결과물 필터하여 모델 최적화
23-
24- 라고 할 수 있다.
2521
22+ - ** 최적화 1** | 정확도 — raw/denoised 분리 (95.2% vs 93.4%)
23+ - ** 최적화 2** | 환각 억제 — 공식 파라미터 3개 튜닝 (반복 환각, 검증한 기본값 표 포함) / VAD pre-filter · MIN_LOGPROB
24+ - ** 최적화 3** | 언어 오분류 — LID 저신뢰→ko 강제 · dual transcribe · 한글 비율 게이트
2625
2726---
2827
29- 밑에글 stt_service.py 내용으로 변경필요
30-
31- 목차
3228
3329---
3430
35- 3 . 문제 제기
36- 4 .
31+ 1 . 문제 제기
32+ 2 .
3733
3834---
3935
40- ### 1. transcribe
36+ ### 1. ** 최적화 2 **
4137
42- 인자 튜닝을 할 지 부터 생각해보았다.
38+ 파라미터 부터 보자
4339
4440``` python
4541# poc-stt-bench/ib/audio/whisper/whisper_stt.py
@@ -67,13 +63,14 @@ def _do_transcribe(audio_np: np.ndarray, language: str) -> tuple[list, float]:
6763 return segs, sum (s.avg_logprob for s in segs) / len (segs)
6864```
6965
70- - 해당 파라미터 값 (beam_size, log_prob_threshold 등) 조회 결과, 패키지 함수 시그니처에 있는 것과 동일함을 확인 (→ 일부 다름 확인)
71- - 시그니처란, 해당 오픈 소스에서 설정한 값을 의미
66+ | 파라미터 | 기본값 | 우리 값 | 역할 |
67+ | --- | --- | --- | --- |
68+ | ` condition_on_previous_text ` | ` True ` | ` False ` | 윈도우 간 반복 전파 차단 |
69+ | ` repetition_penalty ` | ` 1.0 ` | ` 1.2 ` | 반복 토큰 소프트 페널티 |
70+ | ` no_repeat_ngram_size ` | ` 0 ` | ` 3 ` | 3-gram 반복 하드 금지 |
7271
73- - PoC 에서도 동일하게 진행
7472
75-
76- ### 2. 결과물 필터
73+ ### 2. ** 최적화 3**
7774
7875---
7976
@@ -98,7 +95,9 @@ def _do_transcribe(audio_np: np.ndarray, language: str) -> tuple[list, float]:
9895
9996---
10097
101- #### 2-2) # 게이트 2 — dual transcribe + MIN_DUAL_LOGPROB (-0.6)
98+ #### 2-2) # 게이트 2 — dual transcribe + MIN_DUAL_LOGPROB (-1.0)
99+
100+ 세그먼트 평균 로그확률이 -1.0 (확률로 약 37%) 미만이면 버린다. 확신 없이 뱉은 환각의 catch-all.
102101
103102``` python
104103# poc-stt-bench/ib/audio/whisper/whisper_stt.py
@@ -126,6 +125,10 @@ MIN_SEG_S = 0.2 # drop segments shorter than this. preserves short inte
126125
127126#### 2-3) # 게이트 3- LID_TRUST_PROB
128127
128+ 언어 감지 확률이 0.5 미만이면서 비-한국어로 나오면 한국어로 강제한다.
129+ prob 0.23 같은 값은 "ko/ja/zh 가 다 비슷하다 = 모델이 모른다" 는 뜻이고,
130+ 한국어 메인 콘텐츠에서는 ** 한국어로 두는 것이 가장 안전한 가정** 이다.
131+
129132``` python
130133# 게이트 3- LID_TRUST_PROB
131134# Line 170
@@ -141,6 +144,10 @@ LID_TRUST_PROB = 0.5 # LID prob below this + non-main lang -> force MAIN_LAN
141144
142145#### 2-4) # 게이트4 — MIN_LOGPROB (-1.0)
143146
147+ 3초 미만 발화가 비-한국어로 감지되면, ** 한국어로도 · 감지 언어로도** 둘 다 전사한 뒤
148+ ` avg_logprob ` 이 높은 쪽을 채택한다. 양쪽 다 -0.6 미만이면 잡음으로 보고 버린다.
149+ 1\\ ~ 2초짜리 한국어가 음향적으로 일본어/중국어로 오분류되는 것을 막는 장치다.
150+
144151``` python
145152# 게이트 4 — dual transcribe + MIN_DUAL_LOGPROB (-0.6)
146153# Line 176
@@ -176,6 +183,9 @@ MAIN_LANG = "ko"
176183
177184#### 2-5) # 게이트 5 — 한글 char 비율 게이트 (30%)
178185
186+ 한국어로 인식됐는데 결과 텍스트의 한글 비율이 30% 미만이면 버린다.
187+ Whisper 가 한국어 모드에서 가나·한자 토큰을 환각으로 출력하는 케이스를 정확히 잘라낸다.
188+
179189``` python
180190# 게이트 5 — 한글 char 비율 게이트 (30%)
181191# Line 211
@@ -190,6 +200,8 @@ KO_MIN_HANGUL_RATIO = 0.3 # if Hangul ratio of ko transcription is below this -
190200 continue
191201```
192202
203+ > 이 다섯은 공식 문서에 없는, 한국어 콘텐츠를 보며 하나씩 만든 규칙이다.
204+ "어떤 환각을 봤고 → 어떤 게이트로 막았나" 가 이 프로젝트 최적화의 실체다.
193205
194206
195207---
0 commit comments