Aves do Brasil — Alexa skill:用 Python 和开放数据通过语音描述识别鸟类

Aves do Brasil — Alexa skill:用 Python 和开放数据通过语音描述识别鸟类

我花了几个月想认出院子里的一只鸟。为了不再重来一次,我做了一个 Alexa skill。

每天早上,一对绿色的鸟都会停在我家附近同一根电线上。我很确定它们不是 maritaca(巴西常见的一类绿色鹦鹉)——体型不一样,叫声也不一样。但我不知道它们叫什么。

这样过了几个月。我在 WikiAves(巴西最权威的观鸟数据库)上查过,那是一个非常出色的项目——但对我这样的新手来说,信息量带来的更多是压迫感,而不是帮助。我不知道该用哪些术语去筛选。我分不清“绿色、翅膀上有红斑”到底是一种外来的 sabiá(巴西画眉类鸟)还是一种常见的鹦鹉。后来我才知道:那是 Maracanã 小金刚鹦鹉。

接着出现了一个讽刺的转折,而这个转折埋下了后面所有的事:我想去查一下它们的叫声来确认,结果发现鹦鹉类并没有标准化的叫声。我原本想用来当证据的鸣声,根本就不存在可被分类的形式。挑战已经在我脑子里成形了。

第一个想法是错的(而且不道德)

我最初的计划是用 Alexa 去听周围的鸟声,然后通过音频来识别。两个问题在同一天就否掉了这个想法:

Alexa 只能采集人声。它不听环境声——麦克风是为语音指令优化的。背景声音是噪声,不是信号。也不存在我能开启的什么“聆听模式”。

用回放声音吸引鸟类是一种有问题的做法。播放某个物种的鸣声来吸引它,会造成领地压力,可能让鸟离开巢穴,并干扰繁殖。IN ICMBio 14/2018(巴西环境部下属生物多样性保护机构 ICMBio 的 2018 年第 14 号规范性指令)和 CEMAVE(巴西全国野生鸟类研究与保护中心)都不建议这样做。知道这一点后,我毫不犹豫地放弃了这个想法。

于是这个 skill 变成了另一样东西:不再是“录下你听到的声音”,而是“描述你看到的样子”。用自然语言跟 Alexa 说——颜色、体型、在哪里、喙的形状——它就会给出最可能的物种。

技术栈:Python、贝叶斯,以及四个互不相通的开放数据库

Alexa 并不算是一台聪明的设备。它识别语音,然后调用云端的一个函数。全部的智能都在 AWS 上的一个 Lambda(Python)里,而真正的工作是让四个原本没打算互相对话的数据库给出一个一致的答案。

AVONET(Tobias et al. 2022,CC BY 4.0)收录了 1.1万多种鸟类的标准化形态特征——skill 从你的描述中提取的 7 个属性就来自这里:主色、副色、以参照物衡量的体型、环境、姿态、喙和尾。

GBIF 有巴西鸟类的出现记录。我把这些数据当作贝叶斯先验:如果你在 São Paulo 描述“一只大的绿鸟”,评分器会给那些确实出现在该地区的物种更高的权重(半径 30 km,至少 20 条记录)。同样的描述下,bem-te-vi(巴西常见的大食蝇霸鹟)排在稀有物种前面。

xeno-canto 有真实的鸣声录音。这里有一个对我来说没得选的决定:我不可能直接去用这些音频而不署名录音者。每一次播放都会显示录音者的名字、许可协议(CC BY-NC-SA 4.0)以及该录音在资料库中的编号。Python 在抓取这些音频、以编程方式整理物种和作者方面表现非常好。

Han et al. 2025(CC0)补充了 AVONET 没有覆盖的羽色数据。

pt-BR 下的 slot type AMAZON.SearchQuery 可以采集自由语句——“我在院子地上看到一只黄色的小鸟,翅膀是黑的”会整句作为文本传入,再由解析器提取属性。没有菜单,没有“颜色请按 1”。你可以像跟朋友说话一样说。

数字,不夸大任何一点

全巴西 1627 个物种。其中 1014 个有 xeno-canto 的真实录音。数据库最初只有 São Paulo 地区的 390 个物种,后来扩展到覆盖巴西所有生物群落。

在加入真实噪声的模拟中(描述不完整、属性错误、地区性俗名):正确的鸟出现在前 3 个建议里的比例是约 54%。不是 90%。这就是这个模型今天用开放数据和一个接受自由语句的解析器所能做到的。对这个数字保持透明,比把它往上凑更重要。

