สร้างพอดแคสต์อัตโนมัติด้วย Text to Speech จาก Google AI Studio และ n8n แบบง่ายๆ

สร้างพอดแคสต์อัตโนมัติด้วย Text to Speech จาก Google AI Studio และ n8n (เหมาะสำหรับมือใหม่)

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

ในบทความนี้เราจะพาคุณไปรู้จักกับการใช้ Text to Speech (TTS) เพื่อแปลงข้อความเป็นเสียงโดยอัตโนมัติผ่านบริการ Google AI Studio และผสานกับ n8n ซึ่งเป็นเครื่องมือ workflow automation ที่ใช้งานง่ายและฟรี เพื่อสร้างพอดแคสต์อัตโนมัติจากข้อความในไม่กี่คลิก เหมาะกับมือใหม่ที่ไม่มีพื้นฐานการเขียนโค้ดมาก่อน


🔧 ทำความรู้จักเครื่องมือที่ใช้

1. n8n คืออะไร?

n8n (อ่านว่า “เอน-เอด”) เป็นเครื่องมือทำงานแบบ workflow automation ที่ใช้งานง่ายแบบ drag & drop คล้าย Zapier หรือ Make.com แต่ฟรีและเปิดให้ใช้งานได้อย่างยืดหยุ่น คุณสามารถตั้งค่าให้ระบบทำงานอัตโนมัติหลายขั้นตอน เช่น ดึงข้อมูล แปลงข้อความ ส่งอีเมล หรือสร้างพอดแคสต์อย่างที่เราจะทำกันวันนี้

2. Google AI Studio และ Text to Speech (TTS)

Google AI Studio เป็นแพลตฟอร์มที่ Google เปิดให้ใช้งาน AI ด้านการประมวลผลภาษาธรรมชาติ รวมถึงฟีเจอร์ Text to Speech (TTS) ที่สามารถแปลงข้อความธรรมดาให้เป็นเสียงพูดสมจริง รองรับหลายภาษา รวมถึงภาษาไทยด้วย


🎯 เป้าหมายของ Workflow นี้

เราจะสร้างระบบอัตโนมัติที่สามารถ:

  1. รับหัวข้อหรือข้อความพอดแคสต์
  2. ส่งข้อความไปแปลงเสียงผ่าน TTS
  3. บันทึกเสียงเป็นไฟล์ .wave
  4. พร้อมโพสต์หรือส่งออก

Workflow Step-by-Step (พร้อมโค้ด)

chat triger node สำหรับส่งบทความพอดแคสเรา

HTTP REQUEST node สำหรับเชื่อมต่อ google text to speech

coppy json file นี้ไปวางใน text editor แล้วก็ import เข้า n8n workflow ไปเล้ยยยแต่ต้องไปเปลี่ยน API key ของ google ai เอาเองนะ

