使用指南

File Import

目錄

  1. 概述
  2. 支援的音檔格式
  3. 預算檢查
  4. 上傳音檔
  5. 參數說明
  6. 查詢匯入狀態
  7. 匯入完成後
  8. 文字處理參數
  9. 完整流程圖
  10. Webhook 通知
  11. 相關文件

概述

音檔匯入功能讓您上傳預錄的音檔,由系統在背景進行語音辨識、翻譯和摘要處理。與即時語音翻譯(WebSocket)不同,音檔匯入使用 REST API,適合離線批次處理場景。

整體流程

預算檢查 → 上傳音檔 → 追蹤處理進度 → 取得結果
步驟API說明
1. 預算檢查POST /api/v1/imports/check-quota確認剩餘預算是否足夠
2. 上傳音檔POST /api/v1/imports以 multipart/form-data 上傳
3. 查詢狀態GET /api/v1/imports/{importId}輪詢處理進度
3b. 即時進度GET /api/v1/sse/imports/{importId}/progressSSE 即時進度推送(替代輪詢)
4. 查看結果Tasks API / SSE API取得逐字稿、翻譯、摘要

認證方式

所有音檔匯入 API 透過 Header X-API-Key 認證。詳見 認證機制


支援的音檔格式

格式MIME Type說明
MP3audio/mpeg最常見的壓縮格式
WAVaudio/wav無損格式,檔案較大
M4Aaudio/mp4Apple 常用格式

檔案限制:

項目限制
最大檔案大小500 MB
最大時長10 小時
最小時長1 秒

預算檢查

上傳前建議先檢查月度預算是否足夠,避免上傳大檔案後才發現預算不足。

請求

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports/check-quota" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"duration_ms": 3600000}'
參數類型必填說明
duration_msinteger音檔預估時長(毫秒),範圍 1,000 ~ 36,000,000

回應

{
  "data": {
    "allowed": true,
    "remaining_budget": 48.48,
    "is_unlimited": false,
    "duration_minutes": 25,
    "estimated_cost": 0.4236,
    "remaining_minutes": 2864
  }
}
欄位類型說明
allowedbooleantrue 表示預算足夠,可以上傳
remaining_budgetfloat | null剩餘月度預算(USD),無預算限制時為 null
is_unlimitedboolean是否為無預算限制
duration_minutesinteger音檔預估時長(分鐘,無條件進位)
estimated_costfloat預估 STT 處理費用(USD)
remaining_minutesinteger | null剩餘預算可用的等效 STT 分鐘數,無預算限制時為 null

allowedfalse,建議提示使用者等待下月預算重置或調整預算。 可利用 duration_minutesremaining_minutes 顯示「需扣 X 分鐘,剩餘 Y 分鐘」的提示。


上傳音檔

使用 multipart/form-data 格式上傳音檔及處理參數。

基本請求

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@meeting.mp3" \
  -F 'transcription_languages=["zh-TW"]' \
  -F 'translation_languages=["en-US"]' \
  -F "recognition_mode=multi_speaker"

含摘要與文字處理的請求

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@meeting.mp3" \
  -F 'transcription_languages=["zh-TW"]' \
  -F 'translation_languages=["en-US"]' \
  -F "recognition_mode=multi_speaker" \
  -F "summary_template=meeting" \
  -F 'terminology={"zh-TW": [{"term": "語者分離", "boost": 1.5}]}' \
  -F 'translation_dict=[{"source": "語者分離", "translations": {"en-US": "Speaker Diarization"}}]'

成功回應(HTTP 202)

{
  "data": {
    "import_id": "550e8400-e29b-41d4-a716-446655440000",
    "status": "pending",
    "stage": null,
    "progress": 0,
    "message": null,
    "original_filename": "meeting.mp3",
    "file_size": "15.2 MB",
    "task_id": null,
    "created_at": "2026-01-15T10:00:00.000Z"
  }
}

注意:回應碼為 202 Accepted,表示伺服器已接受上傳但處理尚未完成。保存 import_id 用於後續查詢進度。

常見錯誤

錯誤碼HTTP 狀態碼說明處理方式
import_file_too_large413檔案超過 500 MB壓縮或分割檔案
import_invalid_format415不支援的音檔格式使用 mp3/wav/m4a
auth_budget_exceeded402月度預算已超額等待下月預算重置或調整預算

參數說明

必填參數

