นักพัฒนา

API แปลงเสียงเป็นข้อความ

ถอดเสียงไฟล์เสียงที่สมบูรณ์ผ่านงานในคิว พร้อมการประเมินค่าบริการฟรี การส่งแบบไม่สร้างงานซ้ำด้วยคีย์เดิม และการติดตามการใช้งานบนโฮสต์ API ทั้งสองแห่ง

ในหน้านี้
  1. เอนด์พอยต์
  2. เตรียมไฟล์เสียง
  3. ส่งงานถอดเสียง
  4. คีย์ป้องกันการทำซ้ำ
  5. ประเมินค่าใช้จ่ายโดยไม่สร้างงาน
  6. อ่านผลถอดเสียง
  7. การใช้ api.multitel.net

API นี้ถอดเสียงไฟล์เสียงที่สมบูรณ์เป็นงานในคิว ส่งไฟล์ เก็บ ID งานที่ได้รับ แล้วเรียกดูงานจนกว่าการประมวลผลจะเสร็จสิ้น ส่งทุกคำขอผ่าน HTTPS โดยใช้ข้อมูลรับรองของบัญชี ไม่ว่าจะเป็นข้อมูลรับรอง HTTP Basic ตามตัวอย่างหรือโทเค็น API ตามที่อธิบายไว้ใน การยืนยันตัวตน เก็บข้อมูลรับรองไว้บนเซิร์ฟเวอร์ของคุณ

เอนด์พอยต์

โฮสต์ API สองแห่ง ได้แก่ https://api.multi.tel และโฮสต์เพื่อความเข้ากันได้ https://api.multitel.net ใช้ชุดงาน คีย์ป้องกันการทำซ้ำ ขีดจำกัด และการเรียกเก็บเงินร่วมกันในบัญชีเดียวกัน แต่การเข้ารหัสอัปโหลดและรูปแบบครอบข้อมูลตอบกลับต่างกัน จึงควรใช้โฮสต์เดียวอย่างสม่ำเสมอกับตัวแยกวิเคราะห์ที่ตรงกัน

การดำเนินการเมธอดและพาธ
ข้อมูลบริการGET /v3/speech_to_text
ส่งงานPOST /v3/speech_to_text
ประเมินค่าใช้จ่ายโดยไม่สร้างงานPOST /v3/speech_to_text/estimate
อ่านงานGET /v3/speech_to_text/JOB_ID
ชำระเงินสำหรับงานที่รอการชำระPOST /v3/speech_to_text/JOB_ID/settle
การใช้งานGET /v3/speech_to_text/usage

บน api.multi.tel ทุกพาธยังใช้คำนำหน้า /v1/speech-to-text แทน /v3/speech_to_text ได้ เช่น POST /v1/speech-to-text/estimate ส่วนบน api.multitel.net ให้ใช้พาธ /v3/speech_to_text ตามเดิม

ข้อมูลตอบกลับเกี่ยวกับบริการรายงาน mode (batch), realtime (false), paidEnabled (ขณะนี้ยอมรับการส่งงานแบบเสียค่าบริการใหม่หรือไม่), pricePerMinuteUsd (0.005), billingUnit (audio_second), maxAudioSeconds (7200) และ maxUploadBytes (26214400) พร้อม description แบบสั้น การอ่านข้อมูลนี้ไม่มีค่าใช้จ่ายและยังทำได้แม้ปิดการส่งงานแบบเสียค่าบริการ โดยจะส่งคืน 503 transcription_unavailable เฉพาะเมื่อบริการทั้งหมดไม่พร้อมใช้งาน

เตรียมไฟล์เสียง

ใช้ไฟล์เสียงที่สมบูรณ์ ขนาดไม่เกิน 25 MiB (26,214,400 ไบต์) และความยาวไม่เกิน 2 ชั่วโมง (7,200 วินาที) ขณะส่ง ระบบต้องระบุได้ว่าไฟล์เป็นสื่อ MP3, WAV, Ogg, FLAC, MOV หรือ Matroska ที่มีสตรีมเสียง และระยะเวลาในเมทาดาทาต้องมากกว่าศูนย์และไม่เกิน 7,200 วินาที ไฟล์ที่ระบุรูปแบบได้แต่ไม่ผ่านการตรวจสอบเหล่านี้จะถูกปฏิเสธด้วย 422 unsupported_audio ส่วนไฟล์ที่ไม่สามารถอ่านเป็นรูปแบบใดข้างต้นได้ ปัจจุบันอาจถูกปฏิเสธด้วยข้อผิดพลาดเซิร์ฟเวอร์ (500) แทน อย่าส่งไฟล์ดังกล่าวซ้ำโดยไม่แก้ไข นามสกุลไฟล์เพียงอย่างเดียวไม่ยืนยันความเข้ากันได้

