Why a Voice‑AI Portfolio Site Matters
If you’ve spent the last few years tinkering with text‑to‑speech (TTS) engines, voice cloning, or building conversational bots, you already know that a polished demo can be the difference between “nice work” and “hire me”. A static portfolio page is fine for a UI project, but voice AI shines when visitors can hear what you built. In this post I’ll walk you through creating a lightweight, production‑ready voice AI showcase that you can spin up in a weekend and that will impress recruiters and hiring managers.
What We’ll Build
- A simple landing page that introduces you and lists a few voice‑AI projects.
- An on‑demand TTS endpoint that takes a text string, runs it through ElevenLabs’ high‑quality neural voice, and returns an audio file.
- A demo player that lets visitors type or select sample text and instantly hear the result.
All of this will be hosted on Bluehost, the easy, affordable way to deploy a Python‑Flask app (or a static site) without wrestling with complex server configs.
Choosing the Right Tools
| Piece | Why It’s a Good Fit |
|---|---|
| ElevenLabs | Industry‑leading neural TTS with voice cloning, generous free tier, and a straightforward REST API. |
| Flask (Python) | Minimalist web framework; perfect for a single API endpoint and easy to deploy on shared hosting. |
| Bluehost | One‑click Python app setup, cheap plans, and built‑in SSL – you can get the site live with a few clicks. |
Quick tip: If you don’t already have an ElevenLabs account, sign up through this affiliate link to get a bonus credit: ElevenLabs.
Step 1 – Set Up Your Hosting Environment
Create a Bluehost account using the link below. Their shared hosting plans start at just a few dollars a month and include a free domain for the first year.
👉 BluehostIn the Bluehost dashboard, enable Python 3.10+ (or the version they provide) and create a new Flask app. Most plans let you do this with a single “Create Application” button.
Clone a starter repo (or create a new folder) for your project:
git clone https://github.com/yourusername/voice-ai-portfolio.git cd voice-ai-portfolio - Install dependencies (Flask,
requests, andpython-dotenvfor secret handling):
pip install -r requirements.txt Step 2 – Wire Up ElevenLabs TTS
ElevenLabs offers a simple POST endpoint: https://api.elevenlabs.io/v1/text-to-speech/{voice_id}. You’ll need an API key, which you can fetch from your ElevenLabs dashboard.
2.1 Store Secrets Securely
Create a .env file (make sure it’s added to .gitignore) with:
ELEVENLABS_API_KEY=your_api_key_here ELEVENLABS_VOICE_ID=your_voice_id_here # you can use the default “Rachel” voice or a cloned voice 2.2 Flask Endpoint (Python)
# app.py import os import requests from flask import Flask, request, send_file, jsonify from dotenv import load_dotenv from io import BytesIO load_dotenv() app = Flask(__name__) ELEVEN_API_KEY = os.getenv("ELEVENLABS_API_KEY") VOICE_ID = os.getenv("ELEVENLABS_VOICE_ID") ELEVEN_ENDPOINT = f"https://api.elevenlabs.io/v1/text-to-speech/{VOICE_ID}" HEADERS = { "xi-api-key": ELEVEN_API_KEY, "Content-Type": "application/json" } @app.route("/api/speak", methods=["POST"]) def speak(): data = request.get_json() text = data.get("text", "") if not text: return jsonify({"error": "No text provided"}), 400 payload = { "text": text, "voice_settings": { "stability": 0.75, "similarity_boost": 0.85 } } response = requests.post(ELEVEN_ENDPOINT, json=payload, headers=HEADERS) if response.status_code != 200: return jsonify({"error": "TTS failed", "details": response.text}), 500 audio_bytes = BytesIO(response.content) return send_file(audio_bytes, mimetype="audio/mpeg", as_attachment=False, download_name="speech.mp3") if __name__ == "__main__": app.run(host="0.0.0.0", port=5000) What’s happening?
- The endpoint receives JSON
{ "text": "Your sentence here" }. - It forwards the request to ElevenLabs, using the
voice_settingsto tweak stability and similarity. - The raw MP3 bytes are streamed back to the client, so the front‑end can play them instantly.
2.3 cURL Quick Test
curl -X POST https://yourdomain.com/api/speak \ -H "Content-Type: application/json" \ -d '{"text":"Hello, I’m a voice AI demo built on ElevenLabs!"}' \ --output demo.mp3 If everything is wired correctly, you’ll get a demo.mp3 file that sounds like the voice you selected.
Pro tip: Want to experiment with voice cloning? ElevenLabs lets you upload a few minutes of your own voice and generates a custom
voice_id. Check out the docs via the same affiliate link: ElevenLabs.
Step 3 – Build the Front‑End Demo
A minimal HTML page with a textarea and a play button is enough to showcase your skill set. Here’s a snippet you can drop into templates/index.html (Flask will serve it automatically if you set app.route("/") to render the template).
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Voice AI Portfolio</title> <style> body {font-family: Arial, sans-serif; max-width: 600px; margin: 2rem auto;} textarea {width: 100%; height: 80px;} button {margin-top: 0.5rem; padding: 0.5rem 1rem;} </style> </head> <body> <h1>Hey, I’m Alex – Voice AI Engineer</h1> <p>Type something below and hear it spoken by my custom voice.</p> <textarea id="text">Hello, world! This is my voice‑AI demo.</textarea><br> <button id="speakBtn">Speak</button> <audio id="player" controls style="display:none; margin-top:1rem;"></audio> <script> const btn = document.getElementById('speakBtn'); const player = document.getElementById('player'); btn.addEventListener('click', async () => { const txt = document.getElementById('text').value; const resp = await fetch('/api/speak', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({text: txt}) }); if (!resp.ok) { alert('Error generating speech'); return; } const blob = await resp.blob(); player.src = URL.createObjectURL(blob); player.style.display = 'block'; player.play(); }); </script> </body> </html> When a hiring manager lands on your site, they can instantly hear the quality of your TTS integration—no need to download files or watch a video.
Step 4 – Deploy with One Click
- Push your code to the Git repository you linked in the Bluehost dashboard.
- In the Bluehost control panel, click Deploy (or “Pull from Git”).
- The platform will automatically install the
requirements.txt, set up a virtual environment, and start the Flask app on a public URL likehttps://yourdomain.com.
Because Bluehost provides free SSL, your API calls stay secure, and the site looks professional out of the box.
Bonus: Adding a Voice‑Cloned Sample
If you’ve created a custom voice with ElevenLabs, replace ELEVENLABS_VOICE_ID in your .env with the new ID. Then add a dropdown of pre‑written scripts to showcase different tones (narrative, conversational, upbeat). Each selection can call the same /api/speak endpoint, giving recruiters a quick taste of your versatility.
TL;DR – What You Get
- A live portfolio site hosted on a cheap, reliable host (thanks to Bluehost).
- Real‑time TTS powered by the industry‑leading ElevenLabs API (sign up here).
- Full source code you can fork, extend, and point to in your résumé or LinkedIn.
Call to Action
Ready to turn your voice‑AI experiments into a hiring magnet? Grab your ElevenLabs API key via the affiliate link and spin up the demo on Bluehost in under an hour.
🔗 Try ElevenLabs now: https://try.elevenlabs.io/kr07zfuqn1bp
🔗 Deploy instantly with Bluehost: https://bluehost.sjv.io/5k0d52
Happy coding, and may your next interview be as smooth as the voice you just built!
