跳至主要內容
全球國際徵信顧問
案件指揮艙全部本機工具
V236 / OPERATING GUIDE

先讀範圍,再決定錄音增強副本能替你做什麼。

錄音增益降噪副本只在你的瀏覽器內處理聲音,不上傳、不使用麥克風、不使用瀏覽器儲存空間。本頁說明它做什麼、不做什麼、每個步驟的白話原理與參數建議、處理紀錄怎麼讀、如何自己動手驗證、實測結果與限制,以及最常被誤解的地方。

READ FIRST

先說清楚這不是什麼

增強副本是「比較容易聽的工作副本」,不是原始證據,也不會讓錄音裡原本沒有的聲音長出來。
SCOPE

做什麼、不做什麼

做什麼
  • 在你的瀏覽器內讀取一個錄音檔。WAV(PCM 8/16/24/32 位元、浮點 32/64 位元、A-law、μ-law、EXTENSIBLE)由內建解析器直接讀;MP3、OGG Vorbis、Opus、FLAC 等由瀏覽器的 decodeAudioData 解碼(能不能解取決於你的瀏覽器;本站測試用的 Chromium 能解 MP3、OGG、Opus、FLAC,解不了 M4A 與 AAC,遇到時頁面會說明並建議先轉成 PCM WAV)。
  • 上限:檔案 200 MiB、長度 60 分鐘、取樣率 8000 至 192000 Hz。超過時會說明原因並建議先切成較短的段落(例如用 ffmpeg 或錄音軟體),不會悄悄截斷。
  • 只處理前兩個聲道(左、右)。三個以上聲道的檔案,其餘聲道不處理也不輸出,資訊欄會說明。
  • 12 種處理步驟與 4 組預設(人聲清晰、去除嗡嗡聲、遠距離錄音、快速聽取)。「處理範圍與淡入淡出」固定在最前面;其餘步驟都能開關、調整參數與順序。
  • 試聽:在最長 30 秒的試聽範圍上即時重算,可 A(原始)/B(處理後)切換、循環播放,並可「對齊音量後比較」,避免較大聲的一方聽起來比較清楚。附前後波形、頻譜圖(含文字說明)與頻段位準、統計表。
  • 「套用到整段」在背景工作者(Web Worker)內進行,有進度、可隨時取消,取消後不會留下任何檔案;畫面保持可操作。處理前先估算記憶體,超過保護上限就說明原因並拒絕,而不是當機。
  • 輸出 WAV(PCM 16 或 24 位元),檔名加上「_增強版」,可選輸出取樣率;同時產生 JSON 與 TXT 兩種處理紀錄。輸出前若峰值高於滿刻度的 0.9999(約 −0.001 dBFS),整段按比例縮小,並把縮小的量寫入紀錄,不會在編碼時悄悄削波;萬一仍有取樣被夾住,也會記下個數。
  • 「送到線索推理艙」只在你按下按鈕時,把處理紀錄文字送到同一網站的另一個分頁;沒有回應時改用「複製紀錄文字」。
不做什麼
  • 不上傳、不聯網、不使用麥克風、不使用任何瀏覽器儲存空間(含 cookie);關閉或重新整理頁面,畫面上的資料就消失。
  • 不修改原檔;結果一律另存為新檔。
  • 不辨識說話者與說話內容,不做聲紋比對,不判斷真偽或是否被剪接。
  • 不使用機器學習模型,不「生成」聲音。所有步驟都是公開、可重算的傳統訊號處理。
  • 不修復削波:削掉的波形已經遺失,本工具只標示位置。
  • 不支援 RF64、ADPCM 等少見的 WAV 編碼,也不內建 MP3、AAC 解碼器(由瀏覽器負責)。
  • 輸出是重新編碼的新 WAV:不含原檔的標籤與中繼資料,沒有抖動(dither)處理。
STEPS IN PLAIN WORDS

每個步驟在做什麼(白話)

下面依工具內的選單順序排列。每個步驟都附上「代價」:不是只有好處。順序也會影響結果,常見的順序是:先去直流、濾波與陷波,再降噪,接著加強人聲與壓縮,最後調整音量。工具會在順序不合理時提醒(例如降噪放在壓縮之後),但不會阻止你。

處理範圍與淡入淡出(固定在最前面)

原理
只處理你在步驟 2 選取的一段,起訖處各加一小段升餘弦淡入與淡出(預設各 10 毫秒),避免切口造成「啪」聲。試聽範圍(最長 30 秒)必須落在這段之內。
適合
只想處理重點片段;長錄音只處理需要的部分,可以節省時間與記憶體。
代價
淡入淡出會改變起訖處數毫秒的波形;選段以外的聲音不會出現在輸出中。
建議
保留預設值。這個步驟固定在所有步驟之前,不能移動或移除;這是和其他步驟不同的地方。

削波偵測(只標示)