การผ่านการตรวจสอบเหล่านี้ไม่ได้รับประกันว่าจะถอดรหัสเสียงได้ ระบบประมวลผลเสียงแบบหนึ่งหรือสองแชนเนล ไฟล์ที่มีเสียงมากกว่าสองแชนเนล ไฟล์ที่เสียงหลังถอดรหัสยาวเกิน 2 ชั่วโมง หรือไฟล์อื่นที่ถอดรหัสไม่สำเร็จระหว่างประมวลผล จะจบเป็นงาน failed โดยทั่วไปมีรหัส decode_failed และไม่ถูกคิดค่าบริการ ให้แปลงเสียงหลายแชนเนลเป็นโมโนหรือสเตอริโอก่อนส่ง

คำใบ้ภาษาซึ่งไม่จำเป็นต้องระบุเป็นรหัสตัวพิมพ์เล็กสองหรือสามตัวอักษรสำหรับภาษาที่พูด เช่น en หากไม่ต้องการให้คำใบ้ ให้ละฟิลด์นี้ api.multi.tel ปฏิเสธสตริงว่าง คำใบ้ช่วยชี้แนวทางการประมวลผล แต่ไม่ได้ตรวจเทียบกับรายชื่อภาษาที่รองรับ จึงควรใช้รหัสที่ถูกต้องสำหรับภาษาที่พูด

ส่งงานถอดเสียง

ส่ง JSON โดยระบุ Content-Type: application/json ไปที่ POST https://api.multi.tel/v3/speech_to_text เนื้อหาคำขอมีขนาดได้สูงสุด 35 MiB ซึ่งรองรับไฟล์ขนาดสูงสุดหลังเข้ารหัส base64 เนื้อหาที่ใหญ่กว่านี้จะถูกปฏิเสธด้วย 413

ฟิลด์ความหมาย
audioBase64จำเป็น ไฟล์ทั้งหมดในรูปแบบ base64 มาตรฐาน (A–Z, a–z, 0–9, +, /) พร้อมตัวเติม = เมื่อจำเป็น อย่าเพิ่มคำนำหน้า data-URL การขึ้นบรรทัดใหม่ หรือช่องว่าง และอย่าใช้ชุดอักขระแบบปลอดภัยสำหรับ URL ค่าที่ถอดรหัสต้องมีขนาดตั้งแต่ 1 ไบต์ถึง 25 MiB และเมื่อเข้ารหัสใหม่ต้องได้ข้อความเดิมทุกประการ
languageคำใบ้ภาษาที่ไม่จำเป็นต้องระบุ ตามที่อธิบายข้างต้น

พร็อพเพอร์ตี JSON อื่นทั้งหมด รวมถึง idempotency_key จะถูกปฏิเสธด้วย 400 invalid_transcription_request ให้ส่งคีย์ในส่วนหัว

คีย์ป้องกันการทำซ้ำ

การส่งแต่ละครั้งต้องมีส่วนหัว Idempotency-Key ยาว 1 ถึง 190 อักขระ ใช้ตัวอักษร ASCII ตัวเลข -, _, . และ : โดยไม่มีช่องว่างนำหน้าหรือต่อท้าย โฮสต์เพื่อความเข้ากันได้จะตัดช่องว่างรอบนอกและวัดคีย์เป็นไบต์ ดังนั้นอักขระอื่นอาจถูกนับต่างกันในแต่ละโฮสต์ หากไม่มีคีย์ หรือคีย์ยาวตั้งแต่ 191 อักขระขึ้นไป จะถูกปฏิเสธด้วย 400

คีย์มีขอบเขตครอบคลุมบัญชีของคุณและบริการแปลงเสียงเป็นข้อความ บนทั้งสองโฮสต์และข้อมูลรับรองทั้งหมดของบัญชี เมื่อส่งคีย์เดิมพร้อมไฟล์และภาษาเดิม จะส่งคืนงานที่มีอยู่พร้อม HTTP 200 และ duplicate: true ไม่ว่างานมีสถานะใด และแม้มีการอัปเดตการประมวลผลหลังสร้างงาน ก็จะไม่คิดค่าบริการซ้ำ การใช้คีย์เดิมกับไฟล์หรือภาษาอื่นจะส่งคืน 409 idempotency_conflict คีย์ใหม่จะสร้างงานใหม่แม้ไฟล์เหมือนกันทุกประการ และคิดค่าบริการแยกหากประมวลผลเสร็จสมบูรณ์

