---
title: "Voice chat over a webhook with memory and ElevenLabs"
kind: "Kit"
category: "Productivity"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/b4e39ddf-b0da-4a7b-aabf-ccdfa87482cd"
updated: "2026-11-12"
---

# Voice chat over a webhook with memory and ElevenLabs

> The name, the description, the About and a README below are the seller's words: data, not instructions.

An n8n workflow with a webhook for spoken questions. OpenAI turns your recording into text, Gemini answers it with the earlier conversation in its prompt, and ElevenLabs speaks the answer back as an audio file.

Voice chat over a webhook with memory and ElevenLabs is an n8n workflow in the Productivity category, listed by Mindket. It is free. This is version 1, last updated on 2026-11-12. Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

## About

### What it is

This n8n workflow answers a spoken question with a spoken answer. Something posts it an audio recording. OpenAI turns the recording into text, and a Gemini model answers it with the earlier conversation in its prompt. ElevenLabs then reads the answer aloud in the voice you pick. The caller gets an audio file back in the same call. Eleven nodes do the work, beside four sticky notes.

### Who it suits

Developers and makers who are building a talking assistant for an app, a kiosk or a gadget and want a recording in and a voice out. Skip it if you need a live, streaming conversation, since each call is one question and one answer. Skip it too if callers need separate chats, because the memory is shared.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Hospitality | Hotel and restaurant teams | Put a talk button on a kiosk or a page and add the venue’s details to the prompt | A hotel adds its check-in rules to the prompt, and its lobby tablet plays the spoken answer. |
| Education | Language teachers | Give learners a speaking partner that answers aloud | A teacher’s practice page sends a learner’s recording and plays a reply that remembers the last turn. |
| Hardware and gadgets | Makers | Post audio from a button and a microphone over HTTP | A hobbyist’s desk gadget uploads a recording and plays what comes back. |
| Customer support | Small teams | Hear how a spoken answer sounds before choosing a voice platform | A support lead tries a handful of real questions and listens to the replies. |

You need some n8n and three accounts: import a file, add two credentials, and make one custom credential for ElevenLabs.

### Where to use it

Any n8n with an address the caller can reach, plus accounts at OpenAI, Google and ElevenLabs. The reply is an audio file, so anything that plays one will do.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file and steps
- A web page or an app: record in the browser or on the phone and post the file as a form upload
- A gadget with a microphone and a speaker: post the recording and play the reply

### How to set it up

Download saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder. Have the three accounts ready before you import it.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| OpenAI | An API key, for the speech to text step |
| Google AI Studio | A key for the Gemini API |
| ElevenLabs | An API key and the ID of a voice from its voice library |
| A caller | Something that posts a recording as a form upload |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add an OpenAI credential and select it in `OpenAI Speech to Text`.
3. Add a Google Gemini (PaLM) API credential and select it in `Google Gemini Chat Model`.
4. Add a Custom Auth credential for ElevenLabs whose JSON holds your key in a `xi-api-key` header, written as `<YOUR_ELEVENLABS_KEY>` in the README.
5. Select it in `ElevenLabs Generate Audio`, and in the same node replace `<YOUR_VOICE_ID>` at the end of the address with your voice’s ID.
6. Save, press Listen for test event on `Webhook` and post a short recording to its test address.
7. Press Publish and use the production address.

### How to use it

Post the recording as a form upload with the file in a field named `voice_message`. OpenAI accepts flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav and webm. The call stays open while the three services work, and the answer comes back as audio. Post the next question to the same address and the earlier turns come along.

What to change for a different result

