门口的监控摄像头每天对着院子录音,音频流进了家里服务器上的一个 Go 程序。程序把声音切成 3 秒一段,丢进本地跑的神经网络,片刻之后返回结果:一个鸟种名字,附带置信度。美国开发者 Jason Tucker 用三台现成的安防摄像头组出了这样一套系统,他把过程写成博客后登上了 Hacker News 首页,拿到 504 分和 121 条讨论。背后支撑这一切的是开源项目 BirdNET-Go:单二进制、本地推理、24 小时在线的声景分析器,GitHub 上已有 1,767 颗 star。

监控摄像头为什么能当观鸟传感器
现代 IP 摄像头几乎都内置麦克风,用来补齐录像的音轨。这些麦克风平时只是"听得见",没有人真正去"听"。摄像头普遍支持 RTSP 协议输出音视频流,局域网内任何程序都可以直接拉流。
BirdNET-Go 做的事情,就是把这个一直存在却没有被利用的音频流接过来。它支持声卡采集和 RTSP/RTSPS 网络流两种输入,可以并行接多路音源,每一路单独分配模型、单独设置信度阈值。Tucker 没有买任何新硬件,家里三台摄像头的麦克风直接复用,安防系统顺便变成了全天候野外录音站。
这个思路的成本结构值得展开:专业野外观鸟录音设备(定向麦克风加录音机)是一笔不小的投入,而这套方案的新增硬件成本是零,唯一的开销是一台常开的主机,树莓派 4 这一档的单板计算机就够。
推理管线:3 秒窗口与频谱图
BirdNET 的识别方法源自康奈尔大学鸟类学实验室与开姆尼茨工业大学 2021 年发表的论文(Kahl、Wood、Eibl、Klinck,DOI: 10.1016/j.ecoinf.2021.101236)。流程是先将连续音频切成 3 秒的窗口,把每段声音转成频谱图(spectrogram,声音频率随时间分布的图像),再让一个深度残差网络在频谱图上做图像分类。论文里第一代模型是 157 层、超过 2,700 万参数的 ResNet 变体,能识别 984 个北美和欧洲鸟种,在单物种录音集上平均精度 0.791。
BirdNET-Go 用 Go 语言把这套管线做成了常驻服务:音频流拉取、分窗、推理、结果入库、Web 展示全部在一个进程里完成。模型权重直接嵌进二进制,BirdNET v2.4 是默认模型,覆盖 6,500 多个鸟种;装了 ONNX Runtime 之后还能加载 Google Perch v2 等更大的模型,把可识别范围扩到 14,795 个物种,覆盖鸟类之外的昆虫、两栖类和哺乳动物。采样率支持到 256 kHz,这是超声波区间,配合 BattyBirdNET 的 11 个区域蝙蝠分类器,同一套系统夜里能自动切换成蝙蝠监测站。
| 模型 | 物种覆盖 | 运行方式 | 用途 |
|---|---|---|---|
| BirdNET v2.4 | 6,500+ 鸟种 | 默认内嵌(TFLite) | 通用鸟类识别 |
| Google Perch v2 | 14,795 种动物 | ONNX Runtime | 大范围物种含虫、蛙、兽 |
| BirdNET Geomodel v3.0 | 12,012 种 | ONNX Runtime | 按经纬度过滤当地可见物种 |
| BattyBirdNET | 11 个区域模型 | ONNX Runtime | 蝙蝠超声波识别 |
误报治理:声纹识别的工程难点
声音识别的难点从来不在"认出鸟叫",而在"不把别的声音认成鸟"。空调外机的嗡鸣、风吹麦克风、狗叫、邻居的音响,都会在频谱上留下与鸟鸣相似的纹理。BirdNET-Go 为此内置了一整套过滤机制:
- 深度确认(Deep Detection):15 秒窗口内的重复检出才确认,单次孤立的疑似信号不直接入库;
- 按物种动态阈值:常见鸟种调高门槛,稀有鸟种放宽,避免本地优势物种刷屏;
- 地理范围过滤:Geomodel 按用户所在经纬度过滤掉当地不可能出现的物种,从源头砍掉一大类误报;
- 隐私与狗叫过滤器:专门压制人声和犬吠两类高频误报源。
多模型并行还有互相印证的用法:同一份音频同时跑两个模型,两个模型结论一致就提升置信度,结论相悖就标记出来供人工复核。这比单纯调高阈值更能压误报,因为它区分了"模型不确定"和"模型确定但错了"两种情况。
集成生态:检出只是开始
检出结果如果不流转起来,就只是数据库里的一行记录。BirdNET-Go 的告警规则引擎支持按物种、按时段、按置信度设置条件,然后推送到 Discord、Slack、Telegram、ntfy、Pushover、Gotify、Matrix、Bark、webhook 或者直接执行 shell 脚本。MQTT 输出带 Home Assistant 自动发现,家庭自动化系统里"出现松鸦就开庭院灯"这类联动是现成能力。
数据侧还有 BirdWeather 集成:一个全球观鸟者共享检测数据的社区平台,用户可以把自己院子的观测流上传,供研究者和观鸟者查看区域物种动态。不想共享就留在本地,项目默认数据不出内网,遥测严格 opt-in。
实际用起来是什么体验
Tucker 的博客记录了三个摄像头的实际运行情况:系统 24/7 运行,鸟一开口就有识别结果推送进他家 Discord 服务器的 #birdnet 频道;物种新鲜度追踪会把第一次出现的鸟单独标记,他和妻子把"院子物种清单"玩成了收集游戏;声道的实时能量分析界面帮他发现某个摄像头正对着空调外机,挪开机位后误报明显下降。他还把面板通过 Cloudflare 挂上公网域名,让几个朋友远程围观他家院子的鸟况。
Hacker News 评论区的高赞观点集中在一点:无云、无订阅、无 API 调用、无服务关闭风险,数据永远在自己家里。对一个要 7×24 小时跑在自家服务器上的系统,这四条决定了它能否长期活下去。
边界与限制
有三条边界需要说清楚。第一,这是纯声学识别,鸟不叫就检测不到,站在喂食器前安静进食的鸟不会进记录,识别距离受麦克风拾音半径限制,院子的尺度下工作良好,指望它覆盖林地不现实。第二,置信度不等于正确率,声学模型的误报无法完全消除,稀有物种的高置信度记录值得人工听一遍原始音频再下结论。第三,许可证是 CC BY-NC-SA 4.0,非商业用途,和那些可以拿来开公司卖服务的 MIT 项目不同,想把它做进商业产品需要另外谈授权。
上手路径
Debian、Ubuntu、树莓派 OS 官方提供安装脚本:
curl -fsSL https://github.com/tphakala/birdnet-go/raw/main/install.sh -o install.sh
bash ./install.shDocker 镜像覆盖 linux/amd64 和 linux/arm64 两个架构,Linux、Windows、macOS 也有预编译二进制。项目内置引导向导,首次启动跟着配置音频源、选模型、设阈值即可;物种名单自带 eBird/Clements 分类学数据(2,374 属、254 科、11,145 种),离线可查。
家里有带麦克风的摄像头、有一台能常开的机器,部署成本基本只剩一个晚上的时间。对在找"AI 真正有用的小场景"的人来说,这个项目给出了一个具体的答案:不需要 GPU 集群,不需要云 API,一台树莓派加三台旧摄像头,就能把院子变成一个持续运转的物种监测站。
参考来源
- BirdNET-Go GitHub 仓库:https://github.com/tphakala/birdnet-go
- Jason Tucker 原文:https://jasontucker.blog/how-i-turned-my-security-cameras-into-an-automatic-bird-identification-system-with-birdnet-go/
- Hacker News 讨论:https://news.ycombinator.com/item?id=49511856
- Kahl et al. 2021, BirdNET: A deep learning solution for avian diversity monitoring, Ecological Informatics, DOI: 10.1016/j.ecoinf.2021.101236