Paxa Labs

บทสนทนาหลายผู้พูด

POST /v1/tts/dialogue พูดได้สูงสุด 100 บรรทัด แต่ละบรรทัดใช้เสียงของตัวเอง ออกมาเป็นไฟล์เสียงเดียวพร้อมช่วงเงียบระหว่างบรรทัด คิดค่าบริการครั้งเดียวทั้งสคริปต์ และเมื่อล้มเหลวจะคิดเฉพาะบรรทัดที่ส่งครบแล้ว

ดูเป็น Markdown

ส่งบรรทัดของบทสนทนาไปที่ POST /v1/tts/dialogue โดยกำหนดเสียงให้แต่ละบรรทัด แล้วรับไฟล์เสียงเดียวของบทสนทนาทั้งหมด แต่ละบรรทัดใช้กฎข้อความเดียวกับ POST /v1/tts และใช้แท็กที่เสียงนั้นอ่านได้ โดยไม่มีเพดานความยาวของตัวเอง คำขอหนึ่งมีได้สูงสุด 100 บรรทัด รวมกันไม่เกิน 20,000 ตัวอักษร

curl -X POST https://api.paxalabs.com/v1/tts/dialogue \
  -H "Authorization: Bearer $PAXA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "paxa-tts-flash-v2",
  "lines": [
    {
      "text": "สวัสดีครับ ยินดีต้อนรับสู่ Paxa Labs",
      "voice": "khanomkrok"
    },
    {
      "text": "สวัสดีค่ะ วันนี้ให้ช่วยเรื่องอะไรดีคะ",
      "voice": "nomyen"
    }
  ]
}' \
  --output dialogue.ndjson

อ่านสตรีม#

คำตอบสตรีมเป็น NDJSON เสมอ อีเวนต์ chunk แต่ละตัวระบุ line และมีเสียงแบบ base64 เมื่อถอดรหัสทุก chunk ตามลำดับที่มาถึงจะได้ไฟล์เดียวใน format ที่ขอ บรรทัดต่าง ๆ สังเคราะห์พร้อมกันและส่งตามลำดับ จึงเริ่มเล่นได้ตั้งแต่ chunk แรก อีเวนต์ done ตัวสุดท้ายบอก start และ end ของแต่ละบรรทัดเป็นวินาที สำหรับทำคำบรรยายหรือแถบเลื่อนเวลา

NDJSON stream
{"type":"chunk","line":0,"audio":"//NkxAAaOAAAAAABLBQAAAAAAABVVVVV..."}
{"type":"chunk","line":1,"audio":"//NkxAAaOAAAAAABLBQAAAAAAABVVVVV..."}
{"type":"done","lines":[{"start":0,"end":2.35},{"start":2.65,"end":4.9}]}

บทสนทนาแบบ WAV เปิดด้วยเฮดเดอร์เดียวที่ช่องขนาดเป็น 0xFFFFFFFF เพราะรู้ความยาวได้เมื่อจบเท่านั้น เครื่องเล่นจะอ่านไฟล์แบบนี้จนจบไฟล์

ช่วงเงียบระหว่างบรรทัด#

gap_ms กำหนดความเงียบระหว่างบรรทัดหนึ่งกับบรรทัดถัดไป ตั้งแต่ 0 ถึง 5,000 ms ค่าเริ่มต้น 300 ms และไม่เปลี่ยนค่าบริการ Opus ปัดช่วงเงียบเป็นทีละ 20 ms และ MP3 ปัดเป็นทีละหนึ่งเฟรม หากต้องการหยุดกลางบรรทัด ให้ใช้แท็กหยุด

ค่าบริการและความล้มเหลว#

  • คิดค่าบริการครั้งเดียวทั้งคำขอ จากตัวอักษรของทุกบรรทัดรวมกันตามอัตราของโมเดล โดยมีขั้นต่ำ 0.1 เครดิตครั้งเดียว บรรทัดที่ใช้เสียงที่ออกแบบเองคิดตามอัตราของเสียงนั้น และ timestamps มีผลกับทุกบรรทัด
  • ทุกบรรทัดถูกตรวจก่อนคิดค่าบริการ เนื้อหาปัญหาของคำขอที่ถูกปฏิเสธมี line คือลำดับของบรรทัดที่ผิด เช่น 400 tag_invalid จะบอกว่าต้องแก้บรรทัดไหน
  • ความล้มเหลวหลังคิดค่าบริการแต่ก่อนส่งเสียงใดๆ จะตอบปัญหาที่เนื้อหามี line และคืนค่าบริการทั้งหมด
  • ความล้มเหลวหลังเริ่มส่งเสียงแล้วจะจบสตรีมด้วยอีเวนต์ error ซึ่ง lines ระบุบรรทัดที่ส่งครบแล้ว คือ chunk ที่ line น้อยกว่าจำนวนนั้น และ credits คือค่าบริการของบรรทัดเหล่านั้นเมื่อคิดเป็นบทสนทนาของตัวเอง คำขอจะคิดค่าบริการเพียงเท่านั้นและคืนส่วนที่เหลือ ส่วนสตรีมที่อ่านช้ากว่าที่ระบบสร้างเสียงอาจใช้เวลาเกินงบเวลาของคำขอ สตรีมจะจบโดยไม่มีอีเวนต์ done และยังคิดค่าบริการ เหมือนกรณีที่ไคลเอนต์ตัดการเชื่อมต่อเอง
  • บทสนทนาหนึ่งนับเป็นหนึ่งคำขอในหน้าต่างอัตรา และถือหนึ่งช่องคำขอพร้อมกันฝั่งเสียงพูดระหว่างทำงาน Idempotency-Key ทำงานเหมือนใน POST /v1/tts