BirdBuddy: 기기에서 완전히 구동되는 오프라인 새소리 식별기
요약
BirdBuddy는 인터넷 연결 없이 기기 로컬에서 구동되는 오프라인 새소리 식별 앱입니다. 3초간 녹음된 소리를 분석하여 신뢰도에 따라 상위 3개 결과를 제시하며, 모든 과정이 클라우드 왕복 없이 기기 내에서 완료됩니다. 오픈소스 AI 구성 요소(BirdNET ONNX, Piper TTS 등)를 활용해 하이커와 조류 관찰가에게 유용한 경험을 제공합니다.
핵심 포인트
- 클라우드 연결 없이 로컬 기기에서 작동하는 오프라인 새소리 식별 기능
- 3초 녹음 및 분석 후 신뢰도 기반 상위 3개 결과 제시
- BirdNET ONNX와 Piper TTS 등 오픈소스 AI 구성 요소 활용
- 하이커, 조류 관찰가 등 특정 사용자 그룹을 위한 실용적 도구
_이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass 제출물입니다.
제가 만든 것
BirdBuddy는 오프라인 새소리 식별기입니다. 신호가 없는 트레일에서 걷다가 새 소리를 듣고, 3초간 녹음하면 BirdBuddy가 그것이 무엇인지 알려줍니다. 모든 것이 주머니 속 기기 내에서 로컬로 구동됩니다.
화면은 경험 중 가장 짧은 부분입니다. 앱을 열고 한 번 탭한 후 휴대폰을 치우세요. 식별 작업은 약 2초 만에 끝납니다. 클라우드 왕복(round-trip)도 없고, 계정도 없고, 업로드할 필요도 없습니다. 오직 당신과 새, 그리고 기기를 떠나지 않는 52 MB 모델만 있습니다.
누구를 위한 것인가: 하이커, 조류 관찰가(birder), 그리고 숲속에서 아름다운 소리를 들었지만 그것이 무엇인지 전혀 알지 못했던 모든 사람.
실시간 데모: https://birdbuddy.onrender.com
참고: Render의 무료 티어(512 MB RAM)에 호스팅되었습니다. 유휴 상태 후 첫 요청은 활성화되는 데 30~60초가 걸릴 수 있습니다. 실제 빠르고 민첩한 경험은 아래 비디오를 참고하세요.
데모

