AutomationFlowsAI & RAG › Create Narrated Blog Audio From RSS with Google Gemini, Smallest.ai and…

Create Narrated Blog Audio From RSS with Google Gemini, Smallest.ai and…

Original n8n title: Create Narrated Blog Audio From RSS with Google Gemini, Smallest.ai and Wordpress

ByZain Khan @zain on n8n.io

This workflow polls a blog RSS feed, rewrites new posts into a spoken-word script using Google Gemini, generates an MP3 with Smallest.ai, uploads it to Google Drive, and updates the matching WordPress post to embed a public audio player. Polls an RSS feed every minute to detect…

Event trigger★★★★☆ complexityAI-powered13 nodesRss Feed Read TriggerAgentN8N Nodes Preview SmallestaiGoogle DriveWordPressGoogle Gemini Chat
AI & RAG Trigger: Event Nodes: 13 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #17097 — we link there as the canonical source.

This workflow follows the Agent → Google Drive recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "id": "ca016747-29fc-49a3-8878-4582ce6e5156",
      "name": "RSS Feed Trigger",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "position": [
        384,
        240
      ],
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "04c24d1a-b0fe-47ad-a5bd-a83590b4c217",
      "name": "Code - Strip HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        576,
        240
      ],
      "parameters": {
        "jsCode": "const raw = $input.first().json['content:encoded'] || $input.first().json.content || $input.first().json.summary || '';\n\n// Strip all HTML tags\nconst stripped = raw\n  .replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n  .replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n  .replace(/<[^>]+>/g, ' ')\n  .replace(/&nbsp;/g, ' ')\n  .replace(/&amp;/g, '&')\n  .replace(/&lt;/g, '<')\n  .replace(/&gt;/g, '>')\n  .replace(/&quot;/g, '\"')\n  .replace(/&#39;/g, \"'\")\n  .replace(/\\s{2,}/g, ' ')\n  .trim();\n\nreturn [{ json: { textContent: stripped } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "48a4ceeb-0866-4f59-8dbf-935ba5c6ce3b",
      "name": "Set - Standardize Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        832,
        240
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "45ada316-2469-41a9-8c08-74a5779676cd",
      "name": "AI Agent - Rewrite for Audio",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1040,
        240
      ],
      "parameters": {
        "text": "={{ $json.textContent }}",
        "options": {
          "systemMessage": "You are an audio content editor for a blog publishing company.\n\nYou will receive a blog post in plain text. Your job is to rewrite it so it sounds natural and engaging when read aloud by a text-to-speech engine.\n\nFollow these rules strictly:\n- Read the full text and identify the core topic\n- Remove any leftover URLs, image captions, photo credits, or meta text\n- Replace all bullet points and numbered lists with flowing, connected sentences\n- Spell out numbers (e.g. \"3\" becomes \"three\"), symbols (e.g. \"&\" becomes \"and\"), and abbreviations\n- Do NOT include any headings or section titles \u2014 write it as one continuous spoken piece\n- Add a natural intro at the start: \"In today's post, we're covering [topic]...\"\n- Add a natural outro at the end: \"That's all for today. Head to our website to read the full article and subscribe for more content like this.\"\n- Keep the total output under 500 words\n- Write at a 7th grade reading level \u2014 clear, conversational, and easy to follow\n\nReturn ONLY the final rewritten script as plain text.\nDo not include any explanation, commentary, JSON, markdown, or formatting of any kind.\n\nIMPORTANT: Your total output must be under 700 words and under 4000 characters. Be concise."
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "013c9e56-3805-477c-923a-aca1cca2acf9",
      "name": "Smallest AI - Synthesize Speech",
      "type": "n8n-nodes-preview-smallestai.smallestai",
      "position": [
        1440,
        272
      ],
      "parameters": {
        "resource": "tts",
        "operation": "synthesize"
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "1d50201e-df25-41ac-a235-1dc59b3e6447",
      "name": "Google Drive - Upload Audio",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1648,
        272
      ],
      "parameters": {
        "name": "={{ $('RSS Feed Trigger').item.json.title }}_audio.mp3",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "29b62128-f2de-4a39-a910-f7dacfd3e03e",
      "name": "Google Drive - Make Public",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1840,
        272
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "share",
        "permissionsUi": {
          "permissionsValues": {
            "role": "reader",
            "type": "anyone"
          }
        }
      },
      "typeVersion": 3
    },
    {
      "id": "4062a33e-8621-41b0-974a-ca01c34c70e4",
      "name": "WordPress - Embed Audio Player",
      "type": "n8n-nodes-base.wordpress",
      "position": [
        2016,
        272
      ],
      "parameters": {
        "postId": "={{ $('RSS Feed Trigger').first().json.guid }}",
        "operation": "update",
        "updateFields": {
          "content": "==<div style=\"margin-bottom:24px;background:#f9f9f9;padding:16px;border-radius:8px;border:1px solid #e0e0e0;\"><p style=\"margin:0 0 8px 0;font-weight:600;font-size:14px;\">\ud83c\udfa7 Listen to this article</p><audio controls style=\"width:100%;display:block;\"><source src=\"{{ $('Google Drive - Upload Audio').item.json.webViewLink }}\" type=\"audio/mpeg\"></audio></div>{{ $('Set - Standardize Fields').item.json.textContent }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3683ca41-39b9-485c-a8cf-add19232a735",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1072,
        416
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "ad6d20a0-ffdc-49bd-8f2d-b48270f664c6",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        32
      ],
      "parameters": {
        "width": 512,
        "height": 592,
        "content": "## Blog RSS to Narrated Audio\n\n### How it works\nThis workflow automates content repurposing by turning written blog posts into narrated audio articles. It periodically polls your website's RSS feed for new articles. When a new post is detected, a custom JavaScript node strips out HTML tags and prepares the raw text. An AI Agent powered by Google Gemini then rewrites the article content to make it optimal for a natural, spoken-word listening experience.\n\n### Setup steps\n* Configure the URL path of your target blog inside the **RSS Feed Trigger** node.\n* Authenticate your **Google Gemini** configuration inside the LangChain Chat Model node.\n* Connect your **Smallest.ai** credentials to handle speech synthesis.\n* Link your target **Google Drive** and **WordPress** accounts to host the audio and publish the updated media elements.\n\n### Customization\nYou can modify the system instructions in the **AI Agent - Rewrite for Audio** node to dictate a specific tone, add a signature intro/outro, or control the target narration length. You can also alter the WordPress node settings to customize where and how the audio player embed code is added to your articles."
      },
      "typeVersion": 1
    },
    {
      "id": "944d8383-b330-45f7-bf85-3661ee85893c",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 336,
        "content": "## Feed Ingestion & Text Extraction\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6c6d73b4-146c-4238-8074-a91a2393de30",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 448,
        "content": "## Voice Adaptation & Speech Synthesis\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ef1d122c-5404-4a4c-9d94-c4519c0df3b6",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 848,
        "height": 368,
        "content": "## Media Hosting & Site Integration\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "RSS Feed Trigger": {
      "main": [
        [
          {
            "node": "Code - Strip HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Strip HTML": {
      "main": [
        [
          {
            "node": "Set - Standardize Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Rewrite for Audio",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Set - Standardize Fields": {
      "main": [
        [
          {
            "node": "AI Agent - Rewrite for Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive - Make Public": {
      "main": [
        [
          {
            "node": "WordPress - Embed Audio Player",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive - Upload Audio": {
      "main": [
        [
          {
            "node": "Google Drive - Make Public",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Rewrite for Audio": {
      "main": [
        [
          {
            "node": "Smallest AI - Synthesize Speech",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Smallest AI - Synthesize Speech": {
      "main": [
        [
          {
            "node": "Google Drive - Upload Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow polls a blog RSS feed, rewrites new posts into a spoken-word script using Google Gemini, generates an MP3 with Smallest.ai, uploads it to Google Drive, and updates the matching WordPress post to embed a public audio player. Polls an RSS feed every minute to detect…

Source: https://n8n.io/workflows/17097/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow is designed for marketers, content creators, agencies, and solo founders who want to publish long‑form posts with visuals on autopilot using n8n and AI agents. ​

Tool Http Request, Agent, HTTP Request +27
AI & RAG

This workflow is for beauty salons who want consistent, high‑quality social media content without writing every post manually. It also suits agencies and automation builders who manage multiple beauty

Telegram, Google Sheets Trigger, Agent +26
AI & RAG

Arvifund - Supabase (Fixed v6). Uses httpRequest, telegram, supabase, telegramTrigger. Event-driven trigger; 92 nodes.

HTTP Request, Telegram, Supabase +8
AI & RAG

Arvifund - Supabase (Fixed v5). Uses httpRequest, telegram, googleSheets, telegramTrigger. Event-driven trigger; 91 nodes.

HTTP Request, Telegram, Google Sheets +9
AI & RAG

Arvifund - Supabase. Uses httpRequest, telegram, googleSheets, telegramTrigger. Event-driven trigger; 90 nodes.

HTTP Request, Telegram, Google Sheets +8