播放速率重取樣是這個音訊變調工具在瀏覽器中用來改變音高的方法 —— 也就是將一個八度轉換成 2× 或 0.5× 播放速率的相同計算,以 rate = 2^(semitones/12) 表示。接受的範圍是 -12 到 +12 半音,所以這個工具涵蓋完整往下一個八度到完整往上一個八度,並會在您目前的分頁中直接產生一個全新的未壓縮 PCM16 WAV 檔案,完全不會上傳來源音訊。由於音高是透過改變播放速率而非重新對應泛音結構來改變,因此音訊長度也會以相同的倍率跟著改變 —— 升高音高會讓音軌變短、變快,降低音高則會讓它變長、變慢。這個數學來自十二平均律,也是 Web Audio 規範在底層描述 detune 的方式,因此這個行為在各家瀏覽器之間是一致的,而不是任何單一引擎的特殊怪癖。

audio pitch changer explained
audio pitch changer explained

音訊變調工具在瀏覽器中做了什麼

這個在瀏覽器中運作的 音訊變調工具能以整數半音為單位,將單一音訊檔案的感知音高從 -12 提升或降低到 +12,而且它採用的是播放速率重取樣,而不是時間伸縮演算法。當您設定目標半音數時,工具會根據平均律關係式 rate = 2^(semitones/12) 將該整數轉換成播放速率,接著在解碼後的取樣率下,透過 OfflineAudioContext 將整個檔案渲染出來。輸出是一個全新的未壓縮 PCM16 RIFF/WAVE 檔案,由瀏覽器即時編碼,因此沒有需要重新封裝的來源檔,也沒有需要保留的中介格式。所有步驟 —— 解碼、重取樣、混音、寫入 WAV —— 全部都在您目前分頁中、您自己的電腦上完成,這也是為什麼產品合約特別聲明不會將任何來源音訊或渲染後的音訊上傳到 Lizely。在您把這個工具與會將您檔案串流到別處的雲端變調服務比較時,這種純本機處理的特性值得記住,因為它也限制了支援的輸入格式,只能使用您特定瀏覽器目前能夠解碼的那些格式。

半音、八度,以及 2^(n/12) 的關係

半音是標準十二平均律中最小的音程間隔,一個八度內恰好包含十二個等分的半音。根據 McGill University 的 MIDI/頻率參考資料,每個半音對應的頻率比為 2^(1/12),而一個半音內包含 100 cents。W3C Web Audio API 在 AudioBufferSourceNode 套用 detune 時,使用相同的 cents-to-rate 關係:以 cents 為單位的 detune 值,會對播放速率貢獻一個 2^(detune/1200) 的倍率。您在這個工具中設定的位移值僅僅是半音,因此同一公式可簡化為 rate = 2^(semitones/12),也就是下表中各個錨點的由來。由於速率只取決於位移量,長度變化就是速率的倒數 —— 2× 速率會產生大約一半長度的音訊,0.5× 速率則會產生大約兩倍長度的音訊。

半音位移播放速率大致的長度變化
-12 (往下一個八度)0.5×約為原始長度的兩倍
-12^(-1/12) ≈ 0.944×略長
0 (不變)不變
+12^(1/12) ≈ 1.059×略短
+12 (往上一個八度)約為原始長度的一半

這個版本的合約明確列出端點:+12 將素材正好升高一個八度,-12 將其降低一個八度,0 則維持原始音高。介於中間的值會在同樣的尺度上以平均律的步進移動,這就是為什麼您設定的每個正或負位移,都會對應到單一個播放速率倍率,不會再有額外的捨入或曲線。

為什麼音高與長度會一起改變

如果您想要改變音高但不改變長度,實際上您需要的是相位聲碼器 (phase vocoder) 或其他時間伸縮的工作流程,因為這個工具所採用的 Web Audio playbackRate 屬性會把兩者耦合在一起。MDN 將 playbackRate 記錄為原始取樣率的比例:小於 1 的值會讓音訊變慢、變長,大於 1 的值會讓音訊變快、變短,而任何不等於 1 的值都會導致來源被重新取樣。W3C 的 detune 規範背後也是同一個機制 —— detune 同時透過 2^(detune/1200) 這個倍率來移動音高並重新調整時間,因此這個副作用是結構性的,而非偶然的。

這個取捨是有意且已知的:這個音訊變調工具定位於快速的創作移調、音效設計草圖、聽力訓練素材以及粗略剪輯 —— 而不是音調必須鎖定的透明後期母帶處理。尤其是大幅度的向上位移,可能會讓原始音訊中不太明顯的失真或編碼器瑕疵浮上來,因為以 2× 重新取樣基本上會把高頻內容的有效餘裕砍半。這些都不是缺陷 —— 它只是播放速率重取樣在瀏覽器中能做到的邊界,而這個工具從未聲稱能保留 tempo、語速、拍點位置或精確的原始長度。

