訪談或多人會議的錄音轉成文字後,分清每句話是誰說的非常重要。Whisper Notes 在 iPhone 和 Mac 上離線完成語音辨識和說話者分離,內建的每個模型都得在準確度和速度之間取捨,而我們一向把準確度放在第一位。最近,我們把內建的說話者分離模型從 pyannote community-1 換成 NVIDIA 的 Nemotron 3 Diarization,並用 122 段公開錄音(每段一到十二位說話者)比較兩者:說話者分離錯誤率(DER)從 16.0% 降到 9.9%。
Nemotron 3 把說話者分離錯誤率從 16.0% 降到 9.9%
說話者分離錯誤率(DER)以語音時長計算,把三種錯誤加總:歸錯人、漏標,以及把雜音當成人聲。這是衡量說話者分離最常用的指標。下表把它和使用者最常遇到的問題列在一起,也列出兩個模型在 Mac 和 iPhone 上的速度與記憶體用量。
| pyannote community‑1 | Nemotron 3 | |
|---|---|---|
| 說話者分離錯誤率(122 段錄音) | 16.0% | 9.9% |
| 人數判斷正確 | 52% 的錄音 | 80% 的錄音 |
| 歸錯人的語音 | 4.5% | 1.0% |
| Mac(M5)處理 1 小時音訊 | 約 22 秒 | 約 8.5 秒 |
| Mac 記憶體用量 | 0.88 GB | 0.12 GB |
| iPhone 15 處理 55 分鐘錄音 | 約 27 秒 | 約 12 秒 |
| iPhone 15 額外使用的記憶體 | 約 830 MB | 約 30 MB |
| 最多可辨識的人數 | 模型本身不設上限(App 內最多 10 位) | 8 位 |
本文所有表格和圖表中,綠色代表較好的一方,且差距超出誤差範圍:準確度看 95% 區間是否不含零,速度和記憶體看差距是否遠大於多次執行之間的波動。錯誤率越低越好。準確度各列來自 122 段公開錄音(共 25 小時,英語和中文)。速度和記憶體是兩個模型透過 Core ML 執行的結果,Nemotron 3 跑在 Neural Engine 上;Mac 只計處理時間,iPhone 則從開始辨識算到出結果。
這個降幅並非來自少數幾段錄音。下圖是 122 段錄音逐段的變化,從降得最多排到升得最多:
每根長條代表一段錄音,顯示換成 Nemotron 3 後錯誤率變了多少個百分點:零線以下是下降,零線以上是上升。
Nemotron 3 有三種情況不如舊模型:超過八位說話者、只有一位說話者,以及段落較常在句子中間斷開。
歸錯人幾乎消失:4.5% → 1.0%
三種錯誤裡,讀者最先注意到的是歸錯人:字都對,名字卻錯了。換成 Nemotron 3 後,這類錯誤幾乎消失,漏標也跟著減少。
122 段錄音的平均值,單位是語音時長的百分比;每列兩根長條都從零開始。歸錯人和漏標的降幅都超出誤差範圍。雜音當人聲的差異在誤差範圍內,所以那根長條是淺灰色。數值經過四捨五入,加起來不一定剛好等於合計。
人數判對的錄音從 52% 提高到 80%
人數判少,代表兩個聲音被併成了一個,兩個人的發言會出現在同一個標籤下。這是 pyannote community-1 最常犯的錯,Nemotron 3 犯得少很多。
兩個模型在 122 段錄音上判斷的人數,與實際人數對照。pyannote community-1 大多判少。Nemotron 3 判對的較多,判錯時判多和判少一樣常見。
會議、廣播,以及二到八人的錄音都更準
錄音的難度差異很大:遠場收音的會議最難,廣播最容易。依錄音類型、語言和說話者人數分組,每個至少有十段錄音的分組錯誤率都較低;只有一人的那組,差異在誤差範圍內。九到十二人的三段錄音變差了,但數量太少,無法檢驗。
每組兩根長條都從零開始:灰色是 pyannote community-1,綠色是 Nemotron 3,長條末端的數字是平均錯誤率。綠色代表降幅超出誤差範圍,淺灰代表差異在誤差範圍內,琥珀色代表變差。6 場法說會計入總數,但數量太少,不單獨成組。
整理逐字稿:每 10 分鐘要手動修正的次數從 28.9 降到 18.9
錯誤率最後會變成整理逐字稿的工作量:要把說話者檢視整理正確,得合併、拆分幾次段落,再更換幾次說話者。我們在 4 段有逐字參考文本的雙人錄音(荷蘭語 2 段、中文 1 段、芬蘭語 1 段)上,算出至少需要幾次這類修正。讀者另一種會注意到的錯誤,是一個人說的一句話被拆給兩位說話者。在 12 場遠場收音的英語會議中,兩個模型都很少出現這種情況,差異在誤差範圍內。
| pyannote community‑1 | Nemotron 3 | |
|---|---|---|
| 每 10 分鐘需手動修正的次數(4 段雙人錄音) | 28.9 | 18.9 |
| 一句話被拆給兩位說話者(12 場英語會議) | 0.58% 的句子 | 0.88% 的句子 |
手動修正次數只來自 4 段錄音,數量太少,無法做統計檢驗,也不能推及一般情況。「一句話被拆給兩位說話者」是指同一個人說的一句話,文字被分進了兩位說話者的段落。
Nemotron 3 更快,記憶體用量不到七分之一
在裝置上執行,速度和記憶體跟準確度一樣重要。下表是兩個模型透過 Core ML 執行時的處理時間和記憶體用量,Nemotron 3 跑在 Neural Engine 上。在我們測試的每台裝置上,Nemotron 3 都更快,記憶體也用得少很多,這對只有 4 GB 記憶體的舊款 iPhone 最重要。
| pyannote community‑1 | Nemotron 3 | |
|---|---|---|
| Mac(M5) | ||
| 1 小時音訊 | 約 22 秒 | 約 8.5 秒 |
| 記憶體 | 0.88 GB | 0.12 GB |
| iPhone 15 | ||
| 55 分鐘錄音 | 26.6 秒 | 11.8 秒 |
| 辨識時額外使用的記憶體 | 833 MB | 30 MB |
| iPhone 12 mini | ||
| 55 分鐘錄音 | 30.1 秒 | 17.2 秒 |
| 辨識時 App 記憶體峰值 | 638 MB | 71 MB |
多次執行的中位數(pyannote community-1 在 iPhone 15 上只跑了一次),全部使用同一場 55 分鐘、10 位說話者的法說會錄音。兩個模型都透過 Core ML 執行,Nemotron 3 跑在 Neural Engine 上。Mac 只計處理時間,不含音訊解碼和模型載入。iPhone 從開始辨識算到出結果,包含模型載入;pyannote community-1 還包含它原本搭配的後處理。手機全程以 USB 連接,每次執行前都先讓手機降溫。
Core ML 第一次在 Neural Engine 上執行某個模型時,會先為這台裝置編譯模型:Mac 約 7 秒,iPhone 15 約一分鐘。之後載入模型只要不到一秒。
pyannote community-1 仍然較好的地方
- 超過八位說話者。Nemotron 3 最多只標出八個人;在我們 3 段九到十二人的錄音中,有 2 段比 pyannote community-1 差。
- 只有一位說話者。在 14 段單人錄音中,Nemotron 3 有 5 段多分出了說話者,pyannote community-1 只有 1 段。
- 段落在句子中間斷開。在 12 場英語會議中,有 25.8% 的分段落在句子中間,pyannote community-1 是 14.6%。
在 Whisper Notes 裡用好 Nemotron 3 的幾個建議
- 知道有幾個人,就先指定人數。在 108 段兩人以上的錄音中,告訴 Nemotron 3 人數後,有 15 段的人數從錯變對,沒有一段被改錯;錯誤率沒有明顯變化(+0.16 個百分點,在誤差範圍內)。
- 只有一個人說話時,不必辨識說話者。這樣就不會偶爾冒出「第二位說話者」。
- 超過八位說話者時,把標籤當成初稿。需要時在說話者檢視中合併說話者或重新命名。
在 Mac 的說話者檢視中,從「Not right?」指定說話者人數
說話者辨識在 iPhone 和 Mac 上的用法相同,全程在你的裝置上完成。在 App 裡的具體用法,請見Whisper Notes 推出裝置端說話者分離。
運作原理:pyannote 先切時間窗再分群,Nemotron 3 依開口先後為說話者編號
pyannote community-1 是由三個步驟組成的流程。先把音訊切成 10 秒一段的時間窗,找出每個時間窗裡誰在說話(每個時間窗最多 3 人,同一時刻最多 2 人)。接著為每段語音擷取聲紋,也就是嵌入向量(embedding)。最後由 VBx 分群,把相近的聲紋歸為同一位說話者。時間窗裡的說話者編號只在該時間窗內有效,所以總人數要到最後一步才確定。
Nemotron 3 Diarization 是單一模型:一個 31 層的 Transformer 編碼器,在每個時間點為八條說話者軌道各打一個分數。每條軌道獨立計分,所以多人同時說話時,會有多條軌道同時啟動。它沿用 NVIDIA 的 Sortformer 方法,依每個人第一次開口的先後為軌道編號:最先開口的人一定在第 1 條軌道,模型就不必去猜一個聲音該放在哪個位置。依模型卡描述的串流用法,它還用一個依出場順序排列的說話者快取記住先前出現的人,後面的片段就能對上同一個編號。
兩種設計各有限制。pyannote community-1 不設人數上限,但同一時刻最多只能分出兩個人。Nemotron 3 能標出同時說話的多個人,但只有八條軌道,所以最多辨識八位說話者。
示意圖經過簡化。pyannote community-1:在 Whisper Notes 中約 21 MB,CC BY 4.0(模型卡);分段模型出自 Plaquet 與 Bredin(Interspeech 2023),嵌入向量來自 WeSpeaker,分群使用 VBx(Landini 等人,2022)。Nemotron 3 Diarization:97 MB(Fluid Inference 的 8 位元 Core ML 轉換版),約 1 億個參數,OpenMDW 1.1(模型卡);方法見 Sortformer 與 Streaming Sortformer 兩篇論文。
測試方法
- 錄音。122 段公開錄音,共 25 小時,英語和中文,每段 1 到 12 位說話者:遠場收音的會議、廣播、法說會,以及由多段片段拼成的單人錄音。另有 5 段英語、荷蘭語、中文和芬蘭語的雙人錄音,其中 4 段有逐字參考文本。
- 資料集。AMI、AISHELL-4、AliMeeting、VoxConverse、Earnings-21、LibriSpeech、IFADV 和 SKN,加上我們自己的錄音。只用授權允許公開結果的資料集,沒有使用任何使用者的錄音。
- 指標。說話者分離錯誤率,以 10 毫秒為一幀計分,邊界不設容差(collar),重疊語音計入,逐段錄音計算後取平均。
- 統計。95% 區間來自以整段錄音為單位的 10,000 次自助重抽樣(bootstrap);少於十段錄音的分組不提供區間。
- 裝置。一台搭載 M5 晶片的 Mac、一支 iPhone 15 和一支 iPhone 12 mini;準確度在 Mac 上計算。
- 預先註冊。測試計畫在 2026 年 11 月 2 日定案,雙人錄音的劃分在 11 月 4 日確定,當時還沒有任何模型跑過這些片段。
完整測試細節
選取方式。測試問題和規則是為一個更大的基準測試,在任何模型執行之前就訂好的;本文的子集依授權挑選,不依結果,數字則用同一批輸出、同一套計分重新算出。由 LibriSpeech 和 AISHELL-4 片段拼成的單人錄音,歸入各自的來源資料集。我們只公布彙總結果,不公開任何音訊或參考文本。
| 資料集 | 授權 | 使用的錄音 |
|---|---|---|
| AMI Meeting Corpus | CC BY 4.0 | 16 場會議、16 段一分鐘節錄 |
| AISHELL-4 | CC BY-SA 4.0 | 5 場會議、5 段節錄、5 段拼接的單人錄音 |
| AliMeeting | CC BY-SA 4.0 | 8 場會議、8 段節錄、1 段雙人錄音 |
| VoxConverse | CC BY 4.0(影片版權歸原權利人所有) | 30 段廣播、18 段節錄 |
| Earnings-21 | CC BY-SA 4.0 | 6 場法說會、1 段雙人錄音 |
| LibriSpeech | CC BY 4.0 | 5 段拼接的單人錄音 |
| IFADV | GNU GPL v2 或更新版本 | 2 段雙人錄音 |
| SKN 芬蘭語方言樣本 | CC BY(芬蘭語言研究所) | 1 段雙人錄音 |
授權以各資料集官方頁面的說明為準,於 2026 年 11 月核對。
區間。整體錯誤率下降 6.0 個百分點(4.5 到 7.6)。漏標下降 2.3 個百分點(1.3 到 3.4),歸錯人下降 3.4 個百分點(2.4 到 4.6);雜音當人聲下降 0.30 個百分點,在誤差範圍內(−0.02 到 0.62)。人數判斷正確的錄音比例提高 27.9 個百分點(17.2 到 38.5)。分組中,除了一人組,每個區間都不含零。在 12 場英語會議中,「一句話被拆給兩位說話者」的區間含零,「段落在句子中間斷開」的區間不含零。
計分。我們的計分程式和 pyannote.metrics 的結果相差在 0.003 個百分點以內。
超過八位說話者。這類錄音的結果對晶片和音訊解碼的細微差異很敏感。在那場 55 分鐘、10 位說話者的法說會上,Nemotron 3 隨晶片、設定和音訊解碼器不同,錯誤率介於 30.6% 到 42.8%;pyannote community-1 是 21.6%。
後處理設定。部分後處理設定是在預先註冊之後選定的,只用了另外的調校錄音;測試錄音只用來報告結果。
限制。準確度只測了英語和中文;手動修正次數只來自 4 段錄音。Mac 的計時來自一台同時在跑其他工作、裝著 macOS 測試版的 M5 Mac;手機全程以 USB 連接,所以沒有測耗電。
試試看
iPhone 版和 Mac 版的 Whisper Notes 現在都用 Nemotron 3 辨識說話者。有任何問題,歡迎寫信到 support@whispernotes.app。