เลือกหัวข้ออ่าน

🎙️ คู่มือการใช้งาน Gemini API TTS บน n8n

แปลงข้อความเป็นเสียงพูดคุณภาพสูงด้วย AI อย่างง่ายดาย

🚀 ความต้องการเบื้องต้น

n8n เวอร์ชัน 0.5 ขึ้นไป
Gemini API Key สมัครฟรีที่ Google AI Studio
โมเดลที่รองรับ gemini-2.5-flash-preview-tts หรือ gemini-2.5-pro-preview-tts

🔄 ภาพรวมการทำงาน

ระบบ TTS ของ Gemini API ทำงานตามขั้นตอนต่อไปนี้:

1

ส่งข้อความไปยัง API

ส่งข้อความที่ต้องการแปลงเป็นเสียงผ่าน HTTP Request

2

รับข้อมูลเสียง PCM

API ส่งกลับข้อมูลเสียงในรูปแบบ PCM Base64

3

แปลงเป็นไฟล์ WAV

ใช้ Function Node แปลงข้อมูล PCM เป็นไฟล์ WAV ที่เปิดได้

4

บันทึกไฟล์เสียง

บันทึกไฟล์ WAV ลงในระบบหรือส่งต่อไปใช้งาน

📝 ขั้นตอนการสร้าง Workflow

ขั้นที่ 1: สร้าง HTTP Request Node

การตั้งค่า HTTP Request

  • Method: POST
  • URL: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent?key=YOUR_API_KEY
  • Headers: Content-Type: application/json

ตัวอย่าง Request Body:

{
  "contents": [{
    "parts":[{
      "text": "สวัสดีครับ ยินดีต้อนรับสู่ระบบ Text-to-Speech ของ Gemini"
    }]
  }],
  "generationConfig": {
    "responseModalities": ["AUDIO"],
    "speechConfig": {
      "voiceConfig": {
        "prebuiltVoiceConfig": {
          "voiceName": "Kore"
        }
      }
    }
  },
  "model": "gemini-2.5-flash-preview-tts"
}

ขั้นที่ 2: สร้าง Function Node แปลง PCM เป็น WAV

Code สำหรับแปลงไฟล์เสียง

// ดึงข้อมูล 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`
    }
  }
}];

ขั้นที่ 3: บันทึกไฟล์เสียง

ใช้ Write Binary File Node

  • File Path: /path/to/output/{{$json.fileName}}
  • Property Name: audio
  • Create Directories: true

🎤 รายชื่อเสียงและการปรับแต่ง

รายชื่อเสียงทั้ง 30 เสียง

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 - อบอุ่น

เสียงแนะนำสำหรับภาษาไทย

📰 เนื้อหาทางการ/ข่าว

  • Kore (Corporate)
  • Charon (Informative)
  • Rasalgethi (Informative)

🎉 เนื้อหาบันเทิง

  • Puck (Upbeat)
  • Fenrir (Excitable)
  • Laomedeia (Rhythmic)

🧘 เนื้อหาผ่อนคลาย

  • Aoede (Breezy)
  • Callirrhoe (Casual)
  • Vindemiatrix (Gentle)

การควบคุมอารมณ์เสียงด้วย Prompt

💡 วิธีการใช้ Prompt: คุณสามารถควบคุมอารมณ์และน้ำเสียงได้โดยเพิ่มคำสั่งหน้าข้อความ
ประเภทคำสั่ง ตัวอย่างการใช้
อารมณ์ พูดด้วยความตื่นเต้น:, พูดอย่างเศร้า:, พูดอย่างสนุกสนาน:
ระดับเสียง พูดเสียงเบาๆ:, กระซิบ:, ตะโกน:
ความเร็ว พูดช้าๆ:, พูดเร็ว:, พูดช้าและชัดเจน:
น้ำเสียง พูดอย่างเป็นทางการ:, พูดแบบเป็นกันเอง:, พูดแบบมืออาชีพ:

🚀 ตัวอย่างการใช้งานขั้นสูง

การสร้างเสียงหลายผู้พูด

{
  "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"
}

