dev.to #ai短讯
BirdBuddy:完全在设备端运行的离线鸟类叫声识别器
BirdBuddy 是一款为 Hacktoberfest 开源 AI 挑战赛提交的离线鸟类叫声识别应用。该工具利用本地模型,无需网络连接或云端交互,用户录制三秒鸟鸣后,约两秒即可在设备端完成物种识别。其设计强调极简交互与隐私保护,无账号注册需求。
这是 Hacktoberfest 开源 AI 挑战第一周:“Touch Grass”的参赛作品
我构建了什么
BirdBuddy 是一款离线鸟类鸣叫识别工具。当你身处没有信号的步道,听到鸟叫声时,只需录制三秒钟,BirdBuddy 就会告诉你它是什么——所有处理都在你口袋里的设备上本地完成。
屏幕交互是体验中最简短的部分。打开应用,轻触一次,然后把手机收起来。识别过程大约在两秒内完成。无需云端往返,无需账户,无需上传。只有你、那只鸟,以及一个永远不会离开你设备的 52 MB 模型。
适用人群:徒步旅行者、观鸟爱好者,以及任何曾在树林中听到美妙声音却不知其为何物的任何人。
在线演示:https://birdbuddy.onrender.com
注意:托管在 Render 免费套餐上(512 MB RAM)。空闲后的首次请求可能需要 30–60 秒才能唤醒。请观看下方的视频以查看真实流畅的体验。
演示
https://www.youtube.com/watch?v=7b3iXirhnTQ

- 轻量级、优先离线的用户界面
- 上传或录制一段 3 秒的鸟类鸣叫
- 按置信度排名的前三匹配结果
- 由设备上的 TTS 语音朗读最佳匹配结果
- “设置”选项卡,用于调整 Top-K、置信度阈值和语音速度
代码
GitHub:https://github.com/vinksgoyal/birdbuddy
- src/inference.py — BirdNET ONNX 推理(音频 → 物种)
- src/voice.py — Piper TTS(文本 → 语音,离线)
- app.py — Gradio UI
- scripts/tinker_finetune.py — 使用 Tinker 对 Qwen3.5-4B 进行微调以获得鸟类专业知识
- Dockerfile + render.yaml — 一键部署
- docs/ — Copilot 使用截图
我是如何构建它的
BirdBuddy 完全基于开源 AI 构建。三个开源组件使其运作正常。
- BirdNET v2.4 — 开放权重的声学分类器
BirdNET 是由康奈尔大学鸟类学实验室和开姆尼茨工业大学发布的生物声学模型。我使用了 FP32 截断 DFT ONNX 变体(约 52 MB),通过 CPU 上的 ONNX Runtime 运行。它将 3 秒长、48 kHz 的音频分类为 6,522 种物种。
该模型可在笔记本电脑、手机或 Raspberry Pi 上运行——无需 GPU。在现代笔记本电脑 CPU 上,推理延迟低于两秒。
- Piper — 开放权重的文本转语音
Piper 是一个采用 MIT 许可证的神经 TTS 模型,可在 CPU 上运行。我使用了 en_US-lessac-medium 语音模型(约 63 MB)。当 BirdNET 返回最佳匹配结果时,Piper 会大声读出:“我听到了一只北美红雀。”
无需 ElevenLabs,也无需 Google Cloud TTS——语音是一个本地 ONNX 模型,与分类器一样。
- 使用 Tinker 微调的 Qwen3.5-4B
音频模型为我们提供了物种 ID。为了让 BirdBuddy 有用而不仅仅是一个标签,我微调了一个小型大语言模型,使其充当鸟类专家——提供野外笔记、栖息地信息以及如何通过声音进行识别的指导。
我构建了一个包含 60 种常见北美物种的 165 个示例聊天数据集,然后使用 Thinking Machines 的 Tinker 通过 LoRA 适配器(r=16)对 Qwen3.5-4B 进行了微调。
3 个 epoch 的训练损失:
| Epoch | Avg loss |
|---|---|
| 1 | 202.64 |
| 2 | 95.09 |
| 3 | 68.43 |
在未参与训练的提示词上的基线输出(微调前):
“我不知道如何使用 API。……给我一份美洲隼的野外笔记……”
微调后的输出(训练后):
“美洲隼(Falco sparverius)是一种小型猛禽,背部呈棕色,翅膀呈蓝色。其体型、羽毛和行为是在记录野外观察时的有用线索……”
这就是 Tinker 类别所要求的改进:特定任务、清晰的基线、可衡量的提升。
- 使用 GitHub Copilot 构建
Copilot 是整个项目的工作台:
- VS Code 中的 Copilot Chat 搭建了 src/inference.py、src/voice.py 和 Gradio UI 的代码框架
- Copilot 编码代理解决了 Issue #2 并打开了一个 PR,添加了 GitHub Actions CI 工作流
- GitHub Actions 现在会在每次推送时运行测试