原理
找出取樣值被削平在滿刻度附近的位置:連續至少 3 個取樣貼近門檻,或峰值沒有達到滿刻度時,重複碰到同一個最高值而形成的平台。位置與比例寫進紀錄與畫面提示。
適合
錄音太大聲、聲音聽起來破裂時,先知道哪幾段已經損壞。
代價
不改變任何取樣,也不修復。被削掉的波形已經遺失,任何程式都只能猜。
建議
看到大量削波時,後面的增益、壓縮與正規化都要保守,並以原檔為判讀依據。實測見下方「硬削波的語音」一列。

直流偏移移除

原理
每個聲道減去自己的平均值。
適合
幾乎所有錄音。偏移聽不出來,但會浪費動態範圍,也會影響後面的濾波、壓縮與正規化的計算。
代價
幾乎沒有。
建議
保持啟用。

聲道處理

原理
只取左、只取右、合併成單聲道(左右平均),或左減右。加入這個步驟時預設是合併成單聲道;四組預設都不含它。
適合
只有單邊有聲音;左右聲道的噪音一樣,合併後再降噪比較單純。
代價
合併會把兩邊不同的內容混在一起;左減右會抵消置中的聲音(通常就是人聲),結果可能很小聲,只供實驗。
建議
要合併就放在降噪之前;放在降噪之後會變成兩個聲道各自降噪再合併,結果不同,工具會提醒。

高通/低通/帶通濾波

原理
Butterworth 濾波器(截止點為 −3 dB),以雙二階串接實作,階數 2、4、6、8。高通切掉低於截止頻率的低頻(風聲、碰撞、馬達隆隆聲;預設 80 Hz、4 階),低通切掉高頻(嘶聲;預設 4000 Hz),帶通兩者同時。階數越高,過了截止點衰減越陡。
適合
低頻隆隆聲、手持收音的碰撞聲、高頻嘶聲。
代價
濾波器讓不同頻率的延遲不同(相位改變),所以處理後的波形形狀和原檔不同,即使聽起來差不多。階數高、截止點接近人聲時,聲音會變薄或變悶,突然的聲音後可能出現餘振。成年男聲的基頻大約在 85 至 180 Hz,女聲約 165 至 255 Hz,高通截止設太高會削掉聲音的厚度。
建議
人聲先試高通 80 Hz。要用低通就不要低於 3400 Hz,以免子音被削掉。

去除嗡嗡聲(市電陷波)

原理
在市電頻率(臺灣是 60 Hz,許多地區是 50 Hz)及其諧波(預設到第 8 個)上做窄頻陷波(預設帶寬 4 Hz)。陷波器係數與 SciPy 的 iirnotch 相同。自動偵測只比較 50 與 60 Hz 兩種,找不到明顯的嗡嗡聲時不處理,並把偵測分數與結果寫進紀錄。實測:對 60 Hz 嗡嗡聲的測試訊號,60 Hz 的分數是 27.8 dB、50 Hz 是 4.5 dB。
適合
電器、延長線或接地不良造成的低沉「嗡——」聲。
代價
落在這些頻率上的真聲音(很低的男聲基頻、低頻樂器)也會被削弱;嗡嗡聲如果不是剛好 50 或 60 Hz(例如馬達、冷氣的機械聲),陷波沒有用。
建議
先用自動偵測,並對照紀錄中的偵測結果;在臺灣不確定時可手動選 60 Hz。

降噪(頻譜減法/頻譜閘門)

原理
先用一段「只有噪音」的片段估計噪音在每個頻率上的平均強度(噪音輪廓)。再把錄音切成重疊的短視窗(16 kHz 時 512 個取樣,視窗長度隨取樣率調整,每次前進四分之一個視窗),逐一頻率處理:頻譜減法是從幅度中減去「靈敏度 × 噪音輪廓」,閘門是低於門檻的頻率直接壓到下限;壓低的量不超過「降噪量」。增益在時間上(時間平滑)與頻率上(頻率平滑)都做平滑,減少水聲;相位保持不變,重疊相加還原。噪音片段預設自動取最安靜的一段,也可以在步驟 2 自己標記;噪音輪廓會先經過它前面的線性步驟(去直流、濾波、陷波),所以重新排序後輪廓仍然對得上。
適合
持續而穩定的背景噪音:風扇、冷氣、電流聲、錄音裝置的底噪。
代價
不穩定的噪音(旁人說話、交通、音樂)無法估計,降不掉。降噪量越大、靈敏度越高,越容易留下水聲般的殘留雜音(音樂雜訊),說話聲也越悶;噪音片段裡若有說話聲,說話聲會被當成噪音壓掉。降噪不會讓被噪音蓋住的字句浮現。
實測
以純白噪音測試,實際衰減:頻譜減法 降噪量 12 dB/靈敏度 1.5 為 11.4 dB;24 dB/3.0 為 24 dB;24 dB/1.5 為 17.2 dB;閘門 20 dB/3.0 為 19.1 dB;閘門 12 dB/1.5 為 5.8 dB。降噪量只是上限,實際衰減還受靈敏度影響。頻率平滑 1 格會使 1 kHz 純音降低 -1.08 dB;對「純音加白噪音」,訊噪比由 14.5 dB 變為 18.1 dB(頻率平滑 1 格)或 25.6 dB(頻率平滑 0 格):平滑是用一部分降噪量,換取較少水聲與較少傷到語音。(本機沙箱小樣本)
建議
降噪量從 6 至 12 dB、靈敏度從 1.5 起步,一次只調一個參數。聽到水聲就降低降噪量或提高時間平滑;不要重複降噪。極端設定(例如 35 dB/3.0)在合成測試中會讓頻譜距離變差,見下方實測。

