深入探討如何在 AWS 上打造成本優化的自建 AI 轉錄管線——運用 Spot 執行個體、基於 SQS 佇列的自動擴展,以及 Whisper Large-v3 Turbo——在價格上擊敗 OpenAI Whisper API。

大多數建構語音轉文字的團隊都默默接受 API 帳單。我沒有。當一個副業專案開始讓我每月花費 $180 的轉錄 API 費用時,我在 AWS 上重建了整個管線,並將處理成本降到 每小時不到 $0.10——比 OpenAI Whisper API 本身還便宜。

這篇文章將逐步介紹架構、權衡,以及讓它運作的具體決策。這裡的一切都驅動著我以獨立創辦人身分打造的 AI 轉錄平台 StrikeScribe,因此這些數字來自真實的生產工作負載,而非基準測試玩具。

如果你正在建構任何基於 Whisper、Deepgram、AssemblyAI 或 OpenAI 音訊 API 的東西,這就是大多數人錯過的套利機會。

問題:託管轉錄 API 在成本上無法規模化

託管 API 非常適合入門。你傳送音訊,就能取得文字。但定價模式會懲罰用量:

  • OpenAI Whisper API:約每小時 $0.36(按 $0.006/分鐘計算)
  • Otter、Fireflies 等:訂閱等級會限制你的小時數,並收取高額超額費用
  • AssemblyAI / Deepgram:具競爭力,但仍是隨使用量線性成長的按分鐘計費

當你每月處理數百小時——會議、播客、研究通話、IoT 音訊串流——那條線性成本曲線就會成為主要支出項目。你正在為本可直接租用的 GPU 運算支付利潤。

洞察:Whisper 的基礎模型是開源的。你支付的是他人的便利層。如果你能有效率地自行執行推論,經濟效益就會逆轉。

架構

以下是高階管線:

Upload → S3 → SQS Queue → Autoscaling Worker Group (GPU Spot Instances)
   → Whisper Large-v3 Turbo → Pyannote (diarization) → Postgres → Client

Enter fullscreen mode Exit fullscreen mode

讓我拆解實際影響成本的各個部分。

1. Whisper Large-v3 Turbo 達到品質/速度的甜蜜點

Whisper Large-v3 Turbo 能以接近 Large-v3 的準確度,大幅縮短推論時間。對於成本敏感的管線來說,推論速度就是成本,因為你是以 GPU 秒數計費。Turbo 能大幅降低每音訊小時所需的秒數。

為了更快處理,我透過 faster-whisper(CTranslate2 後端)執行,它比參考實作更省記憶體與運算資源:

from faster_whisper import WhisperModel

# int8_float16 keeps VRAM low while preserving accuracy
model = WhisperModel(
    "large-v3",
    device="cuda",
    compute_type="int8_float16",
)

segments, info = model.transcribe(
    "audio.wav",
    beam_size=5,
    vad_filter=True,           # skip silence, save compute
    vad_parameters={"min_silence_duration_ms": 500},
)

for segment in segments:
    print(f"[{segment.start:.2f} -> {segment.end:.2f}] {segment.text}")

Enter fullscreen mode Exit fullscreen mode

這裡有兩個低成本的優化:

  • vad_filter=True — 語音活動偵測會完全跳過靜音區段。真實世界的錄音(會議、通話)充滿死音。這項功能本身就大幅降低了運算量。
  • int8_float16 量化 — 讓你在較便宜、VRAM 較少的 GPU 上執行 Large-v3,而大多數音訊不會有明顯的準確度損失。

2. SQS + 佇列深度自動擴展

最簡單的方法是讓一台 GPU 執行個體永遠開啟。這也是最昂貴的方法——你為閒置時間付費。

相反地,我用 SQS 佇列將上傳與處理分離。一個輕量 Node.js 控制器會輪詢佇列深度,並根據積壓工作量擴展工作節點群:

import { SQSClient, GetQueueAttributesCommand } from "@aws-sdk/client-sqs";
import { AutoScalingClient, SetDesiredCapacityCommand } from "@aws-sdk/client-auto-scaling";

const sqs = new SQSClient({ region: "us-east-1" });
const asg = new AutoScalingClient({ region: "us-east-1" });

async function scaleWorkers() {
  const { Attributes } = await sqs.send(
    new GetQueueAttributesCommand({
      QueueUrl: process.env.QUEUE_URL,
      AttributeNames: ["ApproximateNumberOfMessages"],
    })
  );

  const backlog = parseInt(Attributes.ApproximateNumberOfMessages, 10);

  // one worker per N queued jobs, capped to control spend const desired = Math.min(Math.ceil(backlog / 5), MAX_WORKERS);

  await asg.send(
    new SetDesiredCapacityCommand({
      AutoScalingGroupName: process.env.ASG_NAME,
      DesiredCapacity: desired,
    })
  );
}

