BuddyBird Parrot Mimicry Judgment v1.0.0
English
Glossary
| Term | Meaning |
|---|---|
| Mimicry (mimic) | A parrot sound that imitates the target word |
| Non-speech (non_speech) | An ordinary parrot sound that does not imitate a word (chirps and the like) |
| Guardian reference (reference) | A recording of the guardian saying the target word |
Model description
This model judges whether a parrot successfully imitated a target word.
- The query clip and the guardian references are converted to ContentVec features (hidden layer 8).
- The query is compared with each reference in the reference set (up to 20) by full DTW, and the similarities are averaged.
- The average is converted to a percentile within the cohort and compared with the threshold 0.9915.
| File | Contents |
|---|---|
inference.py, judge/ |
Judgment code |
manifest.json |
Settings, threshold, pool and cohort lists, SHA-256 of each file. Bundle version 1.1.0 |
pool_features.npz, cohort_features.npz, pool_cohort_pairs.npy |
Precomputed features of the pool and the cohort, and their similarity table |
Intended use
- Input: one clip that the upstream
buddybird-ai/parrot-sound-gateaccepted as a parrot sound, one target word, and zero or more own references. - To judge several candidate words, call once per word.
- The model targets small and medium parrots.
Getting started
This release uses Python 3.12 and uv.
hf download buddybird-ai/parrot-mimicry-judgment --revision v1.0.0 --local-dir parrot-mimicry-judgment
cd parrot-mimicry-judgment
uv sync --frozen
The first call downloads the ContentVec weights (about 380 MB).
from inference import MimicryJudgment
model = MimicryJudgment.from_pretrained(
"buddybird-ai/parrot-mimicry-judgment",
revision="v1.0.0",
)
result = model.predict_file(
"query.wav",
word="์๋
",
own_paths=["guardian_annyeong_1.wav", "guardian_annyeong_2.wav"],
account_id="<account id>",
)
print(result)
# {"is_success": True, "score": 99.6..., "status": "ok", "n_own": 2, "n_fill": 18, "set_size": 20}
In-memory waveforms are judged with predict_waveform. From the command line:
uv run --frozen python inference.py query.wav --word ์๋
--ref guardian_1.wav --account-id <account id> --revision v1.0.0
Output
| Key | Type | Meaning |
|---|---|---|
is_success |
bool | Whether the imitation succeeded. Do not recompute it from score |
score |
float or null | Cohort percentile x 100. Null when not judged |
status |
str | ok, no_reference (no references), unsupported_species |
n_own, n_fill, set_size |
int | Own references in the set, pool references in the set, and their total |
Data
| Split | Accounts | Accurate mimicry | Non-speech | Guardian references |
|---|---|---|---|---|
| Development | 172 | 959 | 32,916 | 271 |
| Test | 40 | 152 | 3 | 121 |
Evaluation
Cross-validation numbers come from account-level 5-fold cross-validation on the development data, repeated 10 times. Test numbers apply the pool, cohort and threshold fixed on the development data, unchanged, to 40 accounts never used in development (account-level bootstrap 95% confidence intervals).
| Metric | Cross-validation | Test | Test n |
|---|---|---|---|
| Per-account non-speech FAR, 75th percentile | 3.4% | not measurable | 3 |
| Recall, all words | 31.3% | 49.6% [37.3%, 61.4%] | 152 |
| Recall, ์๋ | 29.9% | 30.0% [14.9%, 42.4%] | 74 |
| Recall, ์๋ ํ์ธ์ | 58.1% | 59.8% [45.1%, 73.5%] | 52 |
| Recall, ์ฌ๋ํด | 14.7% | 92.9% [49.4%, 100.0%] | 14 |
| Recall, ๊น๊ฟ | 59.2% | 75.8% [42.9%, 91.8%] | 12 |
| Wrong-word FAR | 5.9% | 6.5% [4.2%, 8.8%] | 3,017 |
Credit
This work was supported by the Institute of Information & Communications Technology Planning & Evaluation (IITP) grant funded by the Ministry of Science and ICT (MSIT) (IITP-2026-AIยทSW Maestro)
ํ๊ตญ์ด
์ฉ์ด ์ ๋ฆฌ
| ์ฉ์ด | ๋ป |
|---|---|
| ๋ชจ์ฌ(mimic) | ์ต๋ฌด์๊ฐ ๋ชฉํ ๋จ์ด๋ฅผ ๋ฐ๋ผ ํ ์๋ฆฌ |
| ๋น๋ฐํ(non_speech) | ๋จ์ด๋ฅผ ๋ฐ๋ผ ํ์ง ์์ ์ผ๋ฐ์ ์ธ ์ต๋ฌด์ ์๋ฆฌ(์งน์งน ๋ฑ) |
| ๋ณดํธ์ ๊ธฐ์ค์์ฑ(reference) | ๋ณดํธ์๊ฐ ๋ชฉํ ๋จ์ด๋ฅผ ๋ฐ์ํ ๋ น์ |
๋ชจ๋ธ ์ค๋ช
์ต๋ฌด์๊ฐ ๋ชฉํ ๋จ์ด ๋ชจ์ฌ์ ์ฑ๊ณตํ๋์ง ํ์ ํ๋ค.
- ์ง์ clip๊ณผ ๋ณดํธ์ ๊ธฐ์ค์์ฑ์ ContentVec ํน์ง(hidden layer 8)์ผ๋ก ๋ฐ๊พผ๋ค.
- ์ง์๋ฅผ ๊ธฐ์ค์์ฑ ์ธํธ(์ต๋ 20๊ฐ)์ ๊ธฐ์ค์์ฑ ๊ฐ๊ฐ๊ณผ full DTW๋ก ๋น๊ตํด ์ ์ฌ๋ ํ๊ท ์ ๊ตฌํ๋ค.
- ์ด ํ๊ท ์ ์ฝํธํธ ์์ ๋ฐฑ๋ถ์๋ก ๋ฐ๊พธ๊ณ ์๊ณ๊ฐ 0.9915์ ๋น๊ตํ๋ค.
| ํ์ผ | ๋ด์ฉ |
|---|---|
inference.py, judge/ |
ํ์ ์ฝ๋ |
manifest.json |
์ค์ , ์๊ณ๊ฐ, ํ๊ณผ ์ฝํธํธ ๋ชฉ๋ก, ํ์ผ๋ณ SHA-256. ๋ฒ๋ค ๋ฒ์ ์ 1.1.0 |
pool_features.npz, cohort_features.npz, pool_cohort_pairs.npy |
ํ๊ณผ ์ฝํธํธ์ ์ฌ์ ๊ณ์ฐ ํน์ง, ๋ ์ฌ์ด์ ์ ์ฌ๋ ํ |
์ฌ์ฉ ๋ฒ์
- ์
๋ ฅ: ์๋จ
buddybird-ai/parrot-sound-gate๊ฐ ์ต๋ฌด์ ์๋ฆฌ๋ก ํ์ ํ clip 1๊ฐ, ๋ชฉํ ๋จ์ด 1๊ฐ, own ๊ธฐ์ค์์ฑ 0๊ฐ ์ด์. - ํ๋ณด ๋จ์ด๊ฐ ์ฌ๋ฟ์ด๋ฉด ๋จ์ด๋ง๋ค ํธ์ถํ๋ค.
- ์ํ์กฐ์ ์คํ์กฐ๋ฅผ ๋์์ผ๋ก ํ๋ ๋ชจ๋ธ์ด๋ค.
์์ํ๊ธฐ
Python 3.12์ uv๋ฅผ ์ฌ์ฉํ๋ค.
hf download buddybird-ai/parrot-mimicry-judgment --revision v1.0.0 --local-dir parrot-mimicry-judgment
cd parrot-mimicry-judgment
uv sync --frozen
์ฒ์์ ContentVec ๊ฐ์ค์น(์ฝ 380 MB)๋ฅผ ๋ด๋ ค๋ฐ๋๋ค.
from inference import MimicryJudgment
model = MimicryJudgment.from_pretrained(
"buddybird-ai/parrot-mimicry-judgment",
revision="v1.0.0",
)
result = model.predict_file(
"query.wav",
word="์๋
",
own_paths=["guardian_annyeong_1.wav", "guardian_annyeong_2.wav"],
account_id="<account id>",
)
print(result)
# {"is_success": True, "score": 99.6..., "status": "ok", "n_own": 2, "n_fill": 18, "set_size": 20}
๋ฉ๋ชจ๋ฆฌ์ ํํ์ predict_waveform์ผ๋ก ํ์ ํ๋ค. command line์์๋ ๋ค์์ฒ๋ผ ์คํํ๋ค.
uv run --frozen python inference.py query.wav --word ์๋
--ref guardian_1.wav --account-id <account id> --revision v1.0.0
์ถ๋ ฅ
| ํค | ํ | ๋ป |
|---|---|---|
is_success |
bool | ์ฑ๊ณต ์ฌ๋ถ. score๋ก ๋ค์ ๊ณ์ฐํ์ง ์๋๋ค |
score |
float ๋๋ null | ์ฝํธํธ ๋ฐฑ๋ถ์ ร 100. ํ์ ํ์ง ์์ผ๋ฉด null |
status |
str | ok, no_reference(๊ธฐ์ค์์ฑ ์์), unsupported_species |
n_own, n_fill, set_size |
int | ์ธํธ์ own ๊ธฐ์ค์์ฑ ์, ํ ๊ธฐ์ค์์ฑ ์, ํฉ๊ณ |
๋ฐ์ดํฐ
| ๋ถํ | ๊ณ์ | ์ ํํ ๋ชจ์ฌ | ๋น๋ฐํ | ๋ณดํธ์ ๊ธฐ์ค์์ฑ |
|---|---|---|---|---|
| ๊ฐ๋ฐ | 172 | 959 | 32,916 | 271 |
| test | 40 | 152 | 3 | 121 |
ํ๊ฐ
๊ต์ฐจ๊ฒ์ฆ ์์น๋ ๊ฐ๋ฐ ๋ฐ์ดํฐ์์ ๊ณ์ ๋จ์ 5-fold ๊ต์ฐจ๊ฒ์ฆ์ 10ํ ๋ฐ๋ณตํด ์ป์ ๊ฒฐ๊ณผ์ด๊ณ , test ์์น๋ ๊ฐ๋ฐ์ ์ ํ ์ฐ์ง ์์ ๊ณ์ 40๊ฐ์, ๊ฐ๋ฐ ๋ฐ์ดํฐ๋ก ํ์ ํ ํ, ์ฝํธํธ, ์๊ณ๊ฐ์ ๊ทธ๋๋ก ์ ์ฉํ ๊ฒฐ๊ณผ์ด๋ค(๊ณ์ ๋จ์ bootstrap 95% ์ ๋ขฐ๊ตฌ๊ฐ).
| ์งํ | ๊ต์ฐจ๊ฒ์ฆ | test | test ๊ฑด์ |
|---|---|---|---|
| ๊ณ์ ๋ณ ๋น๋ฐํ FAR 75๋ฒ์งธ ๋ฐฑ๋ถ์์ | 3.4% | ์ธก์ ๋ถ๊ฐ | 3 |
| recall, ์ ์ฒด | 31.3% | 49.6% [37.3%, 61.4%] | 152 |
| recall, ์๋ | 29.9% | 30.0% [14.9%, 42.4%] | 74 |
| recall, ์๋ ํ์ธ์ | 58.1% | 59.8% [45.1%, 73.5%] | 52 |
| recall, ์ฌ๋ํด | 14.7% | 92.9% [49.4%, 100.0%] | 14 |
| recall, ๊น๊ฟ | 59.2% | 75.8% [42.9%, 91.8%] | 12 |
| ๋ค๋ฅธ ๋จ์ด FAR | 5.9% | 6.5% [4.2%, 8.8%] | 3,017 |
Credit
์ด ์ฑ๊ณผ๋ 2026๋ ๋ ๊ณผํ๊ธฐ์ ์ ๋ณดํต์ ๋ถ์ ์ฌ์์ผ๋ก ์ ๋ณดํต์ ๊ธฐํํ๊ฐ์์ ์ง์์ ๋ฐ์ ์ํ๋ ๊ฒฐ๊ณผ๋ฌผ์ (IITP-2026-AIยทSW๋ง์์คํธ๋ก)