# 음성 인식 민감도 향상 개발 문서 ## 개요 음성 녹음 기능에서 작은 소리도 텍스트로 변환되도록 음성 인식 민감도를 향상시키는 개선 작업을 수행했습니다. **개선 일자**: 2024년 **대상 파일**: `voice_ai_cnslt/index.php` ## 문제점 기존에는 마이크에 가까이서 말해야만 텍스트로 변환되는 문제가 있었습니다. 작은 소리나 멀리서 말한 경우 인식이 제대로 되지 않았습니다. ## 개선 내용 ### 1. 오디오 증폭 (Audio Amplification) #### 1.1 GainNode를 이용한 오디오 증폭 - **위치**: `startAudioStream()` 함수 - **기술**: Web Audio API의 `GainNode` 사용 - **증폭 배수**: 3.0배 (기본값) - **목적**: 작은 소리도 인식할 수 있도록 오디오 신호 증폭 ```javascript // GainNode 생성 및 증폭 설정 gainNode = audioContext.createGain(); gainNode.gain.value = 3.0; // 3배 증폭 // 오디오 체인: Source -> Gain -> Analyser audioSource.connect(gainNode); analyser = audioContext.createAnalyser(); gainNode.connect(analyser); ``` #### 1.2 변수 추가 - `gainNode`: 오디오 증폭을 위한 GainNode 객체 - `audioSource`: 오디오 소스 객체 ### 2. 마이크 제약 조건 최적화 #### 2.1 오디오 제약 조건 설정 - **위치**: `startAudioStream()` 함수 내 `getUserMedia()` 호출 - **목적**: 작은 소리 감지 향상을 위한 마이크 설정 최적화 ```javascript const audioConstraints = { audio: { echoCancellation: false, // 에코 캔슬 비활성화 noiseSuppression: false, // 노이즈 억제 비활성화 autoGainControl: true, // 자동 게인 제어 활성화 sampleRate: 48000, // 높은 샘플레이트 channelCount: 1 // 모노 채널 } }; ``` #### 2.2 설정 상세 설명 | 설정 | 값 | 설명 | |------|-----|------| | `echoCancellation` | `false` | 에코 캔슬을 비활성화하여 작은 소리도 감지하도록 함 | | `noiseSuppression` | `false` | 노이즈 억제를 비활성화하여 작은 소리도 감지하도록 함 | | `autoGainControl` | `true` | 자동 게인 제어를 활성화하여 입력 신호를 자동으로 조정 | | `sampleRate` | `48000` | 높은 샘플레이트로 더 정확한 오디오 캡처 | | `channelCount` | `1` | 모노 채널 사용 | **주의사항**: - `echoCancellation: false`와 `noiseSuppression: false`는 작은 소리 감지에는 도움이 되지만, 주변 소음이 많은 환경에서는 노이즈가 증가할 수 있습니다. - 필요에 따라 환경에 맞게 조정이 필요할 수 있습니다. ### 3. Web Speech API 설정 최적화 #### 3.1 maxAlternatives 설정 - **위치**: `initSpeechRecognition()` 함수 - **목적**: 더 많은 대안 결과를 허용하여 인식 정확도 향상 ```javascript recognition.maxAlternatives = 3; // 더 많은 대안 결과 허용 ``` #### 3.2 기존 설정 유지 - `lang: 'ko-KR'`: 한국어 인식 - `continuous: true`: 연속 인식 모드 - `interimResults: true`: 중간 결과 표시 ### 4. 에러 처리 개선 #### 4.1 자동 재시작 로직 추가 - **위치**: `setupRecognitionHandlers()` 함수 내 `recognition.onerror` 핸들러 - **목적**: 일시적인 오류 발생 시 자동으로 재시작하여 인식 지속성 향상 #### 4.2 처리하는 오류 유형 **1. `no-speech` 오류** ```javascript if (event.error === 'no-speech') { // 음성이 감지되지 않음 - 자동 재시작 (작은 소리도 감지하도록 지속 시도) if (isRecording) { setTimeout(() => { try { if (isRecording && !isRecognitionActive) { recognition.start(); } } catch (e) { console.log('Recognition restart after no-speech:', e); } }, 500); } return; } ``` **2. `network` 오류** ```javascript if (event.error === 'network') { // 네트워크 오류 시 자동 재시도 if (isRecording) { setTimeout(() => { try { if (isRecording && !isRecognitionActive) { recognition.start(); } } catch (e) { console.log('Recognition restart after network error:', e); } }, 1000); } return; } ``` ### 5. 리소스 정리 개선 #### 5.1 오디오 노드 연결 해제 - **위치**: `stopAudioStream()` 함수 - **목적**: 메모리 누수 방지 및 리소스 정리 ```javascript // 오디오 노드 연결 해제 if (audioSource) { try { audioSource.disconnect(); } catch (e) { console.log('Audio source disconnect:', e); } audioSource = null; } if (gainNode) { try { gainNode.disconnect(); } catch (e) { console.log('Gain node disconnect:', e); } gainNode = null; } if (analyser) { try { analyser.disconnect(); } catch (e) { console.log('Analyser disconnect:', e); } analyser = null; } ``` ## 기술 스택 - **Web Audio API**: 오디오 증폭 및 처리 - **Web Speech API**: 음성 인식 - **MediaRecorder API**: 오디오 녹음 - **getUserMedia API**: 마이크 접근 ## 테스트 방법 1. **기본 테스트** - 마이크에서 약 30cm 이상 떨어진 거리에서 말하기 - 작은 목소리로 말하기 - 정상적으로 텍스트로 변환되는지 확인 2. **민감도 조정 테스트** - 증폭 배수를 조정하여 테스트 - `gainNode.gain.value` 값을 변경 (3.0 → 5.0 또는 7.0) - 너무 높은 값은 오디오 왜곡을 유발할 수 있으므로 주의 3. **환경별 테스트** - 조용한 환경에서 테스트 - 소음이 있는 환경에서 테스트 - 필요시 `echoCancellation`과 `noiseSuppression` 설정 조정 ## 민감도 조정 가이드 ### 증폭 배수 조정 ```javascript // 현재 설정 (3.0배) gainNode.gain.value = 3.0; // 더 높은 민감도가 필요한 경우 gainNode.gain.value = 5.0; // 5배 증폭 gainNode.gain.value = 7.0; // 7배 증폭 (최대 권장값) // 주의: 10 이상의 값은 오디오 왜곡을 유발할 수 있음 ``` ### 마이크 제약 조건 조정 ```javascript // 조용한 환경에서 소음이 많은 경우 audio: { echoCancellation: true, // 에코 캔슬 활성화 noiseSuppression: true, // 노이즈 억제 활성화 autoGainControl: true, sampleRate: 48000, channelCount: 1 } // 작은 소리 감지가 최우선인 경우 (현재 설정) audio: { echoCancellation: false, // 에코 캔슬 비활성화 noiseSuppression: false, // 노이즈 억제 비활성화 autoGainControl: true, sampleRate: 48000, channelCount: 1 } ``` ## 주의사항 1. **오디오 왜곡**: 증폭 배수가 너무 높으면 오디오가 왜곡될 수 있습니다. 권장 범위는 3.0 ~ 7.0입니다. 2. **노이즈 증가**: `echoCancellation`과 `noiseSuppression`을 비활성화하면 주변 소음이 증가할 수 있습니다. 환경에 따라 조정이 필요합니다. 3. **브라우저 호환성**: - Chrome 브라우저에서 최적의 성능을 보입니다 - 다른 브라우저에서는 일부 기능이 제한될 수 있습니다 4. **마이크 권한**: 사용자가 마이크 권한을 허용해야 합니다. ## 향후 개선 방향 1. **동적 민감도 조정**: 사용자가 UI에서 민감도를 조정할 수 있는 슬라이더 추가 2. **환경 감지**: 주변 소음 레벨을 감지하여 자동으로 설정 조정 3. **다양한 마이크 타입 지원**: 다양한 마이크 타입에 최적화된 설정 제공 ## 참고 자료 - [Web Audio API - MDN](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) - [Web Speech API - MDN](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API) - [MediaDevices.getUserMedia() - MDN](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia) ## 변경 이력 | 날짜 | 버전 | 변경 내용 | |------|------|----------| | 2024 | 1.0 | 음성 인식 민감도 향상 기능 추가 |