Before you build anything, here's a live demo so you can feel what you're making. Tap a story, hit play, and it reads aloud. It's the same calm night-time look and player you'll build.
In my video I said you can make up to $10,000 a month building bedtime story apps. That's the top end, and it's real: people are running actual businesses on exactly this idea. Three I dug up:
An app where you pick or paste a story and it reads it back in your own voice, softly, like you're actually there. Two tools do the work:
You don't need to code. Open Claude Code (that's the one that can actually create the files, install everything, and run the app on your computer, the desktop chat app can only write it out) and paste this whole thing in. It's detailed on purpose, that's what gets you an app that looks good instead of a bare wireframe:
Build me a complete bedtime story app that reads stories aloud in a clone of my
own voice. I am not a developer, so set everything up for me and walk me through
running it step by step, explaining each part in plain language as you go.
How it should look and work:
- A calming home screen: deep indigo and purple background, soft stars, rounded
cards, warm gold accents. Show a "tonight's pick" featured story plus a small
library of story cards, each with cover art, a title and a duration.
- Tapping a story opens a player screen with the cover, the title, a big
play/pause button, skip back and forward 15 seconds, and a progress bar.
Highlight the sentence being read as it plays.
- Let me also paste in my own story text and play that.
- Support inline emotion tags in the text like [whisper], [soft] and [excited],
and pass them through to the voice so the delivery actually changes.
The voice (this is the whole point, so set it up with me):
- The stories must play in MY cloned voice using Fish Audio, not a generic voice.
- First, walk me through setting up Fish Audio: signing up at fish.audio, creating
an API key, and cloning my own voice from a short recording. Tell me exactly which
pages to click, then pause so I can paste my API key into the .env file and my
cloned voice reference_id into the app before we continue.
- Then use the fishaudio Python SDK with the free model s2.1-pro-free for the text to speech,
reading in that cloned voice.
- IMPORTANT: never put my API key in the web page. Build a tiny local backend
(Python, FastAPI or Flask) that holds the key, loaded from a .env file, and
have the page call that backend. Explain why, so I understand the app is safe.
- Until Fish Audio is connected, fall back to the browser's built-in voice, but
show a clear "Connect Fish Audio to hear it in your own voice" note, so it's
obvious the real voice is the goal.
Please:
- Give me the full project and the exact terminal commands to install and run it,
copy and paste ready.
- Include two or three short sample stories so it looks alive on the first run.
- Make it genuinely nice to look at, calm and cosy, not a plain wireframe.
- When it's built, run it and show me it working, then tell me the one or two
things I need to personalise: my Fish Audio key and my cloned voice ID.
.env file, never into the chat.s2.1-pro-free) has a free developer window right now (they've extended it before, so check the current status on their site before a big batch). After that, paid plans start at $11 a month, so it stays cheap either way.A bedtime story should sound soft, not flat. You tag the feeling right in the text and Fish Audio reads it that way:
There's a set of core tags (like [excited], [sad], [whisper]) and S2.1 also reads free-form ones like [soft] or [gentle], so you can write almost any feeling in brackets. That's what makes it sound like you're actually tucking them in.
Claude writes and explains all of this for you, but here's the core so you can see how little it really is. Your key loads from the .env file, never hard-coded, and model="s2.1-pro-free" is what makes the emotion tags actually fire:
import os
from fishaudio import FishAudio
# your key is read from the .env file, never written in the code
client = FishAudio() # picks up FISH_API_KEY from your environment
story = "[soft] Once upon a time, in a cosy little house... [whisper] and they all slept soundly."
audio = client.tts.convert(
text=story,
reference_id="YOUR_CLONED_VOICE_ID", # your voice
model="s2.1-pro-free", # needed for the emotion tags to work
)
with open("bedtime.mp3", "wb") as f:
f.write(audio)
Once it works, these turn a nice demo into something you'd actually ship. Same project, same chat.
What you build here runs on your own computer, which is perfect for using it yourself and for filming. Turning it into a real App Store app that strangers can download is a different beast, and worth knowing before you promise anyone anything:
๐ฎ The live demo: try it here (the finished look and feel)
๐ Fish Audio: fish.audio (free account, voice cloning, API keys)
๐ค Claude: claude.com (use Claude Code so it can build and run the whole thing for you)
.env file, and only ever clone a voice you have the right to use, which is your own.