參數類型說明
filefile音檔(multipart/form-data)
transcription_languagesstring (JSON)轉錄語言,JSON 陣列格式(如 ["zh-TW"]
recognition_modestringsingle(單人)或 multi_speaker(多人語者分離)

選填參數

參數類型說明
translation_languagesstring (JSON)翻譯目標語言,JSON 陣列格式(如 ["en-US", "ja-JP"]
summary_templatestring摘要模板識別碼(如 meetinginterviewspeech
terminologystring (JSON)術語庫(提升辨識準確度)
fuzzy_correctionstring (JSON)模糊詞校正規則(通常不需手動設定)
translation_dictstring (JSON)翻譯字典(確保專有名詞翻譯一致)
callback_urlstringWebhook 回呼 URL(處理完成/失敗時通知)

辨識模式

模式說明適用場景
single單人辨識單一講者的語音備忘、演講錄音
multi_speaker多人語者分離會議錄音、訪談、多人對話

摘要模板

可用的摘要模板可透過 GET /api/v1/summary-templates 查詢:

模板適用場景
general通用摘要
meeting會議記錄
meeting_minutes詳細會議紀要
speech演講內容
interview訪談內容
course課程內容

查詢匯入狀態

上傳成功後,使用 import_id 輪詢處理進度。

請求

curl -X GET "https://vas-poc.vurbo.ai/api/v1/imports/{importId}" \
  -H "X-API-Key: YOUR_API_KEY"

回應

{
  "data": {
    "import_id": "550e8400-e29b-41d4-a716-446655440000",
    "status": "processing",
    "stage": "transcribing",
    "progress": 45,
    "message": "正在辨識語音...",
    "task_id": null,
    "error_code": null,
    "error_message": null
  }
}

狀態流轉

pending → processing → completed
                    └→ failed
狀態說明
pending已排入佇列,等待處理
processing正在處理中
completed處理完成(task_id 有值)
failed處理失敗(error_codeerror_message 有值)

處理階段(Stage)

processing 狀態下,stage 欄位表示目前的處理階段:

階段說明大約進度
converting音檔格式轉換0% ~ 10%
transcribing語音辨識中10% ~ 60%
translating翻譯中60% ~ 85%
summarizing生成摘要中85% ~ 100%

輪詢建議

async function pollImportStatus(importId, apiKey) {
  const interval = setInterval(async () => {
    const response = await fetch(
      `https://vas-poc.vurbo.ai/api/v1/imports/${importId}`,
      { headers: { 'X-API-Key': apiKey } }
    );
    const result = await response.json();
    const { status, stage, progress, task_id } = result.data;

    console.log(`狀態: ${status}, 階段: ${stage}, 進度: ${progress}%`);

    if (status === 'completed') {
      clearInterval(interval);
      console.log(`處理完成!Task ID: ${task_id}`);
      // 使用 task_id 載入結果...
    } else if (status === 'failed') {
      clearInterval(interval);
      console.error(`處理失敗: ${result.data.error_message}`);
    }
  }, 5000); // 每 5 秒查詢一次
}

建議:輪詢間隔設為 3~5 秒即可。過於頻繁的輪詢不會加速處理。


音檔無法辨識時的行為(v1.3.5)

若音檔因為「整段靜音 / 音量過小 / 全程雜訊 / 辨識語言與音檔實際語言不符」等原因,導致語音辨識結果為空,系統仍會以 completed 狀態結束(不是 failed),但逐字稿將為空陣列。

行為定義

項目
最終 statuscompleted不是 failed
SSE 最終事件completedtask_id 有值)
Webhook 事件recording.completed + import.completed
逐字稿 entries[](空陣列)
segments_count0
預算扣除依音檔實際時長扣除,不會退還

為什麼不是 failed

failed 代表處理流程本身出錯(如格式錯誤、預算超額、音檔解析失敗)。音檔處理流程完整跑完、只是辨識不出內容,屬於合法的完成狀態。這讓客戶端能以相同的成功分支處理結果,並透過 entries.length === 0 判斷需要顯示「無語音內容」提示。

客戶端處理建議

載入逐字稿(GET /api/v1/sse/history/transcribe/{taskId})時,若累積的句子數為 0,建議顯示空狀態:

const sentences = [];
// ... 處理 SSE 事件收集 init_sentence

if (sentences.length === 0) {
  // 顯示空狀態
  showEmptyState({
    title: '此音檔未辨識出語音內容',
    hint: '可能原因:音量過小、全程靜音、或辨識語言與音檔不符。建議確認音檔品質或調整辨識語言後重新上傳。',
  });
} else {
  renderTranscript(sentences);
}

如何預防

  • 檢查辨識語言設定:確認 transcription_languages 與音檔實際語言一致(例如英文音檔選 en-US,不要選 zh-TW
  • 檢查音檔品質:確認音檔有清晰人聲、音量足夠(建議峰值 -12 dBFS 以上)
  • 多語言音檔:若音檔為多語言內容,建議拆分後分別上傳

小提示:預算會依音檔時長扣除,無法辨識的音檔也不例外。上傳前建議先試聽確認。


匯入完成後

當狀態變為 completed,回應中的 task_id 就是該匯入任務對應的 Task ID。透過此 ID 可以:

1. 查看任務列表

curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks" \
  -H "X-API-Key: YOUR_API_KEY"

2. 載入逐字稿(SSE 串流)

const response = await fetch(
  `https://vas-poc.vurbo.ai/api/v1/sse/history/transcribe/${taskId}`,
  { headers: { 'X-API-Key': apiKey } }
);
// 處理 SSE 事件:init_metadata → init_sentence × N → init_summary → init_done

3. 播放音訊

const response = await fetch(
  `https://vas-poc.vurbo.ai/api/v1/sse/audio/${taskId}`,
  { headers: { 'X-API-Key': apiKey } }
);
const blob = await response.blob();
const audio = new Audio(URL.createObjectURL(blob));
audio.play();

4. 重新翻譯為其他語言

const response = await fetch(
  `https://vas-poc.vurbo.ai/api/v1/sse/retranslate/${taskId}?targetLang=ja-JP`,
  { headers: { 'X-API-Key': apiKey } }
);
// 處理 SSE 事件:translation × N → done

完整的歷史紀錄操作,請參考 歷史紀錄與回放指南


文字處理參數

上傳時可附帶文字處理參數,提升辨識與翻譯品質。

術語庫(terminology)

以 JSON 物件格式,以語言代碼為 key:

{
  "zh-TW": [
    { "term": "語者分離", "boost": 1.5 },
    { "term": "CVD製程", "boost": 2.0 }
  ]
}
欄位必填說明
term術語文字(最大 100 字元)
boost辨識權重(0.5 ~ 5.0,預設 1.0)

每種語言最多 500 個術語。系統會自動從術語庫生成模糊詞校正規則。

模糊詞校正(fuzzy_correction)

通常不需手動設定,系統會從 terminology 自動生成。若需自訂:

{
  "zh-TW": [
    { "correct": "語者分離", "incorrect": ["語這分離", "語者分力"] }
  ]
}

翻譯字典(translation_dict)

確保專有名詞翻譯一致:

[
  {
    "source": "語者分離",
    "translations": {
      "en-US": "Speaker Diarization",
      "ja-JP": "話者分離"
    }
  }
]

建議不超過 50 條目。


Webhook 通知

設定 callback_url 後,處理完成或失敗時 VAS 會主動發送 HTTP POST 通知到您的伺服器,免除輪詢的需要。

設定方式

在上傳時加入 callback_url 參數:

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@meeting.mp3" \
  -F 'transcription_languages=["zh-TW"]' \
  -F "recognition_mode=multi_speaker" \
  -F "callback_url=https://your-server.com/webhooks/vas"

收到的事件

結果事件說明
成功recording.completed + import.completed收到兩個事件
失敗import.failed匯入階段失敗

完整的 Webhook 格式、簽名驗證和範例程式碼,請參考 Webhook 回呼指南


完整流程圖

           ┌────────────────────┐
           │   check-quota      │  檢查預算是否足夠
           │  POST /imports/    │
           │  check-quota       │
           └────────┬───────────┘
                    │
              allowed: true?
               ╱          ╲
             是             否 → 提示預算不足
              │
    ┌─────────▼──────────┐
    │    POST /imports    │  上傳音檔
    │  multipart/form-data│  (transcription_languages,
    │                     │   translation_languages,
    │                     │   recognition_mode, ...)
    └─────────┬──────────┘
              │
         HTTP 202
         import_id
              │
    ┌─────────▼──────────┐
    │  GET /imports/{id}  │  輪詢處理狀態
    │   每 3~5 秒         │  (每 3~5 秒查詢一次)
    └─────────┬──────────┘
              │
        status 判斷
       ╱      │      ╲
   pending  processing  completed / failed
              │              │
         stage:          task_id ←── 處理完成
         converting          │
         transcribing   ┌────▼─────────────┐
         translating    │  Tasks API        │  查看任務列表
         summarizing    │  SSE History API  │  載入逐字稿
                        │  SSE Audio API    │  播放音訊
                        │  SSE Retranslate  │  重新翻譯
                        └──────────────────┘

相關文件

文件說明
認證機制API Key 認證詳細說明
Imports API Reference音檔匯入 API 完整規格
匯入進度 SSE即時進度追蹤 SSE 串流規格
Tasks API Reference任務管理 API 完整規格
Summary Templates Reference摘要模板查詢
歷史紀錄與回放匯入完成後如何載入與回放紀錄

版本:V1.5.7 最後更新:2026-05-20

Copyright © 2026