音訊轉錄管道
使用 Whisper、Deepgram 和 AssemblyAI 建立生產級的語音轉文字管道,支援批次和即時轉錄,並具備說話者分離功能。
決策點
引擎選擇決策樹
如果需求包括:
├─ 需要即時串流?
│ ├─ 是:使用 Deepgram Nova-3 WebSocket(最快)
│ └─ 否:前往準確性需求
├─ 需要最高準確性 + 有 GPU?
│ ├─ 是:使用 Whisper large-v3 搭配 faster-whisper
│ └─ 否:前往成本分析
├─ 預算 < $0.0059/分鐘 且有運算資源?
│ ├─ 是:使用本地 Whisper
│ └─ 否:使用 AssemblyAI Universal-2(最佳 API 說話者分離)
批次 vs 串流處理
如果音訊特性:
├─ 時長 > 30 分鐘?
│ ├─ 是:使用批次處理並搭配區塊切割(在靜音處分割)
│ └─ 否:前往延遲檢查
├─ 需要 < 10 秒內得到結果?
│ ├─ 是:使用串流(Deepgram/Whisper.cpp)
│ └─ 否:使用批次處理以獲得更好的準確性
VAD(語音活動偵測)使用
如果內容類型:
├─ 即時對話/會議?
│ ├─ 是:啟用 VAD(可節省 40-60% 的靜音運算量)
│ └─ 否:前往內容檢查
├─ 有停頓的講座/簡報?
│ ├─ 是:使用保守的 VAD(min_silence_duration_ms: 1000)
│ └─ 否:跳過 VAD(適用於密集語音,如有聲書等)
按領域選擇模型
如果語言/口音:
├─ 非英語或重口音?
│ ├─ 是:使用 Whisper large-v3(最佳多語言支援)
│ └─ 否:前往速度檢查
├─ 需要 < 1 秒延遲?
│ ├─ 是:使用 Deepgram Nova-3 串流
│ └─ 否:使用 AssemblyAI 處理商業/醫學術語
失敗模式
靜音時產生幻覺
偵測:轉錄稿在安靜時段顯示重複的句子,或出現幻想的音樂描述
診斷:VAD 已停用或閾值過低,模型從背景噪音中產生文字
修復:啟用 VAD,設定 min_silence_duration_ms: 500,在 Whisper 中使用 --no_speech_threshold 0.6
超過 10 位說話者時說話者分離失敗
偵测:10-15 分鐘後所有說話者都被標記為“說話者 1”,或句子中間出現隨機的說話者切換 診斷:說話者嵌入模型飽和,在吵雜音訊中發生重疊混淆 修復:按靜音預先分割,如果音軌是立體聲則使用 AssemblyAI 的 dual_channel,最多限制 8 個活躍說話者
影片時間戳偏移
偵測:字幕在對應影片影格之前/之後 2-5 秒出現
診斷:音訊前處理改變了時長,或 VAD 移除片段時未調整時間戳
修復:在前處理中使用 --preserve_timing,與原始音訊時間碼同步,根據已知語音事件進行驗證
語言自動偵測失敗
侦测:當說話者有口音時,英文單字被轉錄為亂碼,或忽略了語碼轉換
診斷:模型在前 30 秒鎖定了錯誤語言,或多語言內容混淆了分類器
修復:對於有口音的英語,強制設定語言 language="en";對於非英語轉英語,使用 task="translate"
長檔案記憶體溢出
偵測:處理超過 45 分鐘的檔案時發生 OOM 崩潰,或 30 分鐘後突然出現品質下降
診斷:模型保留了完整的上下文視窗,GPU VRAM 耗盡
修復:在 25 分鐘邊界處進行區塊切割,並有 30 秒重疊,使用 --without_timestamps 以提高 RAM 效率
實作範例
完整會議轉錄逐步解說
情境:90 分鐘的董事會會議,6 位說話者,需要準確的說話者識別和時間戳以產出會議記錄
輸入分析:
- 90 分鐘 → 需要區塊切割
- 6 位說話者 → 在說話者分離限制內
- 商業情境 → 使用 AssemblyAI 處理術語
決策路徑:
- 時長 > 30 分鐘 → 需要批次處理
- 說話者數量 = 6 → 說話者分離可行
- 商業領域 → 選擇 AssemblyAI Universal-2
- 需要高準確性 → 啟用說話者標籤和智慧格式化
實作:
# 步驟 1:前處理(專家會注意到:標準化音訊音量)
ffmpeg -i meeting.mp4 -ar 16000 -ac 1 -filter:a "volume=0.8" meeting_clean.wav
# 步驟 2:使用重疊進行區塊切割(新手會直接處理整個檔案)
from pydub import AudioSegment
audio = AudioSegment.from_wav("meeting_clean.wav")
chunks = []
for i in range(0, len(audio), 25*60*1000): # 25 分鐘區塊
chunk = audio[i:i+27*60*1000] # 27 分鐘,含 2 分鐘重疊
chunks.append(chunk)
# 步驟 3:使用說話者分離進行轉錄
results = []
for chunk in chunks:
response = assemblyai_client.transcribe(
chunk, speaker_labels=True, auto_punctuation=True,
dual_channel=False, speaker_labels_max=8
)
results.append(response.get_paragraphs())
# 步驟 4:合併重疊片段(專家步驟,新手會忽略)
merged = merge_overlapping_transcripts(results, overlap_seconds=120)
專家 vs 新手:
- 新手:直接處理 90 分鐘的檔案 → OOM 崩潰或準確性差
- 專家:使用重疊進行區塊切割,驗證區塊間說話者的一致性,首先標準化音訊
品質閘道
- WER(字錯誤率)在已知標準答案的測試樣本上 < 5%
- 說話者準確率 > 90%(在有標準答案的情況下,每個話語的說話者 ID 正確)
- 即時延遲 < 2 秒(端到端,針對串流實作)
- SRT/VTT 檔案通過驗證(正確的時間戳,無重疊片段)
- 音訊前處理完成:確認格式為 16kHz 單聲道 WAV/FLAC
- VAD 參數已調整:樣本中靜音偵測的誤報率 < 10%
- 記憶體使用量 < 8GB(針對長達 2 小時的檔案,確認區塊切割正常運作)
- API 錯誤處理已測試:處理超時、重試和配額超限
- 說話者分離數與預期相符(±1 位說話者容差)
- 輸出時間戳與原始音訊的對齊精度在 100ms 內
不適用邊界
此技能不應用於:
- 文字轉語音合成 → 請改用
voice-audio-engineer - 音樂轉錄或歌詞提取 → 請改用
ai-engineer處理音樂 AI 模型 - 不經轉錄的音訊分類 → 請改用
ai-engineer處理音訊分類 - 即時翻譯(轉錄+翻譯) → 請與
language-translator技能結合使用 - 語音生物辨識或說話者識別 → 請改用
ai-engineer處理說話者辨識模型 - 音訊品質增強或降噪 → 請改用
voice-audio-engineer處理音訊處理
以下情況請委派給其他技能:
- 需要自訂喚醒詞偵測 →
voice-audio-engineer - 需要音訊指紋辨識 →
data-pipeline-engineer - 建構語音助理 →
voice-audio-engineer+conversation-designer - 處理超過 10,000 小時的音訊 →
data-pipeline-engineer負責編排