- 使用 Backboard R-CLI 进行数据集工作
我在仓库内部使用 Backboard 的 R-CLI 作为编码代理,用于数据集策展和管道审查——它总结了推理管道,标记了缺失的错误处理,并生成了 scripts/agent_review.md。
部署
Docker + Render。Dockerfile 在构建时下载两个模型(BirdNET 和 Piper),因此容器完全自包含。运行时无需 API 密钥,也无需外部服务。
为什么开放创新很重要?
这个项目之所以存在,是因为开源 AI。每一个设计决策都源于此。
模型权重是开放的。BirdNET 专为生物声学研究发布。如果是封闭的 API,每次调用都要收费,需要联网,而且——最关键的是——不允许我更换模型。在开发过程中,我尝试了三种不同的分类器。如果使用封闭 API,我就只能使用供应商提供的模型。
训练数据是开放的。物种库是一个由社区维护的鸟类录音数据集。成千上万的观鸟爱好者参与其中。一个基于专有数据训练的封闭模型将是一个黑盒。我可以确切地检查我的模型学到了什么。
运行时环境是开放的。ONNX Runtime 意味着 BirdBuddy 可以在 Android、iOS、Linux、macOS 甚至树莓派上运行。封闭的推理服务会将我锁定在一个平台和一种定价层级上。
语音是开放的。Piper 采用 MIT 许可证。其语音模型权重开放。TTS 与分类器在同一台笔记本电脑上运行。
成本为零。没有 API 密钥。没有使用限制。没有“您的免费套餐已过期”这种提示。偏远地区拿着二手手机的孩子可以使用它。互联网不稳定的国家的研究人员也可以使用它。
智能体框架是开放的。Backboard 的 R-CLI 让我能够自动化那些枯燥的部分——数据集清理、管道审查——而不会把我的工作流程锁定在专有的 IDE 中。我可以检查智能体采取的每一步操作。
微调是开放的。Tinker 让我能够将 Qwen3.5-4B 针对特定任务进行微调,并用数据证明,微调后的效果优于基线。封闭的模型端点不会给我提供损失曲线、LoRA 权重,也不会允许我自由更换基础模型。
封闭的替代方案将是:一款订阅制应用,它将你的音频上传到服务器,识别出你自己就能识别的鸟类,并每月收取 9.99 美元。那不是创新——那是寻租行为。
这才是创新:一个 52 MB 的分类器,一个 63 MB 的语音模型,一个微调过的 LoRA —— 全部在你的设备上运行,即使在荒郊野外,免费,且永久免费。
我的智能体会话
Backboard R-CLI 会话:sess_3f07cb2e — 模型 openai/gpt-5.5,配置文件 coding
该会话涵盖:
- 阅读 src/inference.py、app.py 和 requirements.txt
- 总结管道流程
- 标记音频加载器中缺失的错误处理
- 生成 scripts/agent_review.md
奖项类别
- GitHub Copilot 最佳使用奖 — Chat、编码智能体 PR 以及 Actions CI
- Tinker 最佳使用奖 — 对 Qwen3.5-4B 进行了微调,实现了可衡量的损失改善(从 202.64 降至 68.43)
- Backboard 最佳使用奖 — 保存并嵌入了 R-CLI 智能体会话
- Render 最佳使用奖 — 已部署并在 birdbuddy.onrender.com 上线
下一步计划
- 将 BirdBuddy 打包为真正的移动应用(React Native + ONNX Runtime Mobile)
- 将 Tinker 微调数据集扩展至所有 6,522 种 BirdNET 物种
- 添加“徒步日志”功能,本地存储观测记录,随后再同步——绝不在行走过程中同步
- 在蓝牙点击器上恢复真实的硬件按钮,以便在不触碰手机的情况下进行录音
由开源 AI 构建,为了鸟类,也为了每一个更愿意待在户外的人。
译文已达到本站中文翻译的字数上限,剩余内容请查看原文。