이 글은 S3 운영 오디오를 클립 단위로 라벨링하기 위해 구성한 데이터 구조와 작업 절차를 설명한다. 라벨 원장, 자동 판정, 작업 배정 필드가 어떤 역할을 하는지 확인할 수 있다.

1. 라벨링 시스템의 필요성
버디버드앱의 핵심 기능을 위해서는 아래 기술을 개발해야 한다.
- 앵무새 소리 여부 판별 모델: 비앵무새 소리를 제외하는 단계
- 모사 성공 여부 판정 모델: 보호자 녹음 샘플과 비교하여 앵무새가 말하기에 성공했는지 판정
그러기 위해서는 앵무 / 비앵무(앵무새 소리가 아닌 잡음)데이터가 필요하다. 또한 앵무새의 단어 모사 데이터도 필요하다.
하지만 시중에 앵무새 음성을 다루는 데이터셋은 사실상 전무하다. 따라서 공개된 오디오 소스와 버디버드 앱에서 오디오 클립을 직접 수집해야 했다.
이렇게 수집된 클립에는 라벨이 없으므로, 이를 사람이 직접 듣고, 어떤 소리인지 라벨을 부여하는 시스템이 필요했다.
2. 목표
수집한 오디오 클립을 두 모델의 학습과 평가에 사용할 수 있는 라벨 데이터로 변환하는 것이다.
필요한 판정 항목은 다음과 같다.
| 판정 항목 | 기록 내용 | 활용 대상 |
|---|---|---|
| 소리 유형 | 앵무, 비앵무, 판단불가 | 앵무새 소리 여부 판별 모델 |
| 앵무 발성 | 비발화, 단어 모사, 판단불가 | 모사 성공 여부 판정 모델 |
| 라벨링 정보 | 라벨링 담당자, 라벨 저장 시각, 메모 | 판정 근거 추적 |
미라벨링과 판단불가는 서로 다른 상태로 관리한다.
- 미라벨링: 아직 판정을 시작하지 않은 상태
- 판단불가: 클립을 확인했지만 소리를 판정하기 어려운 경우
3. 라벨링 진행 모습
웹 UI는 한 화면에서 재생, 라벨 선택, 메모 작성, 저장을 완료하도록 구성했다. 라벨링 담당자는 숫자 키 프리셋으로 자주 사용하는 라벨 조합을 선택한다. 한 클립에서 여러 특성을 확인하면 라벨링 담당자가 라벨 행을 추가한다.

그림 2: 실제 UI 구조를 가상 식별자와 가상 파형으로 렌더링한 화면
- 단축키를 사용하여 빠르게 라벨링 및 저장이 가능하도록 했다.
4. 데이터 필드
manifest.jsonl은 한 줄에 클립 한 개를 JSON 객체로 저장한다.
4.1 클립의 기본 정보를 담은 필드
| 필드 | 형식 | 설명 |
|---|---|---|
audio_file_id |
문자열 | 원본 WAV와 라벨을 연결하는 고유 키 |
source |
문자열 | 오디오 출처. s3-prod , direct-recording등 이 오디오가 어디에서 수집 되었는지 |
user_id |
문자열 또는 null |
같은 사용자에 속한 클립을 연결하는 내부 식별자 |
session_id |
문자열 또는 null |
같은 수집 세션에 속한 클립을 연결하는 식별자 |
duration_sec |
숫자 또는 null |
오디오의 길이 |
first_seen |
날짜 문자열 | 클립을 manifest.jsonl에 처음 편입한 날짜 |
(예시)
"audio_file_id": "audio_capture/example/session-example.wav",
"source": "s3-prod",
"user_id": "synthetic-user",
"session_id": "session-example",
"duration_sec": 2.4,
"first_seen": "2026-09-12",
4.2 라벨링 필드
라벨링을 저장하면 서버가 판정 내용과 저장 이력을 다음 필드에 기록한다. 코드 필드명은 기존 연동을 위해 reviewed_at과 reviewer를 유지한다.
| 필드 | 형식 | 설명 |
|---|---|---|
label |
객체 배열 | 클립에서 확정한 구조화 라벨 목록. 한 클립에 여러 label을 추가 가능하다. |
memo |
문자열 | 구조화 라벨만으로 표현하기 어려운 판정 근거와 추가 사항 |
reviewed_at |
시간 문자열 또는 null |
라벨링 저장 요청이나 자동 음량 게이트 결과를 기록한 UTC 시각 |
reviewer |
문자열 또는 null |
사람 또는 자동 처리 주체의 식별자 |
(예시)
"reviewed_at": "2026-09-12T03:00:00+00:00",
"reviewer": "labeler-id",
"memo": "추가 확인 사항",
"label": [
{"category": "새 소리", "option": "비발화"}
],
4.3 판정 편의를 위한 필드
maxwin_db: 음량이 너무 작은 음원의 경우, 명확한 분류가 불가함. 편의를 위해 해당 음원의 음량값을 필드로 표시step2_results: 데모앵무새 소리 여부 판별 모델(parrot sound gate)로 앵무/비앵무를 예측한 결과. 아직 데모이기에 정확하지 못하므로, 라벨링 시 참고 용도로 사용했다.
~
(예시)
"maxwin_db": -24.52,
"step2_results": [
{
"version": "1.0.0",
"processed_at": "2026-09-12T02:00:00+00:00",
"parrot_sound_gate": true,
"p": 0.82,
"threshold": 0.6
}
]
| 필드 | 형식 | 설명 |
|---|---|---|
maxwin_db |
숫자 또는 null |
최대 RMS의 dBFS 값 (음량) |
step2_results |
객체 배열 | 버전별 자동 판정 결과 전체 |
version |
문자열 | 모델, 전처리, 판정 기준을 구분하는 버전 |
processed_at |
시간 문자열 | 해당 버전의 모델을 실행한 UTC 시각 |
parrot_sound_gate |
불리언 | 앵무새 소리 후보 여부 |
p |
0부터 1 사이 숫자 | 모델이 계산한 앵무새 소리 예측 점수 |
threshold |
0부터 1 사이 숫자 또는 null |
후보 판정에 사용한 임계값 |
5. 라벨링 데이터 종합: 백오피스 시스템
팀원 셋이서 라벨링한 결과를 자체 백오피스 시스템에 업로드하여 종합한다.

그림 4: 라벨 결과를 확인할 수 있는 버디버드 백오피스 화면