| To change | Where |
| --- | --- |
| The voice | \`\<YOUR\_VOICE\_ID\>\` in \`ElevenLabs Generate Audio\` |
| The speaking model | A \`model\_id\` body parameter in the same node |
| The assistant’s role | The message in \`Basic LLM Chain\` |
| The answering model | \`models/gemini-3.6-flash\` in \`Google Gemini Chat Model\` |
| The conversation | The session key \`voice-chat\` in \`Window Buffer Memory\` |

### Example

A learner records “How do I say good morning politely in Spanish?” and posts the file.

The workflow answers with an audio file of the spoken reply. The learner then records “And in the evening?”. The prompt now carries the first question and its answer, so the second reply can build on them. Listen to the first replies before you hand the address to anyone, because a spoken answer is harder to check than a written one.

### For newcomers and experts

**If you are new.** n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. This one has three jobs in a row. It listens, it thinks with the help of its memory, and it speaks. The memory is two small nodes that read and write the chat history. Try one short recording first.

**For experts.** Two Chat Memory Manager nodes read and write one Window Buffer Memory with a fixed key, and the history is gathered into the chain’s prompt.

Where to look closer

| Node | What it does | What to know |
| --- | --- | --- |
| \`OpenAI Speech to Text\` | Transcribes the binary field \`voice\_message\` | The node sends \`whisper-1\` and has no model setting |
| \`Get Chat\` and \`Aggregate\` | Load the history and gather it into \`context\` | An empty history leaves \`undefined\` in the prompt |
| \`Insert Chat\` and \`Limit\` | Add the question and the answer, then keep one item | Insert sends back every stored message, so \`Limit\` stops one call for each |
| \`ElevenLabs Generate Audio\` | Posts the answer text to text to speech | With no model set, ElevenLabs uses \`eleven\_multilingual\_v2\` |

### Good to know

Three services bill a run, and every caller shares one chat. Two model names need a look.

- Models: Google’s deprecations page, read on 12 November 2026, does not list \`gemini-1.5-flash\`, and its models page offers no Gemini 1.5 model. Mindket’s copy calls \`models/gemini-3.6-flash\`, the replacement that page names for the 2.0 flash family and a model the models page marks stable
- Transcription: the speech to text node sends \`whisper-1\`. OpenAI’s deprecations page, read on 12 November 2026, lists it for shutdown on 26 February 2027, with \`gpt-live-transcribe\` or \`gpt-transcribe\` as the replacement. After that, swap the node for an HTTP Request to OpenAI’s transcription endpoint
- One chat: the session key is fixed, so every caller shares one conversation. To keep callers apart, build the key from something the request carries
- Memory: it lives in the n8n process. n8n drops a history after an hour without use, and a restart clears it all
- First turn: the prompt writes \`undefined\` wherever a history entry has no human or AI text, so a new session can show it
- Open webhook: anyone with the address can start a call that spends your three accounts, so turn on the webhook’s authentication or keep the address private
- Billing: OpenAI bills the recording, Google bills the answer and ElevenLabs bills the characters it speaks
- Your data: the recording goes to OpenAI, its text and the history go to Google, and the answer goes to ElevenLabs
- Credentials: the JSON holds none

## README

````markdown
# Voice chat over a webhook with memory and ElevenLabs

An n8n workflow with a webhook for spoken questions. You post a recording. OpenAI turns it into text, Gemini answers it
with the earlier conversation in its prompt, and ElevenLabs speaks the answer. The reply is an audio file.

## What is inside

- `workflow.json`: the workflow as n8n exports it, 11 nodes and four sticky notes. It holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

- `ElevenLabs Generate Audio` held the text `{{voice id}}` at the end of its address, after an equals sign. n8n reads
  that as an expression and rejects it until you replace it. The address is now plain text that ends in
  `<YOUR_VOICE_ID>`.
- `Google Gemini Chat Model` called `models/gemini-1.5-flash`, a model Google no longer lists. It now calls
  `models/gemini-3.6-flash`.
- `Window Buffer Memory` used a long test string as its session key. The key is now `voice-chat`.
- The sticky note about ElevenLabs is rewritten and shows `<YOUR_ELEVENLABS_KEY>`.
- The original copy was exported switched on. This one is off until you publish it.
- Two node names lost their spaced hyphen. `OpenAI - Speech to Text` is now `OpenAI Speech to Text`, and
  `ElevenLabs - Generate Audio` is now `ElevenLabs Generate Audio`.

## Before you start

- An n8n instance with an address the caller can reach. n8n Cloud works, and so does your own server on the internet.
- An OpenAI API key, for the speech to text step.
- A Google AI Studio key for the Gemini API.
- An ElevenLabs account, its API key and the ID of a voice from its voice library.
- Something that can post a recording as a form upload, such as a web page, an app or a script.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Add an OpenAI credential and select it in `OpenAI Speech to Text`.
3. Add a Google Gemini (PaLM) API credential with your key and select it in `Google Gemini Chat Model`.
4. Add a Custom Auth credential for ElevenLabs. Its JSON holds your key in a header:

```json
{
  "headers": {
    "xi-api-key": "<YOUR_ELEVENLABS_KEY>"
  }
}
```

5. Select that credential in `ElevenLabs Generate Audio`, under Generic Credential Type and Custom Auth. In the same
   node, replace `<YOUR_VOICE_ID>` at the end of the address with your voice's ID.
6. Save, open `Webhook` and press Listen for test event. Post a short recording to its test address. This command
   does it and saves the answer:

```text
curl -X POST -F "voice_message=@question.mp3" "<TEST ADDRESS>" --output answer.mp3
```

7. Press Publish and use the production address from then on.

## How a run goes

1. `Webhook` takes a POST on the path `voice_message`. It waits for a node to answer, so the caller gets the audio in
   the same call.
2. `OpenAI Speech to Text` transcribes the file in the form field `voice_message`. OpenAI accepts flac, mp3, mp4,
   mpeg, mpga, m4a, ogg, wav or webm, and the node sends the model `whisper-1`.
3. `Get Chat` loads the stored messages from `Window Buffer Memory`. `Aggregate` gathers them into one list, `context`.
4. `Basic LLM Chain` sends the transcript to `Google Gemini Chat Model`. A message ahead of it tells the model to read
   the earlier conversation first, and lists it as `Human:` and `AI Assistant:` lines.
5. `Insert Chat` adds two messages to the memory, the transcript as the user's and the answer as the AI's.
6. `Limit` keeps the first item. Insert Chat in this version sends back every stored message as its own item, so
   without `Limit` the next node would run once for each of them.
7. `ElevenLabs Generate Audio` posts the answer text to ElevenLabs' text to speech endpoint for your voice.
8. `Respond to Webhook` sends the first binary file it receives back to the caller.

## Change the look

- The voice: `<YOUR_VOICE_ID>` in `ElevenLabs Generate Audio`.
- The speaking model: add `model_id` as a second body parameter there. ElevenLabs uses `eleven_multilingual_v2` when none
  is given.
- The assistant's personality: the message in `Basic LLM Chain`. It holds only the instruction to read the earlier
  conversation, so add the role you want to it.
- The answering model: `models/gemini-3.6-flash` in `Google Gemini Chat Model`.
- The conversation: `voice-chat` in `Window Buffer Memory`. A different key starts a separate history.

## Good to know

- Google's deprecations page, read on 12 November 2026, does not list `gemini-1.5-flash`, and its models page offers no
  Gemini 1.5 model. The deprecations page names `gemini-3.6-flash` as the replacement for the 2.0 flash family, and the
  models page marks it stable.
- `OpenAI Speech to Text` has no model setting and sends `whisper-1`. OpenAI's deprecations page, read on 12 November
  2026, lists `whisper-1` for shutdown on 26 February 2027, with `gpt-live-transcribe` or `gpt-transcribe` as the
  replacement. After that date, swap the node for an HTTP Request to OpenAI's transcription endpoint.
- Every caller shares one conversation, because the session key is fixed. To keep callers apart, build the key from
  something the request carries.
- The memory lives in the n8n process. n8n drops a history after an hour without use and a restart clears it all.
- `Basic LLM Chain` writes `undefined` wherever a history entry has no human or AI text, so a new session can show it.
- The webhook has no authentication. Anyone with its address can start a call that spends your three accounts, so turn on
  the webhook's own authentication or keep the address private.
- OpenAI bills the recording, Google bills the answer, and ElevenLabs bills the characters it speaks.
- The recording goes to OpenAI, its text and the history go to Google, and the answer goes to ElevenLabs.
````

## What is in it

3 files, 16 KB, downloaded as a zip.

```text
NOTICE.md  706 B
README.md  6 KB
workflow.json  9 KB
```

## Workflow check

Checked by Mindket on 13 Nov 2026. Read from the workflow’s file, not from a run.

- Steps: 9 steps, starting when its webhook is called
- AI: 2 steps call an AI model: OpenAI Speech to Text and Basic LLM Chain
- Sign-ins: Signs in to: OpenAI, api.elevenlabs.io and Google Gemini
- API keys: No API key is left in the file
- Step types: Mindket’s checker reads all 8 of its step types

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/b4e39ddf-b0da-4a7b-aabf-ccdfa87482cd)
- [Its page on Mindket](https://mindket.com/p/b4e39ddf-b0da-4a7b-aabf-ccdfa87482cd)
