cd /news/ai-tools/how-to-add-ai-voice-to-your-django-a… · home › topics › ai-tools › article
[ARTICLE · art-155716] src=dev.to ↗ pub= topic=ai-tools verified=true sentiment=↑ positive

How to Add AI Voice to Your Django App

A developer published a walkthrough for adding AI text-to-speech to a Django application using the ElevenLabs REST API, with async httpx calls wrapped in a reusable synthesize() function and an example /speak/ endpoint that returns MP3 audio. The guide also covers cloning a user's voice from uploaded samples and storing the resulting voice_id on the user model, plus notes on streaming audio for real-time chatbot use cases.

by read3 min views1 publishedOct 23, 2026

Voice has become the new “screen” for many users. From hands‑free navigation to accessibility, integrating AI‑generated speech can make your Django project feel more natural and inclusive. Whether you’re building a customer‑support chatbot, an audiobook generator, or a language‑learning platform, adding text‑to‑speech (TTS) is a quick way to boost engagement.

When you need a reliable, high‑quality TTS service that supports voice cloning, ElevenLabs is a popular choice. Their API offers dozens of realistic voices, fine‑grained control over speaking rate, pitch, and more—all wrapped in a developer‑friendly REST interface.

If you’re looking for a service that’s easy to set up and scales with your Django app, try ElevenLabs: https://try.elevenlabs.io/kr07zfuqn1bp

.env file:

ELEVENLABS_API_KEY=sk_your_key_here

While you can use curl or any HTTP library, Django developers often prefer httpx for async support.

pip install httpx

Create a new module, e.g., voice.py, and add:

import os
import httpx
from django.conf import settings

ELEVENLABS_API_URL = "https://api.elevenlabs.io/v1/text-to-speech"

async def synthesize(text: str, voice_id: str = "Bella", output_path: str = None):
    """
    Convert text to speech using ElevenLabs.
    """
    headers = {
        "accept": "audio/mpeg",
        "xi-api-key": settings.ELEVENLABS_API_KEY,
        "Content-Type": "application/json",
    }

    payload = {
        "text": text,
        "voice_settings": {
            "stability": 0.5,
            "similarity_boost": 0.75,
        },
    }

    async with httpx.AsyncClient() as client:
        resp = await client.post(
            f"{ELEVENLABS_API_URL}/{voice_id}", json=payload, headers=headers
        )
        resp.raise_for_status()

    audio_bytes = resp.content

    if output_path:
        with open(output_path, "wb") as f:
            f.write(audio_bytes)
    return audio_bytes

The voice_id parameter can be any voice you’ve enabled in your ElevenLabs dashboard. “Bella” is a default, but you can list all voices with another endpoint if you need to present options to users.

Here’s a quick example of an endpoint that returns an audio file directly:

from django.http import HttpResponse
from .voice import synthesize

async def speak(request):
    """
    API endpoint: /speak/?text=Hello%20world
    Returns an MP3 file generated by ElevenLabs.
    """
    text = request.GET.get("text", "Hello, world!")
    audio = await synthesize(text, voice_id="Bella")
    return HttpResponse(audio, content_type="audio/mpeg")

Add the URL in urls.py:

from django.urls import path
from .views import speak

urlpatterns = [
    path("speak/", speak, name="speak"),
]

Now, visiting /speak/?text=Good%20morning%20everyone will stream a polished voice directly in the browser.

If you want your users to speak in a personalized voice, ElevenLabs supports cloning with just a few samples. The process:

voice_id you’ll use in subsequent requests. synthesize function.

async def clone_voice(uploaded_audio):
    headers = {"xi-api-key": settings.ELEVENLABS_API_KEY}
    files = {"audio_file": ("sample.wav", uploaded_audio, "audio/wav")}

    async with httpx.AsyncClient() as client:
        resp = await client.post(
            "https://api.elevenlabs.io/v1/voices",
            headers=headers,
            files=files,
        )
        resp.raise_for_status()
        return resp.json()["voice_id"]

You can expose this as a Django view that accepts file uploads. Once the voice is cloned, store the voice_id in your user model for later use.

For real‑time applications (e.g., a chatbot that speaks instantly), you’ll want to stream the audio rather than buffering the whole file. ElevenLabs supports streaming via WebSockets or by returning raw audio/mpeg chunks. In Django, you can use StreamingHttpResponse:

from django.http import StreamingHttpResponse

async def stream_speak(request):
    text = request.GET.get("text", "Hello")
    async def generator():
        audio = await synthesize(text, voice_id="Bella")
        yield audio

    return StreamingHttpResponse(generator(), content_type="audio/mpeg")

For production deployments, consider:

curl Example If you’re debugging or want to try it from the terminal:

curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/Bella" \
     -H "Content-Type: application/json" \
     -H "xi-api-key: $ELEVENLABS_API_KEY" \
     -d '{"text":"Hello from ElevenLabs!","voice_settings":{"stability":0.5,"similarity_boost":0.75}}' \
     --output hello.mp3

Open hello.mp3 to hear the result.

Adding AI voice to a Django app is surprisingly straightforward:

By following the snippets above, you’ll have a functional TTS endpoint in minutes, ready to be integrated into your UI, API, or background workers.

Ready to give your Django app a voice? Dive into ElevenLabs today and transform text into natural, expressive speech: https://try.elevenlabs.io/kr07zfuqn1bp

Happy coding!

── more in #ai-tools 4 stories · sorted by recency
── more on @django 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/how-to-add-ai-voice-…] indexed:0 read:3min 2026-10-23 · —