為什麼這款唱歌監測 App 的曲線比你想的還要講究

摄影图像 ·约 10 分钟 ·記筆記的貓:團子

monitor 是什麼

如果你對聲樂練習感興趣,可能聽過一種說法——「唱得準不準,讓儀器告訴你」。monitor 就是這麼一款 Android 應用:打開之後對著手機唱,螢幕上會即時畫出一條音高曲線,你的聲音落在縱軸的哪個位置、形狀是平的還是抖的,一目瞭然。它同時提供錄音、回放、音階參考線等功能,練聲時像是有一位不發脾氣的陪練。

但這不是什麼新鮮事——市面上能畫音高曲線的 App 不止一款。真正讓我感興趣的是:它是怎麼在千元手機上,用 5MB 的體積做到這件事的? 為什麼同樣一段聲音,在某些 App 上畫出來是亂麻,在它這裡卻是一條乾淨的線?答案藏在從「聲音進入麥克風」到「曲線顯示在螢幕」這條鏈路的每一個環節裡。

安裝

monitor 的安裝包只有 5.54MB,在今天的 Android 應用裡算得上輕量。它運行在 Android 設備上,monitor下載完 APK 之後允許安裝即可,不需要額外的解壓或數據包下載。首次啟動時應用會請求麥克風權限——這是必須的,沒有權限就畫不出任何曲線;除此之外沒有其他硬體要求,也不需要註冊帳號或登入。

有一個值得注意的小細節:某些廠牌的系統會自動殺後台,如果你在練聲中途切到其他 App 再切回來,曲線可能會中斷。建議把 monitor 加入系統的「允許後台活動」白名單,這款 App 不跑耗電的後台服務,但被系統強制休眠後需要重新啟動才能恢復檢測。

問題:為什麼你的聲音能變成一條線

先把鏈路拆開來看。當你對著手機發出一個音時,整個過程經歷四個階段:

採樣 → 分析 → 過濾 → 渲染。

聽起來簡單,但每個階段的取捨都會影響你最終看到什麼。我打算逐個拆解,然後看看 monitor 在每一步做了什麼選擇,以及這些選擇的代價是什麼。

採樣:每秒四萬四千次的「聲音照片」

一切始於麥克風。Android 系統提供了 AudioRecord API,讓 App 可以直接讀取麥克風的原始音頻緩衝區。monitor 以 44100Hz 的取樣率工作——也就是每秒對聲音做 44100 次測量,每一次測量是一個 16-bit 的整數值,代表那一刻聲波的振幅大小。

為什麼是 44100Hz?這不是一個神奇的數字,它是 CD 音質的標準取樣率,足夠覆蓋人耳能聽到的全部頻率範圍(20Hz 到 20kHz),同時又不會產生過多的數據讓手機 CPU 跟不上。如果用更低的取樣率(比如 22050Hz),高頻部分就會丟失,高音區的檢測精度會下降;更高的取樣率(96000Hz)對聲樂檢測來說沒有可感知的好處,只是徒增運算量。

採樣本身不是難點,難點在於即時性——你唱下去的瞬間,曲線應該同步出現,延遲超過 100ms 人耳就能察覺。monitor 用的是小緩衝區策略:每次只讀取幾十毫秒的音頻數據,處理完立刻顯示,然後再讀下一批。這讓延遲壓得很低,但也意味著 CPU 必須持續高頻工作,不能偷懶。

分析:從振幅到頻率的核心演算法

這是整個鏈路最關鍵的一步——把一串振幅數字轉化成「這是什麼音」的判斷。聲音進入麥克風時是一個隨時間變化的振幅波形,我們需要從中提取出基頻(fundamental frequency),也就是決定音高的那個頻率。

常用的基頻檢測演算法有好幾種:自相關(Autocorrelation)、YIN演算法、MPM(Modified Pitch Detection),等等。每種都有自己擅長的場景和盲點——比如自相關在噪音環境下表現不錯,但對氣聲和輕音容易失準;YIN 演算法精確但計算量更大。

我沒辦法直接看到 monitor 用的是哪一種演算法,但從它的表現可以反推:它對穩定長音的追蹤很準,波浪線(顫音)的細節也能捕捉到,同時在有一定環境噪音的情況下不會完全亂掉。這說明它用的不是最簡單的自相關,而是一種做過優化的混合方案——可能在 YIN 的基礎上加了一層快速篩選,先用閾值過濾掉顯然不是人聲的數據,再對剩下的部分跑精確分析。

這裡有一個取捨:演算法越精確,運算量越大,手機發熱就越嚴重。monitor 能在 5MB 體積內跑動、又不讓手機變成暖手寶,說明它在演算法複雜度和效能之間找了一個不錯的平衡點——對於聲樂練習這個場景來說,精度不需要到科學實驗級,但必須足夠穩定、足夠快。

過濾:那一道被你忽略的閾值

現在我們有了原始的基頻數據,但還不能直接畫線——因為麥克風不會只收到你的聲音。冰箱的嗡嗡聲、窗外的車流、手指碰到手機殼的振動,這些都會被採樣、被分析、產生一堆亂七八糟的頻率值。