語音頻段增強

原理
把原聲加上一份只含 300 至 3400 Hz(可調)的版本,使這個頻段提高約指定的分貝數(預設 +4 dB);頻段兩側以二階高通與二階低通漸漸過渡。
適合
聲音聽起來太悶、太遠。
代價
同一頻段裡的噪音也一起變大,所以不會改善訊噪比;它只改變聽起來的明暗。
建議
提高 3 至 6 dB 就夠;先降噪再增強。

動態壓縮

原理
超過門檻的部分按壓縮比壓低(軟膝讓轉折圓滑),反應速度由啟動與釋放時間決定;兩個聲道連動,避免左右偏移。預設門檻 −30 dBFS、壓縮比 3:1、啟動 10 毫秒、釋放 150 毫秒、軟膝 6 dB。
適合
說話聲忽大忽小(說話者與麥克風距離改變)。
代價
大聲的被壓低,小聲的相對變大,說話停頓時的背景噪音也跟著被拉高;壓縮得越多,越容易聽到音量忽大忽小的「抽吸」。
建議
先降噪再壓縮;壓縮比不要超過 4:1;整體太小聲就用「補償增益」或正規化補回。

限幅

原理
前視限幅器:讓任何取樣都不超過上限(預設 −1 dBFS)。先看到即將到來的峰值,提前降低增益,因此不像硬削波那樣直接切平。
適合
拉高增益後怕削波。
代價
上限壓得太低或訊號太大時,聽得到失真或音量被「泵」動。
建議
放在流程最後,通常只需要輕微動作;實際壓低最多的量會寫進紀錄。

正規化

原理
峰值模式:把峰值(取樣值最高的點)調到目標(預設 −1 dBFS)。RMS 模式:把「高於門檻(預設 −60 dBFS)的片段」的平均音量調到目標(預設 −20 dBFS);若達到目標會造成削波,可選「只降低增益」(不改波形,可能達不到目標)或「用限幅器補足」(預設)。
適合
處理後整體太小聲,或要讓不同錄音的音量接近。
代價
只是整體增減音量,不會讓聽不清楚的內容變清楚;RMS 目標很高時,限幅器動作大,會失真。
建議
放在流程最後。若正規化之後還有改變音量的步驟,工具會提醒最後的音量不會是目標值。

變速不變調(WSOLA)

原理
把波形切成重疊的小段,依速度倍率重新排列,並在每個接合處搜尋波形最相似的位置再重疊相加,使音高大致不變。倍率 0.5 至 2.0 倍。
適合
很長的錄音想快點聽,或語速很快想放慢聽清楚。
代價
輸出的時間軸改變。倍率越極端,越容易出現顫動、回音感,子音被吃掉;對非語音內容效果較差。
實測
以類語音的合成訊號測試,原始基頻中位數 118.5 Hz;×0.6 後 120.3 Hz、×1.4 後 121.2 Hz、×1.8 後 118.5 Hz:音高大致維持。(本機沙箱小樣本;只量了這一種合成訊號。)
建議
聽取用 1.25 至 1.5 倍即可。變速後的副本不能直接用來量時間;請用處理紀錄中的對照表換算回原檔時間。

靜音壓縮

原理
以 50 毫秒為單位判斷「靜音」(門檻預設為噪音底再加 10 dB,也可手動設定);長於門檻秒數(預設 1 秒)的靜音,縮短成只保留一小段(預設 0.4 秒)。
適合
電話或會議錄音中的長時間停頓,想快速聽過一遍。
代價
輸出的時間軸改變。門檻設太高,會把輕聲說話也當成靜音剪掉。
實測
一段 20 秒的合成測試訊號壓縮成 8.19 秒。被縮短的區間會逐一寫進處理紀錄(原檔時間的起訖與縮短量)。(本機沙箱小樣本)
建議
先用自動門檻,處理後聽一遍,確認沒有剪到輕聲的字。
PRESETS

四組預設各做了什麼

