Projects/AI 아이트래킹 모델 프로젝트

[프로젝트] 5. 음성인식. Porcupine(웨이크워드) + Whisper(STT) + webrtcvad(발화구간) 파이프라인

ha2yong 2025. 9. 22. 16:23

전체 흐름(한 사이클)

  1. 웨이크워드 감지
    • hotword_detector_worker()가 Porcupine으로 16kHz, mono, 512샘플 프레임을 읽으며 키워드 대기
    • 감지되면 큐에 ("hotword_detected", device_index)를 넣고 스트림을 닫고 종료
      • 같은 마이크를 STT가 바로 열 수 있도록 충돌 방지
  2. STT 녹음 시작
    • record_and_transcribe(device_index=같은_인덱스) 호출
    • sounddevice.InputStream(..., dtype="int16")로 int16 모노로 입력
    • 콜백이 주는 가변 길이 오디오를 내부 byte 버퍼에 쌓고, 정확히 FRAME_MS(기본 20ms) 단위(= 320샘플 = 640바이트)로 프레임화
  3. VAD로 발화 구간 검출
    • 각 프레임을 webrtcvad.is_speech(frame, 16000)에 넣음
    • in_speech 전환 전에 PREROLL_FRAMES(기본 5프레임 ≈ 100ms) 를 계속 모았다가, 말이 시작되면 앞에 붙여서 문장 앞머리 잘림 방지
    • 말이 진행되는 동안은 음성 프레임을 voiced_chunks에 추가
  4. 침묵 타임아웃으로 종료
    • 말이 진행 중일 때 VAD가 연속 n 프레임의 무성(침묵) 을 보고하면 종료
    • 이 n은 MAX_SILENCE_SEC와 FRAME_MS로 정해집니다
      → pad_needed = int((MAX_SILENCE_SEC*1000)/FRAME_MS)
      • 예) MAX_SILENCE_SEC=0.8, FRAME_MS=20ms → 40프레임 연속 무성이면 종료
    • 또한 하드 상한으로 MAX_RECORD_SEC(기본 20초)을 넘으면 안전하게 종료
  5. Whisper 변환
    • 모은 voiced_chunks(int16 프레임들)를 이어붙여 bytes → 메모리 WAV로 만든 뒤 faster-whisper로 STT 수행
    • 결과 텍스트 출력
  6. 다시 웨이크워드 대기
    • starter.py가 루프를 돌면서 웨이크워드 워커 재기동

 

🎙️ 1. OpenAI Whisper

👉 범용 Speech-to-Text (STT) 모델

  • 목적: 음성을 텍스트로 변환 (음성 인식).
  • 특징:
    • OpenAI에서 공개한 대규모 Transformer 기반 음성 인식 모델.
    • 수십만 시간의 다국어 음성+자막 데이터로 학습됨.
    • 다국어 지원: 90개 이상 언어 인식 및 번역까지 가능.
    • 강인성: 잡음이 많거나 억양이 섞인 환경에서도 좋은 성능.
    • 버전: tiny → base → small → medium → large (모델 크기와 정확도/속도 트레이드오프).
    • 사용 방식:
      • 마이크나 파일 입력 → wave/wav/mp3 처리 → Whisper 모델 → 텍스트 결과.
      • GPU/CPU에서 실행 가능하지만, 큰 모델은 리소스 많이 사용.
  • 장점:
    • 범용성 (여러 언어, 일반 문장).
    • 강력한 정확도.
  • 단점:
    • 모델 크기가 크고 리소스 요구 높음 (실시간 처리 시 성능 고려 필요).
    • 클라우드/API나 GPU 환경이 권장됨.

🎯 2. Picovoice Porcupine

👉 초경량 웨이크워드(Hotword) 감지 엔진

  • 목적: 특정 “키워드”를 음성에서 실시간으로 감지 (“Hey Siri”, “Ok Google”, “헤이 류지” 같은 웨이크워드).
  • 특징:
    • Picovoice 사의 상용 솔루션.
    • On-device 동작을 목표로 설계 → 아주 가볍고 빠름.
    • CPU만으로도 저사양(라즈베리파이, IoT 기기)에서 실시간 감지 가능.
    • 다양한 플랫폼 지원: C, Python, Android, iOS, Raspberry Pi, WebAssembly 등.
    • 키워드(custom wake word)를 훈련시켜 원하는 단어를 감지 가능.
  • 장점:
    • 저지연·저전력 (항상 켜져 있어야 하는 웨이크워드에 최적).
    • 네트워크 필요 없음 (개인정보 보호 측면).
  • 단점:
    • 특정 키워드만 감지 (범용 음성인식 불가).
    • 키워드 감지 정확도는 높지만, 일반 문장 인식은 불가능.