DEV Community

VoiceDeveloper
VoiceDeveloper

Posted on

AI Voice for Real Estate: Virtual Property Tours

Why AI Voice is a Game‑Changer for Real Estate

When a potential buyer scrolls through a listing, the first thing they see is the photos. The next thing they hear can be the difference between a quick ��nice house” and a booked virtual tour. Adding a natural‑sounding voice narration to a 3‑D walkthrough or video tour creates a more immersive experience, builds trust, and keeps users engaged longer.

With modern text‑to‑speech (TTS) and voice‑cloning APIs, you can generate a professional‑grade narrator in minutes—no studio, no actors, no expensive licensing fees. In this post we’ll walk through how to hook up ElevenLabs (a top‑tier TTS service) to a real‑estate web app, generate on‑the‑fly audio, and even clone a brand voice for consistent storytelling across all your listings.


Getting Started with ElevenLabs

ElevenLabs offers a straightforward REST API that returns high‑quality audio in MP3 or WAV format. The free tier gives you 10 k characters per month, which is plenty for testing a few properties.

Quick tip: Sign up through this affiliate link to get a bonus credit and support the article: https://try.elevenlabs.io/kr07zfuqn1bp

1. Grab Your API Key

After signing up, head to the dashboard → API Keys and copy the secret token. Keep it safe; you’ll need it in every request.

2. Choose a Voice

ElevenLabs ships with several pre‑trained voices (e.g., “Rachel”, “James”). You can also upload a short sample of your own agent’s voice and let the platform create a clone—perfect for keeping a consistent brand tone.

# List available voices (curl)
curl -X GET "https://api.elevenlabs.io/v1/voices" \
     -H "xi-api-key: YOUR_API_KEY"
Enter fullscreen mode Exit fullscreen mode

The response includes a voice_id you’ll use in subsequent calls.


Generating Speech with Python

Below is a minimal Python script that takes a property description, calls ElevenLabs, and saves the resulting audio file.

import requests
import json

API_KEY = "YOUR_API_KEY"
VOICE_ID = "YOUR_VOICE_ID"   # e.g., "Rachel"
ENDPOINT = f"https://api.elevenlabs.io/v1/text-to-speech/{VOICE_ID}"

def synthesize(text: str, filename: str = "tour.mp3"):
    payload = {
        "text": text,
        "model_id": "eleven_monolingual_v1",  # default high‑quality model
        "voice_settings": {
            "stability": 0.75,
            "similarity_boost": 0.85
        }
    }

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

    response = requests.post(ENDPOINT, headers=headers, data=json.dumps(payload))

    if response.status_code == 200:
        with open(filename, "wb") as f:
            f.write(response.content)
        print(f"✅ Audio saved to {filename}")
    else:
        print("❌ Error:", response.status_code, response.text)

if __name__ == "__main__":
    description = """
    Welcome to 123 Maple Street. This 4‑bedroom, 3‑bath colonial sits on a quiet cul‑de‑sac,
    featuring a renovated kitchen with quartz countertops, hardwood floors throughout,
    and a backyard perfect for entertaining.
    """
    synthesize(description, "maple_street_tour.mp3")
Enter fullscreen mode Exit fullscreen mode

What’s happening?

  1. Payload – You pass the raw text and optionally tweak stability (how “steady” the voice sounds) and similarity_boost (how close it stays to the original voice profile).
  2. Headers – The xi-api-key authenticates the request.
  3. Response – On success the API streams back raw audio bytes, which we write to an MP3 file.

You can now attach maple_street_tour.mp3 to any 3‑D viewer or video player.


Integrating Audio into a Web Tour (JavaScript)

If your property tours run in the browser, you can fetch the audio on demand and feed it to the HTML5 <audio> element.

<button id="play-tour">Play Tour Narration</button>
<audio id="tour-audio" controls></audio>