預設只是起點,不是「最佳設定」。它們是依經驗與下方的合成測試調整的參數,沒有在大量真實錄音上驗證過。

四組預設的步驟與主要參數
預設適合的情況步驟與主要參數
人聲清晰說話聲偏小、背景有持續的沙沙聲削波偵測、去直流、高通 80 Hz 4 階、頻譜減法降噪 12 dB/靈敏度 1.5、語音頻段 +4 dB、壓縮(−30 dBFS、3:1)、RMS 正規化到 −20 dBFS(限幅補足)
去除嗡嗡聲低沉的電器嗡嗡聲削波偵測、去直流、市電陷波(自動偵測 50/60 Hz,8 個諧波)、高通 40 Hz 2 階、峰值正規化到 −1 dBFS
遠距離錄音說話者離麥克風很遠、聲音小而悶削波偵測、去直流、高通 100 Hz 4 階、頻譜減法降噪 14 dB/靈敏度 1.6、語音頻段 +5 dB、壓縮(−36 dBFS、3:1)、RMS 正規化到 −18 dBFS(限幅補足)
快速聽取很長的錄音想快點聽過一遍削波偵測、去直流、靜音壓縮(門檻為噪音底加 10 dB,超過 1 秒的靜音保留 0.4 秒)、變速 1.5 倍(音高不變)、RMS 正規化到 −20 dBFS(限幅補足);時間軸會改變,紀錄附對照表
PROCESS LOG

處理紀錄怎麼讀

每次套用到整段,都會產生 JSON 與 TXT 兩種紀錄(內容相同,TXT 給人讀、JSON 給程式讀)。主要欄位如下:

處理紀錄(JSON)的主要欄位
欄位內容
schema、tool格式標記(gib-audio-enhance-log-1)、工具名稱、頁面、版本(V236)與核心版本
createdAt、createdAtNote產生時間(來自這台裝置的時鐘,未經第三方驗證)
input原檔的檔名、大小、SHA-256、格式、讀取方式(內建解析器或瀏覽器解碼)、取樣率、聲道、位元深度、長度與位準統計
selection處理範圍的起訖秒數、淡入淡出毫秒
steps實際執行的步驟,依序列出 id、參數、說明、各步驟自己算出的值(derived,例如降噪使用的噪音片段與視窗大小、陷波採用的頻率、壓縮壓低最多的量、正規化的增益)與用時
output副本的檔名、大小、SHA-256、取樣率、聲道、位元深度、長度、輸出前縮小的量(exportGainDb)與編碼時被夾住的取樣數
timeline時間軸是否改變;改變時附輸出時間對應原檔時間的對照表與被縮短的區間
processing、stats處理用時;處理前後的位準統計(峰值、平均、噪音底、人聲位準,皆為粗略值,不是訊噪比)
environment、notes瀏覽器識別字串;限制說明(這是工作副本、不能取代原檔、不是公證)

紀錄是一般文字檔,可以被編輯;它的用途是讓別人能照著重做並比對,而不是替內容背書。工具也能「匯入先前的處理紀錄」還原步驟與參數,並核對目前載入的原檔雜湊是否相同。

VERIFY YOURSELF

如何自行驗證

先核對雜湊
  • 用作業系統的 sha256sum(或 shasum -a 256、certutil -hashfile)對原檔與副本計算,和處理紀錄中的 input.sha256、output.sha256 比對。
  • 或用下面的 Python 程式(只用標準函式庫,不依賴本站任何程式):
import hashlib
import json


def sha256_of(path):
    h = hashlib.sha256()
    with open(path, "rb") as f:
        for chunk in iter(lambda: f.read(1 << 20), b""):
            h.update(chunk)
    return h.hexdigest()


ORIGINAL = "範例.wav"                       # 你保存的原檔
COPY = "範例_增強版.wav"                    # 下載的增強副本
LOG = "範例_增強版_處理紀錄.json"           # 下載的處理紀錄(JSON)

log = json.load(open(LOG, encoding="utf-8"))
print("原檔與紀錄相符:", sha256_of(ORIGINAL) == log["input"]["sha256"])
print("副本與紀錄相符:", sha256_of(COPY) == log["output"]["sha256"])
確認輸出檔的格式
  • 用 ffprobe 看編碼、取樣率、聲道與長度,應與處理紀錄 output 欄位相同:
ffprobe -v error -show_streams -of json 範例_增強版.wav
用 SciPy 重現濾波步驟
  • 流程只含一個高通或低通濾波步驟時,下面的程式用相同的 Butterworth 設計重算並與副本比對,差最多的一點應在 1 個量化步階內:
import json

import numpy as np
from scipy import signal
from scipy.io import wavfile

ORIGINAL = "範例.wav"                       # 原檔:單聲道、16 位元 PCM
COPY = "範例_增強版.wav"                    # 下載的增強副本(流程只含一個高通或低通濾波步驟)
LOG = "範例_增強版_處理紀錄.json"           # 下載的處理紀錄(JSON)

