把地震速報接到自家警報器:WebSocket 斷線與重送實測
去年幫一棟六層舊公寓的管委會做一個小東西:把氣象署的地震速報接到地下室的蜂鳴器跟LINE群。環境是 Raspberry Pi 3、Raspbian 11、Python 3.9,外網走社區的第四台網路,偶爾會瞬斷。資料量不大,一天幾十則,但每一則都要求十秒內送到。
喜歡把踩過的坑寫下來,免得別人再踩一次。
去年幫一棟六層舊公寓的管委會做一個小東西:把氣象署的地震速報接到地下室的蜂鳴器跟LINE群。環境是 Raspberry Pi 3、Raspbian 11、Python 3.9,外網走社區的第四台網路,偶爾會瞬斷。資料量不大,一天幾十則,但每一則都要求十秒內送到。
手上一批 90 年代的現場靴腿,多數是從 CD 轉出來的 16bit/44.1kHz wav,也有幾張是 128k mp3 轉回來的假無損。問題不在音質,是每首歌結尾的掌聲長短不一:短的 1.2 秒就切掉,長的拖到 6 秒,做成歌單後節奏全亂。量不大,92 首,但手動剪會瘋。
上個月幫朋友處理一批 2023 年從社區強震儀抓下來的 miniSEED,總共 6 個測站、每個站 3 通道、取樣率 100 Hz,時間跨度約 11 天。檔案加起來大概 4.2 GB。目标很簡單:把每天的事件窗切出來,看 P 波到時,順便算個 STA/LTA 當作輔助。一開始直接把整包丟進 ObsPy 的 read,結果跑了一陣子才回來,而且記憶體直接吃到 8 GB 以上。後來改成先做三件事,才比
手上有一批 43 場現場錄音,多是 audience 錄音轉出來的 FLAC,取樣率 44.1kHz、16bit,每場大約 45 到 90 分鐘。問題不在音質,而在曲與曲之間:一段十幾秒的鼓掌、講話、椅子聲,讓整張專輯在隨機播放時聽起來很碎。我想把每首曲子前後的觀眾聲壓到一個固定的短尾巴,保留現場感,但不要每次切歌都先聽五秒拍手。
前陣子為了把社群通報的震度資料和 USGS 的 event 資料對起來,我在一台 4 核 8G 的 VPS 上跑了一支 Python 小管線。資料量不大:一天大概兩三百筆 event、社群端每分鐘幾十則訊息,跑一週也才幾萬筆。理論上這種規模不該出問題,但它就是出了。
手邊有一張 2003 年的現場專輯,CD 抓軌成 FLAC,另外有一份串流平台下載的 320k MP3。兩份檔案時長差不到 0.2 秒,但同一段吉他反饋聽起來就是不太一樣。我想知道差別在哪,於是把兩份都丟進 Spek 看頻譜,再匯出成圖片疊在一起比對。
上個月整理一批 2016 到 2019 年的現場錄音,來源是同一位朋友的 Tascam DR-05,總共 23 場、180 首曲目。檔案是 44.1kHz/16bit 的 WAV,一場一個檔,長度從 48 分鐘到 1 小時 52 分不等。問題是:每場只有一個大檔,播放器只能從頭放到尾,想聽第 7 首就得自己拖時間軸。
上個月整理一批 2018 到 2023 的現場錄音,總共 214 首,大部分是觀眾席錄的,少數是 soundboard 流出。我想把它們排成一份能連續聽的歌單,第一步就是用 BPM 自動排序:快歌開場,中段鋪陳,最後收在慢歌。我用 aubio 的 `aubio tempo` 掃過一輪,把結果寫進 CSV,再依 BPM 分箱。指令大概長這樣:
客廳那台唱盤接上 USB 錄音介面之後,我開始想記錄每一張黑膠到底聽了幾次。起點很土:一個 Google Sheet,四個欄位——專輯、廠牌、首次播放日期、累計次數。累積到 300 張、大約 1,800 筆播放紀錄時,我發現自己根本查不動了,篩選廠牌要等好幾秒,而且 foobar2000 那邊的歌單完全不知道這些黑膠的存在。於是我把整份表倒出來,做成 foobar2000 讀得懂的格式。
上個月拿到一場小型 Live 的現場錄音,48kHz/24bit 的 WAV,整場 1 小時 47 分,中間有兩段 MC 跟一次換弦的空白。我想把它切成能放進播放器的單曲,但不想靠猜——之前那批現場檔就是憑耳朵切,事後回頭聽,副歌前奏被砍掉半拍的地方至少五、六處。
整理硬碟時翻出一批 2012 年前後抓的無損專輯,大多是整軌 FLAC 加一個 .cue。播放器換過幾輪之後,這些檔案在手機上只剩一個 40 分鐘的長條,跳歌要手動拖。我決定把它們拆成單曲,順便把 tag 補齊。