1. 문제 정의: 왜 기기 지향성 탐지가 중요한가
스마트 스피커나 차량 인포테인먼트 시스템 앞에서 여러 사람이 대화할 때, 기기가意圖하지 않은 발화에 반응하는 상황은 빈번하다. 기존 웨이크워드 방식은 "헤이 시리"와 같은 고정 구문을 강제하므로 자연스러운 대화 흐름을 방해한다. 선택적 주의 시스템(Selective Attention System, SAS)은 이러한 한계를 극복하기 위해 설계된 세 단계 추론 파이프라인이다.
핵심 성능 지표는 다음과 같다:
- ARM Cortex-A 계열 프로세서에서 150ms 이하의 엔드투엔드 지연
- 오디오 단독 구성 시 F1 0.86, 비전 융합 시 0.95 달성
- 불필요한 ASR 호출 90% 이상 절감
- 웨이크워드 없는 연속 대화 지원
필드 테스트 결과, 전체 오작동의 83%가 기기 대화와 인간 간 대화를 구분하지 못해 발생했다. SAS는 이를 독립 분류 문제가 아닌 순차적 의사결정 과정(SDAR)으로 재정의한다.
2. 계층적 추론 아키텍처
2.1 파이프라인 개요
데이터 흐름은 다음과 같이 단계적으로 정제된다:
원시 오디오 → 기하학적 필터링 → 발화 의도 분류 → 상황적 적합성 판단 → 실행 여부 결정
후반 단계로 갈수록 연산 복잡도는 증가하지만, 실제 처리되는 데이터 규모는 기하급수적으로 감소한다. 벤치마크 결과, 제1단계에서 전체 비목표 음성의 62%가 선제 필터링되었다.
2.2 제1단계: 공간 음향 필터링
마이크로폰 어레이를 활용한 신호 처리 단계로, "소리가 어디서 왔는가"를 해결한다.
- TDOA(Time Difference of Arrival) 기반 도달 방향 추정
- MVDR(Minimum Variance Distortionless Response) 적응성 빔포머
- 주축 외 간섭 대역별 억제(일반적으로 20-25dB 감쇠)
4채널 선형 어레이, 2m 거리 조건에서 SNR 18dB 개선이 확인되었다. TV 소리나 에어컨 소음 같은 정적 소스 제거에 특히 효과적이다.
구성 권장사항:
- 최소 2채널(권장 4채널 선형 배열)
- 단일 프레임 처리 지연 <15ms
- 60°~120° 가변 수음 각도
2.3 제2단계: 효율적 의도 분류
"현재 발화가 기기를 향한 것인가"를 판단하는 경량 신경망.
| 속성 | 값 |
|---|---|
| 입력 특징 | 64빈 log-mel 필터뱅크 (25ms 윈도우, 10ms 홉) |
| 네트워크 구조 | 1D 합성곱 4층 → 양방향 GRU → 시그모이드 |
| 파라미터 규모 | 435K (INT8 양자화 후 520KB) |
| 추론 시간 | Cortex-A72 기준 8ms/발화 |
훈련 시 커리큘럼 학습을 적용한다:
- 2인 교대 대화로 초기 수렴
- 점진적 오버랩 음성 도입
- 3-4인 복잡한 교차 대화로 일반화
2.4 제3단계: 맥락 기반 상태 추정
가장 핵심적인 혁신으로, "현재 대화 상태에서 기기 응답이 적절한가"를 판단한다.
- 슬라이딩 8초 맥락 버퍼
- 경량 Transformer 인코더 (85K 파라미터)
- 엄격한 인과성 보장—미래 정보 참조 없음
- 출력: [0,1] 구간의 조정 계수
효과적인 대표적 시나리오:
- 앞선 대화를 참조하는 모호 명령 ("저거 말고 다시")
- 대화 중간 삽입되는 기기 지시
- 른 턴-taking 상황
2.5 비전 융합 확장
카메라 탑재 기기의 경우 추가 신호 활용:
- 경량 포즈 추출 파이프라인:
- 얼굴 방위각 (yaw/pitch)
- 시선 벡터 추정
- 입술 움직임 감지
- 제2단계 분류기의 최종 은닉층에서 특징 융합
- F1 0.86 → 0.95로 성능 향상
로봇 플랫폼 검증 결과, 3m 거리 내에서 시각 정보 결합 시 탐지 정확도가 27% 향상되었으며 특히 사용자가 기기 등을 돌린 상태에서도 안정적이다.
3. 핵심 구현 기법
3.1 MVDR 빔포머 구현
import numpy as np
def adaptive_mvdr(mic_array_signals, sensor_coords, estimated_doa):
"""
MVDR 빔포밍 핵심 구현
"""
# 공분산 행렬 추정 (대각선 로딩으로 수치 안정성 확보)
sample_cov = np.cov(mic_array_signals)
regularized = sample_cov + 1e-6 * np.eye(sample_cov.shape[0])
# 지향 벡터 구성
steering = compute_direction_vector(sensor_coords, estimated_doa)
# 최적 가중치 계산
numerator = np.linalg.solve(regularized, steering)
denominator = np.dot(steering.conj(), numerator)
optimal_weights = numerator / denominator
# 출력 신호 합성
return np.dot(optimal_weights.conj(), mic_array_signals)
실무상 주의사항:
- 공분산 행렬 특이성: 대각선 로딩 필수
- DOA 추정 불안정: GCC-PHAT + SRP-PHAT 하이브리드 적용 권장
- 실시간 제약: 블록 단위 재귀 공분산 갱신
3.2 분류기 훈련 전략
데이터 증강 파이프라인:
- 방향 임펄스 응답(RIR) 합성을 통한 다양한 공간 특성 부여
- 제어된 노이즈 주입 (SNR 15-30dB 범위)
- 타임 스트레칭으로 ±10% 속도 변형
손실 함수 개선—클래스 불균형 대응:
import torch
import torch.nn.functional as F
class BalancedFocalLoss(torch.nn.Module):
def __init__(self, pos_weight=0.25, focusing_param=2.0):
super().__init__()
self.alpha = pos_weight
self.gamma = focusing_param
def forward(self, predictions, ground_truth):
bce = F.binary_cross_entropy(predictions, ground_truth, reduction='none')
predicted_prob = torch.exp(-bce)
# 어려운 샘플에 자동 가중치 집중
modulating_factor = (1 - predicted_prob) ** self.gamma
return (self.alpha * modulating_factor * bce).mean()
3.3 인과적 Transformer 설계
import torch
from torch.nn import TransformerEncoder, TransformerEncoderLayer
class TemporalContextEncoder(torch.nn.Module):
def __init__(self, feature_dim=64, attention_heads=4, depth=3):
super().__init__()
self.position_embedding = torch.nn.Parameter(
torch.randn(1, 500, feature_dim) # 최대 500프레임 @ 100Hz
)
encoder_config = TransformerEncoderLayer(
d_model=feature_dim,
nhead=attention_heads,
dim_feedforward=256,
dropout=0.1,
batch_first=True
)
self.transformer_stack = TransformerEncoder(encoder_config, num_layers=depth)
def forward(self, sequence):
# sequence: [배치, 시간, 특징]
time_steps = sequence.size(1)
positioned = sequence + self.position_embedding[:, :time_steps, :]
# 미래 참조 차단 마스크 (핵심!)
causal_mask = torch.triu(
torch.ones(time_steps, time_steps),
diagonal=1
).bool().to(sequence.device)
return self.transformer_stack(positioned, mask=causal_mask)
설계 노하우:
- 위치 인코딩은 학습 가능한 파라미터가 사인-코사인 대비 수렴 속도 우위
- 어텐션 헤드 수는 4개가 복잡도-성능 트레이드오프 최적점
- 잔차 연결과 사전 LayerNorm으로 깊은 층 안정화
4. 엣지 배포 최적화
4.1 리소스 최적화 매트릭스
| 기법 | 메모리 절감 | 속도 향상 | 정확도 영향 |
|---|---|---|---|
| 대칭 양자화 (INT8) | 4배 | 1.8배 | F1 <0.5%p 하락 |
| 비구조적 프루닝 | 1.5배 | 1.2배 | F1 1.2%p 하락 |
| 순환 버퍼 재사용 | - | 1.3배 | 무 |
| 지수함수 LUT 근사 | - | 1.5배 | 미미 |
Mel 필터뱅의 삼각형 윈도우 계산을 LUT로 대체하면 특징 추출 단계에서 15% 가속 가능하다.
4.2 시나리오별 파라미터 튜닝
스마트 홈:
- 수음 패턴: 90° 집중
- VAD 임계: -30dB
- 결정 경계 τ: 0.7
차량 환경:
- 수음 패턴: 120° 광각
- AEC(음향 에코 제거) 필수 적용
- 결정 경계 τ: 0.8 (정밀도 우선)
서비스 로봇:
- 비전 융합 필수 활성화
- 머리 추적 예측 윈도우: 500ms
- 결정 경계 τ: 0.65 (재현율 우선)
5. 검증 결과
5.1 정량적 평가
| 구성 | 정밀도 | 재현율 | F1 | 지연(ms) |
|---|---|---|---|---|
| 오디오 전용 | 0.89 | 0.83 | 0.86 | 55 |
| 오디오+비전 | 0.97 | 0.93 | 0.95 | 142 |
| 단일 마이크 | 0.81 | 0.76 | 0.78 | 48 |
5.2 모듈별 기여도 분석
| 제외 모듈 | F1 변화 | 해석 |
|---|---|---|
| 제1단계 (공간 필터) | -0.23 | 기하학적 정보 필수 |
| 제2단계 (의도 분류) | -0.41 | 기본 분류 능력 핵 |
| 제3단계 (맥락 추정) | -0.38 | 시간적 맥락 가장 큰 영향 |
| 시각 입력 | -0.09 | 부가적이나 유의미 |
5.3 기존 방식과의 비교
| 관점 | SAS | 웨이크워드 |
|---|---|---|
| 상호작용 패턴 | 자연스러운 대화 | 고정 구문 필수 |
| 계산 부하 | 지속적 중간 부하 | 간헐적 고점 |
| 다중 기기 | 명확한 라우팅 | 충돌 가능 |
| 사용자 학습 | 불필요 | 구문 암기 필요 |
| 오작동률 | 2.1% | 0.5%-1% |
| 응답 지연 | 150ms | 200-300ms |
6. 응용 확장
6.1 스마트 홈 시나리오
근접 인식 라우팅:
다중 기기 환경에서 사용자 위치와 발화 방향을 종합해 가장 적절한 기기를 선택한다.
음성 입력 → SAS 분석 → 사용자 A → 거실 스피커
→ 사용자 B → 주방 디스플레이
민감 주제 자동 차단:
발화 내용의 의미적 분석을 통해 금융, 의료 등 민감 주제 감지 시 수동 승인 모드로 전환.
6.2 자동차 특화
- 엔진 회전수 연동 노이즈 스펙트럼 보상
- 좌석 위치별 마이크 게인 자동 보정
- 창문 개폐 상태에 따른 반향 특성 적응
80km/h 주행 시 노이즈 보상 적용으로 F1 0.82 이상 유지 확인.
6.3 산업 현장 맞춤화
| 제약 조건 | 대응 방안 |
|---|---|
| >85dB 고소음 | 산업 특화 노이즈 DB 구축, 제1단계 강건성 강화 |
| 방호마스크 음색 왜곡 | 전용 훈련 데이터 수집, 필터뱅크 파라미터 조정 |
| 폭발 방지 구역 | 비전 모듈 제외, 본질 안전 마이크로 교체 |
7. 구현 로드맵
단계적 접근 권장:
- 기초 단계: 빔포머 + 단순 분류기로 핵심 파이프라인 검증
- 확장 단계: 시간적 맥락 모듈 추가로 연속 대화 처리
- 완성 단계: 비전 융합으로 극한 조건 커버리지 확대
데이터 수집 원칙:
- 실제 환경의 다양한 배경 소음 반영
- 연령대·지역별 억양 스펙트 다양화
- 스크립트 기반 녹음보다 자연 대화 우선
검증 방법론:
- 대항적 테스트: "저기 [긴 침묵] 불 켜줘" 같은 중간 중단 패턴
- 다중 동시 웨이크워드 시나리오
- SNR 별 구간 성능 곡선 측정
핵심 통찰은 단순한 "지금 이 소리가 기기를 향했는가"를 넘어, "현재 대화의 어떤 상태인가"를 이해하는 것이다. 이 맥락적 인식이 사용자 경험의 질적 도약을 가져온다.