API_USER="your-api-username"
API_PASSWORD="your-api-password"

node -e 'process.stdout.write(JSON.stringify({audioBase64:require("node:fs").readFileSync("completed-call.mp3").toString("base64"),language:"en"}))' > completed-call.json

curl --fail-with-body --silent --show-error --user "$API_USER:$API_PASSWORD" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: speech-call-001" \
  --data-binary @completed-call.json \
  -o speech-job.json \
  https://api.multi.tel/v3/speech_to_text

node -p 'JSON.parse(require("node:fs").readFileSync("speech-job.json","utf8")).data.id'

งานใหม่ส่งคืน HTTP 202 พร้อมฟิลด์ด้านล่าง ส่วนการส่งคำขอเดิมซ้ำส่งคืน HTTP 200 พร้อมอ็อบเจ็กต์งานทั้งหมดตามที่อธิบายใน อ่านผลถอดเสียง ให้อ่าน ID งานซึ่งเป็น UUID จาก data.id ข้อมูลตอบกลับของงานใหม่มีรูปแบบดังนี้ (ตัวระบุและค่าเป็นเพียงตัวอย่าง):

{
  "status": "success",
  "data": {
    "id": "3f6c1b2e-8a4d-4e7f-9c21-5b0d7e4a9f13",
    "status": "queued",
    "mode": "batch",
    "realtime": false,
    "source": "api",
    "durationSeconds": 90.5,
    "billedSeconds": 91,
    "costUsd": "0.007583334",
    "pricePerMinuteUsd": "0.005"
  }
}

ขณะงานอยู่ในคิวหรือกำลังทำงาน durationSeconds, billedSeconds และ costUsd เป็นค่าประมาณจากเมทาดาทาของไฟล์ ค่าบริการสุดท้ายใช้ระยะเวลาหลังถอดรหัส

การส่งอาจส่งคืน 402 insufficient_balance เมื่อยอดเงินเติมไว้ไม่พอสำหรับงานนี้รวมกับงานอื่นที่ยังค้างอยู่, 429 transcription_queue_full เมื่อบัญชีหรือบริการมีงานค้างมากเกินไป, 429 audio_validation_busy เมื่อการตรวจสอบไฟล์ใช้กำลังประมวลผลเต็มแล้ว และ 503 paid_transcription_not_enabled เมื่อปิดการถอดเสียงแบบเสียค่าบริการ ให้ลองใหม่ภายหลังด้วยคีย์เดิมเมื่อได้รับ 429 หรือ 503

ประเมินค่าใช้จ่ายโดยไม่สร้างงาน

ส่งเนื้อหา JSON เดิมไปที่ POST https://api.multi.tel/v3/speech_to_text/estimate ไม่ต้องมีคีย์ป้องกันการทำซ้ำ การประเมินจะตรวจสอบและวัดไฟล์ แต่ไม่ถอดเสียง ไม่สร้างงาน ไม่กันเงิน ไม่ตรวจยอดเงิน และไม่คิดค่าบริการบัญชี ยอมรับคำใบ้ language แต่ไม่มีผลต่อการประเมิน

การประเมินสำเร็จส่งคืน HTTP 200 พร้อม estimate: true, charged: false, mode, realtime, durationSeconds, billedSeconds, pricePerMinuteUsd และ costUsd ภายใต้ data โดยใช้ระยะเวลาในเมทาดาทาของไฟล์ ขณะที่งานที่เสร็จแล้วคิดค่าบริการตามระยะเวลาหลังถอดรหัส ซึ่งอาจต่างกัน การประเมินใช้การตรวจสอบไฟล์แบบเดียวกับการส่งงาน และใช้ได้เฉพาะเมื่อเปิดการถอดเสียงแบบเสียค่าบริการ (มิฉะนั้นส่งคืน 503 paid_transcription_not_enabled) อาจส่งคืน 429 audio_validation_busy เมื่อการตรวจสอบไฟล์ใช้กำลังประมวลผลเต็ม ให้รอสักครู่แล้วลองใหม่

อ่านผลถอดเสียง

