ตรวจสอบสถานะงาน — GET /status
Personal API key และ session อ่านสถานะได้เฉพาะงานของเจ้าของบัญชี งานของผู้ใช้อื่นตอบ 404
ตรวจสอบความคืบหน้าของงานถอดเสียงด้วย job_id — เมื่องานเสร็จสิ้น (state = READY) response จะมีลิงก์ดาวน์โหลดไฟล์ซับไตเติลให้ทันที
GET https://api.lomasub.ai/status?job_id=<job_id>
| Header |
ค่า |
จำเป็น |
Authorization |
Bearer <API_KEY> |
ต้องระบุ |
Query Parameters
| พารามิเตอร์ |
ชนิด |
จำเป็น |
คำอธิบาย |
job_id |
string (UUID) |
ต้องระบุ |
รหัสงานที่ได้จาก POST /new-transcribe |
ตัวอย่าง Request
curl "https://api.lomasub.ai/status?job_id=0b8a4f3e-6c1d-4a9b-9f2e-7d5c3b1a8e64" \
-H "Authorization: Bearer $LOMA_API_SECRET_KEY"
Response — 200 OK
ฟิลด์ที่มีเสมอ
| ฟิลด์ |
ชนิด |
คำอธิบาย |
job_id |
string (UUID) |
รหัสงาน |
state |
string |
สถานะปัจจุบันของงาน (ดูตารางสถานะด้านล่าง) |
source_url |
string (URL) |
URL ไฟล์เสียงต้นทางของงานนี้ |
audio_duration_seconds |
float | null |
ความยาวไฟล์เสียงที่ worker ถอดรหัสได้ (วินาที) — มีค่าหลังตรวจความยาวและจองโควตาใน SPLITTING สำเร็จ หรือเมื่อ worker ส่งค่าตอน /finish; ก่อนหน้านั้นเป็น null |
started_at |
string (timestamp) |
เวลาที่ worker รับงาน (เท่ากับ s2_splitting_ts) หรือเวลาเข้าคิวหากยังไม่มีใครรับ ทุก timestamp ใน API เป็น UTC รูปแบบ RFC 3339 ลงท้ายด้วย Z |
config |
object |
config snapshot ที่ worker ใช้จริง (ค่าเริ่มต้นของเซิร์ฟเวอร์รวมกับค่าที่ส่งมา) รวมถึง language |
s1_queued_ts … s9_ready_ts |
string | null |
เวลาเข้าสู่แต่ละขั้นตอน 11 ค่า: s1_queued_ts, s2_splitting_ts, s3_transcribing_ts, s3a_pro_correcting_ts, s4_aligning_ts, s4a_llm_splitting_ts, s4b_forcedalign_2nd_ts, s5_preparing_srt_ts, s6_diarizing_ts, s7_building_srt_ts, s9_ready_ts — ขั้นตอนที่ยังไม่ถึงหรือไม่ได้ทำงานจะเป็น null ผลต่างของค่าที่ติดกันคือเวลาที่ใช้ในแต่ละขั้น |
สถานะของงาน (state)
งานจะไล่สถานะตามลำดับต่อไปนี้ (บางขั้นตอนมีเฉพาะเมื่อเปิดตัวเลือกที่เกี่ยวข้อง)
| สถานะ |
คำอธิบาย |
QUEUED |
เข้าคิว รอ worker รับงาน |
SPLITTING |
ดาวน์โหลด ถอดรหัสเป็น 16 kHz โมโน สแกน Silero VAD และแบ่งช่วงเสียง |
TRANSCRIBING |
Whisper ถอดเสียงทุกช่วง แล้วผ่านตัวกรองข้อความหลอนภาษาไทย |
PRO_CORRECTING |
ตรวจแก้คำด้วย Pro หลัง TRANSCRIBING ก่อน ALIGNING (เฉพาะ promodel="pro") |
ALIGNING |
ForceAligner จัดตำแหน่งเวลาของแต่ละคำ (ข้ามเมื่อ forcealigner_level="none") |
LLM_SPLITTING |
กำลังตัดประโยคด้วยโมเดลภาษา (เฉพาะเมื่อ forcealigner_level="llmsplitting") |
FORCEDALIGN_2ND |
กำลังจัดตำแหน่งเวลารอบที่สอง (เฉพาะเมื่อ forcealigner_level="llmsplitting") |
PREPARING_SRT |
ตัดบรรทัดด้วยตัวตัดแบบ pause-DP ให้ได้ขนาดตาม srt_cue_words ไม่เกิน srt_max_chars แล้วรวมบรรทัดสั้น |
DIARIZING |
กำลังระบุผู้พูด (เฉพาะเมื่อ speaker_diarization=true) |
BUILDING_SRT |
รวมบรรทัดสั้นรอบสุดท้าย กรองข้อความหลอน จัดเวลาแสดงผล (end-fill, ตัดขอบเงียบ, จำกัดการยืด, แยกที่ช่วงเงียบยาว) ใส่ timestamp คาราโอเกะ สร้าง sidecar และอัปโหลดผลลัพธ์พร้อมกัน |
READY |
เสร็จสิ้น — ดาวน์โหลดผลลัพธ์ได้ |
FAILED |
งานล้มเหลว — ดูรายละเอียดใน failed_stage และ error |
การ poll: เรียกซ้ำทุก 1–3 วินาทีจนกว่า state จะเป็น READY หรือ FAILED ซึ่งเป็นสถานะสิ้นสุดทั้งคู่
ฟิลด์เพิ่มเติมเมื่อ state = READY
| ฟิลด์ |
ชนิด |
คำอธิบาย |
srt_url |
string (URL) |
ลิงก์ดาวน์โหลด result.srt — SubRip ธรรมดา มีป้ายชื่อผู้พูดนำหน้าเมื่อเปิด diarization (มีเสมอ) |
vtt_url |
string (URL) |
ลิงก์ดาวน์โหลด result.vtt — WebVTT บรรทัดเดียวกับ SRT ไม่มีข้อมูลซ่อนใด ๆ (มีเมื่อไฟล์นี้ถูกสร้าง) |
compact_url |
string (URL) |
ลิงก์ดาวน์โหลด result.compact.txt (ข้อความล้วน; มีเมื่อไฟล์นี้ถูกสร้าง) |
karaoke_vtt_url |
string (URL) |
ลิงก์ดาวน์โหลด result.karaoke.vtt — WebVTT ที่มี timestamp ระดับคำ <hh:mm:ss.ttt> แทรกหน้าคำถัดไปในแต่ละ cue สำหรับเรนเดอร์แบบคาราโอเกะ (มีเมื่อ forcealigner_level ไม่ใช่ none) |
words_url |
string (URL) |
ลิงก์ดาวน์โหลด result.words.json — ข้อมูลระดับคำสำหรับวิเคราะห์/ฝึกโมเดล: token ทุกตัวพร้อมเวลาเริ่ม-จบจาก ForceAligner, ขอบเขต chunk, บรรทัดดิบจาก LLM (เมื่อใช้ llmsplitting), cue สุดท้ายกับช่วง token, ผู้พูด, และค่า VAD ทั้งไฟล์ (มีเมื่อ forcealigner_level ไม่ใช่ none; รูปแบบดูที่ result.words.json) |
debug_vtt_url |
string (URL) |
ลิงก์ดาวน์โหลด result.debug.vtt — WebVTT สำหรับดีบัก: cue เดียวกับ SRT พร้อม timestamp ระดับคำ (เมื่อ forcealigner_level ไม่ใช่ none) ตามด้วยบล็อก NOTE loma-fastsrt-vad (ค่า VAD รายเฟรมของ cue) และ NOTE loma-fastsrt-embedding (speaker embedding เมื่อเปิด diarization) ไม่ใช่ซับสำหรับผู้ชม (สร้างให้ทุกงาน ขั้นตอนนี้ไม่ทำให้งานล้มเหลว มีเมื่ออัปโหลดสำเร็จ; รูปแบบดูที่ result.debug.vtt) |
ลิงก์ดาวน์โหลดเป็น presigned URL ที่มีอายุ 86 400 วินาที (24 ชั่วโมง) — หากลิงก์หมดอายุ ให้เรียก GET /status อีกครั้งเพื่อรับลิงก์ใหม่
ฟิลด์ *_url แต่ละตัวจะมีก็ต่อเมื่อไฟล์นั้นถูกสร้างจริง (srt_url มีเสมอ) — response ไม่มี object key ใด ๆ ใช้ลิงก์เท่านั้น
ฟิลด์เพิ่มเติมเมื่อ state = FAILED
| ฟิลด์ |
ชนิด |
คำอธิบาย |
failed_stage |
string | null |
ขั้นตอนที่ worker อยู่ตอนยอมแพ้ เช่น ALIGNING |
error |
string | null |
ข้อความข้อผิดพลาดจาก worker ตัดที่ 4000 ตัวอักษร |
ตัวอย่าง Response — งานกำลังประมวลผล
{
"job_id": "0b8a4f3e-6c1d-4a9b-9f2e-7d5c3b1a8e64",
"state": "TRANSCRIBING",
"source_url": "https://lomafastsrt.sgp1.cdn.digitaloceanspaces.com/cancer.mp3",
"audio_duration_seconds": null,
"started_at": "2026-07-10T09:15:24.102Z",
"config": { "language": "th", "srt_max_chars": 40, "srt_cue_words": 6, "speaker_diarization": false },
"s1_queued_ts": "2026-07-10T09:15:22.481Z",
"s2_splitting_ts": "2026-07-10T09:15:24.102Z",
"s3_transcribing_ts": "2026-07-10T09:15:41.877Z",
"s3a_pro_correcting_ts": null,
"s4_aligning_ts": null,
"s4a_llm_splitting_ts": null,
"s4b_forcedalign_2nd_ts": null,
"s5_preparing_srt_ts": null,
"s6_diarizing_ts": null,
"s7_building_srt_ts": null,
"s9_ready_ts": null
}
ตัวอย่าง Response — งานเสร็จสิ้น
{
"job_id": "0b8a4f3e-6c1d-4a9b-9f2e-7d5c3b1a8e64",
"state": "READY",
"source_url": "https://lomafastsrt.sgp1.cdn.digitaloceanspaces.com/cancer.mp3",
"audio_duration_seconds": 213.4,
"started_at": "2026-07-10T09:15:24.102Z",
"config": {
"forcealigner_level": "default",
"speaker_diarization": false,
"min_vad_duration_seconds": 10.0,
"max_vad_duration_seconds": 25.0,
"vad_threshold": 0.3,
"min_srt_duration_ms": 1200,
"srt_max_chars": 48,
"srt_cue_words": 6,
"language": "th"
},
"srt_url": "https://...presigned.../result.srt?X-Amz-Expires=...",
"vtt_url": "https://...presigned.../result.vtt?X-Amz-Expires=...",
"compact_url": "https://...presigned.../result.compact.txt?X-Amz-Expires=...",
"karaoke_vtt_url": "https://...presigned.../result.karaoke.vtt?X-Amz-Expires=...",
"words_url": "https://...presigned.../result.words.json?X-Amz-Expires=...",
"debug_vtt_url": "https://...presigned.../result.debug.vtt?X-Amz-Expires=...",
"s9_ready_ts": "2026-07-10T09:18:03.554Z"
}
ตัวอย่าง Response — งานล้มเหลว
{
"job_id": "0b8a4f3e-6c1d-4a9b-9f2e-7d5c3b1a8e64",
"state": "FAILED",
"failed_stage": "ALIGNING",
"error": "forcealigner request failed"
}
ข้อผิดพลาดที่อาจพบ
| สถานะ |
สาเหตุ |
ตัวอย่างข้อความ |
401 Unauthorized |
ไม่มีหรือ API key ไม่ถูกต้อง |
— |
404 Not Found |
ไม่พบ job_id ที่ระบุ, รูปแบบ id ไม่ถูกต้อง หรืองานถูกลบแล้ว (บัญชีฟรีที่ไม่เคยชำระเงินเก็บผลงาน 24 ชั่วโมงหลังสร้างงาน) |
"job not found" |