여기서 볼 수 있는 것들:
- 가볍고, 오프라인 우선(offline-first) UI
- 3초간의 새소리 업로드 또는 녹음
- 신뢰도에 따라 순위가 매겨진 상위 3개 일치 항목
- 기기 내 TTS 음성으로 읽어주는 최고 일치 항목
- Top-K, 신뢰도 임계값(confidence threshold), 음성 속도를 조정할 수 있는 설정(Settings) 탭
코드
GitHub: https://github.com/vinksgoyal/birdbuddy
레포지토리 레이아웃:
src/inference.py— BirdNET ONNX 추론 (오디오 → 종)src/voice.py— Piper TTS (텍스트 → 음성, 오프라인)app.py— Gradio UIscripts/tinker_finetune.py— 새 전문가 지식을 위한 Qwen3.5-4B의 Tinker 파인튜닝Dockerfile+render.yaml— 원클릭 배포docs/— Copilot 사용 스크린샷
제작 과정 (How I Built It)
BirdBuddy는 전적으로 오픈소스 AI로 구축되었습니다. 세 가지 오픈 소스 구성 요소가 작동하게 합니다.
1. BirdNET v2.4 — 오픈 가중치 음향 분류기
BirdNET은 Cornell Lab of Ornithology와 Chemnitz University에서 공개한 생물음향학(bioacoustics) 모델입니다. 저는 ONNX Runtime on CPU를 통해 실행되는 FP32 truncated-DFT ONNX 변형 버전(~52 MB)을 사용했습니다. 이 모델은 3초 분량의 48 kHz 오디오를 6,522종으로 분류합니다.
이 모델은 GPU 없이도 노트북, 휴대폰 또는 Raspberry Pi에서 실행됩니다. 최신 노트북 CPU에서는 추론 지연 시간(Inference latency)이 2초 미만입니다.
2. Piper — 오픈 가중치 텍스트-음성 변환 (Text-to-Speech)
Piper는 CPU에서 실행되는 MIT 라이선스의 신경망 TTS입니다. 저는 en_US-lessac-medium 음성(~63 MB)을 사용했습니다. BirdNET이 최고 일치 종(top match)을 반환하면, Piper가 이를 소리 내어 말해줍니다: _
미세 조정된 출력 (학습 후):
_"American Kestrel (Falco sparverius)는 갈색 상부와 파란 날개를 가진 작은 매입니다. 그 모양, 깃털, 행동은 현장 관찰을 기록할 때 유용한 단서가 됩니다..."
이것이 Tinker 카테고리가 요구하는 개선점입니다: 구체적인 작업, 명확한 기준선, 측정 가능한 향상.
4. GitHub Copilot으로 구축
Copilot은 프로젝트 전체의 작업대였습니다:
- VS Code에서 Copilot Chat을 사용하여
src/inference.py,src/voice.py, 그리고 Gradio UI를 구성했습니다. - Copilot 코딩 에이전트가 Issue #2를 처리하여 GitHub Actions CI 워크플로우를 추가하는 PR을 열었습니다.
- 이제 GitHub Actions는 푸시할 때마다 테스트를 실행합니다.
5. 데이터셋 작업을 위한 Backboard R-CLI
저는 Backboard의 R-CLI를 리포지토리 내부에서 코딩 에이전트로 사용하여 데이터셋 큐레이션 및 파이프라인 검토를 진행했습니다. 이는 추론 파이프라인을 요약하고, 누락된 오류 처리를 표시했으며, scripts/agent_review.md 파일을 생성했습니다.
배포 (Deployment)
Docker + Render. Dockerfile은 빌드 시점에 BirdNET과 Piper 두 모델을 다운로드하여 컨테이너가 완전히 독립적으로 작동하도록 합니다. 런타임에 API 키나 외부 서비스가 필요하지 않습니다.
오픈 혁신(Open Innovation)이 중요한 이유?
이 프로젝트는 오직 오픈 소스 AI 덕분에 존재할 수 있었습니다. 모든 설계 결정은 이로부터 비롯되었습니다.
모델은 오픈 웨이트입니다. BirdNET은 생물음향학(bioacoustics) 연구를 위해 특별히 공개되었습니다. 폐쇄형 API는 호출당 비용이 들고, 인터넷 연결을 필요로 하며, — 결정적으로 — 모델 교체가 불가능했을 것입니다. 개발 과정에서 저는 세 가지 다른 분류기(classifier)를 시도했습니다. 폐쇄형 API를 사용했다면 공급업체가 제공하는 것에 갇혔을 겁니다.
학습 데이터는 오픈입니다. 종 라이브러리는 새 녹음 자료로 구성된 커뮤니티가 선별한 데이터셋입니다. 수천 명의 조류 관찰자(birder)들이 기여했습니다. 독점 데이터로 학습된 폐쇄형 모델은 블랙박스일 것입니다. 저는 제 모델이 정확히 무엇을 배웠는지 검사할 수 있습니다.
실행 환경(runtime)은 오픈입니다. ONNX Runtime 덕분에 BirdBuddy는 Android, iOS, Linux, macOS — 심지어 Raspberry Pi에서도 실행됩니다. 폐쇄형 추론 서비스(inference service)는 저를 하나의 플랫폼과 하나의 가격 책정 단계에 가두었을 것입니다.
음성(voice)은 오픈입니다. Piper는 MIT 라이선스를 따릅니다. 그 음성 모델은 오픈 웨이트입니다. TTS는 분류기와 같은 노트북에서 실행됩니다.
비용은 제로입니다. API 키가 필요 없습니다. 사용량 제한도 없고,
Backboard R-CLI 세션: sess_3f07cb2e — 모델 openai/gpt-5.5, 프로필 coding
이 세션에서 다룬 내용:
src/inference.py,app.py, 및requirements.txt읽기- 파이프라인 요약하기
- 오디오 로더의 누락된 오류 처리 기능 지적하기
scripts/agent_review.md생성하기
수상 부문 (Prize Categories)
참가작:
- GitHub Copilot 활용 최우수: 채팅, 코딩 에이전트 PR, 및 Actions CI
- Tinker 활용 최우수: 측정 가능한 손실 개선(202.64 → 68.43)을 거친 미세 조정된 Qwen3.5-4B 모델
- Backboard 활용 최우수: 저장되고 임베드된 R-CLI 에이전트 세션
- Render 활용 최우수: birdbuddy.onrender.com에 배포되어 라이브 상태
다음 계획 (What's Next)
- BirdBuddy를 실제 모바일 앱으로 패키징하기 (React Native + ONNX Runtime Mobile)
- Tinker 미세 조정 데이터셋을 모든 6,522 BirdNET 종으로 확장하기
- 발견 기록(sightings)을 로컬에 저장하고 나중에 동기화하는
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기

