연구노트

R&E 연구노트 ⑱ 목소리를 어떻게 알아듣는가, Transformer·Whisper·VAD

2마지막 수정
R&E 연구노트 ⑱ 목소리를 어떻게 알아듣는가, Transformer·Whisper·VAD

연구노트 시리즈.

Transformer와 self-attention

현대 음성·언어 모델의 바탕은 Transformer다. 순환 구조나 합성곱 없이 self-attention만으로 시퀀스를 처리한다. 입력을 쿼리·키·값 세 벡터로 바꾼 뒤, 쿼리와 키의 내적으로 "어디에 주목할지"를 정하고 값들을 가중합한다. 내적 값은 키 차원의 제곱근으로 나눠 분산을 안정화한다. 서로 다른 표현 부분공간을 동시에 보는 다중 헤드 어텐션을 쓰고, 순서 정보가 명시되지 않으므로 사인·코사인 기반 위치 인코딩을 입력에 더한다. 이 구조가 이후 거의 모든 대규모 언어·음성 모델의 토대가 됐다.

Whisper

음성 인식 모델로는 OpenAI Whisper를 썼다. Transformer 인코더-디코더 구조이고, 약 68만 시간의 다국어 음성으로 약지도 학습됐다(영어 약 43.8만, 비영어 약 11.7만, 음성 번역 약 12.5만 시간). 특수 토큰으로 전사, 번역, 언어 식별을 한 모델에서 처리하도록 설계된 점이 독특하다.

입력은 오디오를 바로 넣지 않고 시간-주파수 표현으로 바꾼다.

  1. STFT(단시간 푸리에 변환): 윈도를 씌워 짧은 구간씩 푸리에 변환한다. Whisper는 25ms 윈도, 10ms hop, FFT 크기 400을 쓴다.
  2. 파워 스펙트럼: 진폭의 제곱을 구한다.
  3. 멜 필터뱅크: 사람 청각 특성을 반영해 80개 멜 채널로 매핑한다.
  4. 로그 압축: 음압을 로그 스케일로 인지하는 청각 특성에 맞춰 동적 범위를 줄인다.

모델 규모와 이중 구조

Whisper는 여러 크기를 제공한다.

모델 파라미터 상대 속도 특징
tiny 39M ~32배 저사양 임베디드 적합
base 74M ~16배 키오스크 권장
small 244M ~6배 균형
medium 769M ~2배 고정확도
large 1,550M 1배 최고 성능, 서버용

키오스크는 실시간 반응성과 한국어 정확도를 둘 다 원한다. 그래서 발화 중에는 tiny 모델로 부분 인식 결과를 즉시 보여주고, 발화가 끝나면 medium 모델로 문장 단위 최종 결과를 확정하는 이중 모델 구조를 택했다. 저사양에서도 반응성과 정확도를 함께 잡는 절충이다.

발화를 어떻게 끊는가

음성 활동 감지(VAD)는 오디오에서 말하는 구간과 침묵 구간을 가른다. 침묵을 인식 엔진에 넘기지 않으면 처리가 가벼워지고 잡음 오인식도 준다. 통계 기반은 빠르지만 잡음에 약하고, 신경망 기반은 강건하지만 무겁다. 그래서 둘을 병행했다.

  • WebRTC VAD(민감도 2)가 발화 시작을 빠르게 감지한다.
  • Silero VAD(민감도 0.4)가 신경망으로 정밀 검증한다.

무음이 0.7초 이상 지속되면 발화 종료로 판정한다. 링버퍼로 발화 시작 직전의 오디오를 보존해, 첫 음절이 잘리지 않게 했다. 서버는 RealtimeSTT와 Flask·WebSocket으로 구성하고, 들어온 오디오는 16kHz로 리샘플링하며, 인식 언어는 한국어로 고정해 자동 판별 오류를 줄였다.

변경 이력 (2건)
  1. gitprogam 수정feat(binaryhub-blog): tetris 위키 + SEO 정비 + hero 이미지 + 글 다수
  2. gitprogam 최초 작성init: monorepo (nsgh-tools + binaryhub-blog)

관련 글