你把兩個人的訪談交給本機語音 Agent,幾分鐘後拿到逐字稿,文字看起來都對,卻在一段安靜之後把主持人和來賓的標籤對調。Mac 說話者分段真正要解的,就是「誰在什麼時候說話」這個時間軸問題;光有語音轉文字,還不能回答它。
這篇給第一次接觸語音模型、想在 Apple Silicon Mac 上做雙人會議紀錄或語音 Agent 的讀者。你會用 speech-swift 跑 NVIDIA Nemotron 3 Diarization 的 Core ML 與 MLX 版本,接上 ASR(自動語音辨識),再用三段短錄音驗收停頓、插話和重疊說話。這是一份可照做的操作與驗收教學;文中的範例時間和對話是示意,不代表本文已跑過模型。
先說結論:一張時間軸,兩種模型,最後還要驗收
可用的多人逐字稿=ASR 的文字+說話者分段的時間軸+人工核對過的匿名標籤。把 ASR 想成聽寫員,把 diarization(說話者分段)想成替每句話貼上「第幾位聲音」的場記。兩者可以各自做對,也可以在合併時貼錯。你需要保留原音和時間戳,才能回頭查是哪一步出錯。
NVIDIA 的 Nemotron 3 模型卡把輸出定義為按首次出現順序排列的匿名 speaker channel,最多八個;同一時間可以有兩個 channel 活躍。這裡的「10 毫秒」是活動機率的時間格距,不是每個切點都準到 10 毫秒的保證。speaker_0 也不是某個人的姓名;要叫出真人姓名,得另做有根據的身分對照。

