From 2e38c86ff0d128991bf9f7d4063d511bad70d4a5 Mon Sep 17 00:00:00 2001 From: Sam Alghaithi Date: Mon, 7 Sep 2026 14:09:12 -0700 Subject: [PATCH 1/3] docs: add Gandr to the Custom TTS section --- fern/customization/custom-tts/gandr.mdx | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 fern/customization/custom-tts/gandr.mdx diff --git a/fern/customization/custom-tts/gandr.mdx b/fern/customization/custom-tts/gandr.mdx new file mode 100644 index 000000000..e22572583 --- /dev/null +++ b/fern/customization/custom-tts/gandr.mdx @@ -0,0 +1,55 @@ +--- +title: Gandr +subtitle: Use Gandr text to speech as a custom voice in Vapi +description: Connect the Gandr text to speech API to Vapi through a custom voice endpoint, hosted by Gandr or deployed on your own server. +slug: customization/custom-tts/gandr +--- + +[Gandr](https://gandr.ai) is a text to speech API built for voice agents. It reads numbers, order IDs and addresses correctly, one engine speaks 23 languages with six voices, every render carries an inaudible watermark, and audio streams back as it is generated. You connect it through a [custom voice](/customization/custom-voices/custom-tts) endpoint. Gandr hosts one for you at `https://tts.gandr.ai/v1/vapi`, and there is a small adapter you can deploy yourself if you want the TTS hop on a server you control. + +A Gandr account and API key are required. + + + + **Hosted:** `https://tts.gandr.ai/v1/vapi` already implements the custom voice contract. It reads the nested `message` envelope, synthesizes at the requested `message.sampleRate` (8000, 16000, 22050, 24000 or 44100) and streams raw 16-bit little-endian mono PCM back. + + **Self-hosted:** deploy the adapter at [github.com/Gandr-AI/gandr-vapi](https://github.com/Gandr-AI/gandr-vapi). It calls Gandr's OpenAI-compatible speech endpoint and implements the same contract, so the assistant config is identical apart from the URL. + + + Store your Gandr key in a [custom credential](/server-url/server-authentication) so it never travels in the assistant config, then reference it: + + ```json + { + "voice": { + "provider": "custom-voice", + "server": { + "url": "https://tts.gandr.ai/v1/vapi", + "credentialId": "", + "timeoutSeconds": 10 + } + } + } + ``` + + Start a call and your assistant speaks with a Gandr voice. The stock voices are `gandr-ava`, `gandr-dane`, `gandr-jenny`, `gandr-leo`, `gandr-lewis` and `gandr-mia`, and any of the 23 languages can be set per request, independent of the voice. + + + +## Troubleshooting + +| Symptom | Fix | +| --- | --- | +| Audio plays at the wrong speed or pitch | Vapi expects mono 16-bit little-endian PCM at exactly `message.sampleRate`, with no WAV header. The hosted endpoint does this; if you run the adapter, check that it passes the requested rate through | +| Voice or pronunciation edits don't take effect | Vapi caches custom voice audio. Set `"cachingEnabled": false` on the `voice` object while iterating | +| The call times out | Check that the Gandr key in the custom credential is active and that the endpoint URL answers over HTTPS | + +## Related + + + + The step by step dashboard setup for the hosted endpoint. + + + Voices, languages, formats and the OpenAI-compatible speech endpoint. + + From 20ae28ea03deb1c7b0d9eaa70482fd42e5291fea Mon Sep 17 00:00:00 2001 From: Sam Alghaithi Date: Mon, 7 Sep 2026 14:09:14 -0700 Subject: [PATCH 2/3] docs: register the Gandr Custom TTS page in the navigation --- fern/docs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fern/docs.yml b/fern/docs.yml index ef815129a..b8a6764c4 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -315,6 +315,8 @@ navigation: contents: - page: Gradium path: customization/custom-tts/gradium.mdx + - page: Gandr + path: customization/custom-tts/gandr.mdx - section: Custom LLMs icon: fa-light fa-brain-circuit contents: From ed009c2cbe63806de19733354cda2b11c0978bb8 Mon Sep 17 00:00:00 2001 From: Sam Alghaithi Date: Mon, 7 Sep 2026 14:11:20 -0700 Subject: [PATCH 3/3] docs: tighten the Gandr custom-voice page wording and link the self-hosted adapter --- fern/customization/custom-voices/gandr.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fern/customization/custom-voices/gandr.mdx b/fern/customization/custom-voices/gandr.mdx index 42729f5a4..81181bf1a 100644 --- a/fern/customization/custom-voices/gandr.mdx +++ b/fern/customization/custom-voices/gandr.mdx @@ -5,9 +5,9 @@ description: Wire Gandr, a text to speech API for voice agents, into Vapi with t slug: customization/custom-voices/gandr --- -Gandr is a text to speech API built for voice agents. It reads numbers, dates, order IDs and addresses correctly, one engine speaks 23 languages with six voices, and every render carries an inaudible watermark. Audio streams back as it is generated. +Gandr is a text to speech API built for voice agents. It reads numbers, order IDs and addresses correctly, one engine speaks 23 languages with six voices, and every render carries an inaudible watermark. Audio streams back as it is generated. -Gandr's `/v1/vapi` endpoint implements the custom-voice contract described in the [Custom TTS guide](/customization/custom-voices/custom-tts): it reads the nested `message` envelope, honours the requested `sampleRate` (8000, 16000, 22050, 24000 or 44100), and returns raw 16-bit little-endian mono PCM. +Gandr's `/v1/vapi` endpoint implements the custom-voice contract described in the [Custom TTS guide](/customization/custom-voices/custom-tts): it reads the nested `message` envelope, honours the requested `sampleRate` (8000, 16000, 22050, 24000 or 44100), and returns raw 16-bit little-endian mono PCM. To run the TTS hop on a server you control instead, deploy the small adapter at [github.com/Gandr-AI/gandr-vapi](https://github.com/Gandr-AI/gandr-vapi); it calls Gandr's OpenAI-compatible speech endpoint and implements this same contract. A Gandr account and API key are required.