log = json.load(open(LOG, encoding="utf-8"))
sr, x = wavfile.read(ORIGINAL)
x = x.astype(np.float64) / 32768
sel = log["selection"]
x = x[round(sel["startSec"] * sr): round(sel["endSec"] * sr)]
f = [s for s in log["steps"] if s["id"] == "filter"][0]["derived"]["applied"][0]    # 例:{"type": "highpass", "fc": 80, "order": 4}
kind = "highpass" if f["type"] == "highpass" else "lowpass"
sos = signal.butter(f["order"], f["fc"], kind, fs=sr, output="sos")                  # Butterworth,與工具使用相同的傳遞函數
y = signal.sosfilt(sos, x)
out = wavfile.read(COPY)[1].astype(np.float64)
mid = slice(int(0.2 * sr), -int(0.2 * sr))                                          # 避開兩端的淡入淡出
print("與副本逐點比較,差最多的一點相差(單位:16 位元量化步階):", np.max(np.abs(np.round(y * 32768) - out)[mid]))
用 NumPy 重現降噪步驟
  • 流程只含一個頻譜減法降噪步驟時,下面的程式依紀錄中的視窗大小與噪音片段,用 NumPy 重做一次,差最多的一點應在 1 個量化步階內。它也是演算法的完整規格:
import json

import numpy as np
from scipy.io import wavfile

ORIGINAL = "範例.wav"                       # 原檔:單聲道、16 位元 PCM
COPY = "範例_增強版.wav"                    # 下載的增強副本(流程只含一個降噪步驟,方法為頻譜減法)
LOG = "範例_增強版_處理紀錄.json"           # 下載的處理紀錄(JSON)

log = json.load(open(LOG, encoding="utf-8"))
sr, full = wavfile.read(ORIGINAL)
full = full.astype(np.float64) / 32768
sel = log["selection"]
x = full[round(sel["startSec"] * sr): round(sel["endSec"] * sr)].copy()
fi, fo = round(sel["fadeInMs"] * sr / 1000), round(sel["fadeOutMs"] * sr / 1000)   # 選段的升餘弦淡入淡出
x[:fi] *= 0.5 - 0.5 * np.cos(np.pi * (np.arange(fi) + 0.5) / fi)
x[len(x) - fo:] *= (0.5 - 0.5 * np.cos(np.pi * (np.arange(fo) + 0.5) / fo))[::-1]

d = [s for s in log["steps"] if s["id"] == "denoise"][0]
p, v = d["params"], d["derived"]
N = v["frameSamples"]; H = N // 4; bins = N // 2 + 1
w = 0.5 - 0.5 * np.cos(2 * np.pi * np.arange(N) / N)                                # 週期式 Hann 視窗
noise = full[round(v["noiseStartSec"] * sr): round(v["noiseEndSec"] * sr)]          # 噪音片段取自原檔,不含淡入淡出
prof = np.mean([np.abs(np.fft.rfft(noise[s:s + N] * w)) for s in range(0, len(noise) - N + 1, H)], axis=0)

floor = 10 ** (-p["reduction"] / 20)
a = 0.92 * p["smooth"] / 100                                                        # 時間平滑:釋放係數;啟動係數為其 1/4
L = len(x); off = N - H; M = int(np.ceil((L + N - H) / H))
xp = np.concatenate([np.zeros(off), x, np.zeros(N + 4 * H)])
out = np.zeros(len(xp)); Gp = None
for m in range(M):
    X = np.fft.rfft(xp[m * H: m * H + N] * w)
    mg = np.abs(X)
    m2 = mg - prof * p["sens"]                                                      # 頻譜減法:幅度減去 靈敏度×噪音輪廓
    g = np.where(m2 > floor * mg, m2 / np.maximum(mg, 1e-20), floor)                # 最多只壓到「降噪量」
    fs = p["fsmooth"]
    if fs > 0:                                                                      # 頻率平滑:前後各 fs 格取平均
        g = np.array([g[max(0, k - fs): min(bins - 1, k + fs) + 1].mean() for k in range(bins)])
    Gp = g.copy() if Gp is None else g * (1 - np.where(g > Gp, 0.25 * a, a)) + Gp * np.where(g > Gp, 0.25 * a, a)
    out[m * H: m * H + N] += np.fft.irfft(X * Gp, N) * w / 1.5                      # 合成:再乘一次 Hann,疊加後除以 1.5
y = out[off: off + L]
res = wavfile.read(COPY)[1].astype(np.float64)
print("與副本逐點比較,差最多的一點相差(單位:16 位元量化步階):", np.max(np.abs(np.round(y * 32768) - res)))
  • 範例假設原檔是單聲道、16 位元 PCM,且流程中只有降噪這一個步驟;步驟不只一個時,要依序重現,每一步比對的是它的輸入而不是原檔。
  • 在不同瀏覽器之間,數學函式可能有末位差異,所以跨瀏覽器重跑同一組步驟,輸出檔的雜湊不一定相同。