如何使用音訊變調工具在本機變調

以下是這個音訊變調工具目前版本支援的操作流程。

  1. 選擇一個您瀏覽器能直接解碼的音訊檔案 —— 常見格式包含 MP3、WAV、M4A、AAC、Ogg、WebM 與 FLAC —— 並確認其大小不超過 50 MiB。實際的編解碼器支援仍取決於您使用的特定瀏覽器,因此即使副檔名被識別,也不保證每個不常見的編解碼器設定檔都能成功解碼。
  2. 在 -12 到 +12 半音的範圍內設定一個整數的音高位移。請使用符合您想要聽到的整數:正值升高音高,負值降低音高,零則維持原始音高。請記住,因為音高與時間在播放速率重取樣中是一起移動的,所以同一個設定也會等比例改變長度。
  3. 完成本機渲染,讓工具回報所顯示的長度變化,然後從結果下載完成的未壓縮 PCM16 WAV。

第二步是值得放慢仔細看的部分。正半音每往十二個步進會將速率加倍,因此 +12 位移會讓速度加倍,-12 位移則會讓速度減半,而單一個半音只會讓速率在任何方向上變動大約六個百分比。如果您的來源是短迴圈或持續音,那麼一個半音的變動是進行更大跳躍之前很實用的測試。如果您想要往上的完全四度,請輸入 +5;如果您想要往下的完全五度,請輸入 -7。這個工具只是把您輸入的任何整數,透過同一個公式對應過去。

決定渲染能否成功的限制

這個產品合約特別事先載明這些限制,並在任何一項被違反時回傳單一錯誤且不下載任何檔案,在您餵入長檔案之前值得先了解。

限制數值適用位置
最大輸入檔案大小50 MiB解碼前的編碼檔
最大解碼長度5 分鐘解碼後的音訊
最大解碼聲道數8 聲道解碼後的音訊
取樣率範圍8,000 – 192,000 Hz解碼後的音訊
輸入樣本預算30 million channel samples解碼階段
輸出樣本預算30 million channel samples變調後的輸出

30 million channel samples 的輸出樣本預算是負向位移中最常被忽略的限制。降低音高會增加所需的輸出幀數 —— 這正是讓音軌變長的原因 —— 因此一個通過解碼端限制的輸入,在您推向 -12 半音時仍可能因為超過輸出端限制而失敗。在這種情況下,訊息會指出所要求的位移超出預算,而且不會截斷任何內容。空檔案、不支援的輸入類型、無效的解碼維度以及解碼失敗,都會在進行任何昂貴的輸出工作之前就預先被拒絕;而且每次輸入或半音變動都會讓先前的結果失效,所以舊的渲染不會覆蓋到較新的結果。這裡沒有靜默地截尾,也沒有隱藏的長度上限:如果預算被超過,您就單純拿不到檔案。

下載的 WAV 檔實際上包含什麼

您儲存的檔案是一個新編碼的未壓縮 PCM16 RIFF/WAVE 串流,以交錯 (interleaved) 且小端序 (little-endian) 的方式寫入。浮點樣本會在轉換成 16 位元整數之前,先被限制在 -1 到 +1 的區間內,這符合該格式的合法範圍,但也代表 PCM16 的量化可能與解碼後的浮點來源有所不同。匯出的是一個新檔,而不是原始容器的重新封裝,因此任何來源編解碼器、壓縮品質、位元率、ID3 標籤、封面、章節、cue 點、loop 點以及其他容器中繼資料都不會被保留。瀏覽器的重取樣品質是 implementation-defined 的,這也是為什麼這個輸出被建議用於練習曲、音效與粗略剪輯,而不是已完成的母帶。這個頁面刻意不產生由 blob 支援的音訊預覽,因為網站的媒體政策不允許這條預覽路徑,因此聆聽結果的正確方式是下載 WAV 並在您信任的本機播放器中播放。如果您需要透明、tempo 鎖定的變調,請規畫在您工作流程的其他地方使用專門的相位聲碼器或時間伸縮工具 —— 這個音訊變調工具刻意不做出這種承諾。

在數學與純本機的流程都釐清之後,下一步就是實際試做一次位移。開啟音訊變調工具,挑一個半音值,並把渲染出的 WAV 與您的來源比較,感受每一步帶來多大的變化。

延伸閱讀:音訊變調工具入門:在本機改變音高

延伸閱讀:免費線上音訊變調工具:免註冊、免上傳