Files
sam-kd/voice_ai_cnslt/record_dev.md
hskwon aca1767eb9 초기 커밋: 5130 레거시 시스템
- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경
- DB 연결 하드코딩 → .env 기반으로 변경
- MySQL strict mode DATE 오류 수정
2025-12-10 20:14:31 +09:00

8.0 KiB

음성 인식 민감도 향상 개발 문서

개요

음성 녹음 기능에서 작은 소리도 텍스트로 변환되도록 음성 인식 민감도를 향상시키는 개선 작업을 수행했습니다.

개선 일자: 2024년
대상 파일: voice_ai_cnslt/index.php

문제점

기존에는 마이크에 가까이서 말해야만 텍스트로 변환되는 문제가 있었습니다. 작은 소리나 멀리서 말한 경우 인식이 제대로 되지 않았습니다.

개선 내용

1. 오디오 증폭 (Audio Amplification)

1.1 GainNode를 이용한 오디오 증폭

  • 위치: startAudioStream() 함수
  • 기술: Web Audio API의 GainNode 사용
  • 증폭 배수: 3.0배 (기본값)
  • 목적: 작은 소리도 인식할 수 있도록 오디오 신호 증폭
// 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() 호출
  • 목적: 작은 소리 감지 향상을 위한 마이크 설정 최적화
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: falsenoiseSuppression: false는 작은 소리 감지에는 도움이 되지만, 주변 소음이 많은 환경에서는 노이즈가 증가할 수 있습니다.
  • 필요에 따라 환경에 맞게 조정이 필요할 수 있습니다.

3. Web Speech API 설정 최적화

3.1 maxAlternatives 설정

  • 위치: initSpeechRecognition() 함수
  • 목적: 더 많은 대안 결과를 허용하여 인식 정확도 향상
recognition.maxAlternatives = 3; // 더 많은 대안 결과 허용

3.2 기존 설정 유지

  • lang: 'ko-KR': 한국어 인식
  • continuous: true: 연속 인식 모드
  • interimResults: true: 중간 결과 표시

4. 에러 처리 개선

4.1 자동 재시작 로직 추가

  • 위치: setupRecognitionHandlers() 함수 내 recognition.onerror 핸들러
  • 목적: 일시적인 오류 발생 시 자동으로 재시작하여 인식 지속성 향상

4.2 처리하는 오류 유형

1. no-speech 오류

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 오류

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() 함수
  • 목적: 메모리 누수 방지 및 리소스 정리
// 오디오 노드 연결 해제
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. 환경별 테스트

    • 조용한 환경에서 테스트
    • 소음이 있는 환경에서 테스트
    • 필요시 echoCancellationnoiseSuppression 설정 조정

민감도 조정 가이드

증폭 배수 조정

// 현재 설정 (3.0배)
gainNode.gain.value = 3.0;

// 더 높은 민감도가 필요한 경우
gainNode.gain.value = 5.0;  // 5배 증폭
gainNode.gain.value = 7.0;  // 7배 증폭 (최대 권장값)

// 주의: 10 이상의 값은 오디오 왜곡을 유발할 수 있음

마이크 제약 조건 조정

// 조용한 환경에서 소음이 많은 경우
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. 노이즈 증가: echoCancellationnoiseSuppression을 비활성화하면 주변 소음이 증가할 수 있습니다. 환경에 따라 조정이 필요합니다.

  3. 브라우저 호환성:

    • Chrome 브라우저에서 최적의 성능을 보입니다
    • 다른 브라우저에서는 일부 기능이 제한될 수 있습니다
  4. 마이크 권한: 사용자가 마이크 권한을 허용해야 합니다.

향후 개선 방향

  1. 동적 민감도 조정: 사용자가 UI에서 민감도를 조정할 수 있는 슬라이더 추가
  2. 환경 감지: 주변 소음 레벨을 감지하여 자동으로 설정 조정
  3. 다양한 마이크 타입 지원: 다양한 마이크 타입에 최적화된 설정 제공

참고 자료

변경 이력

날짜 버전 변경 내용
2024 1.0 음성 인식 민감도 향상 기능 추가