cd /news/ai-tools/create-a-meditation-app-with-ai-gene… · home › topics › ai-tools › article
[ARTICLE · art-145887] src=dev.to ↗ pub= topic=ai-tools verified=true sentiment=↑ positive

Create a Meditation App with AI-Generated Voice

A developer published a walkthrough for building a meditation app that uses ElevenLabs' text-to-speech API to generate natural-sounding guided narration. The tutorial covers cloning a voice from a short audio sample to obtain a voice_id, then calling the synthesize endpoint with stability and similarity_boost settings to produce MP3 audio for guided breathing scripts. It includes Python and curl examples for both the voice-cloning and synthesis steps.

by read4 min views1 publishedOct 6, 2026

If you’ve ever built a simple chatbot or a notification system, you’ve already worked with APIs, authentication, and the occasional rate limit. Adding a real‑time, natural‑sounding voice turns a text‑based experience into something that feels comforting, personal, and almost therapeutic. For meditation, that’s a game‑changer: a gentle narrator can guide breathing, set intentions, or play ambient sounds—all while keeping your users engaged.

In this post we’ll walk through:

By the end, you’ll have a working prototype that you can extend into a full‑featured meditation app.

Text‑to‑speech (TTS) is a mature field, but most free or open‑source solutions lag behind commercial providers in naturalness, voice variety, and developer experience. ElevenLabs offers:

If you’re looking for a quick, production‑ready voice solution, check out ElevenLabs at https://try.elevenlabs.io/kr07zfuqn1bp. The free tier is generous, and you can upgrade to a paid plan for higher quality and more requests.

A generic “calm” voice can work, but a cloned voice that mimics the user’s own voice or a brand‑specific narrator creates a deeper connection. ElevenLabs’ cloning workflow is simple:

voice_id. Below is a quick Python script to upload a clip and get the voice_id:

import os
import requests

API_KEY = os.getenv("ELEVENLABS_API_KEY")
UPLOAD_URL = "https://api.elevenlabs.io/v1/voices"

headers = {"xi-api-key": API_KEY, "Accept": "application/json"}

with open("sample.wav", "rb") as audio:
    files = {"file": ("sample.wav", audio, "audio/wav")}
    response = requests.post(f"{UPLOAD_URL}/clone", headers=headers, files=files)

if response.ok:
    voice_id = response.json()["voice_id"]
    print("Your cloned voice ID:", voice_id)
else:
    print("Error:", response.text)

Remember to keep the audio file under 3 MB for the free tier. If you need larger samples, upgrade your plan.

Once you have a voice_id, you can use it in subsequent synthesis calls to produce a voice that sounds like the original speaker.

A typical meditation routine might consist of:

We’ll generate these on demand using ElevenLabs’ synthesize endpoint.

import os
import requests

API_KEY = os.getenv("ELEVENLABS_API_KEY")
VOICE_ID = os.getenv("VOICE_ID")  # The cloned voice ID you got earlier
TTS_URL = f"https://api.elevenlabs.io/v1/text-to-speech/{VOICE_ID}"

headers = {
    "xi-api-key": API_KEY,
    "Content-Type": "application/json"
}

def synthesize(text, output_path="output.mp3"):
    payload = {
        "text": text,
        "voice_settings": {
            "stability": 0.5,  # 0-1.0
            "similarity_boost": 0.75
        }
    }
    response = requests.post(TTS_URL, headers=headers, json=payload, stream=True)
    if response.status_code == 200:
        with open(output_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"Saved audio to {output_path}")
    else:
        print("Synthesis failed:", response.text)

script = """
Welcome. Let's take a moment to settle in. 
Close your eyes, and breathe in slowly through your nose.
Hold for a count of three.
Now exhale gently through your mouth.
Repeat this cycle for a few minutes.
"""

synthesize(script)

This script pulls the voice model from ElevenLabs and writes the resulting MP3 to disk. You can adapt the synthesize function to stream audio directly to a mobile app or a web player.

curl for Quick Tests If you prefer the CLI:

curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/$VOICE_ID" \
     -H "xi-api-key: $ELEVENLABS_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
           "text": "Hello from ElevenLabs! This is a test of the TTS engine.",
           "voice_settings": { "stability": 0.5, "similarity_boost": 0.75 }
         }' --output test.mp3

Let’s assume you’re building a React Native app. The simplest way to play synthesized audio is to:

expo-av or react-native-sound. Here’s a quick React Native snippet:

import React, { useEffect } from 'react';
import { View, Button } from 'react-native';
import { Audio } from 'expo-av';

export default function MeditationScreen() {
  const playAudio = async () => {
    const { sound } = await Audio.Sound.createAsync(
      { uri: 'https://your-backend.com/audio/meditation.mp3' },
      { shouldPlay: true }
    );
    // Optionally unload when finished
    sound.setOnPlaybackStatusUpdate((status) => {
      if (status.didJustFinish) {
        sound.unloadAsync();
      }
    });
  };

  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Button title="Start Meditation" onPress={playAudio} />
    </View>
  );
}

If you’re using a serverless function (e.g., Vercel, Netlify Functions), the function can call ElevenLabs, store the MP3 in S3, and return the URL. That keeps the client lightweight.

Concern Best Practice Why it matters
Rate limits Cache the generated MP3s for each script. Avoid repeated TTS calls for identical content.
Latency Pre‑generate common meditation flows at build time. Keeps the user experience snappy.
Security Store your ElevenLabs API key in environment variables, never in client code. Protect your quota and avoid abuse.
Voice quality Fine‑tune stability &similarity_boost per voice. Some voices sound better with higher stability; others benefit from more boost.
Analytics Log play counts and completion rates. Understand which flows resonate.

You’ve seen how easy it is to turn a text prompt into a lifelike meditation guide. The next step? Try ElevenLabs and start cloning voices, experimenting with different tones, and building a truly personalized meditation experience. Grab your API key and get started at https://try.elevenlabs.io/kr07zfuqn1bp—the free tier is generous, and the quality will blow your users away.

Happy coding, and may your app bring calm to the world!

── more in #ai-tools 4 stories · sorted by recency
── more on @elevenlabs 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/create-a-meditation-…] indexed:0 read:4min 2026-10-06 · —