BirdNET-Go 技术解读:安防摄像头改造成 24 小时鸟类声纹监测站

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

BirdNET-Go 官方 Web 仪表盘:实时频谱、检测记录与物种统计

监控摄像头为什么能当观鸟传感器

现代 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.46,500+ 鸟种默认内嵌(TFLite)通用鸟类识别
Google Perch v214,795 种动物ONNX Runtime大范围物种含虫、蛙、兽
BirdNET Geomodel v3.012,012 种ONNX Runtime按经纬度过滤当地可见物种
BattyBirdNET11 个区域模型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 官方提供安装脚本:

bash
curl -fsSL https://github.com/tphakala/birdnet-go/raw/main/install.sh -o install.sh
bash ./install.sh

Docker 镜像覆盖 linux/amd64 和 linux/arm64 两个架构,Linux、Windows、macOS 也有预编译二进制。项目内置引导向导,首次启动跟着配置音频源、选模型、设阈值即可;物种名单自带 eBird/Clements 分类学数据(2,374 属、254 科、11,145 种),离线可查。

家里有带麦克风的摄像头、有一台能常开的机器,部署成本基本只剩一个晚上的时间。对在找"AI 真正有用的小场景"的人来说,这个项目给出了一个具体的答案:不需要 GPU 集群,不需要云 API,一台树莓派加三台旧摄像头,就能把院子变成一个持续运转的物种监测站。

参考来源