Paxa Labs

นิยายโต้ตอบและวิชวลโนเวลภาษาไทย

ทำเสียงให้นิยายแบบแตกกิ่งภาษาไทย ทั้งนิยายแชท วิชวลโนเวล และเกมที่ผู้อ่านเลือกทางเดินเอง จะเรนเดอร์ทั้งต้นไม้ไว้ล่วงหน้า หรือพูดสดตามเส้นทางที่ผู้อ่านเลือกก็ได้

ไอเดียให้ลองเล่น

ถึงจุดที่ต้องเลือก

จะเดินเข้าไปถามเขาตรง ๆ หรือจะรอดูเงียบ ๆ อยู่ตรงนี้ก่อนดี

เส้นทางที่ผู้อ่านเลือก

เธอเลือกจะเดินเข้าไป และนั่นคือจุดที่ทุกอย่างเปลี่ยนไปตลอดกาล

บรรทัดในรูปแบบแชท

ไม่ต้องมาทำเป็นห่วงตอนนี้หรอก ตอนที่ฉันต้องการเธอ เธออยู่ไหน

เส้นทางที่ผู้อ่านพลาดไป

ถ้าวันนั้นเธอเลือกอีกทาง เรื่องทั้งหมดนี้คงไม่มีวันเกิดขึ้นเลย

ทุกการ์ดเล่นคลิปจริงที่สร้างจากสคริปต์นั้น ๆ ด้วยเสียงนมเย็น เปิดในหน้าเสียงพูดเพื่อให้พูดข้อความของคุณเองได้

บทแบบแตกกิ่งกลายเป็นเสียงได้อย่างไร

นิยายแบบแตกกิ่งเป็นงานเขียนประเภทเดียว ที่ยังไม่รู้ว่าบรรทัดถัดไปคืออะไรจนกว่าผู้อ่านจะลงมือเลือก จอยลดาเผยแพร่นิยายไทยในรูปแบบแชทที่อ่านทีละข้อความ ส่วนวิชวลโนเวลที่สร้างบนเอนจินอย่าง Ren'Py เขียนบทพูดบรรทัดละหนึ่งผู้พูดและมีจุดให้เลือกคั่นระหว่างฉาก ทั้งสองรูปแบบทิ้งคำถามเดียวกันไว้ให้สตูดิโอ ถ้าเรนเดอร์ทั้งต้นไม้ไว้ล่วงหน้า ทุกกิ่งจะกลายเป็นไฟล์ที่พร้อมอยู่ก่อนใครจะเปิดแอป และจ่ายไปแล้วไม่ว่าจะมีผู้อ่านเดินไปทางนั้นหรือไม่ ถ้าพูดสดตอนเล่น ผู้อ่านจะจ่ายตามเส้นทางที่เดินจริงเท่านั้น แลกกับการเปิดการเชื่อมต่อค้างไว้ตลอดที่อ่านอยู่ แบบไหนถูกกว่าขึ้นอยู่กับว่าผู้อ่านทั่วไปเห็นต้นไม้นั้นมากแค่ไหน และตารางข้างล่างใส่ตัวเลขจริงลงไปให้แล้ว

ที่มา:Joylada(เปิดในแท็บใหม่)Ren'Py(เปิดในแท็บใหม่)

  1. แผ่ต้นไม้ออกเป็นช่วงคำพูด

    ทุกโหนดกลายเป็นช่วงคำพูดที่มีผู้พูดและรหัสเสียงกำกับ ช่วงที่ยาวไม่เกิน 5,000 ตัวอักษรใช้คำขอเดียว ที่ยาวกว่านั้นแบ่งตรงรอยต่อประโยค

  2. เลือกเรนเดอร์ล่วงหน้าหรือพูดสด เป็นรายฉาก

    บทเปิดที่ผู้อ่านทุกคนต้องผ่านคุ้มที่จะเรนเดอร์ไว้ครั้งเดียว ส่วนกิ่งที่แทบไม่มีใครเดินไปคุ้มกว่าที่จะพูดสด ตัดสินใจแยกรายฉากได้ และเปลี่ยนใจหลังเปิดตัวได้โดยไม่ต้องแก้สคริปต์

  3. เก็บสิ่งที่ผู้อ่านเคยได้ยินไว้

    บรรทัดที่พูดสดออกมาก็เป็นไฟล์ MP3 ธรรมดา การเก็บไว้ทำให้เส้นทางที่เล่นซ้ำกลายเป็นการอ่านจากแคช และการย้อนอ่านเส้นทางเดิมไม่มีค่าใช้จ่ายในรอบที่สอง