Enter fullscreen mode Exit fullscreen mode

當佇列為空時,節點群會縮減到零個 GPU 工作者。你只在有音訊需要處理時才支付 GPU 時間。這是最大的一項結構性成本槓桿。

3. Spot 執行個體(以及如何應對中斷)

GPU Spot 執行個體比隨需執行個體便宜 60–90%。缺點是 AWS 可能在 2 分鐘警告後回收它們。對於轉錄這種無狀態批次工作負載來說,這是完美的搭配——前提是你能優雅地處理中斷。

工作者會監聽 Spot 中斷通知,並將進行中的工作重新排入佇列,確保不會遺失任何工作:

// Poll the instance metadata endpoint for the interruption signal
async function checkForInterruption() {
  try {
    const res = await fetch(
      "http://169.254.169.254/latest/meta-data/spot/instance-action",
      { signal: AbortSignal.timeout(1000) }
    );
    if (res.status === 200) {
      // Reclaim imminent — put the current job back on the queue
      await requeueCurrentJob();
      await gracefulShutdown();
    }
  } catch {
    // 404 = not interrupted, carry on
  }
}

setInterval(checkForInterruption, 5000);

Enter fullscreen mode Exit fullscreen mode

因為工作是冪等的且有佇列支援,中斷的工作會被其他工作者接手。不會遺失任何工作,也不需要手動復原。這種韌性讓 Spot 能用於生產環境,而不僅僅是業餘批次工作。

4. 使用 Pyannote 進行說話者分離

原始轉錄稿只是價值的一半——知道「誰說了什麼」才能把一整面文字轉成可用的會議記錄。Pyannote 負責說話者分離:

from pyannote.audio import Pipeline

pipeline = Pipeline.from_pretrained(
    "pyannote/speaker-diarization-3.1",
    use_auth_token=HF_TOKEN,
)

diarization = pipeline("audio.wav")

for turn, _, speaker in diarization.itertracks(yield_label=True):
    print(f"{speaker}: {turn.start:.1f}s - {turn.end:.1f}s")

Enter fullscreen mode Exit fullscreen mode

接著將分離片段與 Whisper 的時間戳對齊,就能為每行文字標註說話者。雖然會增加運算量,但這是從「一份轉錄稿」變成「會議智慧」的關鍵。

成果

在生產環境中執行此管線:

  • 處理成本:每小時音訊低於 $0.10——擊敗 OpenAI Whisper API
  • 一次壓力測試:來自 9 台 Raspberry Pi 24/7 錄音的 216 小時音訊,總成本 低於 $3
  • 整體基礎架構成本較「永遠開啟/託管 API」的基準降低約 60%

四項槓桿——Turbo 模型、VAD 靜音跳過、縮減至零的自動擴展,以及 Spot 定價——的複合效果是乘法而非加法。每項單獨都有幫助;疊加後,它們徹底改變了單位經濟效益。

什麼時候不該自建

公平來說,這不是免費午餐。我選擇自建的原因是:

  • 用量高到 API 費用遠大於工程時間
  • 工作負載是 批次而非即時(Spot + 佇列延遲可以接受)
  • 我願意管理 AWS 基礎架構、GPU 驅動程式與模型更新

如果你用量低、需要低於一秒的即時字幕,或不想維護基礎架構,託管 API 才是正確選擇。損益平衡點通常落在每月低百位數小時左右。

結論

套利模式——找出競爭對手定價過高的項目,然後用你可控的基礎元件以更低成本建構——在目前的 AI 基礎架構中非常真實。大量的「AI 產品」定價只是 GPU 運算與開源模型上的利潤。

如果你處理大量的音訊資料,我這套管線的組合是:

  1. faster-whisper + Large-v3 Turbo,使用 int8_float16 與 VAD
  2. 能縮減至零的 SQS 佇列深度自動擴展
  3. 具中斷安全與冪等工作的 GPU Spot 執行個體
  4. 使用 Pyannote 進行說話者分離,增加真實產品價值

我已將所有這些功能整合到 StrikeScribe——上傳音訊或影片,即可取得可搜尋的轉錄稿加上結構化的 AI 洞察,無需註冊,也不需要會議機器人。如果你想看看這條管線的輸出端實際運作,這是最簡單的方法。

歡迎在留言區提出架構問題——特別是 Spot 中斷處理與分離對齊,這兩件事通常是大家卡住的地方。