กำกับน้ำเสียงด้วยแท็ก
แท็กคำกำกับคือคำกำกับในวงเล็บเหลี่ยมอย่าง [whispering] เสียงอย่าง [laughs] คำอุทาน และเครื่องหมาย <emph> กับ <whisper> ที่เขียนไว้ในข้อความของคำขอถึง Paxa TTS Flash v2 รวมวิธีอ่านแท็กแต่ละแบบ น้ำหนัก การผสม ค่าบริการ และแท็กทุกแบบที่ API ปฏิเสธ
บน Paxa TTS Flash v2 ทุกเสียงอ่านแท็กที่เขียนไว้ใน text ของ POST /v1/tts ได้ คำกำกับในวงเล็บเหลี่ยม เช่น [whispering] กำหนดน้ำเสียงของข้อความที่ตามมา เสียงอย่าง [laughs] ดังตรงตำแหน่งที่เขียน คำอุทานอย่าง [um] ถูกพูดออกมาเป็นคำ และ <emph> กับ <whisper> ครอบช่วงข้อความ API อ่านแท็กทุกตัวก่อนตัดเครดิต และแท็กที่โมเดลปฏิเสธตอบ 400 tag_invalid ส่วนบน Paxa TTS Flash (paxa-tts-flash-v1) มีเพียงเสียงรุ่นทดลองที่อ่านแท็กอารมณ์ และเสียงอื่นทุกเสียงจะข้ามแท็ก
curl -X POST https://api.paxalabs.com/v1/tts \
-H "Authorization: Bearer $PAXA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "[warm, unhurried] ยินดีต้อนรับกลับมาครับ [chuckles] วันนี้มีข่าวดี [เอ่อ] <whisper>แต่ขอเก็บเป็นความลับไว้ก่อนนะครับ</whisper>",
"voice": "khanomkrok",
"model": "paxa-tts-flash-v2"
}' \
--output speech.mp3import { writeFile } from "node:fs/promises";
const response = await fetch("https://api.paxalabs.com/v1/tts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PAXA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "[warm, unhurried] ยินดีต้อนรับกลับมาครับ [chuckles] วันนี้มีข่าวดี [เอ่อ] <whisper>แต่ขอเก็บเป็นความลับไว้ก่อนนะครับ</whisper>",
voice: "khanomkrok",
model: "paxa-tts-flash-v2",
}),
});
if (!response.ok) throw new Error(`TTS failed: ${response.status}`);
await writeFile("speech.mp3", Buffer.from(await response.arrayBuffer()));import os
import requests
response = requests.post(
"https://api.paxalabs.com/v1/tts",
headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"},
json={"text": "[warm, unhurried] ยินดีต้อนรับกลับมาครับ [chuckles] วันนี้มีข่าวดี [เอ่อ] <whisper>แต่ขอเก็บเป็นความลับไว้ก่อนนะครับ</whisper>", "voice": "khanomkrok", "model": "paxa-tts-flash-v2"},
)
response.raise_for_status()
with open("speech.mp3", "wb") as f:
f.write(response.content)คำกำกับ#
คำกำกับเขียนเป็นภาษาธรรมชาติ บอกว่าอยากให้ข้อความหลังแท็กฟังเป็นอย่างไร เป็นภาษาไทย อังกฤษ หรือจีนก็ได้ แล้วเสียงจะพูดแบบนั้นจนถึงคำกำกับถัดไป คำใดก็ได้ในวงเล็บเหลี่ยมที่ไม่ใช่เสียง คำอุทาน ช่วงหยุด หรือการตั้งค่าที่ถูกปฏิเสธ จะอ่านเป็นคำกำกับ ตัวอย่างที่ใช้เริ่มต้นได้:
[อบอุ่น พูดช้า ๆ],[เขินอาย พูดเบา ๆ],[ค่อย ๆ ตื่นเต้นขึ้น][whispering],[calm, measured],[building excitement],[barely awake, at three in the morning][害羞地,小声],[冷冷地,带着笑意],[像是等这一刻等了十年]
ข้อความก่อนคำกำกับแรกใช้น้ำเสียงเดิมของเสียงนั้น และ [neutral] พากลับสู่น้ำเสียงเดิม เสียงและคำอุทานไม่เปลี่ยนคำกำกับที่มีผลอยู่
- ข้อความในวงเล็บเหลี่ยมไม่ถูกพูดออกเสียง ยกเว้นคำอุทาน แท็กหนึ่งตัวเริ่มจาก
[ถึง]ตัวถัดไป โดยไม่มี[อื่นหรือการขึ้นบรรทัดใหม่คั่น และวงเล็บแบบเต็มความกว้าง[ ]ใช้ได้เหมือนกัน - ตัวพิมพ์เล็กหรือใหญ่ไม่มีผล ตัวอักษรและตัวเลขแบบเต็มความกว้างอ่านเป็น ASCII และช่องว่างหลายช่องอ่านเป็นช่องเดียว
[Sad][SAD]และ[ sad ]จึงเป็น[sad]ทั้งหมด - วงเล็บที่ไม่มีตัวอักษร เช่น
[1]หรือ[...]ได้คำตอบtag_invalid
น้ำหนักและการผสม#
น้ำหนักเขียนต่อหลังโคลอน เช่น [sad:0.5] หรือ [laughs:0.3] เขียนเป็นตัวเลขอย่าง 0.5 .5 หรือ 0,5 หรือเป็นเปอร์เซ็นต์อย่าง 50% ก็ได้ เลขไทยและตัวเลขแบบเต็มความกว้างก็อ่านได้ น้ำหนักที่ต่ำกว่า 0 อ่านเป็น 0 และไม่มีเพดานด้านบน [excited:2] จึงใช้ได้ บน [neutral] บนคำอารมณ์จากรายการแท็กอารมณ์ เช่น [sad] และบนเสียง น้ำหนักที่ไม่ใช่ตัวเลข เช่น [sad:half] ได้คำตอบ tag_invalid ส่วนคำกำกับอื่น โคลอนเป็นส่วนหนึ่งของคำ [note: see below] จึงเป็นคำกำกับหนึ่งตัว
+ รวมคำกำกับหลายตัวเป็นการผสม แต่ละส่วนมีน้ำหนักของตัวเอง เช่น [happy+sad] หรือ [happy:0.7+sad:0.3] การผสมรับเฉพาะคำกำกับ [happy+laughs] และ [sad+um] จึงได้คำตอบ tag_invalid
เสียง#
เสียงดังตรงตำแหน่งที่เขียน เขียนเสียงใดก็ได้ด้านล่างด้วยชื่อหรือคำสะกดแบบอื่นของมัน และใส่น้ำหนักได้ เช่น [soft laugh:0.8] เสียงที่น้ำหนัก 0 จะถูกละไว้
| เสียง | เขียนแบบอื่นได้ |
|---|---|
| [sighs] | sigh, a sigh, deep sigh, heavy sigh, long sigh, sighs deeply, sighs heavily, soft sigh, sighs softly, ถอนหายใจ, ถอนใจ, ถอนหายใจยาว, 叹气, 叹息, 唉 |
| [laughs] | laugh, laughter, a laugh, short laugh, big laugh, soft laugh, laughs softly, quiet laugh, เสียงหัวเราะ, 笑声, 大笑 |
| [chuckles] | chuckle, a chuckle, soft chuckle, small chuckle, light chuckle, chuckles softly, หัวเราะหึๆ, หัวเราะหึ ๆ, หัวเราะในลำคอ, 轻笑, 窃笑 |
| [exhales sharply] | exhale sharply, sharp exhale, huff, huffs, พ่นลมหายใจแรงๆ, พ่นลมหายใจแรง ๆ, 猛地呼气 |
| [gasps] | gasp, a gasp, sharp gasp, soft gasp, หายใจเฮือก, 倒吸一口气, 倒抽一口冷气 |
| [inhales deeply] | inhale deeply, deep inhale, deep breath, a deep breath, takes a deep breath, breathes in deeply, หายใจเข้าลึกๆ, หายใจเข้าลึก ๆ, สูดหายใจลึกๆ, สูดหายใจลึก ๆ, 深吸一口气, 深呼吸 |
| [giggles] | giggle, a giggle, soft giggle, หัวเราะคิกคัก, คิกคัก, 咯咯笑, 嘻嘻 |
| [sobs] | sob, a sob, soft sob, sobs quietly, เสียงสะอื้น, 抽泣, 啜泣, 呜咽 |
| [yawns] | yawn, a yawn, หาว, 打哈欠, 哈欠 |
| [clears throat] | clear throat, clears his throat, clears her throat, clears their throat, throat clear, ahem, กระแอม, กระแอมไอ, 清嗓子, 清了清嗓子 |
| [inhales] | inhale, breathes in, quick inhale, หายใจเข้า, 吸气 |
| [breath] | a breath, takes a breath, quick breath, หายใจ, 呼吸 |
| [exhales] | exhale, breathes out, หายใจออก, 呼气 |
| [whimpers] | whimper, a whimper, soft whimper, เสียงหงิงๆ, เสียงหงิง ๆ, เสียงครางหงิงๆ, เสียงครางหงิง ๆ, 嘤嘤, 嘤咛, 呜呜 |
| [scoffs] | scoff, a scoff, pfft, pff, psh, pshh, soft scoff, แค่นเสียง, หึ, เสียงหึ, 嗤, 嗤了一声, 冷哼, 冷哼一声, 哼 |
เสียงต่อไปนี้ได้คำตอบ tag_invalid ไม่ว่าเขียนสะกดแบบใด
| เสียง | เขียนแบบอื่นได้ |
|---|---|
| [sniffs] | sniff, sniffle, sniffles, สูดจมูก, 吸鼻子, 抽鼻子 |
| [gulps] | gulp, a gulp, กลืนน้ำลาย, 咽口水, 吞口水 |
| [coughs] | cough, a cough, dry cough, coughing fit, soft cough, small cough, coughs softly, ไอ, เสียงไอ, ไอแค่กๆ, ไอแค่ก ๆ, ไอค่อกแค่ก, 咳嗽, 咳, 咳了一声, 干咳 |
| [sneezes] | sneeze, a sneeze, achoo, ah-choo, atchoo, small sneeze, soft sneeze, จาม, เสียงจาม, ฮัดชิ่ว, ฮัดเช้ย, 打喷嚏, 喷嚏, 阿嚏 |
| [groans] | groan, a groan, soft groan, groans softly, เสียงคราง, เสียงครางเบาๆ, เสียงครางเบา ๆ, 呻吟声, 一声呻吟 |
| [grunts] | grunt, a grunt, soft grunt, ฮึ่ม, เสียงฮึ่ม, อึ๊บ, เสียงอึ๊บ, 闷哼, 闷哼一声, 低哼 |
| [snorts] | snort, a snort, soft snort, พ่นลมจมูก, พ่นลมทางจมูก, เสียงพ่นลมจมูก, 喷鼻息, 鼻哼, 鼻子哼了一声 |
| [pants] | pant, pants heavily, pants softly, เสียงหอบ, เสียงหอบหายใจ, 喘气声, 喘息声, 大口喘气 |
| [shushes] | shush, a shush, shh, shhh, จุ๊ๆ, จุ๊ ๆ, ชู่ว, ชู่ว์, เสียงชู่ว, 嘘, 嘘了一声 |
| [tsks] | tsk, tsk tsk, tut, tuts, tut tut, tut-tut, tongue click, clicks tongue, clicks her tongue, clicks his tongue, clicks their tongue, จิ๊, จิ๊ปาก, จุ๊ปาก, เดาะลิ้น, 啧, 啧啧, 咂嘴 |
| [hums] | hum, a hum, soft hum, hums softly, ฮัม, เสียงฮัม, ฮัมเพลง, 哼歌, 哼小曲, 哼曲子 |
| [screams] | scream, a scream, shriek, shrieks, a shriek, small shriek, กรี๊ด, เสียงกรี๊ด, เสียงกรีดร้อง, 尖叫声, 一声尖叫, 惊叫声 |
คำอุทาน#
[um] และ [hmm] คือคำอุทาน ซึ่งถูกพูดออกมาเป็นคำที่เขียนไว้ในวงเล็บ ข้อความที่มีคำอุทานจึงมีสิ่งที่จะพูดเสมอ คำอุทานไม่รับน้ำหนัก [um:0.5] จึงได้คำตอบ tag_invalid
| คำอุทาน | เขียนแบบอื่นได้ |
|---|---|
| [hmm] | hm, hmmm, mmm, อืม, 嗯 |
| [um] | umm, uh, uhh, er, เอ่อ, เอ่อๆ, เอ่อ ๆ, อ่า, 呃, 呃呃, 额 |
คำสะกด [uhm], [erm], [อืมม] ได้คำตอบ tag_invalid
ช่วงหยุด#
[short pause] [pause] [long pause] และความยาวที่กำหนดเอง เช่น [pause 300ms] เพิ่มความเงียบตรงตำแหน่งที่เขียนไว้ ดูความยาวและขีดจำกัด 500 ms ได้ที่ช่วงหยุด
การเน้นและการกระซิบ#
<emph> และ <whisper> ครอบช่วงข้อความ <emph>...</emph> เน้นคำที่อยู่ข้างใน และ <whisper>...</whisper> กระซิบคำเหล่านั้น
- น้ำหนักเขียนหลังโคลอนเหมือนในวงเล็บ เช่น
<emph:0.5>หรือ<whisper:0.3>เครื่องหมายที่น้ำหนักอ่านเป็นตัวเลขไม่ได้ เช่น<emph:half>จะถูกข้ามไปพร้อมตัวปิด - ตัวปิดคืนคำกำกับที่มีผลอยู่ก่อนเครื่องหมายนั้น หรือคืนน้ำเสียงเดิมของเสียงเมื่อก่อนหน้าไม่มีคำกำกับ คำกำกับที่เขียนไว้ในช่วงนั้นจะแทนที่สิ่งที่ตัวปิดคืนให้
- ตัวปิดหนึ่งตัวปิดเครื่องหมายชนิดเดียวกันที่เปิดอยู่ด้านในสุด ตัวปิดที่ไม่มีเครื่องหมายเปิดจะถูกข้าม และเครื่องหมายที่ไม่ได้ปิดมีผลต่อไปเหมือนคำกำกับ
- ตัวพิมพ์และช่องว่างในเครื่องหมายไม่มีผล
< EMPH >และ</ emph >อ่านได้ทั้งคู่ - การเน้นเขียนเป็นคำกำกับได้ด้วย เป็น
[เน้นเสียง]หรือ[เน้น],[เน้นคำ],[เน้นคำนี้],[เน้นย้ำ],[ลงน้ำหนัก],[emphasize],[emphasise],[emphasized],[emphasised],[emphasis],[with emphasis],[强调],[強調],[重读],[重讀],[加重语气],[加重語氣]
แท็กที่ API ปฏิเสธ#
แท็กแต่ละแบบต่อไปนี้ได้คำตอบ 400 tag_invalid ก่อนตัดเครดิต แม้ข้อความจะไม่มีอะไรอื่นเลย
| แท็ก | ตัวอย่าง |
|---|---|
| วงเล็บที่ไม่มีตัวอักษร | [1], [...] |
| เสียงที่ไม่อยู่ในรายการเสียง | [sniffs], [gulps], [coughs], [sneezes], [groans], [grunts], [snorts], [pants], [shushes], [tsks], [hums], [screams] |
| คำสะกดคำอุทานที่โมเดลอ่านไม่ได้ | [uhm], [erm], [อืมม] |
| น้ำหนักบนคำอุทาน | [um:0.5] |
น้ำหนักที่ไม่ใช่ตัวเลขบน [neutral] คำอารมณ์ หรือเสียง | [sad:half], [laughs:lots] |
| ส่วนของการผสมที่ไม่ใช่คำกำกับ | [happy+laughs], [sad+um] |
| การตั้งค่าของคำขอที่เขียนเป็นแท็ก | [voice], [language] |
| สำเนียง | [british accent], [สำเนียงอีสาน], [北京口音] |
| เสียงแบบอื่น | [robotic], [old man voice], [เสียงเด็ก], [机器人] |
| การร้องเพลง | [singing], [ร้องเพลง], [唱歌] ส่วน [sing-song] เป็นคำกำกับ |
| เสียงประกอบ | [door slams], [applause], [sound effect], [เสียงประกอบ] |
| ภาษา | [in thai], [english], [ภาษาไทย], [中文] |
ค่าบริการ#
แท็กคือข้อความ ทุกตัวอักษรของแท็ก รวมวงเล็บและเครื่องหมาย นับรวมในความยาวคำขอและค่าบริการตามอัตราต่อตัวอักษรของโมเดล ตัวอย่างด้านบนยาว 126 ตัวอักษร คิด 1.26 เครดิต ข้อความที่มีแต่แท็กและไม่มีคำอุทานได้คำตอบ 422 unspeakable_text โดยยังไม่คิดเครดิต เครดิตและการคิดค่าบริการ อธิบายการปัดเศษและค่าขั้นต่ำ
แท็กบนการเชื่อมต่อสด#
บนการเชื่อมต่อสด เฟรม text ที่มีแท็กซึ่งโมเดลปฏิเสธจะได้อีเวนต์ error พร้อม tag_invalid และบัฟเฟอร์คงข้อความเดิมก่อนเฟรมนั้นไว้ การส่งอัตโนมัติจะเก็บแท็กหรือเครื่องหมายที่ยังเปิดค้างท้ายบัฟเฟอร์ไว้ก่อน แท็กที่ถูกแบ่งข้ามเฟรมจึงถูกอ่านครบทั้งตัว ส่วนแท็กที่เปิดค้างเกินเกณฑ์ความยาวที่ใช้ส่งข้อความทั่วไปจะถูกอ่านเป็นข้อความ โดยไม่ถูกตรวจสอบในฐานะแท็ก แท็กที่ยังไม่มีคำตามมาจะรอคำเหล่านั้นอยู่ในบัฟเฟอร์ การสังเคราะห์แต่ละช่วงเริ่มด้วยคำกำกับและเครื่องหมายที่ช่วงก่อนหน้าจบไว้ แท็กที่ยกมานี้ไม่คิดค่าบริการแต่นับรวมใน max_chars และใช้ได้ไม่เกินครึ่งหนึ่งของค่านี้ เฟรมที่ทำให้แท็กที่ยกมายาวเกินครึ่งหนึ่ง หรือทำให้แท็กที่รออยู่ในบัฟเฟอร์รวมกับแท็กที่ยกมาเกิน max_chars จะได้ text_too_long ส่วน cancel พาการเชื่อมต่อกลับสู่น้ำเสียงเดิมของเสียงนั้น
หมายเหตุ
เอนด์พอยต์ที่เข้ากันได้กับ OpenAI อ่านแท็กใน input ตามกฎเดียวกัน