เรนเดอร์ทั้งต้นไม้ หรือพูดเฉพาะเส้นทาง

เรนเดอร์ทั้งต้นไม้ หรือพูดเฉพาะเส้นทาง
วิธีส่งเสียงตัวอักษรเครดิตค่าใช้จ่าย
เส้นทางของผู้อ่านหนึ่งคน 120 บรรทัด10,800108$0.11
ผู้อ่าน 10,000 คน พูดสดตอนเล่น108,000,0001,080,000$1,080
ทั้งต้นไม้ ทำเสียงครั้งเดียว ใช้ได้กับผู้อ่านทุกคนที่จะมีต่อจากนี้ประมาณ $1.44

คำนวณที่ 10 เครดิตต่อ 1,000 ตัวอักษร จากบรรทัดยาว 90 ตัวอักษร การเรนเดอร์ล่วงหน้าจ่ายครั้งเดียวสำหรับผู้อ่านทั้งหมด ส่วนการพูดสดจ่ายต่อผู้อ่านหนึ่งคน จุดคุ้มทุนจึงอยู่ราว ๆ ผู้อ่าน 13 คน

หนึ่งบท สี่ตอนจบ

chapter-07.tree
scene_07a  ณิชา     nomyen       96 chars
scene_07a  ธาวิน    massaman     82 chars
  choice_1 -> scene_07b
  choice_2 -> scene_07c

scene_07b  ณิชา     nomyen       88 chars    [pre-rendered]
scene_07c  ณิชา     nomyen       94 chars    [pre-rendered]
scene_07c  คุณยาย   miangkham    90 chars    [pre-rendered]

# 4 กิ่ง x ~400 บรรทัด = ต้นไม้ทั้งต้นด้านบน
# ผู้อ่านหนึ่งคนได้ยินราว 120 บรรทัด

ต้นไม้คือหน่วยที่สตูดิโอตั้งงบ ส่วนเส้นทางคือหน่วยที่ผู้อ่านได้ยิน ทั้งสองแบบใช้รหัสเสียงหนึ่งตัวต่อหนึ่งผู้พูดเหมือนกัน

จากวันเปิดตัวจนเข้าที่

เปิดตัว

เรนเดอร์บทเปิดไว้ก่อน

ผู้อ่านทุกคนต้องผ่านบทเปิด จึงทำเสียงไว้ครั้งเดียวแล้วเสิร์ฟเป็นไฟล์ ไม่มีอะไรในส่วนนี้ต้องตัดสินใจตอนเล่น

สัปดาห์ที่ 1

กิ่งที่คนไปน้อยใช้พูดสด

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

เดือนที่ 3

เส้นทางยอดนิยมอยู่ในแคชแล้ว

บรรทัดที่พูดไปแล้วหนึ่งครั้งก็เป็นไฟล์ MP3 ธรรมดา การเก็บเฉพาะบรรทัดที่ผู้อ่านไปถึงจริงทำให้ต้นไม้ส่วนใหญ่กลายเป็นไฟล์ไปเอง โดยไม่ต้องตัดสินใจเรนเดอร์เลยสักครั้ง

เดือนที่ 12

ต้นไม้หยุดมีค่าใช้จ่าย

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

การเชื่อมต่อสดที่เปิดอยู่หนึ่งเส้นถือหนึ่งช่องคำขอพร้อมกันของแพ็กเกจ การติดตั้งแบบพูดสดจึงวัดขนาดจากจำนวนผู้อ่านพร้อมกัน และจำนวนบรรทัดต่อวันไม่มีผลต่อการคำนวณนี้

สำหรับนักพัฒนา

ตัวอย่าง TypeScript เปิดซ็อกเก็ตสดแบบที่เซสชันพูดสดใช้ ส่วนตัวอย่าง Python ส่งหนึ่งช่วงแบบเดียวกับที่ชุดงานเรนเดอร์ล่วงหน้าทำ และตัวอย่างออปชันแสดงฟิลด์เสียง โมเดล และรูปแบบไฟล์ที่แต่ละฉากตั้งไว้

เอกสารอ้างอิง API ฉบับเต็ม
// Runs on Bun as-is; on Node, `import WebSocket from "ws"` accepts
// the same constructor options. Browsers cannot send this header, and
// API keys never ship to browsers anyway.
const socket = new WebSocket("wss://api.paxalabs.com/v1/tts/live", {
  headers: { Authorization: `Bearer ${process.env.PAXA_API_KEY}` },
});
socket.binaryType = "arraybuffer";