我們如何驗證這些演算法
  • 核心演算法寫成可在 Node.js 與瀏覽器共用的純函式,並有 428 項單元斷言(本機沙箱的測試,涵蓋正常、邊界、錯誤輸入與取消)。環境:Node.js v22.22.0、NumPy 2.5.3、SciPy 1.18.1。
  • 端對端另有 295 項檢查(Playwright 驅動 Chromium:桌面 1366×800、手機 390×844 觸控、降速、取消、損毀與超限檔案、內容安全政策違規與非同源請求計數),通過 295 項。
單元斷言與外部對照:本機沙箱的測試;「最差誤差」是所有案例中差最多的一個(單位:以滿刻度 1.0 為準的取樣值,或複數頻率響應的差距大小)
項目對照對象通過實測最差誤差說明
FFT、實數 FFT 與反變換NumPy numpy.fft257.1e-14浮點數誤差
Butterworth 高通/低通(2 至 8 階)SciPy signal.butter、signal.sosfilt40頻率響應 5.1e-12;逐點 8.8e-08工具以單精度浮點運算,所以逐點誤差約 1e-8 等級
市電陷波係數SciPy signal.iirnotch含於上列0係數逐項相同
噪音輪廓與降噪(頻譜減法、頻譜閘門)以 NumPy 獨立寫的參考實作25輪廓 3.3e-16;降噪 4.4e-084 組參數;降噪量 0 dB 時視窗重疊相加可完整重建
重取樣(Kaiser 窗 sinc)SciPy signal.resample_poly(峰值 0.5 的帶內雜訊)165.5e-04濾波器設計不同,屬於「解釋或近似」;48 kHz 轉 16 kHz 對 10 kHz 的抑制實測 88 dB
WAV 讀取(PCM 8/16/24/32、浮點 32/64、A-law、μ-law、EXTENSIBLE、3 聲道、截斷與異常檔頭)與寫出SciPy wavfile、ffmpeg、ffprobe610取樣值逐點相同;16/24 位元寫出再讀回逐取樣相同
SHA-256Python hashlib、NIST 範例200含空檔、分段餵入與大檔
變速不變調、靜音壓縮、動態處理、時間對照表、分析器、頻譜圖、流程與紀錄、限制與記憶體性質檢查(長度、音高、不變量)與獨立計算241—這類沒有現成的外部參考,改驗證性質(例如音高中位數、輸出長度、取消時能停下來)

誤差越小越一致。這些是對合成訊號與測試檔的比對,不代表所有真實錄音都相同。

輸出檔層級的交叉比對(本機沙箱,14 秒的合成語音加白噪音)
比對實測差異說明
高通 4 階,工具輸出(16 位元)對 SciPy butter+sosfilt1單位:16 位元量化步階(LSB);差 1 是四捨五入的末位差
高通 2 階,工具輸出對 ffmpeg highpass 濾波器最差 2,均方根 0.72兩邊的濾波器實作不同(ffmpeg 的階數與運算精度另有取捨),屬於「解釋或近似」
頻譜減法降噪(12 dB),工具輸出對 NumPy 參考實作1用本指南下方的 Python 程式即可重現
頻譜減法降噪(20 dB、頻率平滑 0),工具輸出對 NumPy 參考實作1
輸出 WAV:ffmpeg 解碼對工具內部取樣值(16 位元、24 位元)0、0ffprobe 回報 pcm_s16le、pcm_s24le,取樣率與長度正確
輸出 WAV:Chromium decodeAudioData 對工具內部取樣值(24 位元)0.0e+00以滿刻度 1.0 為準的取樣值差
同一組步驟:瀏覽器(Chromium)輸出對 Node.js 命令列輸出0(雜湊相同)單位:16 位元量化步階;同一份程式碼在不同引擎的數學函式可能有末位差異
內建 WAV 解析器與 Chromium decodeAudioData 讀同一批檔案的取樣值差(以 SciPy 或 ffmpeg 解出的預期值為準;單位:滿刻度 1.0)
檔案內建解析器對預期值decodeAudioData 對預期值兩者互差
pcm16(立體聲)03.1e-053.1e-05
pcm16(單聲道)03.1e-053.1e-05
pcm24(立體聲)000
pcm32(立體聲)000
f32(立體聲)000
pcm8(立體聲)07.8e-037.8e-03
f64(立體聲)0無法解碼—
mulaw(單聲道)03.0e-053.0e-05
alaw(單聲道)03.0e-053.0e-05

「兩者互差」是兩條讀取路徑對同一個檔案的差:工具先用內建解析器讀 WAV,瀏覽器解碼只在內建解析器無法處理時使用。這個 Chromium 無法解碼 64 位元浮點 WAV,內建解析器可以。

