REST API

逐字稿條目 API

概述

逐字稿條目(句子)編輯 API。提供使用者修正 STT 辨識錯誤的能力。


PATCH /api/v1/tasks/{taskId}/entries/{sid}

功能說明

修改歷史錄音中單一句子的原文(original_text)。

設計重點:

  • 保留 STT 原始輸出:首次編輯時系統會自動把原始 STT 結果備份到 original_text_raw,可隨時回溯
  • 不自動重翻:本端點只改原文,翻譯需呼叫 GET /api/v1/sse/recordings/{taskId}/entries/{sid}/retranslate 觸發
  • 樂觀鎖:可帶 expected_revision 防止併發覆寫
  • TTS 快取自動失效:原文變更後該句所有語言的 TTS 快取會被清除

限制

  • 僅允許已完成處理(processing_status === completed)的錄音;進行中的錄音會回 recording_not_completed
  • 只能編輯屬於該 API Key 持有者的錄音

認證方式

Header:X-API-Key(詳見 認證機制)

請求參數

Path 參數

參數類型必填說明
taskIdstring是任務 ID(UUID)
sidnumber是句子 ID(1-based)

Body 參數(JSON)

參數類型必填說明
original_textstring是修正後的原文,1–2000 字元
expected_revisionnumber否樂觀鎖:當前 transcript revision;不符會回 transcript_revision_conflict

請求範例

# 直接覆寫(推薦:tasks 路徑)
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/tasks/{taskId}/entries/5" \
  -H "X-API-Key: vas_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "original_text": "修正後的文字" }'

# 帶樂觀鎖
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/tasks/{taskId}/entries/5" \
  -H "X-API-Key: vas_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "original_text": "修正後的文字", "expected_revision": 3 }'

成功回應

HTTP 200

{
  "data": {
    "sid": 5,
    "original_text": "修正後的文字",
    "original_text_raw": "原始 STT 輸出",
    "original_text_edited_at": "2026-05-06T10:30:00.000000Z",
    "translated_texts": {
      "en-US": "已過期的舊翻譯,待呼叫 retranslate 端點重做"
    },
    "revision": 4
  }
}
欄位類型說明
sidnumber句子 ID
original_textstring修正後的原文
original_text_rawstringSTT 原始輸出(首次編輯時備份)
original_text_edited_atstring編輯時間(ISO 8601)
translated_textsobject既有翻譯(不會自動更新,需另呼叫 SSE 重翻端點)
revisionnumber寫入後的新 revision,用於下次樂觀鎖

特有錯誤碼

錯誤碼HTTP說明
recording_not_found404錄音不存在或不屬於該使用者
recording_not_completed422錄音尚未完成處理
entry_not_found404找不到指定的句子
entry_text_empty422原文為空
entry_text_too_long422原文超過 2000 字元上限
transcript_revision_conflict409revision 不符(已被其他請求修改),或同一份逐字稿正有其他寫入在進行
speaker_transcript_not_found404找不到逐字稿
storage_upload_failed500逐字稿寫回儲存服務失敗

典型工作流:編輯 + 自動重翻

// 1. 從 historyTranscribe 取得當前 revision(透過 init_metadata 或自行讀取)
const currentRevision = 3;

// 2. 編輯原文
const editResp = await fetch(`/api/v1/tasks/${id}/entries/${sid}`, {
  method: 'PATCH',
  headers: { 'X-API-Key': key, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    original_text: '修正後文字',
    expected_revision: currentRevision,
  }),
});
const { data } = await editResp.json();
// 以回傳的 data.revision 為準,不要假設它等於 expected_revision + 1

// 3. 觸發單句重翻(會 emit progress / translated / done 事件)
const sse = new EventSource(
  `/api/v1/sse/recordings/${id}/entries/${sid}/retranslate`
    + `?expectedRevision=${data.revision}&api_key=${key}`
);
sse.addEventListener('translated', (e) => {
  const { lang, text } = JSON.parse(e.data);
  console.log(`${lang}: ${text}`);
});
sse.addEventListener('done', (e) => {
  const { revision } = JSON.parse(e.data);
  // 同樣以回傳值為準:期間若有其他寫入,版本號會跳號
  sse.close();
});

版本:V1.24.1 最後更新:2026-09-28

Copyright © 2026