버디버드라는 앵무새에게 말을 가르치는 서비스를 개발중입니다. 아래는 그 과정에 대한 기록입니다.


1. 전체 구조

0. VAD 클립 입력
1. 음량 게이트(loudness_gate) 
  — 너무 조용해 판별이 어려운 클립을 차단하는 게이트 (too_quiet)
2. 앵무새 소리 여부 판별(parrot-sound_gate) 
  — 사람 음성·TV 소리 등 비앵무새 소리를 차단하는 게이트
3. biodenoising 
  — 앵무새 소리를 제외한 노이즈 제거 (현재 고려하지 않음)
4. 모사 성공 여부 판정(mimicry-judgement) 
  — 보호자 녹음 샘플과 VAD 클립을 비교

이 중 2. 앵무새 소리 여부 판별(parrot-sound_gate)의 v1.0.0을 다루는 포스팅이다.


편의를 위한 용어 정리!

모든 오디오 클립은 아래 두가지 부류로 구분된다. 이 gate는 아래 두가지 부류를 구분하는 것이 목표이다.

  • 앵무 소리
  • 비앵무 소리: 사람 소리, TV소리, 잡음 등 앵무새 소리가 아닌 모든 소리

2. 데이터셋 구성

클래스 개수
앵무 503
비앵무 1819

2-1. 앵무 데이터

앵무새 종 개수
conure 151
lovebird 150
cockatiel 89
budgerigar 60
quaker 44
cockatoo 7
patagonian_conure 2

2-2. 비앵무 데이터

모집단 개수
팀에서 직접 녹음한 사람 음성 40
buddybird-prod S3 사람 음성 859
buddybird-prod S3 잡음 920

3. 평가 분할 방식

프로토콜 분할 기준 용도
LOSO 대표 지표, 학습에 없던 종 일반화
LOIO 개체 보조 지표, 개체 단위 엄격 분할
kfold 클립 층화 5겹 낙관 편향 상한 참고
  • LOSO(leave-one-species-out): 앵무 종 하나를 테스트로 홀드아웃하고 나머지 종으로 학습한다. 고객 앵무는 항상 학습에 없던 개체이므로 이 방식을 대표 지표로 본다.
  • LOIO(leave-one-individual-out): 개체 하나를 테스트로 홀드아웃하고 나머지 개체로 학습한다. 학습에 없던 개체 일반화를 더 엄격하게 측정한다.
  • kfold: 전체를 층화 5겹으로 나눠 채점한다. 같은 개체가 학습과 테스트에 함께 들어가 낙관 편향이 있어 상한 참고로만 본다.

4. 평가 지표

지표 정의 민감한 오류
재현율 recall 실제 앵무 중 통과시킨 비율 앵무 누락
정밀도 precision 통과시킨 것 중 실제 앵무 비율 사람 음성 오통과

사람 음성 오통과는 4단계에서 모사 성공 오탐으로 이어지는 가장 비싼 오류다. 정밀도는 이 오

5. 모델 구조

사전학습 인코더 Google Perch 2.0로 오디오를 임베딩한다. 이 임베딩을 기준으로 앵무/비앵무를 분류하는 선형 probe를 학습한다.

5-1. Google Perch 2.0 인코더 파라미터

생물음향데이터로 학습된 인코더이다.

항목
모델 Perch 2.0
임베딩 차원 1536
리샘플 32kHz
창 길이 5초
홉 길이 2.5초
피크 정규화 0.25
창 풀링 평균

5-2. probe 파라미터

항목
전처리 표준화
분류기 L2 로지스틱 회귀
클래스 가중 균형
규제 강도 C 0.2154, 내부 교차검증 선택

probe 운영 임계값 τ 산정

정책 R2를 채택한다.

사람 음성 오통과율(FAR) 상한을 2%로 정하고 그 안에서 앵무 재현율을 최대화한다. 운영 임계값 τ는 0.0378이다.

probe는 클래스 1 = 앵무(parrot)의 확률(0~1)을 도출한다.

  • 앵무 확률 ≥ τ(0.0378) → 앵무 (통과)
  • 앵무 확률 < τ(0.0378) → 비앵무 (차단)

고려했던 대안 정책 비교:

정책 사람 FAR 상한 τ 전체 재현율 conure 재현율 판정
R1 3% 0.015 0.972 0.927 사람 오통과 2.9%로 상한 근접
R2 2% 0.0378 0.966 0.914 채택
R3 1% 0.077 0.950 0.874 conure 재현율 보수적
R4 사람 1%, 잡음 5% 0.077 0.950 0.874 R3과 동일 τ
하한 0.5% 0.600 0.837 0.656 conure 재현율 급락

6. 성능

운영 임계값 τ=0.0378에서의 성능

지표 지표 정의
전체 앵무 재현율 0.966 실제로 앵무인 클립 중에서 앵무로 판정된 비율
사람 음성 오통과율 0.019 사람 음성 클립 중 앵무로 잘못 판정된 비율
잡음 오통과율 0.020 잡음 클립 중 앵무로 잘못 판정된 비율

LOSO 종별 분리도:

표본 재현율 ROC-AUC
conure 151 0.967 0.9958
lovebird 150 1.000 1.0000
cockatiel 89 1.000 1.0000
budgerigar 60 0.967 0.9988
quaker 44 1.000 1.0000
cockatoo 7 1.000 0.9995
patagonian_conure 2 1.000 1.0000

종별 재현율은 폴드마다 사람 FAR 2% 상한에서 임계값을 다시 선택한 값이다. kfold 낙관 상한은 ROC-AUC 0.9999, 전체 재현율 1.000이다.

지표는 두 가지로 판정한다.

  • 균형정확도를 0.5 임계값에서 계산하면 하드 네거티브 유입으로 캘리브레이션이 이동해 대표성이 낮아진다. conure는 0.841로 감소한다.

  • ROC-AUC로 임계 무관 분리도를, 재현율로 운영점 성능을 판정한다.

정리

현재 2322개 클립으로도 gate 성능이 높은 것이 확인되었다. 추후 buddybird-prod S3에 실제 사용자의 데이터가 쌓이는 대로, 다음 버전으로 개선할 예정이다.

기타

오디오 전체에 걸쳐 잡음이 앵무새 소리보다 크게 나타나는 경우 ‘비앵무(non_parrot)’으로 처리되는 경향이 있다.

또한 conure의 재현율이 떨어진 이유는 ‘코뉴어_김공룡’의 단어 말하기 발화가 저음이고 톡특하기 때문인 것으로 판단된다. 그 외 개체의 단어 말하기 발화는 모두 정확이 분류되었다.

LOSO에서 FN(실제 앵무이나 비앵무로 판단된 클립)을 살펴보면 아래와 같다.

  • conure종 김공룡 발화 클립이 13개
  • budgerigar종 클립이 4개