MEASURED, WITH LIMITS

實測:什麼時候有幫助,什麼時候沒有

以下數字全部是「本機沙箱小樣本」:用程式合成的語音(單一合成語者、單一亂數種子,沒有安裝語音合成器,所以不是真人錄音)加上人為製造的劣化,再對照「沒有加噪音的同一條訊號」。這些指標都不是聽懂程度或準確率,真實案件也沒有乾淨參考可比。它們只能說明「在這個人造情境下發生了什麼」。

單獨的降噪或陷波

單獨的降噪或陷波步驟(前面只加去直流):相對「未處理」的變化,格內為「SI-SDR 變化 dB / 頻譜距離變化 dB」。SI-SDR 越高越好,頻譜距離越低越好。
情境未處理的 SI-SDR頻譜減法 12 dB/靈敏度 1.5(預設)頻譜減法 20 dB/2.5閘門 20 dB/2.5頻譜減法 35 dB/3.0(極端)只做 50/60 Hz 陷波
白噪音(訊噪比 10 dB)6.3+6.0 / −1.7+5.6 / −0.3+7.9 / −1.4+5.7 / +5.60.0 / 0.0
粉紅噪音(5 dB)1.4+3.4 / −0.9+4.5 / +0.4+3.5 / 0.0+4.9 / +6.90.0 / 0.0
60 Hz 嗡嗡聲加諧波(5 dB)1.4+4.9 / −0.5+3.3 / +1.0+6.5 / −0.1+2.7 / +4.0+9.0 / −1.0
50 Hz 嗡嗡聲加諧波(5 dB)1.3+5.3 / −0.5+3.9 / +1.2+7.0 / 0.0+3.5 / +4.3+9.7 / −0.8
遠距離(殘響、低通、衰減,白噪音 8 dB)4.5+6.1 / −1.9+5.8 / −0.4+8.0 / −1.6+5.7 / +6.60.0 / 0.0
硬削波的語音(白噪音 20 dB)16.6+2.1 / +1.1−0.3 / +3.8+3.2 / +1.0−0.3 / +6.00.0 / 0.0

整條預設流程

預設處理方式的整條流程:格內為「整條流程相對未處理的 SI-SDR 變化 dB | 其中降噪與陷波這兩步的貢獻 dB」。貢獻=整條流程對「同一條流程拿掉降噪與陷波」的 SI-SDR 差。
情境人聲清晰遠距離錄音去除嗡嗡聲
白噪音(訊噪比 10 dB)−9.6 | +7.0−12.9 | +6.1−1.1 | 0.0
粉紅噪音(5 dB)−4.4 | +5.8−7.5 | +4.9+3.3 | 0.0
60 Hz 嗡嗡聲加諧波(5 dB)−3.7 | +6.0−5.8 | +5.1+7.0 | +8.7
50 Hz 嗡嗡聲加諧波(5 dB)−3.4 | +6.4−5.6 | +5.7+6.8 | +9.0
遠距離(殘響、低通、衰減,白噪音 8 dB)−9.0 | +6.1−13.1 | +7.2−1.0 | 0.0
硬削波的語音(白噪音 20 dB)−21.4 | +4.4−24.8 | +4.8−7.2 | 0.0

用時、畫面是否卡住與記憶體

處理全部在背景工作者內進行。下表的「長任務」是主執行緒上超過 50 毫秒的任務數(PerformanceObserver 量測):「整段處理期間」是處理進度條顯示的期間;「切換與繪圖瞬間」是載入完成、切換步驟、首次按播放與畫出試聽結果的瞬間。目標是兩者都為 0:整段處理期間在多數未降速的實測中為 0,但切換與繪圖的瞬間在沙箱的軟體繪圖環境下仍偶爾有 50 至 110 毫秒的任務,沒有完全達成。沙箱可能同時有其他程序爭用 CPU(只有 2 個核心),爭用時計時與長任務數都會變差;每次測試開始時的 1 分鐘平均負載都記在結果檔裡。

實測用時(本機沙箱,2 核心,單次或少數幾次實測;「人聲清晰」預設流程 7 個步驟;載入含 SHA-256 與波形概覽)
情境載入 秒試聽計算 秒整段處理 秒處理用時占錄音長度整段處理期間的長任務 個切換與繪圖瞬間的長任務 個
14 秒,16 kHz 單聲道 WAV(桌面 1366×800)0.150.360.30—02(最長 142 ms)
30 分鐘,44.1 kHz 單聲道 WAV(桌面)4.41.248.42.7 %03(最長 202 ms)
同上,主執行緒降速 4 倍(CDP)4.51.847.32.6 %07(最長 187 ms)
同上,整個瀏覽器限制在單一核心的 25 %21.05.3225.412.5 %不判定(見下)不判定(見下)
25 分鐘,44.1 kHz 立體聲 MP3(瀏覽器解碼),處理其中 60 秒7.01.63.2—01(最長 83 ms)

