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