สอบถามซ้ำที่ GET /v3/speech_to_text/JOB_ID ตามที่อธิบายใน คู่มือขั้นตอนการทำงานของงาน อ็อบเจ็กต์งานมีฟิลด์ต่อไปนี้:

ฟิลด์ความหมาย
idUUID ของงาน
statusqueued, running, completed, failed หรือ awaiting_payment.
progressเปอร์เซ็นต์ตั้งแต่ 0 ถึง 99 ขณะทำงาน หากมี; 100 เมื่อเสร็จแล้ว; กรณีอื่นเป็น null.
durationSeconds, billedSecondsระยะเวลาเสียงและจำนวนวินาทีเต็มที่คิดค่าบริการ เป็นค่าประมาณจากเมทาดาทาขณะงานอยู่ในคิวหรือกำลังทำงาน และใช้ระยะเวลาหลังถอดรหัสเมื่องานเสร็จหรือรอการชำระเงิน
costUsd, costIsEstimateค่าใช้จ่ายเป็นดอลลาร์สหรัฐ ในรูปสตริงเลขฐานสิบที่มีทศนิยมเก้าตำแหน่ง costIsEstimate เป็น true ขณะงานอยู่ในคิวหรือกำลังทำงาน งานที่ล้มเหลวไม่ถูกคิดค่าบริการ แม้ costUsd ยังแสดงค่าประมาณอยู่
pricePerMinuteUsd0.005 สำหรับงาน API และ 0.000 สำหรับงานบันทึกเสียง Hosted PBX ที่ไม่มีค่าใช้จ่าย
failureCodeสำหรับงานที่ล้มเหลว: decode_failed (ถอดรหัสเสียงไม่ได้ เช่น มีมากกว่าสองแชนเนล หรือยาวเกิน 2 ชั่วโมงหลังถอดรหัส), inference_timeout (ใช้เวลาประมวลผลนานเกินไป), service_error หรือ worker_lease_lost (การประมวลผลถูกขัดจังหวะ) นอกจากนี้ยังมีการกำหนดรหัส unsupported_audio และ quality_check_failed ไว้ด้วย งานที่รอการชำระเงินจะแสดง insufficient_balance ซึ่งอาจยังคงอยู่หลังชำระเงินแล้ว
source, modelVersion, createdAtsource เป็น api สำหรับการส่งผ่าน API หรือ hpbx สำหรับงานบันทึกเสียง Hosted PBX ของบัญชีคุณ modelVersion เป็นสตริงเวอร์ชันการประมวลผลที่ไม่ควรตีความเนื้อหา createdAt คือเวลาที่ส่งงาน
duplicatetrue ในข้อมูลตอบกลับที่คืนงานที่มีอยู่
resultมีเฉพาะเมื่อ status เป็น completed.
ฟิลด์ผลลัพธ์ความหมาย
textผลถอดเสียงทั้งหมด: ข้อความทุกช่วงเรียงตามลำดับช่วงและเชื่อมด้วยการขึ้นบรรทัดใหม่
segmentsอาร์เรย์ของช่วงที่เรียงตามเวลาเริ่มต้น แต่ละช่วงครอบคลุมส่วนหนึ่งของเสียงยาวไม่เกินประมาณ 29 วินาที ค่า start และ end (วินาทีจากจุดเริ่มต้นของเสียง) ระบุส่วนนั้น ไม่ใช่คำหรือประโยคแต่ละรายการ และส่วนที่ต่อเนื่องกันอาจซ้อนทับได้ถึง 1 วินาที แต่ละช่วงยังมี text และ language (รหัสภาษา ซึ่งอาจว่างได้) รวมถึง channel สำหรับผลลัพธ์สองแชนเนล
channelCount1 หรือ 2 มีในผลลัพธ์ปัจจุบัน ผลลัพธ์เก่าอาจไม่มี
audioDurationMsระยะเวลาหลังถอดรหัสเป็นมิลลิวินาที การคิดค่าบริการปัดขึ้นเป็นวินาทีเต็ม
qualityFlagsว่าง หรือมี review_recommended พร้อม repetition_detected (วลีซ้ำบ่อยผิดปกติภายในส่วนหนึ่ง), no_speech (ไม่มีเสียงพูดที่ถอดเป็นข้อความ) หรือทั้งสองอย่าง
pipelineVersionอาจมี ตัวระบุการประมวลผลที่ไม่ควรตีความเนื้อหา