降速實測要怎麼讀

記憶體

瀏覽器所有行程(含瀏覽器本體、GPU 與頁面,合計)的常駐記憶體:頁面載入後閒置約 1201.5 MB;處理 14 秒的小檔後約 1374.7 MB;處理 30 分鐘單聲道 44.1 kHz WAV 的尖峰約 1992.7 MB;載入 25 分鐘立體聲 MP3 並處理其中 60 秒的尖峰約 2323.5 MB(粗略值,每次都包含瀏覽器本體,不是只算本工具)。程式的估計只算背景工作者內的工作陣列(30 分鐘單聲道約 757 MiB),不含下載用的資料塊、檔案讀取緩衝與瀏覽器本身,所以不等於行程總量;在記憶體小的裝置上仍可能失敗,失敗時會顯示說明而不是當機。

套用到整段前的尖峰記憶體估計(程式內建公式,44.1 kHz、「人聲清晰」、輸出 16 位元;保護上限 1536 MiB)
長度WAV 單聲道WAV 立體聲MP3 等壓縮格式 單聲道MP3 等壓縮格式 立體聲
10 分鐘約 252 MiB約 404 MiB約 353 MiB約 606 MiB
30 分鐘約 757 MiB約 1211 MiB約 1060 MiB約 1817 MiB,超過保護上限
60 分鐘約 1514 MiB約 2422 MiB,超過保護上限約 2120 MiB,超過保護上限約 3634 MiB,超過保護上限

保護上限:預設 1.5 GiB;瀏覽器回報裝置記憶體時,再取「裝置記憶體 × 0.25」;瀏覽器識別字串看起來是手機或平板時,再不超過 0.75 GiB;三者取最小的。壓縮格式(MP3 等)必須整段解碼成未壓縮資料才能處理,所以估計較大,60 分鐘的立體聲 MP3 在預設上限下會被拒絕並建議切段。WAV 只讀取你選取的範圍,記憶體較省。

COMMON MISTAKES

常見誤解

「降噪之後聽到字了。」
如果原檔裡有,降噪可能讓它比較好認;如果原檔裡沒有,增益、降噪與壓縮可能製造出聽起來像字的雜音。請對照原檔反覆確認,不要把副本裡新出現的字句當成原檔內容。
「降噪量調越大越乾淨。」
不是。降噪量只是上限;壓得越多,水聲般的殘留雜音和說話聲失真越嚴重。實測中極端設定的頻譜距離反而變差。
「增益拉高就能聽見小聲的話。」
增益把噪音和說話聲一起放大,不會改善訊噪比。小聲到被噪音蓋過去的內容,放大也聽不見。
「削波的聲音可以修回來。」
被削平的波形已經遺失。本工具只標示位置,不做假的修復。
「變速之後可以直接量對話的時間。」
變速與靜音壓縮會改變時間軸。請用處理紀錄的對照表換算回原檔時間,或一律回到原檔上量。
「預覽就是最後的結果。」
預覽在最長 30 秒的範圍上計算,和整段處理很接近,但範圍邊界附近(尤其是降噪與壓縮的起始階段)可能略有不同;噪音輪廓不受預覽範圍影響。
「有處理紀錄就沒人能質疑。」
紀錄只是文字檔,可以被編輯,時間來自本機時鐘。它記錄做法,讓別人能重做並比對;它不替內容背書。
「換一個瀏覽器,結果也要逐位元相同。」
不承諾。數學函式的差異可能造成末位不同;同一個瀏覽器、同一組步驟才能預期相同的雜湊。
「預設組合適合所有錄音。」
不是。預設只是起點;合成測試中,硬削波的錄音套用預設反而明顯變差。
「副本可以取代原檔。」
不可以。副本是經過處理的工作檔,請一律連同原檔與處理紀錄一起保存與提供。

建議的使用流程

  1. 先把原檔另存一份並設為唯讀,不要在原檔上做任何事。
  2. 在工具內載入錄音,確認檔案資訊(長度、取樣率、SHA-256)與有沒有削波的提示。
  3. 在步驟 2 選出要處理的範圍;有降噪需求時,標記一段「只有噪音」的片段(沒有人說話)。
  4. 選最接近的預設,用 A/B 試聽;一次只調一個參數;出現水聲、悶、顫動就調回來。
  5. 套用到整段,輸出 WAV;同時下載增強副本與處理紀錄(JSON 與 TXT)。
  6. 用證據鏈帳本為原檔、副本與紀錄計算雜湊並匯出,封存碼交給第三方保存。
  7. 交付時三者一起附上,並明確說明「這份是增強副本,經過哪些處理」。
  8. 是否可作為證據、怎麼提出,請諮詢律師。