เลือกหัวข้ออ่าน
แปลงข้อความเป็นเสียงพูดคุณภาพสูงด้วย AI อย่างง่ายดาย
ในยุคที่ Content เป็นราชา การมีเสียงพูดที่น่าฟังและเป็นธรรมชาติกลายเป็นปัจจัยสำคัญในการสร้าง Engagement ไม่ว่าจะเป็น Podcast, วิดีโอการสอน, หรือแม้แต่ระบบประกาศอัตโนมัติ แถมยังสามหารถกำหนดสไตล์การพูดได้อีกด้วย
ระบบ TTS ของ Gemini API ทำงานตามขั้นตอนต่อไปนี้:
ส่งข้อความที่ต้องการแปลงเป็นเสียงผ่าน HTTP Request
API ส่งกลับข้อมูลเสียงในรูปแบบ PCM Base64
ใช้ Function Node แปลงข้อมูล PCM เป็นไฟล์ WAV ที่เปิดได้
บันทึกไฟล์ WAV ลงในระบบหรือส่งต่อไปใช้งาน
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent?key=YOUR_API_KEYตัวอย่าง Request Body:
{
"contents": [{
"parts":[{
"text": "สวัสดีครับ ยินดีต้อนรับสู่ระบบ Text-to-Speech ของ Gemini"
}]
}],
"generationConfig": {
"responseModalities": ["AUDIO"],
"speechConfig": {
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Kore"
}
}
}
},
"model": "gemini-2.5-flash-preview-tts"
}
// ดึงข้อมูล base64 จาก response
const base64Audio = $input.first().json.candidates[0].content.parts[0].inlineData.data;
// แปลง base64 เป็น Buffer (PCM data)
const pcmData = Buffer.from(base64Audio, 'base64');
// สร้าง WAV header
function createWavHeader(dataLength, sampleRate = 24000, channels = 1, bitsPerSample = 16) {
const header = Buffer.alloc(44);
// RIFF header
header.write('RIFF', 0);
header.writeUInt32LE(36 + dataLength, 4);
header.write('WAVE', 8);
// fmt subchunk
header.write('fmt ', 12);
header.writeUInt32LE(16, 16);
header.writeUInt16LE(1, 20);
header.writeUInt16LE(channels, 22);
header.writeUInt32LE(sampleRate, 24);
header.writeUInt32LE(sampleRate * channels * bitsPerSample / 8, 28);
header.writeUInt16LE(channels * bitsPerSample / 8, 32);
header.writeUInt16LE(bitsPerSample, 34);
// data subchunk
header.write('data', 36);
header.writeUInt32LE(dataLength, 40);
return header;
}
// สร้าง WAV file
const wavHeader = createWavHeader(pcmData.length);
const wavFile = Buffer.concat([wavHeader, pcmData]);
// ส่งคืนข้อมูล
return [{
json: {
fileName: `tts_${new Date().getTime()}.wav`,
fileSize: wavFile.length,
duration: pcmData.length / (24000 * 2),
timestamp: new Date().toISOString()
},
binary: {
audio: {
data: wavFile,
mimeType: 'audio/wav',
fileName: `tts_${new Date().getTime()}.wav`
}
}
}];
| Voice Name | ลักษณะเสียง | Voice Name | ลักษณะเสียง |
|---|---|---|---|
| Zephyr | Bright - สดใส | Puck | Upbeat - ร่าเริง |
| Charon | Informative - ให้ข้อมูล | Kore | Corporate - บริษัท |
| Fenrir | Excitable - ตื่นเต้นง่าย | Leda | Youthful - อ่อนเยาว์ |
| Orus | Firm - มั่นคง | Aoede | Breezy - สบายๆ |
| Callirrhoe | Casual - สบายๆ | Autonoe | Bright - สดใส |
| Enceladus | Breathy - หายใจ | Iapetus | Clear - ชัดเจน |
| Umbriel | Casual - สบายๆ | Algieba | Smooth - นุ่มนวล |
| Despina | Smooth - นุ่มนวล | Erinome | Clear - ชัดเจน |
| Algenib | Gravelly - ห้าว | Rasalgethi | Informative - ให้ข้อมูล |
| Laomedeia | Rhythmic - จังหวะสนุก | Achernar | Soft - นุ่ม |
| Alnilam | Firm - มั่นคง | Schedar | Even - สม่ำเสมอ |
| Gacrux | Mature - ผู้ใหญ่ | Pulcherrima | Forward - ส่งต่อ |
| Achird | Friendly - เป็นมิตร | Zubenelgenubi | Casual - สบายๆ |
| Vindemiatrix | Gentle - อ่อนโยน | Sadachbia | Lively - มีชีวิตชีวา |
| Sadaltager | Knowledgeable - มีความรู้ | Sulafat | Warm - อบอุ่น |
| ประเภทคำสั่ง | ตัวอย่างการใช้ |
|---|---|
| อารมณ์ | พูดด้วยความตื่นเต้น:, พูดอย่างเศร้า:, พูดอย่างสนุกสนาน: |
| ระดับเสียง | พูดเสียงเบาๆ:, กระซิบ:, ตะโกน: |
| ความเร็ว | พูดช้าๆ:, พูดเร็ว:, พูดช้าและชัดเจน: |
| น้ำเสียง | พูดอย่างเป็นทางการ:, พูดแบบเป็นกันเอง:, พูดแบบมืออาชีพ: |
{
"contents": [{
"parts":[{
"text": "TTS the following conversation between พิธีกร and แขกรับเชิญ:\nพิธีกร: สวัสดีครับ วันนี้เรามีแขกรับเชิญพิเศษ\nแขกรับเชิญ: สวัสดีค่ะ ยินดีที่ได้มาร่วมรายการ"
}]
}],
"generationConfig": {
"responseModalities": ["AUDIO"],
"speechConfig": {
"multiSpeakerVoiceConfig": {
"speakerVoiceConfigs": [{
"speaker": "พิธีกร",
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Kore"
}
}
}, {
"speaker": "แขกรับเชิญ",
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Puck"
}
}
}]
}
}
},
"model": "gemini-2.5-flash-preview-tts"
}
// เพิ่มใน Function Node เพื่อตรวจสอบข้อมูล
console.log('PCM Data Length:', pcmData.length);
console.log('Duration (seconds):', pcmData.length / (24000 * 2));
console.log('File Size (KB):', wavFile.length / 1024);
32,000 tokens ต่อ request
24 ภาษา รวมถึงภาษาไทย
Mono 16-bit 24kHz PCM
ใช้ Set Node เตรียมข้อความที่ซับซ้อนก่อนส่ง
ใช้ IF Node ตรวจสอบความยาวข้อความไม่เกิน limit
ใช้ Wait Node เว้นระยะหากประมวลผลหลายรายการ
เก็บข้อมูลไฟล์เสียงไว้ใน Database
ใช้ Webhook รับข้อความจากแอปอื่น
ใช้ Try-Catch สำหรับจัดการ error
เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า
คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น
ยอมรับทั้งหมดประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
คุกกี้ประเภทนี้จะทำการเก็บข้อมูลการใช้งานเว็บไซต์ของคุณ เพื่อเป็นประโยชน์ในการวัดผล ปรับปรุง และพัฒนาประสบการณ์ที่ดีในการใช้งานเว็บไซต์ ถ้าหากท่านไม่ยินยอมให้เราใช้คุกกี้นี้ เราจะไม่สามารถวัดผล ปรับปรุงและพัฒนาเว็บไซต์ได้
รายละเอียดคุกกี้
คุกกี้ประเภทนี้จะเก็บข้อมูลต่าง ๆ รวมทั้งข้อมูลส่วนบุคคลเกี่ยวกับตัวคุณเพื่อเราสามารถนำมาวิเคราะห์ และนำเสนอเนื้อหา ให้ตรงกับความเหมาะสมกับความสนใจของคุณ ถ้าหากคุณไม่ยินยอมเราจะไม่สามารถนำเสนอเนื้อหาและโฆษณาได้ไม่ตรงกับความสนใจของคุณ
รายละเอียดคุกกี้