socket.onopen = () => {
  socket.send(JSON.stringify({
    type: "start",
    model: "paxa-tts-flash-v2",
    voice: "khanomkrok",
    timestamps: "word",
  }));
  // Send text whenever it becomes available, token by token if you like.
  socket.send(JSON.stringify({ type: "text", text: "สวัสดีครับ ยินดีต้อนรับสู่ Paxa Labs" }));
  socket.send(JSON.stringify({ type: "flush" }));
  socket.send(JSON.stringify({ type: "end" }));
};

socket.onmessage = (event) => {
  if (typeof event.data === "string") {
    const message = JSON.parse(event.data);
    if (message.type === "done") socket.close();
    return;
  }
  player.feed(new Uint8Array(event.data)); // binary frames are audio
};

ฟังเสียงจริง

เสียงบางส่วนจากทั้งหมด 50 เสียง สร้างจาก API ด้วยรหัสเสียงที่เปิดให้ใช้งานจริง ฟังครบทุกเสียงได้ที่หน้า Text-to-Speech

  • ลูกชุบv1 + v2เปิดในหน้าเสียงพูด
  • ขนมครกv1 + v2เสียงชายหลัก
  • นมเย็นv1 + v2เสียงหญิงหลัก
  • ฝอยทองv1 + v2เสียงเล่าเรื่อง

บรรทัดสั้นเป็นโจทย์ของมันเอง

นิยายแบบแตกกิ่งเขียนเป็นชิ้นสั้น ๆ ทั้งข้อความแชทหนึ่งบรรทัด คำโต้กลับประโยคเดียว หรือข้อความบนปุ่มให้เลือก ภาษาไทยเขียนติดกันโดยไม่มีช่องว่างระหว่างคำ ชิ้นที่มีแค่สี่คำจึงให้บริบทน้อยมากสำหรับการตัดคำ Paxa TTS Flash v2 อ่านวรรณยุกต์จากตัวสะกดโดยไม่ต้องเปิดพจนานุกรม นี่คือสิ่งที่ทำให้บรรทัดสั้นที่อยู่โดด ๆ ยังฟังรู้เรื่อง

คำถามที่พบบ่อย

ควรเรนเดอร์ทั้งต้นไม้ หรือพูดสดดี

การเรนเดอร์ล่วงหน้ามีค่าใช้จ่ายราว $1.44 ครั้งเดียวสำหรับผู้อ่านทั้งหมด ส่วนการพูดสดราว $0.11 ต่อผู้อ่านหนึ่งคน ถ้ามีผู้อ่านน้อยกว่าราว 13 คน การพูดสดถูกกว่า มากกว่านั้นการเรนเดอร์ล่วงหน้าถูกกว่า

ให้ตัวละครแต่ละตัวมีเสียงต่างกันได้ไหม

ได้ ถึง 50 เสียงตามแคตตาล็อก รหัสเสียงหนึ่งตัวต่อหนึ่งผู้พูดถูกเก็บไว้ในสคริปต์ และรหัสเดิมให้เสียงเดิมทุกครั้งที่รัน

ถ้าผู้อ่านกดข้ามบรรทัดจะเกิดอะไรขึ้น

ส่งเฟรม cancel บนซ็อกเก็ตสด บรรทัดนั้นจะหยุด ส่วนที่ค้างในคิวถูกทิ้งโดยไม่คิดเงิน และการเชื่อมต่อเดิมรับบรรทัดถัดไปต่อได้เลย

ผู้อ่านหนึ่งคนใช้กำลังของแพ็กเกจไปเท่าไร

การเชื่อมต่อสดที่เปิดอยู่หนึ่งเส้นถือหนึ่งช่องคำขอพร้อมกันตลอดเวลาที่เปิด การติดตั้งแบบพูดสดจึงวัดขนาดจากจำนวนผู้อ่านพร้อมกัน และจำนวนบรรทัดต่อวันไม่มีผลต่อการคำนวณนี้

เอาไฟล์เสียงใส่ในเกมที่ขายได้ไหม

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

เริ่มต้นด้วยเครดิตฟรี

เข้าสู่ระบบด้วย Google, GitHub หรือ Hugging Face แล้วใช้เครดิตฟรี 100 เครดิตกับข้อความของคุณเอง

บทความที่เกี่ยวข้อง