还有一个鸣声小测验:skill 播放一段真实录音,你来猜是什么物种。猜对了,它记分。猜错了,它告诉你答案并再播一次,让你建立联想。这是一种不用去野外也能练耳朵的方式。

而最大的工程瓶颈不是评分器——是 Alexa Developer Console。测试一个 Alexa skill 是个很慢的过程:部署耗时、日志延迟,界面也很少有人真正摸透。开发过 Alexa 的人都懂。没开发过的,以后会懂。

这个 skill 不做什么(故意的)

它不录鸟的声音——Alexa 做不到。它不循环播放鸣声去吸引鸟——那是不道德的。它没有使用数据,因为刚刚上线。它没有用户评价,因为我不会去编。WikiAves、xeno-canto、GBIF 和 AVONET 是被署名的数据来源,不是合作方。

每一次鸣声播放都附带负责任回放的提示。单次播放、控制音量、署名录音者、提醒注意繁殖季。这不是功能——这是义务。

邀请:去用、去弄坏、去改进

代码是 MIT 许可,仓库是公开的:github.com/jvitorcarvalho/aves-do-brasil-alexa。

我希望大家能从中玩得开心。希望有人听到 urutau(大林鸱,一种巴西夜行鸟)的叫声,那是你能听到的最奇特的声音之一。希望有人认出院子里的一只鸟,然后在午饭时讲给朋友听。希望 Manaus 的某个开发者拿走这个仓库,为亚马逊地区重新校准先验。希望某位鸟类学家去修正那些来自 GBIF、很可能有错的俗名。

今天这个 skill 覆盖全巴西——1627 个物种,1014 个有录音。还有提升空间。

想试试:“Alexa, abre Aves do Brasil”。免费,无广告,不收集数据。

想参与:提一个 issue,发一个 PR,或者告诉我 tico-tico(巴西常见的方胸草鹀)在你所在的城市叫别的名字。都有帮助。


由 Evolutiva Negócios Digitais(巴西米纳斯吉拉斯州 João Monlevade/MG)开发。数据来源:AVONET(Tobias et al. 2022,CC BY 4.0)、GBIF(CC0)、xeno-canto(CC BY-NC-SA 4.0)、Han et al. 2025(CC0)、WikiAves(公开查询)。回放提示依据 IN ICMBio 14/2018 和 CEMAVE 指南。

常见问题

Aves do Brasil skill 是怎么通过口述描述识别一只鸟的?

这个 skill 使用一个贝叶斯评分器,把从你的话里提取的 7 个属性——颜色、体型、环境、姿态、喙、尾和副色——与 1627 个巴西物种的形态数据做交叉比对。数据库来自 AVONET(Tobias et al. 2022),并用 GBIF 的出现记录做补充,以提高你所在地区更可能出现的物种的权重。你用自然语言描述你看到的,就会得到与描述最匹配的物种。

这个 skill 会播放鸣声来吸引鸟吗?

不会。这个 skill 每次查询只播放一次 xeno-canto 的真实录音,音量受控,并署名原录音者。循环播放鸣声来吸引鸟会造成领地压力,并可能干扰繁殖——IN ICMBio 14/2018 和 CEMAVE 都不建议这种做法。每一次播放都附带负责任回放的提示。

语音识别的准确率是多少?

在加入真实噪声的模拟中(描述不完整、属性错误、地区性俗名),正确的鸟出现在前 3 个建议里的比例约为 54%。这个数字反映的是当前使用开放数据和自由语句解析器的表现。这个 skill 不会把指标往上凑——对局限保持透明是有意为之。

Aves do Brasil skill 是免费的吗?会收集个人数据吗?

这个 skill 是免费的,无广告,也不收集个人数据。代码以 MIT 许可开源,放在公开仓库里。所用的数据库(AVONET、GBIF、xeno-canto、Han et al. 2025)全部是开放数据,并已妥当署名。

我可以为这个 skill 做贡献或者修正鸟类俗名吗?

可以。仓库接受 issue 和 pull request——欢迎鸟类学家、开发者和观鸟者的贡献。与 GBIF 记录不同的地区性俗名可以直接修正。当前数据库覆盖巴西 1627 个物种,其中 1014 个有真实录音,但在区域校准和扩展上还有空间。