工程趣聞 2026 年 9 月 16 日

2026-09-16 — 電子紙相框:鳥鳴辨識結果即時拼成十九世紀鳥類插畫

primary=https://github.com/arnegiacomo/fugleramme primary=https://github.com/arnegiacomo/fugleramme/releases/tag/v0.21.3 primary=https://github.com/arnegiacomo/fugleramme/blob/main/docs/hardware.md primary=https://github.com/arnegiacomo/fugleramme/blob/main/src/fugleramme/render/dither.py primary=https://github.com/arnegiacomo/fugleramme/blob/main/src/fugleramme/render/collage.py primary=https://github.com/arnegiacomo/fugleramme/blob/main/src/fugleramme/picks.py primary=https://github.com/arnegiacomo/fugleramme/blob/main/src/fugleramme/panel.py primary=https://news.ycombinator.com/item?id=49711544

電子紙相框:鳥鳴辨識結果即時拼成十九世紀鳥類插畫

GitHub · arnegiacomo/fugleramme · 2026-09-16

樹莓派接一片電子紙掛在窗邊,畫面不是即時波形圖,也不是滾動的物種清單,而是一張只在鳥種組合改變時才重繪的十九世紀鳥類圖鑑拼貼。開源專案 fugleramme 由開發者 arnegiacomo 在挪威卑爾根自宅打造,9 月 15 日登上 Hacker News,截稿時已有 1216 點、168 則留言GitHub 上累積 1380 顆星,最新版本是 9 月 14 日發布的 v0.21.3

原本的問題

作者在 README 裡列出的幾個同類專案,走的都是同一條路:用 BirdNET 系列辨識鳥種後,靠 AI 生成插畫來呈現結果——AvianVisitors 是「AI 生成插畫加照片拼貼」,belkins-birdnet 是「AI 生成的花鳥畫風插畫」;另一支 inky-bird-frame 雖然用真人畫的田野筆記風插畫,但一樣要畫到同一片 Inky 電子紙上。

電子紙本身也有兩個現成的坑:一是螢幕只認得六種顏色(Spectra 6),把全彩合成圖直接丟給驅動程式,驅動程式會自己再做一次抖色,抖過的圖再抖一次只會糊掉;二是全螢幕更新很慢,如果每次辨識到新的鳥就重新洗牌畫面上每一隻鳥的插畫,畫面會不必要地一直閃動重排。

採用的方法

fugleramme 自己不做任何聲音辨識,辨識工作整個外包給 BirdNET-Go(模型來自 Cornell Lab of Ornithology 與 Chemnitz University of Technology,CC BY-NC-SA 4.0,非商用)。它只是輪詢 BirdNET-Go 的 API 拿偵測結果,位址由 FUGLERAMME_DETECTOR_URL 指定,可以是同一台機器,也可以是網路上任何一台既有的 BirdNET-Go。

插畫端則反其道而行,堅持不用 AI 生成圖超過 800 張去背裁片,涵蓋 400 多種鳥,全部剪自真實的十九世紀北歐、英國與中歐博物學版畫,手工去背後存成一張張透明 PNG,只有少數做過 AI 輔助修圖。為了避免每次重繪都重新抽卡造成畫面亂跳,picks.py 替每個物種固定抽一張變體圖,只要那隻鳥還在觀察窗內就一直用同一張,離開窗口才會重新抽。

排版由 collage.py 負責:不是簡單的方框排列,而是照每隻鳥去背後的輪廓形狀做碰撞檢查——不透明的鳥身彼此不能疊,透明邊緣可以互相蓋住,讓鳥群看起來緊靠在一起;體型則直接讀真實體重資料(AVONET,Tobias et al. 2022, Ecology Letters)換算,體型大的鳥由中心往外以螺旋順序放,最大的鳥永遠落在畫面正中央。

畫到電子紙之前,dither.py 自己先把全彩合成圖量化成六色調色盤,再用 Floyd–Steinberg 演算法抖色成 P 模式圖——調色盤刻意混合了驅動程式「實際寫入」的六色與「螢幕實際顯示」的六色(各佔一半),讓抖色時的色彩距離貼近人眼看到的效果,再把這張已經抖好色的圖直接丟給驅動,讓它跳過自己內建的抖色、只做索引搬移:

SATURATION = 0.5
PALETTE_6 = [
    tuple(int(s * SATURATION + d * (1.0 - SATURATION))
          for s, d in zip(sat, desat))
    for sat, desat in zip(_SATURATED, _DESATURATED)
]

def dither(image):
    return image.convert("RGB").quantize(
        palette=_palette_image(),
        dither=Image.Dither.FLOYDSTEINBERG,
    )

最後由 panel.py 把畫面推上實體螢幕:呼叫 device.show() 這一步,在 13.3 吋面板上會整整卡住約 35 秒等電子紙物理翻頁完成,這段時間程式就是單純阻塞等待。

專案辨識引擎插畫來源
fuglerammeBirdNET-Go800+ 張手切十九世紀真實版畫,無 AI 生成
AvianVisitorsBirdNET-PiAI 生成插畫 + 照片拼貼
belkins-birdnetBirdNET-PiAI 生成的花鳥畫風插畫
inky-bird-frameBirdNET田野筆記風格插畫

實際效果

官方推薦的完整組合是樹莓派 5(2GB)、Inky Impression 13.3 吋(Spectra 6,1600×1200)、Clippy EM272Z1 單聲道麥克風配 UGREEN USB 音效卡,再裝進一個 IKEA RÖDALM A4 相框,用 install.sh 裝成 systemd 服務,或用 ghcr.io/arnegiacomo/fugleramme 容器跑。就算沒有電子紙面板,程式一樣會把同一張拼貼跑成網頁 kiosk,用 HDMI 接螢幕或直接開網址都看得到。作者自己那台就直接放在 Bergen 廚房窗邊,即時顯示他家花園實際聽到的鳥。

目前的成長方式是持續補真實版畫而不是生成更多 AI 圖:v0.21.3 的更新記錄裡,兩筆改動分別是社群 PR #79#80 新增歐洲攀雀(Remiz pendulinus)與黃腳鷗(Larus michahellis)的裁片,另外重新掃描並裁切了 18 張既有版畫以統一紙質色調,全部掛在追蹤新增鳥種的 issue #44 底下。授權也分兩層:程式碼是 MIT,插畫另外標 CC BY-SA 4.0,BirdNET-Go 模型本身維持非商用。

影響範圍

已經自架 BirdNET-Go 的人接上 fugleramme 不必重跑辨識、也不必換機器:把 FUGLERAMME_DETECTOR_URL 指到既有站台即可,這種「只顯示、不辨識」的模式甚至能把主機降到樹莓派 Zero 2 W,因為真正吃資源的是持續跑分類器那台機器,畫面渲染本身很輕。任何在做 Inky Impression(Spectra 6 六色)顯示的專案,也可以直接照抄 dither.py 的雙調色盤混合手法:自己先量化成六色 P 模式圖再丟給 inky.set_image,避免驅動程式內建的抖色對一張已經抖過色的圖再抖一次而糊掉輸出。

原始來源:arnegiacomo/fuglerammeRelease v0.21.3Hacker News 討論


End of article
0
Would love your thoughts, please comment.x
()
x