{
  "name": "podcast",
  "nodes": [
    {
      "parameters": {
        "public": true,
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.1,
      "position": [
        -200,
        -120
      ],
      "id": "5082e02e-6ab6-42a1-82d9-bf08c40d584e",
      "name": "When chat message received",
      "webhookId": "e8b4a54d-0506-46bb-9760-75a53db590c6"
    },
    {
      "parameters": {
        "jsCode": "// n8n Code Node - Audio Processing\n// Process base64 audio data and create WAV file output\n\n// Function to create WAV header for PCM data\nfunction createWavHeader(dataLength, channels = 1, sampleRate = 24000, bitsPerSample = 16) {\n  const header = new ArrayBuffer(44);\n  const view = new DataView(header);\n  \n  // RIFF header\n  view.setUint32(0, 0x46464952, true); // \"RIFF\"\n  view.setUint32(4, 36 + dataLength, true); // File size - 8\n  view.setUint32(8, 0x45564157, true); // \"WAVE\"\n  \n  // Format chunk\n  view.setUint32(12, 0x20746d66, true); // \"fmt \"\n  view.setUint32(16, 16, true); // Format chunk size\n  view.setUint16(20, 1, true); // Audio format (PCM)\n  view.setUint16(22, channels, true); // Number of channels\n  view.setUint32(24, sampleRate, true); // Sample rate\n  view.setUint32(28, sampleRate * channels * (bitsPerSample / 8), true); // Byte rate\n  view.setUint16(32, channels * (bitsPerSample / 8), true); // Block align\n  view.setUint16(34, bitsPerSample, true); // Bits per sample\n  \n  // Data chunk\n  view.setUint32(36, 0x61746164, true); // \"data\"\n  view.setUint32(40, dataLength, true); // Data size\n  \n  return new Uint8Array(header);\n}\n\n// Function to combine WAV header with audio data\nfunction createWavFile(pcmData, channels = 1, sampleRate = 24000, bitsPerSample = 16) {\n  const header = createWavHeader(pcmData.length, channels, sampleRate, bitsPerSample);\n  const wavFile = new Uint8Array(header.length + pcmData.length);\n  \n  wavFile.set(header, 0);\n  wavFile.set(pcmData, header.length);\n  \n  return wavFile;\n}\n\n// Main processing function\ntry {\n  // Get the input data\n  const inputData = $input.first().json;\n  \n  // Extract base64 audio data from the input structure\n  let base64Data;\n  \n  // Handle different possible input structures\n  if (inputData.body && inputData.body[0] && inputData.body[0].candidates) {\n    // Google AI response structure\n    base64Data = inputData.body[0].candidates[0].content.parts[0].inlineData.data;\n  } else if (inputData.data) {\n    // Direct data field\n    base64Data = inputData.data;\n  } else if (inputData.audio) {\n    // Audio field\n    base64Data = inputData.audio;\n  } else {\n    throw new Error('Could not find base64 audio data in input');\n  }\n  \n  // Convert base64 to buffer\n  const audioBuffer = Buffer.from(base64Data, 'base64');\n  \n  // Create WAV file with header\n  const wavData = createWavFile(new Uint8Array(audioBuffer));\n  \n  // Convert back to base64 for n8n output\n  const wavBase64 = Buffer.from(wavData).toString('base64');\n  \n  // Return the processed data\n  return [\n    {\n      json: {\n        success: true,\n        fileName: 'processed_audio.wav',\n        audioData: wavBase64,\n        originalSize: audioBuffer.length,\n        wavSize: wavData.length,\n        mimeType: 'audio/wav'\n      },\n      binary: {\n        audio: {\n          data: wavBase64,\n          mimeType: 'audio/wav',\n          fileName: 'processed_audio.wav'\n        }\n      }\n    }\n  ];\n  \n} catch (error) {\n  // Return error information\n  return [\n    {\n      json: {\n        success: false,\n        error: error.message,\n        inputStructure: Object.keys($input.first().json)\n      }\n    }\n  ];\n}"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        640,
        -100
      ],
      "id": "60b913cc-0f9f-4e57-973a-ba9a3b9e67ae",
      "name": "Code"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:streamGenerateContent",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "key",
              "value": "ใส่ Google API KEY ของเราลงไปตรงช่องนี้"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"contents\": [\n    {\n      \"role\": \"user\",\n      \"parts\": [\n        {\n          \"text\": \"{{ $json.message.content }}\"\n        }\n      ]\n    }\n  ],\n  \"generationConfig\": {\n    \"responseModalities\": [\n      \"audio\"\n    ],\n    \"temperature\": 1,\n    \"speech_config\": {\n      \"voice_config\": {\n        \"prebuilt_voice_config\": {\n          \"voice_name\": \"Orus\"\n        }\n      }\n    }\n  }\n}\n",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        300,
        -140
      ],
      "id": "2cf64bee-ceed-4ce4-837b-fbac2cf2b541",
      "name": "HTTP Request"
    }
  ],
  "pinData": {},
  "connections": {
    "When chat message received": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        []
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "586aeadc-15d6-4e86-adf0-7f94debbb204",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "fc9f0dff6f39c36c5c8265e21dc77cb8d5046083aab5149167fee000369f26f0"
  },
  "id": "YlXom9f3n1vWsltN",
  "tags": []
}

เมื่อใส่เข้าไปหน้าตามันจะออกมาแบบนี้

จากนั้นเราก็ไปเอา Google API key มาใส่

✅ เหมาะกับใคร?

  • ยูทูบเบอร์หรือนักคอนเทนต์ที่ไม่มีเวลาอัดเสียง
  • เจ้าของเพจข่าว/สาระที่ต้องการเพิ่มช่องทางเสียง
  • ธุรกิจที่ต้องการระบบเสียงอัตโนมัติ เช่น เมนูโทรศัพท์, พรีเซ็นต์ AI

📌 สรุป: พลังของ Text to Speech + n8n

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

ตัวอย่าง Podcast ที่สร้างด้วย Google AI studio

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top