Files
sam-kd/voice_ai_cnslt/record_dev.md

255 lines
8.0 KiB
Markdown
Raw Permalink Normal View History

# 음성 인식 민감도 향상 개발 문서
## 개요
음성 녹음 기능에서 작은 소리도 텍스트로 변환되도록 음성 인식 민감도를 향상시키는 개선 작업을 수행했습니다.
**개선 일자**: 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 | 음성 인식 민감도 향상 기능 추가 |