เลือกช่วงเวลาสำคัญ — POST /short-topics
อัปโหลดไฟล์คำบรรยายของงานที่ถอดเสียงเสร็จแล้ว (result.karaoke.vtt หรือไฟล์ .srt ธรรมดา) ระบบจะส่งเนื้อหาไปให้ LLM คัดเลือก ช่วงเวลาสำคัญ 6 ช่วง ความยาวช่วงละ 30-50 วินาที กระจายครอบคลุมเนื้อหาสำคัญตั้งแต่ต้นจนจบ โดยแต่ละช่วงเริ่มที่ต้นประโยคและจบเมื่อประโยคจบ ไม่ตัดกลางใจความ พร้อมตั้งชื่อ topic ให้แต่ละช่วง เหมาะกับการนำไปตัดคลิปสั้น
POST https://api.lomasub.ai/short-topics
นี่คือ endpoint ฝั่ง client เพียงตัวเดียวที่ช้า: แต่ละคำขอใช้เวลา ประมาณ 20-45 วินาที เพราะต้องรอ LLM ประมวลผล — ตั้งค่า timeout ฝั่ง client ให้นานพอ (อย่างน้อย 5 นาที)
Headers
| Header | ค่า | จำเป็น |
|---|---|---|
Authorization |
Bearer <API_KEY> — เป็น API key ตัวเดียวกับ endpoint อื่น |
ต้องระบุ |
Content-Type |
multipart/form-data — curl และ browser ตั้งให้อัตโนมัติ |
ต้องระบุ |
Request Body
ส่งเป็น multipart/form-data มีฟิลด์เดียว
| ฟิลด์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
file |
file | ต้องระบุ | ไฟล์ result.karaoke.vtt หรือ .srt — ดาวน์โหลดได้จาก karaoke_vtt_url / srt_url ที่ได้จาก ตรวจสอบสถานะงาน เมื่องานอยู่สถานะ READY |
ระบบตรวจรูปแบบไฟล์จากบรรทัดแรก: ขึ้นต้นด้วย WEBVTT จะอ่านแบบ WebVTT (พร้อมตัด timestamp ระดับคำ <hh:mm:ss.ttt> ออก) นอกนั้นอ่านแบบ SRT
ขนาดไฟล์สูงสุด 8 MB และเนื้อหาที่แปลงแล้วต้องไม่เกิน 400,000 ตัวอักษร (ประมาณ 4 ชั่วโมงของเสียง)
ตัวอย่าง Request
curl -X POST "https://api.lomasub.ai/short-topics" \
-H "Authorization: Bearer $LOMA_API_SECRET_KEY" \
-F "file=@result.karaoke.vtt" \
--max-time 300
Response — 200 OK
{
"topics": [
{
"topic": "แนวทางการตรวจประเมินผื่น Maculopapular rash โดยแยกตำแหน่งรอยโรคและอาการไข้ร่วมด้วย",
"start": "00:00:15.872",
"end": "00:00:43.728"
},
{
"topic": "ลักษณะการลุกลามของผื่นจากศีรษะลงสู่ขาและรอยโรคจุดขาวในปากของโรคหัด",
"start": "00:02:29.328",
"end": "00:03:00.320"
}
]
}
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
topics |
array | รายการช่วงเวลา สูงสุด 6 ช่วง เรียงตามเวลาเริ่มจากน้อยไปมาก |
topics[].topic |
string | ชื่อหัวข้อภาษาไทย ความยาวประมาณ 10-20 คำ |
topics[].start |
string | เวลาเริ่ม — HH:MM:SS.mmm หรือ HH:MM:SS (ดูหัวข้อความละเอียดด้านล่าง) |
topics[].end |
string | เวลาจบ — รูปแบบเดียวกับ start |
ความละเอียดของเวลาและการ snap ขอบ cue
เวลาที่คืนกลับมา ไม่ได้มาจาก LLM โดยตรง — ระบบจะ snap ค่าที่ LLM เลือกไปยังขอบของ cue จริงในไฟล์ที่อัปโหลดที่ใกล้ที่สุด (ภายใน 2 วินาที) โดย start snap ไปหาเวลาเริ่มของ cue และ end snap ไปหาเวลาจบของ cue ทำให้
- มิลลิวินาทีเป็นค่าจริงจากไฟล์ ไม่ใช่ตัวเลขที่ LLM เดาขึ้นมา
- ทุกช่วงตัดตรงขอบประโยคพอดี ไม่ตัดกลางคำ
ความละเอียดขึ้นกับไฟล์ต้นทาง: ถ้ามี timestamp ใดในไฟล์ที่มีเศษมิลลิวินาทีไม่เป็นศูนย์ ระบบจะคืนค่าเป็น HH:MM:SS.mmm แต่ถ้าทุก timestamp เป็นวินาทีถ้วนทั้งไฟล์ จะคืนเป็น HH:MM:SS
| ไฟล์ต้นทาง | ตัวอย่าง timestamp | ผลลัพธ์ |
|---|---|---|
result.karaoke.vtt |
00:08:39.012 |
00:08:39.012 |
result.srt |
00:00:00,128 |
00:00:00.128 |
.srt ที่เป็นวินาทีถ้วน |
00:00:10,000 |
00:00:10 |
ไฟล์ยาวถูกแบ่งวิเคราะห์ขนานกัน: ไฟล์ที่มีไม่เกิน 99 cue ส่งให้ LLM ครั้งเดียว (6 ช่วง) ไฟล์ที่มี 100-300 cue แบ่งเป็น 2 ส่วน (ส่วนละ 3 ช่วง) และไฟล์ที่มีมากกว่า 300 cue แบ่งเป็น 3 ส่วน (ส่วนละ 2 ช่วง) แต่ละส่วนต่อเนื่องกันและไม่ซ้อนทับกัน ทุกส่วนถูกส่งพร้อมกันแล้วรวมผลฝั่งเซิร์ฟเวอร์ตามลำดับเวลา จำนวนช่วงที่ได้คือผลรวมของทุกส่วน (6 ช่วงสำหรับไฟล์ที่มีตั้งแต่ 100 cue ขึ้นไป) และกระจายตามความยาวไฟล์โดยอัตโนมัติ ถ้าส่วนใดส่วนหนึ่งล้มเหลว คำขอทั้งหมดจะตอบเป็นข้อผิดพลาด ไม่คืนผลบางส่วน
หมายเหตุ: ระบบจำกัดจำนวนช่วงไว้ไม่เกิน 6 ช่วงฝั่งเซิร์ฟเวอร์ (ถ้า LLM ตอบมากกว่านั้นจะคัดให้กระจายทั่วไฟล์ โดยเก็บช่วงแรกและช่วงสุดท้ายไว้) ส่วนไฟล์ที่สั้นมากอาจได้น้อยกว่า 6 ช่วง ความยาวของแต่ละช่วงเป็นเป้าหมายที่ขอจาก LLM (30-50 วินาที) — โดยทั่วไปจะได้ตามนั้น แต่บางช่วงอาจสั้นหรือยาวกว่าเล็กน้อย ระบบรับประกันเพียงว่า start < end และทั้งคู่ไม่เกินความยาวของไฟล์
ข้อผิดพลาดที่อาจพบ
| สถานะ | สาเหตุ | ตัวอย่างข้อความ |
|---|---|---|
401 Unauthorized |
ไม่มีหรือ API key ไม่ถูกต้อง | — |
413 Payload Too Large |
ไฟล์ใหญ่เกิน 8 MB | "subtitle upload is too large" |
422 Unprocessable Entity |
ไม่มีฟิลด์ file ใน multipart body |
ตอบเป็น list ตามรูปแบบ FastAPI |
422 Unprocessable Entity |
ไฟล์ไม่ใช่ WebVTT/SRT, ไม่ใช่ UTF-8, ไม่มี cue หรือเนื้อหายาวเกินกำหนด | "file must be a webvtt or srt transcript" |
429 Too Many Requests |
มีคำขอกำลังประมวลผลอยู่เต็มจำนวน (มากกว่า 4 คำขอพร้อมกัน) หรือ LLM จำกัดอัตราการเรียก — header Retry-After: 30 |
"short-topics is busy, retry later" |
502 Bad Gateway |
เรียก LLM ไม่สำเร็จ หรือ LLM ตอบกลับในรูปแบบที่ใช้ไม่ได้ | "llm returned no usable topics" |
503 Service Unavailable |
ระบบยังไม่ได้ตั้งค่า OPENROUTER_API_KEY |
"short-topics is not configured" |
504 Gateway Timeout |
LLM ใช้เวลานานเกินกำหนด | "llm request timed out" |