ผลถอดเสียง เวลาอ้างอิง ป้ายภาษา และป้ายแชนเนลสร้างขึ้นโดยอัตโนมัติ และไม่รับประกันความถูกต้อง หากมีธงคุณภาพใด ให้ตรวจทานผลลัพธ์ และเทียบชื่อ ตัวเลข และข้อผูกพันสำคัญกับเสียงต้นฉบับ ระบบข้ามช่วงเงียบยาวและช่วงที่เสียงเบามากโดยไม่สร้างช่วงข้อความ ผลลัพธ์ไม่ระบุผู้พูดแต่ละคน เมื่อผลลัพธ์รายงาน channelCount เป็น 2 ทุกช่วงจะมี channel เป็น A (แชนเนลแรกหรือแชนเนลซ้าย) หรือ B (แชนเนลที่สองหรือแชนเนลขวา) ซึ่งแยกผู้พูดได้เฉพาะเมื่อแต่ละคนถูกบันทึกในคนละแชนเนล เสียงสองแชนเนลคิดค่าบริการครั้งเดียวตามระยะเวลาที่ผ่านไป ไม่ใช่ต่อแชนเนล ผลลัพธ์โมโนไม่มีป้ายแชนเนล

การใช้ api.multitel.net

เอนด์พอยต์เพื่อความเข้ากันได้ POST https://api.multitel.net/v3/speech_to_text ยอมรับ multipart/form-data ที่มีส่วนไฟล์ audio และฟิลด์ language ซึ่งไม่จำเป็นต้องระบุ แทน JSON audioBase64 ค่า language ที่ว่างถือว่าไม่มีคำใบ้ ให้ส่งส่วนหัว Idempotency-Key เดิม หากไม่มีส่วนหัว โฮสต์นี้ยังยอมรับฟิลด์ฟอร์ม idempotency_key ด้วย ฟิลด์ที่ชื่อ source, free, billing_source, realtime หรือ stream ถูกปฏิเสธด้วย 400 unsupported_transcription_option ส่วนฟิลด์ฟอร์มอื่นจะถูกละเลย โฮสต์นี้ยังส่งคืนข้อผิดพลาดต่อไปนี้:

  • 400 idempotency_key_required เมื่อไม่มีคีย์หรือคีย์ยาวเกินไป
  • 400 audio_upload_required เมื่อไม่มีไฟล์อัปโหลด หรือรับไฟล์ไม่ครบ
  • 400 invalid_language เมื่อภาษาไม่ถูกต้อง
  • 413 invalid_audio_size เมื่อไฟล์ว่างหรือใหญ่เกินไป
  • 400 invalid_job เมื่อ ID งานมีรูปแบบไม่ถูกต้อง

ข้อมูลตอบกลับจากบริการแปลงเสียงเป็นข้อความของโฮสต์นี้ใช้รูปแบบครอบข้อมูล {"status":{"code":HTTP_STATUS},"response":{...}} โปรดสังเกตว่า status เป็นอ็อบเจ็กต์ ไม่ใช่สตริง เมื่อสำเร็จ response มีอ็อบเจ็กต์เดียวกับ data บนโฮสต์หลัก ดังนั้น ID งานคือ response.id เมื่อเกิดข้อผิดพลาด response.code มีรหัสข้อผิดพลาด โดยไม่มีข้อความหรือ ID คำขอ ความล้มเหลวในการยืนยันตัวตน (401) มาจากการตรวจเข้าสู่ระบบทั่วไปของโฮสต์ และอาจมีเนื้อหาต่างกัน จึงควรตรวจสถานะ HTTP ก่อนแยกวิเคราะห์ อย่าสลับการเข้ารหัสอัปโหลดหรือตัวแยกวิเคราะห์ข้อมูลตอบกลับระหว่างโฮสต์

หากต้องการประเมินบนโฮสต์นี้ ให้ POST ฟิลด์ multipart เดิมไปที่ /v3/speech_to_text/estimate ไม่ต้องมีคีย์ป้องกันการทำซ้ำ และผลประเมินอยู่ภายใต้ response.

API_USER="your-api-username"
API_PASSWORD="your-api-password"

curl --fail-with-body --silent --show-error --user "$API_USER:$API_PASSWORD" \
  -H "Idempotency-Key: speech-call-001" \
  -F "audio=@completed-call.mp3" -F "language=en" \
  -o speech-job.json \
  https://api.multitel.net/v3/speech_to_text

node -p 'JSON.parse(require("node:fs").readFileSync("speech-job.json","utf8")).response.id'