ขอ URL อัปโหลดไฟล์ — POST /presigned-url

มีไฟล์อยู่ในเครื่อง ไม่มี URL สาธารณะ? ใช้ endpoint นี้ขอ ลิงก์อัปโหลดชั่วคราว (presigned URL) ก่อน — ระบบจะตอบกลับ upload_url สำหรับ PUT ไฟล์ขึ้นไป และ source_url สำหรับนำไปใช้ส่งงานถอดเสียงได้ทันที

POST https://api.lomasub.ai/presigned-url

ขั้นตอนการใช้งานมี 3 จังหวะ: ขอลิงก์ → PUT ไฟล์ → ส่งงานด้วย source_url

Headers

Header ค่า จำเป็น
Authorization Bearer <API_KEY>
Content-Type application/json

Request Body

ทุกฟิลด์เป็นตัวเลือกเสริม (ส่ง {} เปล่าได้) แต่แนะนำให้ระบุทั้งคู่

ฟิลด์ ชนิด จำเป็น คำอธิบาย
filename string ชื่อไฟล์ต้นทาง — ระบบใช้เฉพาะนามสกุลไฟล์ต่อท้ายชื่อไฟล์สุ่มที่สร้างให้ เช่น .mp3
content_type string MIME type ของไฟล์ เช่น audio/mpeg — ค่าเริ่มต้นคือ application/octet-stream และต้องใช้ค่าเดียวกันนี้ตอน PUT ไฟล์

ตัวอย่าง Request

curl -X POST "https://api.lomasub.ai/presigned-url" \
  -H "Authorization: Bearer $LOMA_API_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "audio.mp3",
    "content_type": "audio/mpeg"
  }'

Response — 200 OK

{
  "method": "PUT",
  "upload_url": "https://...spaces.../tmpupload/aBcDeFgH1234.mp3?X-Amz-Signature=...",
  "headers": {
    "Content-Type": "audio/mpeg",
    "x-amz-acl": "public-read"
  },
  "object_key": "tmpupload/aBcDeFgH1234.mp3",
  "source_url": "https://...cdn.../tmpupload/aBcDeFgH1234.mp3",
  "expires_in_seconds": 86400
}
ฟิลด์ ชนิด คำอธิบาย
method string HTTP method ที่ต้องใช้อัปโหลด — เป็น PUT เสมอ
upload_url string (URL) ลิงก์อัปโหลดชั่วคราว ใช้ PUT ตัวไฟล์ขึ้นไปโดยตรง
headers object Headers ที่ต้องแนบตอน PUT ให้ครบทุกตัว (เช่น Content-Type, x-amz-acl) มิฉะนั้นลายเซ็นไม่ผ่านและถูกปฏิเสธ
object_key string ตำแหน่งไฟล์ในระบบจัดเก็บ เช่น tmpupload/<ชื่อสุ่ม><นามสกุล>
source_url string (URL) URL สาธารณะของไฟล์หลังอัปโหลด — นำไปใช้เป็น source_url ใน POST /new-transcribe
expires_in_seconds int อายุของ upload_url (ค่าเริ่มต้น 86400 วินาที = 24 ชั่วโมง)

ขั้นตอนที่ 2 — PUT ไฟล์ขึ้น upload_url

แนบ headers ทุกตัวจาก response แล้ว PUT ตัวไฟล์เป็น request body

curl -X PUT "<upload_url>" \
  -H "Content-Type: audio/mpeg" \
  -H "x-amz-acl: public-read" \
  --data-binary @audio.mp3

การ PUT ไปยัง upload_url ไม่ต้องใช้ Authorization header — สิทธิ์ฝังอยู่ในลายเซ็นของ URL แล้ว

ขั้นตอนที่ 3 — ส่งงานถอดเสียงด้วย source_url

curl -X POST "https://api.lomasub.ai/new-transcribe" \
  -H "Authorization: Bearer $LOMA_API_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "source_url": "<source_url จาก response>",
    "language": "th"
  }'

ตัวอย่างสคริปต์ Python แบบครบวงจร

อัปโหลดไฟล์ในเครื่องแล้วส่งงานถอดเสียงต่อทันที (ใช้เฉพาะ standard library)

import json
import os
import urllib.request

API_BASE = "https://api.lomasub.ai"
API_KEY = os.environ["LOMA_API_SECRET_KEY"]
LOCAL_FILE = "audio.mp3"

def call_api(path, payload):
    req = urllib.request.Request(
        f"{API_BASE}{path}",
        data=json.dumps(payload).encode(),
        method="POST",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
        },
    )
    with urllib.request.urlopen(req) as resp:
        return json.loads(resp.read())

# 1) ขอลิงก์อัปโหลด
signed = call_api("/presigned-url", {
    "filename": os.path.basename(LOCAL_FILE),
    "content_type": "audio/mpeg",
})

# 2) PUT ไฟล์ขึ้นไปพร้อม headers ที่กำหนด
with open(LOCAL_FILE, "rb") as f:
    put_req = urllib.request.Request(
        signed["upload_url"], data=f.read(), method="PUT",
        headers=signed["headers"],
    )
    urllib.request.urlopen(put_req)

# 3) ส่งงานถอดเสียงด้วย source_url ที่ได้
job = call_api("/new-transcribe", {
    "source_url": signed["source_url"],
    "language": "th",
})
print("job created:", job["job_id"])

เคล็ดลับ: ไฟล์วิดีโอหรือไฟล์เสียงขนาดใหญ่ ควรแปลงเป็น MP3 โมโน 16 kHz bitrate ต่ำ (เช่น 32 kbps) ก่อนอัปโหลด — คุณภาพการถอดเสียงไม่ต่างกัน แต่อัปโหลดเร็วขึ้นมาก เช่น ffmpeg -i video.mp4 -vn -ac 1 -ar 16000 -b:a 32k audio.mp3

ข้อผิดพลาดที่อาจพบ

สถานะ สาเหตุ
401 Unauthorized ไม่มีหรือ API key ไม่ถูกต้อง (ตอนเรียก /presigned-url)
403 Forbidden (ตอน PUT) แนบ headers ไม่ครบ/ไม่ตรงกับที่ระบบกำหนด หรือ upload_url หมดอายุ
422 Unprocessable Entity รูปแบบ body ไม่ถูกต้อง เช่น content_type เป็นสตริงว่าง

results matching ""

    No results matching ""