How to Host an AI Podcast Platform on Bluehost A developer published a step-by-step guide for building a Flask web service that converts markdown podcast scripts into finished MP3 episodes using the ElevenLabs text-to-speech API and FFmpeg for audio concatenation, hosted on Bluehost. The service accepts a JSON payload with a script URL and intro/outro music URLs, then returns a downloadable episode ready for publishing. Podcasting is exploding, but producing high‑quality audio still takes a lot of time and equipment. With modern text‑to‑speech TTS and voice‑cloning services you can turn a markdown script into a fully‑produced episode in minutes. In this guide we’ll walk through: By the end you’ll have a tiny web service that accepts a podcast script or a URL to a markdown file and returns a downloadable MP3 ready for publishing. | Item | Reason | |---|---| | ElevenLabs API key – sign up at https://try.elevenlabs.io/kr07zfuqn1bp https://try.elevenlabs.io/kr07zfuqn1bp | Gives you access to state‑of‑the‑art TTS and voice cloning. | | Python 3.9+ | Core language for the demo. | | Flask or FastAPI | Minimal web framework to expose a REST endpoint. | | FFmpeg | Concatenates audio segments and normalises volume. | | Bluehost account – get one at https://bluehost.sjv.io/5k0d52 https://bluehost.sjv.io/5k0d52 | Provides the cheap, easy‑to‑use hosting environment for our app. | | Git optional | For version control and quick deployment. | ElevenLabs offers a straightforward REST API. Below is a minimal Python wrapper that sends a text payload and streams back an MP3 file. python import os import requests ELEVEN API KEY = os.getenv "ELEVEN API KEY" BASE URL = "https://api.elevenlabs.io/v1" def generate speech text: str, voice id: str = "default" - bytes: """ Calls ElevenLabs TTS and returns raw MP3 bytes. """ endpoint = f"{BASE URL}/text-to-speech/{voice id}" headers = { "xi-api-key": ELEVEN API KEY, "Content-Type": "application/json", "Accept": "audio/mpeg" } payload = { "text": text, "model id": "eleven monolingual v1", "voice settings": {"stability": 0.75, "similarity boost": 0.85} } response = requests.post endpoint, json=payload, headers=headers response.raise for status return response.content Tip: If you want a custom cloned voice, create it in the ElevenLabs dashboard and replace voice id with the ID you receive. You can test the function locally: python export ELEVEN API KEY=your key here python - <<'PY' from main import generate speech audio = generate speech "Hello, this is a test of ElevenLabs text‑to‑speech." open "test.mp3", "wb" .write audio print "Saved test.mp3" PY Play test.mp3 to hear the result. The quality is comparable to a human narrator, and the API is priced per character, making it cheap for short‑form podcasts. Our Flask app will accept a JSON payload like: { "title": "AI Podcast 101", "script url": "https://example.com/episode1.md", "intro music url": "https://example.com/intro.mp3", "outro music url": "https://example.com/outro.mp3" } The flow: markdown2 . generate speech for the main body. python app.py import os, subprocess, tempfile, requests, markdown2 from flask import Flask, request, send file, jsonify app = Flask name ELEVEN API KEY = os.getenv "ELEVEN API KEY" if not ELEVEN API KEY: raise RuntimeError "Set ELEVEN API KEY env var" Re‑use the generate speech function from earlier from main import generate speech assume same file for brevity def download url: str - bytes: r = requests.get url r.raise for status return r.content def concat audios parts: list bytes - bytes: """ Takes a list of raw MP3 bytes, writes them to temp files, and returns a single concatenated MP3 using ffmpeg. """ with tempfile.TemporaryDirectory as td: paths = for i, data in enumerate parts : p = os.path.join td, f"part{i}.mp3" open p, "wb" .write data paths.append p list file = os.path.join td, "list.txt" open list file, "w" .write "\n".join f"file '{p}'" for p in paths out path = os.path.join td, "out.mp3" cmd = "ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", list file, "-c", "copy", out path subprocess.run cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL return open out path, "rb" .read @app.route "/generate", methods= "POST" def generate : data = request.json script md = download data "script url" .decode script text = markdown2.markdown script md, strip=True strip HTML tags 1️⃣ Intro intro = download data "intro music url" 2️⃣ Main narration narration = generate speech script text 3️⃣ Outro outro = download data "outro music url" final mp3 = concat audios intro, narration, outro return send file io.BytesIO final mp3 , mimetype="audio/mpeg", as attachment=True, download name=f"{data 'title' }.mp3" if name == " main ": app.run host="0.0.0.0", port=5000 Dependencies pip install flask requests markdown2 ffmpeg must be installed on the system apt-get install ffmpeg or brew install ffmpeg Run locally with python app.py and POST a JSON payload to http://localhost:5000/generate . You’ll receive a ready‑to‑publish MP3. requirements.txt , and maps a URL to a WSGI entry point. All of this can be done without touching a VPS console, making Bluehost the easy, affordable way to spin up a voice‑AI service. ~/my-podcast . app.py . flask app.wsgi Bluehost will generate it . Flask requests markdown2 pip install -r requirements.txt ffmpeg via the package manager. If not, you can compile a static binary and place it in your app folder; the Flask code calls echo "export ELEVEN API KEY=your key here" ~/.bashrc source ~/.bashrc https://yourdomain.com/generate . curl -X POST https://yourdomain.com/generate \ -H "Content-Type: application/json" \ -d '{ "title": "AI Podcast 101", "script url": "https://raw.githubusercontent.com/yourrepo/episode1.md", "intro music url": "https://example.com/intro.mp3", "outro music url": "https://example.com/outro.mp3" }' \ --output episode1.mp3 If the download succeeds, you’ve just built a fully‑hosted AI podcast generator with a few lines of code /voices endpoint to upload a few minutes of your own voice and generate a custom voice id . All of these extensions sit on the same Flask base; you only need to add a few more routes or background workers. You now have a practical, production‑ready pipeline: Give it a spin, tweak the voice settings, and start publishing AI‑generated episodes without ever stepping into a recording studio. Ready to build? Grab your ElevenLabs API key and a Bluehost account today, and watch your podcast ideas come to life in seconds. Happy coding