เพื่อน AI และแชทบอทบทบาทสมมติภาษาไทย
ให้เพื่อน AI หรือตัวละครบทบาทสมมติภาษาไทยมีเสียงเป็นของตัวเอง เปิด WebSocket เดียวต่อหนึ่งบทสนทนา สั่งหยุดได้เมื่อถูกพูดแทรก และใช้รหัสเสียงคงที่ที่ทำให้ตัวละครเป็นเสียงเดิมเสมอ
ไอเดียให้ลองเล่น
คืนนี้เป็นยังไงบ้าง เล่าให้ฟังหน่อยสิ เราอยากรู้จริง ๆ นะ
เมื่อวานที่เล่าเรื่องงานให้ฟัง วันนี้ดีขึ้นบ้างไหม
อย่าเพิ่งเดินออกไปสิ ฉันยังพูดไม่จบเลยนะ กลับมานั่งลงก่อน
หลับให้สบายนะ พรุ่งนี้ตื่นมาค่อยเล่าให้ฟังต่อก็ได้
ทุกการ์ดเล่นคลิปจริงที่สร้างจากสคริปต์นั้น ๆ ด้วยเสียงนมเย็น เปิดในหน้าเสียงพูดเพื่อให้พูดข้อความของคุณเองได้
ทำให้เพื่อน AI พูดได้อย่างไร
เพื่อน AI คือบทสนทนาที่ไม่มีงานรออยู่ตอนจบ เรื่องนี้เปลี่ยนหน้าที่ของชั้นเสียงไปทั้งหมด บอทบริการพูดผลลัพธ์ที่เขียนสคริปต์ไว้ไม่กี่แบบ ส่วนเพื่อน AI พูดทุกอย่างที่โมเดลเขียนขึ้นมา ตลอดทั้งคืน ด้วยเสียงที่ผู้ใช้ตัดสินใจไปแล้วว่าเป็นของใครคนหนึ่ง ลองถามคนที่เลิกเปิดแอปว่าทำไม คำตอบมักไม่ได้อยู่ที่บทที่เขียน แต่อยู่ที่วันหนึ่งเสียงมันเพี้ยนไปนิดหนึ่ง หรือมันพูดต่อทั้งที่เรากำลังจะพูดอะไรบางอย่าง สองอย่างที่รับน้ำหนักตรงนี้ อย่างแรกคือเสียงที่ไม่เพี้ยนไปตามเวลา ซึ่งรหัสเสียงคงที่ในแคตตาล็อกให้มาอยู่แล้ว อย่างที่สองคือการพูดแทรก คนที่คุยกับเพื่อน AI ย่อมพูดแทรกขึ้นมา และเพื่อน AI ที่ยังอ่านย่อหน้าเดิมต่อทั้งที่ไม่มีใครฟังแล้ว จะหมดความเป็นคนทันที ประเทศไทยเป็นตลาดที่เริ่มจากแชท LINE มีผู้ใช้ประจำเดือน 56 ล้านคน คิดเป็นร้อยละ 78.2 ของประชากร เพื่อน AI ภาษาไทยจึงมักเป็นสินค้าแชทที่เรียนรู้ที่จะพูดได้
เปิดซ็อกเก็ตพร้อมกับที่บทสนทนาเริ่ม
WebSocket เดียวรับทั้งเซสชัน ส่งโมเดล เสียง และรูปแบบไฟล์ครั้งเดียวตอนเปิด หลังจากนั้นทุกตาคือเฟรมข้อความบนการเชื่อมต่อที่อุ่นอยู่แล้ว
สั่งสังเคราะห์ทีละประโยค
ส่งประโยคทันทีที่โมเดลเขียนจบ เสียงจะเริ่มกลับมาตั้งแต่ส่วนที่เหลือยังเขียนไม่เสร็จ และตาที่ถูกพูดแทรกกลางคันก็เหลือให้จ่ายแค่ประโยคเดียว
สั่งหยุดทันทีที่อีกฝ่ายเริ่มพูด
เฟรม cancel หยุดรอบที่กำลังพูดและทิ้งส่วนที่ค้างในบัฟเฟอร์ เซสชันยังเปิดอยู่ และเฟรมข้อความถัดไปเริ่มตาใหม่ได้ทันที
หนึ่งซ็อกเก็ต หลายตา และการพูดแทรกหนึ่งครั้ง
-> {"type":"start","model":"paxa-tts-flash-v2","voice":"sanaechan"}
<- {"type":"started","connection":"c_8f21","voice":"sanaechan"}
-> {"type":"text","text":"คืนนี้เป็นยังไงบ้าง"}
<- {"type":"charged","seq":1,"chars":19,"credits":0.19}
<- [เฟรมเสียงไบนารี]
<- {"type":"flushed","seq":1}
-> {"type":"text","text":"เล่าให้ฟังหน่อยสิ เราอยากรู้จริง ๆ นะ"}
<- {"type":"charged","seq":2,"chars":37,"credits":0.37}
<- [เฟรมเสียงไบนารี]
# ผู้ใช้เริ่มพูดแทรก
-> {"type":"cancel"}
<- {"type":"cancelled","seq":2}
-> {"type":"text","text":"ได้ ๆ ฟังอยู่"}ตาที่ 2 ยังคงค่าบริการ 0.37 เครดิตตามใบเสร็จเดิม ซึ่งเป็นส่วนต่างจากยอดสะสมของการเชื่อมต่อ ไม่มีอะไรค้างอยู่ในคิวหลังจากนั้น และการเชื่อมต่อเดิมรับตาถัดไปต่อได้โดยไม่ต้องเชื่อมใหม่
ค่าเสียงของเพื่อน AI
| บทสนทนา | จำนวนคำตอบ | ตัวอักษร | ค่าใช้จ่าย |
|---|---|---|---|
| หนึ่งค่ำคืน | 20 | 2,400 | $0.02 |
| ผู้ใช้ประจำหนึ่งคน หนึ่งเดือน | 1,200 | 144,000 | $1.44 |
| ผู้ใช้ประจำ 1,000 คน หนึ่งเดือน | ประมาณ $1,440 | ||
คำนวณที่ 10 เครดิตต่อ 1,000 ตัวอักษร จากคำตอบยาว 120 ตัวอักษร วันละ 40 คำตอบ ค่าบริการคิดตามตัวอักษรที่พูดออกไปจริง
ชีวิตของตัวละครหนึ่งตัว
เลือกเสียง
คุณลองฟังทั้งแคตตาล็อกแล้วเลือกมาหนึ่งเสียง การเลือกนั้นกลายเป็นรหัสหนึ่งบรรทัดในไฟล์ตั้งค่า และเป็นครั้งสุดท้ายที่ใครต้องคิดเรื่องนี้
ระดับความสนิทเข้าที่
คุณดูบทสนทนาจริงมาพักหนึ่งแล้วขยับตัวละครจากระดับสุภาพไปหาระดับสนิท นั่นคือการแก้ prompt คำสรรพนามและคำลงท้ายที่มันเขียนเปลี่ยนไป ส่วนเสียงที่อ่านยังเป็นเสียงเดิม
มีคนผูกพันกับมันแล้ว
เสียงยังเป็นเสียงเดียวกับที่เขารู้จักตั้งแต่แรก เพราะรหัสของเสียงรุ่นเสถียรให้เสียงเดิมเสมอ ไม่มีอะไรเสื่อม ไม่มีอะไรหมดอายุ และไม่ต้องอัดใหม่เมื่อผู้ให้บริการเปลี่ยนอะไรสักอย่าง
เพิ่มตัวละครตัวที่สอง
อีกหนึ่งรหัสเสียง อีกหนึ่ง prompt ตัวละครตัวแรกไม่ถูกแตะเลย และผู้ใช้ที่คุยกับตัวแรกอย่างเดียวจะไม่รู้สึกถึงความเปลี่ยนแปลงใด ๆ
ไม่มีขั้นตอนไหนบนไทม์ไลน์นี้ที่ต้องใช้แท็กอารมณ์ สิ่งที่ทำให้ตัวละครเปลี่ยนไปตามเวลาคือบทที่เขียนและเสียงที่เลือก
สำหรับนักพัฒนา
ตัวอย่าง 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 };
import json import os from websockets.sync.client import connect # pip install websockets with connect( "wss://api.paxalabs.com/v1/tts/live", additional_headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"}, ) as socket: socket.send(json.dumps({"type": "start", "model": "paxa-tts-flash-v2", "voice": "khanomkrok"})) socket.send(json.dumps({"type": "text", "text": "สวัสดีครับ ยินดีต้อนรับสู่ Paxa Labs"})) socket.send(json.dumps({"type": "flush"})) socket.send(json.dumps({"type": "end"})) with open("speech.mp3", "wb") as f: for frame in socket: if isinstance(frame, bytes): f.write(frame) # binary frames are audio continue event = json.loads(frame) if event["type"] == "done": break
curl -X POST https://api.paxalabs.com/v1/tts \ -H "Authorization: Bearer $PAXA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "text": "สวัสดีครับ ยินดีต้อนรับสู่ Paxa Labs", "voice": "khanomkrok", "model": "paxa-tts-flash-v2", "format": "mp3", "stream": false }' \ --output speech.mp3
ฟังเสียงจริง
เสียงบางส่วนจากทั้งหมด 50 เสียง สร้างจาก API ด้วยรหัสเสียงที่เปิดให้ใช้งานจริง ฟังครบทุกเสียงได้ที่หน้า Text-to-Speech
- เสน่ห์จันทน์v1 + v2เปิดในหน้าเสียงพูด
- ต้มยำv1 + v2เพื่อนซี้
- มอคค่าv1 + v2สุขภาพใจ
- เต้าฮวยv1 + v2นางเอกละคร
ทำไมภาษาไทยเก็บเรื่องนี้ไว้คนละที่
ภาษาไทยระบุความสัมพันธ์ไว้ในตัวคำเลย คำสรรพนามที่ผู้พูดเลือกใช้เรียกตัวเองและเรียกอีกฝ่าย กับคำลงท้ายที่ปิดประโยค วางคนสองคนไว้ในตำแหน่งที่สัมพันธ์กัน ตั้งแต่ก่อนที่น้ำเสียงจะเข้ามาเกี่ยว Paxa TTS Flash v2 อ่านทั้งหมดนี้จากตัวสะกด ความสนิทของตัวละครจึงเป็นสิ่งที่ prompt กำหนด และเสียงเป็นฝ่ายแสดงออกมา
คำถามที่พบบ่อย
อีกหกเดือนตัวละครจะยังเสียงเดิมไหม
ยังเหมือนเดิม เสียงคือรหัสคงที่ในแคตตาล็อก และรหัสเดิมให้เสียงเดิมทุกคำขอ ความเป็นเสียงของตัวละครไม่ได้ขึ้นกับไฟล์ตัวอย่างที่คุณต้องเก็บรักษาไว้เอง
หยุดพูดตอนผู้ใช้พูดแทรกได้อย่างไร
ส่งเฟรม cancel บนซ็อกเก็ตสด ประโยคที่กำลังพูดจะหยุด ส่วนที่ค้างในคิวถูกทิ้งโดยไม่คิดเงิน และการเชื่อมต่อเดิมรับตาถัดไปต่อได้เลย
ทำให้เพื่อน AI เสียงดีใจหรือเสียใจได้ไหม
ได้ ทุกเสียงของ Paxa TTS Flash v2 รับคำกำกับในวงเล็บเหลี่ยมที่เขียนไว้ในข้อความตอบ เช่น [happy] หรือ [sad] ส่วนความสนิทของประโยคไทยยังมาจากคำสรรพนามและคำลงท้ายที่ใช้เขียน และเสียงที่คุณเลือกให้อ่าน
ให้ตัวละครบทบาทสมมติแต่ละตัวมีเสียงของตัวเองได้ไหม
ได้ ให้แต่ละตัวละครใช้หนึ่งใน 50 เสียงในแค็ตตาล็อก หรือออกแบบเสียงให้ตัวละครจากคำบรรยาย บัญชีหนึ่งเก็บเสียงที่ออกแบบไว้ได้ 1 ถึง 50 เสียงตามแพลน และเราไม่มีบริการโคลนเสียง
เพื่อน AI ที่ถูกใช้งานหนักมีค่าใช้จ่ายเท่าไร
ประมาณ $1.44 ต่อเดือน สำหรับผู้ใช้ที่ได้รับคำตอบเป็นเสียงวันละ 40 ครั้ง ค่าเสียงคิดตามจำนวนตัวอักษร เดือนที่คุยน้อยจึงจ่ายน้อยลง และเดือนที่เงียบสนิทก็ไม่มีค่าใช้จ่าย
เริ่มต้นด้วยเครดิตฟรี
เข้าสู่ระบบด้วย Google, GitHub หรือ Hugging Face แล้วใช้เครดิตฟรี 100 เครดิตกับข้อความของคุณเอง
บทความที่เกี่ยวข้อง
- ค่าพากย์เสียงภาษาไทยปี 2569: สตูดิโอ ฟรีแลนซ์ และ AI
- เลือกเสียง AI ภาษาไทยให้เหมาะกับงาน: คู่มือครบทั้ง 34 เสียง
- วิธีเขียนสคริปต์ให้เสียง AI ภาษาไทยอ่านได้เป็นธรรมชาติ
- ภาษาไทยไม่มีจุดจบประโยค: เสียงพูดแบบสตรีมควรตัดตรงไหน
- วัดคุณภาพเสียง AI ภาษาไทยด้วยสิบประโยค
- Paxa TTS Flash อ่านภาษาจีนกลางได้แล้ว พร้อมเสียงใหม่หกเสียง
- Paxa TTS Flash อ่านแท็กอารมณ์ได้แล้ว บนเสียงใหม่สองเสียง
- Paxa TTS Flash เริ่มส่งเสียงแรกใน 104 มิลลิวินาที
- Text to Speech คืออะไร เสียง AI ทำงานอย่างไร และใช้ทำอะไรได้บ้าง
- วิธีทำเสียงพากย์ AI ใส่คลิป TikTok Reels และ Shorts
- แปลงข้อความเป็นเสียงภาษาไทยที่ดีที่สุด สำหรับแอป วิดีโอ และสายโทรศัพท์
- โปรแกรมสร้างเสียง AI ที่ดีที่สุดสำหรับ YouTube ทั้งเสียงบรรยาย ช่องไม่เปิดหน้า และ Shorts
- Text to Speech ฟรีที่ดีที่สุด สำหรับงานส่วนตัวและการลองเสียงก่อนจ่ายเงิน
- Text to Speech ที่ดีที่สุดสำหรับทำหนังสือเสียงและงานอ่านเรื่องยาว
- วิธีเจนเสียง AI ภาษาไทย ตั้งแต่เลือกเสียงจนได้ไฟล์
- ให้ AI อ่านนิยายให้ฟัง ด้วยเสียงผู้บรรยายและเสียงตัวละคร
- วิธีเขียนคำบรรยายเสียงสำหรับออกแบบเสียง AI พร้อมตัวอย่าง
- ออกแบบเสียงกับโคลนเสียงต่างกันอย่างไร สองวิธีสร้างเสียง AI ของตัวเอง
- เครื่องมือออกแบบเสียง AI ที่ดีที่สุดสำหรับเสียงภาษาไทย เสียงที่บันทึกไว้ใช้ซ้ำ และ Voice Agent
- Paxa TTS Flash v2 เปิดให้ใช้งานแล้ว
- เครื่องมือออกแบบเสียง AI เปิดให้ใช้งานแล้ว
- Temperature และแท็กช่วงหยุดบน Paxa TTS Flash v2