เลือกช่วงเวลาสำคัญ — 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"

results matching ""

    No results matching ""