這就是 Threshold of volume(音量閾值) 存在的原因。它是檢測的第一道閘門:只有振幅超過閾值的採樣才會進入後續分析,低於閾值的直接丟棄。預設值是 0.50,但這個數字不是萬能的——安靜的房間裡可以調低讓輕音也能進來,吵雜的環境裡必須調高才能擋住底噪。

設置頁首項:Threshold of volume 滑桿與預設值 0.50

這個設計看起來簡單,實際上很巧妙:它把「是否為有效人聲」的判斷從複雜的頻率分析前置到了最前面,用一個極低成本的比較運算擋掉了大部分噪音。代價是——氣聲重、音量小的練習者可能會發現自己的聲音被閘門攔住了,需要手動把閾值調低。這不是演算法的缺陷,而是這種前置過濾方案的固有 trade-off。

除了音量閾值之外,monitor 還有隱藏的頻率過濾:它只關注人聲的頻率範圍(大約 80Hz 到 1100Hz),超出這個範圍的檢測結果會被標記為不可信、不畫線。這也是為什麼你對著 App 吹口哨(高於人聲範圍)可能得不到任何曲線——不是它壞了,是它故意忽略了。

渲染:滾動的曲線和有限的螢幕空間

終於到了最後一步——把分析結果畫到螢幕上。這裡的挑戰是:螢幕空間有限,但聲音是連續不斷的。monitor 的做法是讓曲線從右往左滾動,最新的數據點出現在右側,整條曲線每秒向左推進一段距離,最左側的舊數據隨滾動消失。

縱軸的音高標線不是固定的——它會根據你的音域自動調整。如果你唱的是低音,縱軸會下移顯示 C2 到 C4 的範圍;突然唱到高音時,縱軸會跟著往上擴。這個「自動滾動」功能可以關閉,但關掉之後你很容易唱出螢幕範圍,曲線跑出視野就看不到了。

還有一個細節值得提:音階參考線。當你在 Settings 裡選了一個音階(比如 C Major 或 E♭ Minor),monitor 會在縱軸上把這個音階內的音級用顏色高亮畫出參考線。這條線不是「評分標準」,它只是一個視覺引導——你唱到主音時曲線落在主音線上,唱偏了就漂到空白區。這個設計的好處是:你不需要同時記住所有音級的位置,眼睛掃一眼就知道自己唱在哪。

E♭ Minor 音階下的主界面:紅色當前音級線與綠色音階參考線

代價與邊界:這套設計在哪些場景會失效

說了這麼多好處,也該說說它做不到什麼。

首先,它只能檢測單音。如果你同時唱兩個音(比如哼鳴加嘴型),或者環境裡有第二個聲音(伴奏、和聲),演算法會試圖從混亂中找一個最強的基頻,但結果往往不穩定——曲線會亂跳,或者卡在一個奇怪的位置不動。這不是 monitor 的問題,是所有基頻檢測方案的共同邊界:多音聲場的頻率分析本身就是一個尚未完全解決的難題。

其次,極低音區(80Hz 以下)和極高音區(1100Hz 以上)的精度會下降。低音區的波長太長,短緩衝區內採樣點不夠,演算法難以精確定位;高音區接近 Nyquist 頻率的一半,取樣率的限制開始顯現。monitor 在這兩個區域會變得更「保守」——寧可不畫線也不給出不可信的結果。

最後,它不判斷好不好聽。曲線平穩不等於有感情,波浪線規律也不等於顫音到位。monitor 提供的是一個客觀的物理測量,它告訴你音高落在了哪裡,但不會告訴你這個音在當前這首歌裡合不合適、情感表達夠不夠。這是人耳和審美的工作,機器幫不上忙。

判斷:這款 App 適合什麼,不適合什麼

綜合下來,monitor 的設計哲學很清晰:在消費級硬體的限制下,用盡可能簡單、快速、穩定的方案解決「即時音高可視化」這一個問題。它沒有堆功能、沒有做花裡胡哨的 UI、也沒有試圖成為一款全能的聲樂教學軟體——它就做一件事:把你的聲音變成一條可信的曲線。

如果你是正在練聲的業餘愛好者、或者想直觀地看到自己的音高穩定度,這款 App 夠用而且好用。如果你需要多音分析、需要專業級的精度、或者希望 App 能直接告訴你「這裡唱錯了」,那它可能滿足不了你的需求——那些功能的計算量和複雜度,遠遠超出了一個 5MB 手機 App 的合理邊界。

技術產品的優劣,很多時候不在於它做了什麼驚天動地的事,而在於它清楚自己要解決什麼問題、並且把這件事做到位。monitor 就是這樣一個例子:從採樣到渲染的每一步,你都能看到它在「精度、速度、體積」三者之間做的務實取捨,而這些取捨最終匯成了你手中那條乾淨、即時、可信的音高曲線。

本文為個人基於網路公開資料整理編寫,非官方內容,僅供學習交流參考;軟體版權歸原作者所有,請支持正版;使用過程中遇到問題請查閱官方管道,本文不承擔任何責任。

團子還試過這些