要在瀏覽器中改變音高卻不失真,做法是用 Web Audio 解碼檔案,透過 OfflineAudioContext 以平均律的比例 2^(n/12) 重新取樣(其中 n 是半音的偏移量),再匯出成未壓縮的 PCM16 WAV。因為同一個比例也會影響播放速度,提高音高會讓音訊縮短,降低音高則會以同樣的倍率讓音訊變長。用這種方式做的音高偏移,在來源端是純粹保持原始取樣率的,因為原始緩衝區從未被重新錄製;但重新取樣後的輸出,可能會暴露出原本在來源中被掩蓋的鋸齒失真(aliasing)。要留在瀏覽器裡,還是把檔案送到桌面版 DAW,取決於這個專案需要的是單純的音高調整、鎖定節奏的音高調整,還是音高加上透明無損的母帶處理。音訊變調工具(Audio Pitch Changer)鎖定的是這三種情境中的第一種,並在頁面上用白話文誠實地說明第二種情境背後的數學原理。
音訊變調工具在目前的瀏覽器分頁中,執行的正是這套流程,鎖定的是這個關鍵字背後的實際任務:使用者手上有一個音訊檔案,想要不同的音樂音高,並希望結果留在瀏覽器裡,而不必送到伺服器。這項產品的契約明確表示:不會上傳任何內容、檔案在本機解碼、離線算圖在解碼後的取樣率下執行,下載的是重新編碼過的 WAV。接下來的章節會說明半音滑桿背後的數學原理、三個步驟的操作流程、輸入與輸出的限制,以及這種做法不適用的情況。

