File Import
目錄
概述
音檔匯入功能讓您上傳預錄的音檔,由系統在背景進行語音辨識、翻譯和摘要處理。與即時語音翻譯(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}/progress | SSE 即時進度推送(替代輪詢) |
| 4. 查看結果 | Tasks API / SSE API | 取得逐字稿、翻譯、摘要 |
認證方式
所有音檔匯入 API 透過 Header X-API-Key 認證。詳見 認證機制。
支援的音檔格式
| 格式 | MIME Type | 說明 |
|---|---|---|
| MP3 | audio/mpeg | 最常見的壓縮格式 |
| WAV | audio/wav | 無損格式,檔案較大 |
| M4A | audio/mp4 | Apple 常用格式 |
檔案限制:
| 項目 | 限制 |
|---|---|
| 最大檔案大小 | 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_ms | integer | 是 | 音檔預估時長(毫秒),範圍 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
}
}
| 欄位 | 類型 | 說明 |
|---|---|---|
allowed | boolean | true 表示預算足夠,可以上傳 |
remaining_budget | float | null | 剩餘月度預算(USD),無預算限制時為 null |
is_unlimited | boolean | 是否為無預算限制 |
duration_minutes | integer | 音檔預估時長(分鐘,無條件進位) |
estimated_cost | float | 預估 STT 處理費用(USD) |
remaining_minutes | integer | null | 剩餘預算可用的等效 STT 分鐘數,無預算限制時為 null |
若
allowed為false,建議提示使用者等待下月預算重置或調整預算。 可利用duration_minutes和remaining_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_large | 413 | 檔案超過 500 MB | 壓縮或分割檔案 |
import_invalid_format | 415 | 不支援的音檔格式 | 使用 mp3/wav/m4a |
auth_budget_exceeded | 402 | 月度預算已超額 | 等待下月預算重置或調整預算 |
參數說明
必填參數
| 參數 | 類型 | 說明 |
|---|---|---|
file | file | 音檔(multipart/form-data) |
transcription_languages | string (JSON) | 轉錄語言,JSON 陣列格式(如 ["zh-TW"]) |
recognition_mode | string | single(單人)或 multi_speaker(多人語者分離) |
選填參數
| 參數 | 類型 | 說明 |
|---|---|---|
translation_languages | string (JSON) | 翻譯目標語言,JSON 陣列格式(如 ["en-US", "ja-JP"]) |
summary_template | string | 摘要模板識別碼(如 meeting、interview、speech) |
terminology | string (JSON) | 術語庫(提升辨識準確度) |
fuzzy_correction | string (JSON) | 模糊詞校正規則(通常不需手動設定) |
translation_dict | string (JSON) | 翻譯字典(確保專有名詞翻譯一致) |
callback_url | string | Webhook 回呼 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_code 和 error_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),但逐字稿將為空陣列。
行為定義
| 項目 | 值 |
|---|---|
最終 status | completed(不是 failed) |
| SSE 最終事件 | completed(task_id 有值) |
| Webhook 事件 | recording.completed + import.completed |
| 逐字稿 entries | [](空陣列) |
segments_count | 0 |
| 預算扣除 | 依音檔實際時長扣除,不會退還 |
為什麼不是 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