Mac 說話者分段在語音 Agent 裡做哪三件事?
- 找活動區間:辨認音檔哪些時段有人說話,可能同時有兩人。
- 沿時間維持匿名標籤:同一個聲音隔一段時間再出現,應盡量回到相同 speaker ID。NVIDIA 使用按首次出現排序的 channel 與串流快取;這個設計需要在你的錄音情境裡驗收。
- 把文字接上時間軸:ASR 說「說了什麼」,分段說「誰在何時說」。如果逐字稿只有一大段文字,光靠兩個輸出無法可靠地把每個字歸給某人;要用有時間戳的片段、逐段轉錄,或能同時處理多人語音的管線。
例如你人工標註的設計案例是:A 在 0–2 秒說話,B 在 2–4 秒回答;安靜兩秒後,A 在 6–7 秒補一句。驗收重點不是模型把第一位叫 speaker_0 還是 speaker_1,而是同一個 A 在前後兩段是否維持同一標籤。真正錄音的邊界通常不會剛好落在整秒,這些數字只用來說明核對方法。
上手前:備好 Mac、錄音和一份人工答案
截至 2026 年 9 月,speech-swift 專案要求 Apple Silicon、macOS 15 以上;從原始碼建置還列出 Swift 6、Xcode 16 與 Metal Toolchain。下文用官方 Homebrew CLI。首次使用模型會下載權重到本機快取,因此先留出網路與磁碟空間。NVIDIA 模型卡把模型授權列為 OpenMDW 1.1;若要再散布權重或納入產品,先核對條款。
準備一段取得參與者同意的雙人短錄音,自己先聽一遍,記下「A/B、開始時間、結束時間、文字」作為人工答案。為了比較兩個後端,固定同一份原始檔;不要一邊換錄音、一邊換模型。NVIDIA 的 ASR 整合文件採用 16 kHz、單聲道 WAV,可用 ffmpeg -i input.mp3 -ac 1 -ar 16000 -c:a pcm_s16le meeting.wav 轉檔。若來源本來就是合適的 WAV,保留原檔作對照即可。
Mac 說話者分段 5 步:同一段錄音跑 Core ML、MLX 與 ASR
① 安裝 CLI,先確認可用命令
在使用原生 ARM Homebrew 的 Mac 終端機輸入 brew tap soniqo/tap,再輸入 brew install soniqo/tap/speech,接著以 speech diarize --help 確認選項有 nemotron3。截至 2026 年 9 月 27 日,專案自己的 tap 配方是 v0.0.28;本機查到的 Homebrew core 配方仍是 v0.0.27,而該版 CLI 程式碼尚未列出 nemotron3。專案 README 明示 Rosetta/x86_64 Homebrew 不在支援範圍。已安裝舊版時,先核對 speech diarize --help 再執行下列步驟。
② 用 Core ML 取得第一條匿名時間軸
輸入 speech diarize meeting.wav --engine nemotron3。你會看到每段的 speaker ID 與起迄秒數。若要保存供程式處理的結果,可加 --json;目前程式碼的 JSON 物件含 segments、num_speakers,每段有 start、end、duration、speaker。CLI 也會輸出進度文字,所以先看輸出,再把 JSON 部分交給解析器,別假定整個終端輸出都是純 JSON。官方說話者分段指令文件列有這些選項。
③ 同檔改用 MLX,逐段比較
輸入 speech diarize meeting.wav --engine nemotron3 --nemotron3-backend mlx。Core ML 與 MLX 使用各自的 INT8 匯出版本,專案文件要求把它們當成不同變體評估。先看說話人數,再看每段起迄、停頓後 ID 是否回到原人,以及重疊時是否保留兩條活動區間。不要只因總段數相同,就判定兩版相等。
④ 做文字稿,再按時間把兩張紙疊起來
先輸入 speech transcribe meeting.wav --engine qwen3,得到整段 ASR 文字,核對人名、數字和語句。這是「內容檢查」,還不是附 speaker 的逐字稿。做一個初學者可檢查的版本:從分段時間軸挑一段只有一人說話的區間,例如人工案例的 2.10–4.35 秒,以 ffmpeg -ss 2.10 -to 4.35 -i meeting.wav -ac 1 -ar 16000 clip.wav 裁出小片,再跑 speech transcribe clip.wav --engine qwen3。把實際開始、結束秒數及匿名 speaker ID 與文字放成一列,播放原音核對;例子的秒數須換成你自己的區間。
逐段裁切只是容易檢查的基線:片段太短、切掉字首字尾,或兩人同時說話,都可能使辨識變差。遇到重疊時先保留「兩人同時說話」的時間註記,別把混合音訊硬分給單一 speaker。進階系統可參考 NVIDIA 的多說話者 ASR 整合指南,它使用分別處理 speaker 的串流與時間標記;那是另一套管線,不能直接把本文兩個 CLI 命令當成等價實作。
⑤ 先建立三組小驗收,再決定是否接入 Agent
- 停頓:A 說一句、靜音、A 再說一句。記「同一人被換 ID」的次數,另記第二句是否漏掉。
- 插話:A 說到一半,B 接一小句。記 B 的起點有沒有切出、A 的續句是否被歸給 B。
- 重疊:A 與 B 同時說短句。記兩條聲音是否同時出現在時間軸,並把 ASR 漏字與分段漏切分開記。
每段都用人工答案對照 Core ML、MLX 兩份結果。建議留四欄:audio_id、人工標籤區間、模型標籤區間、錯誤類型。匿名 ID 先在每段錄音中做一次 A/B 對應,之後維持不變;不要每遇到錯換就重新命名,否則會把錯誤「修」掉。這些小樣本是你的回歸測試,不是可外推到所有語言與房間的準確率。
什麼時候可以接入語音 Agent?
先決定 Agent 要靠 speaker ID 做什麼。如果只是把會議紀錄分段,錯誤可以讓人回放修正;如果要依「誰說的」執行工具、變更資料或做權限判斷,就要讓關鍵動作等待確認,不能把匿名 channel 當身分驗證。已經在做語音對話的人,也可對照 Nari+Qwen3 TTS 語音 Agent,把「聽、辨人、說」當成不同模組安排。speech-swift 文件也把命名聲音身分列為另一個模型與步驟,並說 Nemotron 3 兩個後端不產生 speaker embedding。
若你要低延遲串流,專案文件目前把 Core ML 的 Nemotron 3 session 標為 experimental。文件只報告五個 VoxConverse-dev 檔案的短節奏離線對照,並指出其中一個四人檔的說話人數被低估。這是作者的有界觀察,不是本文重現,也不等於你自己的雙人錄音會有相同結果。先用離線時間軸驗收,再評估串流的延遲與錯換,順序比較穩妥。
常見問題:8 個直接答案
1. speaker_0 就是主持人嗎?
不一定。它是這次錄音裡依首次出現次序建立的匿名 channel;先聽原音,才知道它對應誰。
2. 10 毫秒代表每句切點誤差都小於 10 毫秒?
不代表。10 毫秒描述輸出時間格距,不是人工答案與模型切點之間的誤差上限。
3. 只跑 speech transcribe 會有說話者嗎?
看選用的 ASR 引擎與輸出模式。本文用 Qwen3 ASR 命令示範文字,再以 Nemotron 3 建時間軸;請用你安裝版本的 --help 核對其他引擎的能力。
4. 重疊說話時,能強制選一個人嗎?
不該直接強制。模型可在同一時間回報兩條活動;若逐字稿只留一人,會把另一人的話藏掉。
5. Core ML 與 MLX 的 ID 數字要逐字相等嗎?
不必。先在各自結果中對應聲音,再比停頓後是否保持同一人、漏切多少、邊界差在哪。
6. 可以把 speaker ID 跨會議沿用嗎?
不要直接沿用。它描述本次輸出的匿名 channel;跨錄音要另做聲音比對與人工確認。
7. Mac 上跑本機模型,就能跳過錄音同意嗎?
不能這樣推論。資料是否離開裝置,與參與者是否同意錄音,是兩個不同問題;先取得合適同意並管好原音檔。
8. 哪種結果算可以上線?
由你的用途決定。至少先讓停頓、插話、重疊三組錄音有人工答案,記錄每種錯誤,確認 Agent 的關鍵動作有核對機制。
給新手的三個重點
- 先把「說了什麼」與「誰在何時說」拆開看,才找得到錯誤來源。
- 同一份錄音跑 Core ML 和 MLX,核對停頓後的 ID、插話與重疊;不要把官方小樣本當成自己的成績。
- 把匿名 speaker ID 交給人核對後再接入 Agent;需要身分權限的步驟另外設計確認。
接著閱讀
左右滑動查看更多推薦
結語:先做一張「會暴露錯誤」的時間軸
今天先選一段已取得同意的雙人錄音,人工標記 A、B 和三處關鍵轉折;再跑兩個後端,把 ASR 文字接到單人區間,聽回原音找出第一次錯換。你得到的不是一張漂亮卻無法查核的逐字稿,而是一套能判斷語音 Agent 何時該相信、何時該停下來核對的流程。想繼續系統化學習,可從 AlphaLab 課程選一個適合的起點。
