@@ -29,6 +29,23 @@ import type { AudioState, AgentType, Civilization } from '@shared/types/common';
2929
3030// ── 유틸리티 ────────────────────────────────────────────────
3131
32+ /**
33+ * STT 출력의 불필요한 공백을 정리한다.
34+ * - 구두점 앞 공백 제거 (예: "괜찮 ." → "괜찮.")
35+ * - 한글 뒤 공백 + 1음절 한글 패턴 병합 (예: "큐레 이터" → "큐레이터")
36+ * - 연속 공백 축소
37+ */
38+ function cleanSttText ( text : string ) : string {
39+ return text
40+ // 구두점 앞 공백 제거
41+ . replace ( / \s + ( [ . , ! ? ] ) / g, '$1' )
42+ // 한글 + 공백 + 한글 1음절 + 한글 (분리된 음절 병합)
43+ . replace ( / ( [ \uAC00 - \uD7AF ] ) \s ( [ \uAC00 - \uD7AF ] ) ( [ \uAC00 - \uD7AF ] ) / g, '$1$2$3' )
44+ // 연속 공백 축소
45+ . replace ( / \s { 2 , } / g, ' ' )
46+ . trim ( ) ;
47+ }
48+
3249const VALID_CIVILIZATIONS : ReadonlySet < string > = new Set < Civilization > ( [
3350 'Greek' , 'Roman' , 'Egyptian' , 'Mesopotamian' , 'Chinese' ,
3451 'Japanese' , 'Korean' , 'Indian' , 'Persian' , 'Mayan' , 'Other' ,
@@ -148,22 +165,25 @@ function createSessionEvents(refs: SessionRefs, setters: SessionSetters): LiveSe
148165 } ,
149166
150167 onUserSpeech : ( data ) => {
168+ const cleaned = cleanSttText ( data . text ) ;
169+ if ( ! cleaned ) return ;
170+
151171 setters . setTranscript ( prev => {
152172 const last = prev [ prev . length - 1 ] ;
153173 // 같은 유저 턴이면 이어붙이기 (3초 내)
154174 if ( last && last . role === 'user' && Date . now ( ) - last . timestamp < 3000 ) {
155175 // 서브스트링이면 교체 (더 긴 버전으로 업데이트)
156- if ( data . text . includes ( last . text ) ) {
176+ if ( cleaned . includes ( last . text ) ) {
157177 return [
158178 ...prev . slice ( 0 , - 1 ) ,
159- { ...last , text : data . text , timestamp : Date . now ( ) } ,
179+ { ...last , text : cleaned , timestamp : Date . now ( ) } ,
160180 ] ;
161181 }
162182 // 완전히 다른 텍스트면 이어붙이기
163- if ( ! last . text . includes ( data . text ) ) {
183+ if ( ! last . text . includes ( cleaned ) ) {
164184 return [
165185 ...prev . slice ( 0 , - 1 ) ,
166- { ...last , text : last . text + ' ' + data . text , timestamp : Date . now ( ) } ,
186+ { ...last , text : last . text + ' ' + cleaned , timestamp : Date . now ( ) } ,
167187 ] ;
168188 }
169189 return prev ;
@@ -174,7 +194,7 @@ function createSessionEvents(refs: SessionRefs, setters: SessionSetters): LiveSe
174194 {
175195 id : `u-${ Date . now ( ) } ` ,
176196 role : 'user' ,
177- text : data . text ,
197+ text : cleaned ,
178198 timestamp : Date . now ( ) ,
179199 } ,
180200 ] ;
0 commit comments