<script>
const API_KEY = "YOUR_API_KEY";
const VOICE_ID = "YOUR_VOICE_ID";

async function fetchNarration(text) {
  const resp = await fetch(
    `https://api.elevenlabs.io/v1/text-to-speech/${VOICE_ID}`,
    {
      method: "POST",
      headers: {
        "xi-api-key": API_KEY,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        text,
        model_id: "eleven_monolingual_v1",
        voice_settings: { stability: 0.7, similarity_boost: 0.9 }
      })
    }
  );

  if (!resp.ok) {
    const err = await resp.text();
    throw new Error(`ElevenLabs error: ${err}`);
  }

  // The API returns raw audio; turn it into a Blob URL
  const blob = await resp.blob();
  return URL.createObjectURL(blob);
}

document.getElementById("play-tour").addEventListener("click", async () => {
  const description = `Welcome to 456 Oak Avenue...`; // fetch from DB or CMS
  const audioUrl = await fetchNarration(description);
  const audioEl = document.getElementById("tour-audio");
  audioEl.src = audioUrl;
  audioEl.play();
});
</script>
Enter fullscreen mode Exit fullscreen mode

Why this works well

  • Lazy loading – Audio is generated only when the user clicks, keeping page load fast.
  • Dynamic content – You can pull the property description from your CMS, personalize it per user, and generate a unique voice track each time.
  • No server‑side storage – The audio stream lives only in the browser’s memory, reducing compliance headaches.

Voice Cloning for a Consistent Brand

Imagine every listing narrated by the same friendly agent voice, even if you have dozens of agents. ElevenLabs lets you upload a 30‑second sample and creates a clone that sounds like the original speaker.

  1. Record a short script (e.g., “Welcome to our listings. I’m Alex, your virtual guide.”) in a quiet environment.
  2. Upload via the dashboard → Voice Cloning → Add New Voice.
  3. Get the new voice_id and replace it in the code snippets above.

Now every property tour will sound like it’s coming from your brand’s voice, not a generic TTS engine.

Pro tip: Use a consistent speaking rate and tone across all recordings. The more uniform the sample, the more natural the clone will sound.


Best Practices & Gotchas

Issue Solution
Long descriptions ( > 5 k characters) Split the text into paragraphs and concatenate the resulting MP3s client‑side.
Latency (API call takes ~1–2 s) Pre‑generate audio for popular listings during off‑peak hours and cache the MP3 on a CDN.
Licensing ElevenLabs’ free tier is fine for demos; for commercial use, upgrade to a paid plan to unlock higher limits and commercial rights.
Audio quality on mobile Serve both MP3 (for broad compatibility) and AAC (smaller size) and let the browser pick the best.
Voice cloning ethics Always have explicit consent from the person whose voice you clone and disclose that the narration is AI‑generated.

Putting It All Together – A Mini End‑to‑End Flow

  1. Admin panel – Agent writes a description, optionally records a 30‑second voice sample.
  2. Backend (Python/Node) – Stores the text, triggers the ElevenLabs TTS endpoint, saves the MP3 to S3 (or another object store).
  3. Frontend – Loads the MP3 URL into an <audio> element that syncs with the 3‑D camera movement (e.g., using three.js events).
  4. Analytics – Track play, pause, and ended events to see how long users listen, then iterate on description length and voice style.

With just a few lines of code you’ve turned a static photo gallery into a guided, voice‑enhanced property tour that feels like a personal walkthrough.


Ready to Give Your Listings a Voice?

If you’re curious how natural‑sounding AI narration can boost engagement, give ElevenLabs a spin. Their API is developer‑friendly, the quality rivals professional voice actors, and the cloning feature lets you keep a unified brand voice across every listing.

👉 Try ElevenLabs today and start building voice‑powered real‑estate experiences: https://try.elevenlabs.io/kr07zfuqn1bp

Happy coding, and may your tours be as smooth as a well‑narrated story!

Top comments (0)