erm: 一款用於移除語音贅詞的本地 CLI 工具

概覽

erm 是一款設計用於從音訊錄音中自動移除語音贅詞(例如「um」、「uh」和「er」)的本地命令列介面(CLI)工具。與會導致明顯點擊聲和突兀轉場的簡單切割方法不同,erm 結合了基於逐字稿的檢測與波形分析以及環境音合成技術,以實現無縫剪輯。

自動音訊切割的技術挑戰

僅靠基於逐字稿的切割——即識別贅詞的時間戳記並切割音訊——對於達到專業水準的結果而言是不夠的,主要原因有三個:

  1. 逐字稿間隙: 像 Whisper 這樣的語音轉文字模型通常會自動在逐字稿中省略贅詞,導致沒有可供目標移除的 token。
  2. 波形不連續性: 在任意時間戳記切割音訊會導致波形產生「階梯狀」變化,人類耳朵會將其感知為點擊聲。
  3. 環境噪音偏移: 即使是乾淨的拼接,背景嘶嘶聲(環境音)在切割前後也會略有不同,從而產生可察覺的音訊底噪偏移。

檢測流程

為了確保對贅詞的高召回率,erm 採用了四階段檢測策略:

1. Whisper 逐字稿生成

該工具使用 faster-whisper(預設使用 medium.en 模型)來生成單字層級的時間戳記。它會向模型提供特定指令以避免清理逐字稿,確保贅詞能作為 token 被保留下來以供檢測。

2. 間隙填充分析

如果兩個已轉錄單字之間的時間間隔超過 350ms,erm 會分析該間隙內的音訊。如果在 Whisper 報告為靜音的地方檢測到發聲,該工具會將其標記為模型從逐字稿中省略的贅詞。

3. 單字內贅詞檢測

當 Whisper 將贅詞與相鄰單字黏在一起時(例如,「in, uhhhhh」變成單個 「in」 token),erm 會識別出異常長的單個 token。它會在短暫的音訊下降處將這些 token 切開,並根據合理的發音長度判斷哪一段是實際的單字,將其餘部分標記為贅詞。

4. 時長與音高測試

對於持續時間明顯長於文字所暗示的單字,erm 會掃描尾端是否有發聲。它會應用音高測試來區分說話者只是說話緩慢(變動的聲學特徵)與某人拉長母音(例如「uhhhhh」)(穩定且簡單的聲學特徵)。

實現無縫拼接

為了消除可聽見的瑕疵,erm 在最終渲染前會執行幾個優化步驟:

波形對齊與零點交叉 (Zero-Crossing)

切割端點允許滑動高達 60ms,以尋找最近的安靜點。從該點開始,端點會對齊到最近的「零點交叉」——即波形穿過零點的精確時刻。將兩個零點連接在一起可以防止因波形階梯狀變化而產生的點擊聲。

動態淡入淡出 (Dynamic Crossfading)

使用 ffmpeg,erm 應用了在兩個音訊片段重疊處的淡入淡出效果。淡入淡出長度並非固定,而是根據切割的大小進行縮放(介於 50ms 到 120ms 之間),以避免短片段被抹平或長片段產生爆音。

動態淡入淡出 (Dynamic Crossfading)

使用 ffmpeg,erm 應用了在兩個音訊片段重疊處的淡入淡出效果。淡入淡出長度並非固定,而是根據切割的大小進行縮放(介於 50ms 到 120ms 之間),以避免短片段被抹平或或長片段產生爆音。

環境音合成

為了掩蓋切割處背景嘶嘶聲的變化,erm 會自動識別原始錄音中一段安靜的片段。這段「環境音」會以低音量在整個輸出音訊下方循環播放,從而建立一個一致的環境底噪,隱藏拼接轉場。

運作模式與驗證

降噪策略

由於降噪可能會平滑掉用於檢測的音高與音量線索,erm 提供四種模式。預設模式為 hybrid,即在原始音訊上進行檢測以維持精確度,但最終的切割是從降噪後的副本中提取的,以獲得更好的音質。

驗證

validate 子命令會透過檢查檔案是否能開啟、驗證輸出時長是否比輸入時長短(約等於切割長度之和),以及重新轉錄清理後的檔案以確保贅詞已移除,來確保輸出的完整性。

範圍與限制

erm 嚴格限制於移除聲音,而非語言。它不會移除:

  • 贅詞短語: 「like」、「you know」或「I mean」會被保留,因為它們可能帶有語義意義。
  • 編輯錯誤: 重複的單字、錯誤的開頭或長思考停頓會被保留,因為移除它們需要根據哪一個「take」較佳來進行編輯判斷。

社群觀點

雖然該工具為內容創作者節節省了大量時間,但一些使用者與語言學家認為,贅詞在人類語音中具有其作用。

「然而在語音中 [ums 和 ahs] 可以作為一個焦點,用來指示接下來的部分很重要。」

其他人則指出,對於非母語人士而言,這些停頓通常表示認知轉換,如果將其移除,可能會使說話者聽起來斷斷續續,或改變句子的原意。

Sources