Use Cases ที่น่าสนใจ

  • ระบบประกาศอัตโนมัติในสำนักงาน
  • แปลงบทความบล็อกเป็นพอดแคสต์
  • ระบบ IVR สำหรับ Call Center
  • แจ้งเตือนด้วยเสียงผ่าน Line Notify
  • สร้างคอนเทนต์เสียงสำหรับ Social Media
  • ระบบอ่านข่าวอัตโนมัติ
  • เสียงบรรยายสำหรับวิดีโอ
  • 🔧 การแก้ไขปัญหา

    ปัญหาที่พบบ่อย

    ⚠️ ไฟล์เสียงเปิดไม่ได้ ตรวจสอบว่าใช้ Function Node แปลง PCM เป็น WAV แล้ว และตั้งค่า sample rate = 24000 Hz
    ⚠️ API Error 400
    • ตรวจสอบ API Key ให้ถูกต้อง
    • ตรวจสอบชื่อโมเดลให้ตรงกับที่รองรับ
    • ตรวจสอบ voiceName ให้ตรงกับรายการที่มี
    ⚠️ เสียงไม่ชัด
    • ลองเปลี่ยนเสียงอื่นที่เหมาะกับเนื้อหา
    • ปรับคำสั่งในข้อความให้ชัดเจนขึ้น
    • ตรวจสอบว่าข้อความไม่ยาวเกินไป

    การ Debug

    // เพิ่มใน 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);

    📊 ข้อจำกัดและข้อควรระวัง

    🔢 Token Limit

    32,000 tokens ต่อ request

    🌐 ภาษาที่รองรับ

    24 ภาษา รวมถึงภาษาไทย

    🎵 รูปแบบเสียง

    Mono 16-bit 24kHz PCM

    💡 Tips & Tricks

    1. เตรียมข้อความ

    ใช้ Set Node เตรียมข้อความที่ซับซ้อนก่อนส่ง

    2. ตรวจสอบความยาว

    ใช้ IF Node ตรวจสอบความยาวข้อความไม่เกิน limit

    3. ประมวลผลเป็นชุด

    ใช้ Wait Node เว้นระยะหากประมวลผลหลายรายการ

    4. บันทึก Metadata

    เก็บข้อมูลไฟล์เสียงไว้ใน Database

    5. รับข้อความอัตโนมัติ

    ใช้ Webhook รับข้อความจากแอปอื่น

    6. Error Handling

    ใช้ Try-Catch สำหรับจัดการ error

    📈 Workflow ตัวอย่าง

    📰 ระบบอ่านข่าวอัตโนมัติ

    1. RSS Feed Node - ดึงข่าวใหม่
    2. Set Node - จัดรูปแบบข้อความ
    3. HTTP Request - เรียก Gemini API
    4. Function Node - แปลงเป็น WAV
    5. Telegram Node - ส่งไฟล์เสียง

    📢 ระบบประกาศ

    1. Google Sheets - อ่านข้อความประกาศ
    2. Loop Node - วนลูปแต่ละข้อความ
    3. HTTP Request - สร้างเสียง
    4. Function Node - แปลงไฟล์
    5. FTP Node - อัพโหลดไฟล์

    🎙️ Podcast Generator

    1. WordPress Node - ดึงบทความ
    2. Set Node - เพิ่ม intro/outro
    3. HTTP Request - Multi-speaker TTS
    4. Function Node - แปลงเสียง
    5. S3 Node - เก็บไฟล์

    🔗 ทรัพยากรเพิ่มเติม

    🛠️ เครื่องมือที่เกี่ยวข้อง
    • n8n Community Nodes สำหรับ Audio Processing
    • FFmpeg สำหรับแปลงไฟล์เสียงขั้นสูง
    • Audacity สำหรับแก้ไขไฟล์เสียง

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

    ตั้งค่าความเป็นส่วนตัว

    คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

    ยอมรับทั้งหมด
    จัดการความเป็นส่วนตัว
    • คุกกี้ที่จำเป็น
      เปิดใช้งานตลอด

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

    • คุกกี้เพื่อการวิเคราะห์

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

    • คุกกี้เพื่อปรับเนื้อหาให้เข้ากับกลุ่มเป้าหมาย

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

    บันทึกการตั้งค่า