平均律音高公式如何運作
這個工具中的音高,由十二平均律(twelve-tone equal temperament)所支配,這正是現代數位鍵盤與 MIDI 所使用的同一套調律系統。麥基爾大學(McGill University)關於MIDI 與頻率換算的課程教材指出,一個八度包含十二個相等的半音,每個半音的頻率比為 2^(1/12),而一個半音等於 100 音分(cents)。W3C 的 Web Audio 規範,在 AudioBufferSourceNode 的播放演算法中,定義了對應的音分關係,其中變調(detune)貢獻的因子是 2^(detune/1200)。
在音分與半音之間換算(每個半音一百音分),會把這兩個公式收束成本文從頭到尾使用的較簡單形式:playbackRate = 2^(n / 12),其中 n 是整數的半音偏移量。
MDN 對 playbackRate 的文件說明將它定義為原始取樣率上的一個乘數:小於一的值會讓音訊變慢,大於一的值會讓它變快,任何非一的值都會讓瀏覽器重新取樣解碼後的緩衝區。這正是為什麼提高音高也會讓音訊變短,而降低音高會讓它變長。新的音高與新的長度,其實是同一次重新取樣運算的兩個面向。
+12 個半音的偏移量,會產生 2^(12/12) = 2.0 的播放速率,音高加倍、長度減半。-12 的偏移量則會產生 2^(-12/12) = 0.5,音高減半、長度加倍。位於高於原音七個半音處的完全五度,會產生 2^(7/12),約為 1.498,聽起來快而明亮。位於五個半音處的完全四度,則會產生 2^(5/12),約為 1.335。這些都是貫穿本文其餘部分所使用的標準平均律音程,與取樣率、聲道數或編碼格式無關。
用音訊變調工具處理單一音訊檔案
這個介面只提供這條重新取樣路徑所需要的控制項,因此操作流程很短,結果也可以預期。三個動作就能產生一個完整的 WAV 檔:選一個檔案、選一個半音整數、算圖並下載。以下詳細步驟精確對應這項操作契約。
- 選擇一個瀏覽器可解碼、大小不超過 50 MiB 的音訊檔案。輸入控制項接受常見的 MP3、WAV、M4A、AAC、Ogg、WebM 與 FLAC 副檔名,但實際能否解碼,仍取決於目前瀏覽器能解碼的內容,因此副檔名可辨識並不代表一定能成功解碼。
- 設定一個介於 -12 到 +12 半音之間的整數音高偏移量。數值為 0 會保留原始音高,不過重新編碼後的 PCM16 WAV,仍可能與解碼後的浮點數來源有差異,因為浮點數轉 PCM16 本身就是一道量化步驟。+12 會把音高調高一個八度;-12 會把音高調低一個八度。中間的數值則會產生上一節所討論的平均律比例。
- 建立完整的本機算圖結果,檢視顯示出來的長度變化,然後下載 PCM16 WAV。這個工具會透過 OfflineAudioContext,在解碼後的取樣率下算出整個檔案,把每個聲道編碼成交錯排列的小端序 PCM16,放進一個 RIFF/WAVE 容器中,把浮點數取樣值裁切到合法的 -1 到 +1 區間,並把這些位元組交付成單一個下載檔。WAV 檔本身不會有無聲的尾端遭到裁切,也不存在任何隱藏的長度上限。
以一個實際範例來說,取一段 180 秒的片段,以 +12 個半音算圖。公式給出 2^(12/12) = 2.0 倍的播放速度,因此輸出的影格數,會是把來源取樣率下的 180 / 2.0 = 90 秒音訊取上限值。下載到的 WAV,會以相同的取樣率承載 90 秒音訊,但每一個影格都已經被向上重新取樣,以符合加倍後的音高。完整的算術只是一次代入:rate = 2.0,duration_out = 180 / 2.0 = 90。這正是使用者在點擊算圖之前,就能在紙上預測出來的結果。
支援的輸入格式與你下載到的 WAV
輸入端一次接受一個編碼過的檔案,編碼後的內容有一道硬性的 50 MiB 上限。瀏覽器接著會把檔案解碼成一個 AudioBuffer,這正是提供給離線算圖的來源。在開始任何昂貴的輸出運算之前,解碼後的緩衝區會先對照幾項明確的預算逐一檢查,任何一項失敗都會直接中止,並顯示錯誤訊息,而不是產生一個不完整的下載檔。
| 階段 | 限制 | 為什麼重要 |
|---|---|---|
| 編碼後的輸入檔案 | 最多 50 MiB | 超過此大小的內容會在解碼前就被拒絕。 |
| 解碼後長度 | 最多 5 分鐘 | 解碼後長度更長的音訊會被拒絕。 |
| 解碼後的聲道數 | 最多 8 個 | 超過八個聲道的解碼結果會被拒絕。 |
| 解碼後取樣率 | 8,000 Hz 到 192,000 Hz | 超出此區間的取樣率會被拒絕。 |
| 解碼後的聲道取樣數 | 最多 30,000,000 | 超過此數值的輸入,會在算圖前就被拒絕。 |
| 輸出的聲道取樣數 | 最多 30,000,000 | 如果向下的音高偏移,讓輸出超過這項預算,就不會寫出任何內容。 |
可下載的 WAV 永遠是重新編碼的結果。它是未壓縮、交錯排列、小端序的 PCM16,放在 RIFF/WAVE 容器裡。原始的壓縮品質、位元率、ID3 或 Vorbis 標籤、內嵌的封面圖片、章節標記、標記點、循環播放中繼資料,以及其他容器層級的中繼資料,都不會被帶進匯出檔案中。16 位元的量化結果,可能與解碼來源的浮點數解析度有落差,而瀏覽器的重新取樣器實作方式因瀏覽器而異,因此大幅向上的音高偏移,可能會暴露出原本在來源中被掩蓋的鋸齒失真。對於要求透明無損母帶處理的用途,這些但書會是決定性的;但對於快速的創意實驗、練習用音軌、音效與粗剪,這樣的輸出通常已經綽綽有餘。
決定算圖能否完成的限制
那些以為「降低音高」永遠是輕鬆操作的使用者,最常碰到的就是輸出端的預算上限。降低音高會讓音訊變長,因此即使輸入端仍在預算之內,輸出的影格數也會隨之增加。這項產品契約把這一點說得很明白:一個通過解碼上限的輸入,仍然可能因為輸出上限而失敗,只要所要求的向下音高偏移,讓所需的輸出超過 30,000,000 個聲道取樣值。在這種情況下,訊息會說明所要求的偏移超出預算,且不會做任何裁切;不會提供不完整的 WAV。
其他的防護機制比較不顯眼,但確實存在。每當有新的輸入或新的半音數值,都會在下一個工作開始之前,讓先前的算圖結果失效,因此一個仍在進行中的離線算圖,不會覆寫較新的狀態。當工作被判定失效時,解碼用的內容會被關閉,離線來源會被停止或中斷連線,而下載用的 Object URL 也會在被取代或頁面卸載時被撤銷。空檔案、不支援的類型、無效的解碼尺寸,以及解碼失敗,都會以明確的訊息被拒絕,而不會被悄悄轉換成其他東西。這一切都不會影響一般的單檔使用情境,但可以解釋為什麼一個大檔案配上大幅度的向下音高偏移,可能會失敗,而一個較小檔案配上向上偏移卻不會。
音高與長度必須分開處理的情況
本文必須誠實劃出一條界線:這個關鍵字所承諾的「不失真」,並沒有說明「品質」究竟指的是什麼。如果讀者所說的品質,是指輸出是一個乾淨的 PCM16 檔案,沒有中繼資料流失、沒有額外的壓縮流程,也不需要上傳,那麼這個工具符合這個標準。如果讀者所說的品質,是指音高改變的同時保留原始的節奏與長度,那麼沒有任何靠改變播放速率運作的工具能達到這個標準,這個工具也不宣稱自己做得到。
| 特性 | 播放速率重新取樣(本工具) | 時間拉伸(獨立的工作流程) |
|---|---|---|
| 改變的內容 | 音高與長度一起改變 | 音高與長度分別改變 |
| 演算法類型 | 對單一緩衝區做取樣率重新取樣 | 相位聲碼器、顆粒合成,或類似的分析-再合成技術 |
| 常見的品質風險 | 大幅向上偏移可能暴露鋸齒失真 | 在打擊樂素材上出現瞬態糊化與相位瑕疵 |
| 適合用於 | 練習用音軌、音效、快速實驗 | 節奏必須保持鎖定的正式音訊 |
| 只靠瀏覽器 | 可以 | 需要專用函式庫或外部工具 |
如果交付成果要求固定的長度,請改用相位聲碼器,或在 DAW 中採用其他時間拉伸的工作流程,而不是瀏覽器端的重新取樣器。MDN 上關於 playbackRate 的說明條目證實,Web Audio API 標準形式中只提供會改變速度的重新取樣器;獨立的時間拉伸並不在同一套流程之中。對於只需要小幅調整節奏的使用者,這一點也值得留意:專用的音訊變速工具(Audio Speed Changer)只處理速度、不改變音高,而這裡專用的音訊變調工具(Audio Pitch Changer)則處理音高偏移,但不宣稱能保留節奏。
「品質」在這裡實際上指的是什麼
對照這個關鍵字來看,最乾淨的解讀是「不上傳、不做第二次破壞性壓縮、不做無聲截斷,而且格式安全,方便日後下游重新編輯」。這四項承諾都成立。瀏覽器是唯一會碰到音訊的環境。離線算圖會產生完整的輸出影格數,而且只有在聲道數、取樣率與影格數都符合預期時,才會提供 WAV 檔。PCM16 編碼是未壓縮的,且在每一套接受 WAV 的編輯軟體中都廣受支援。浮點數轉 PCM16 本身就是一道破壞性步驟,因此取樣值未必能與解碼來源逐位元相符。
這個關鍵字言過其實的地方,在於任何把「品質」當成「音樂上的透明無損」同義詞的解讀。無論是在瀏覽器中還是在桌面版 DAW 中,重新取樣都會留下痕跡。大幅向上偏移會暴露鋸齒失真。大幅向下偏移會拉長檔案,並逼近輸出端的預算上限。容器層級的中繼資料不會在重新編碼後存活下來。這項產品契約把輸出結果描述為適用於快速的創意實驗、練習用音軌、音效與粗剪,而不是一套透明無損的母帶處理流程。清楚知道這個專案落在這條界線的哪一側,正是選對工具的關鍵。
想更深入了解,請參閱如何在 iPhone 上改變音訊速度並儲存檔案。
想更深入了解,請參閱音訊變調工具的準確度:數學原理、限制與結果。