Echo is a mobile app that creates fully produced, character-voiced audiobooks from any book file, ready to listen to anywhere.
Upload a PDF or EPUB and Echo processes every line of text, identifies every character, builds a voice for them, and narrates the story with the weight and emotion it deserves.
Don't like a voice Echo picked? Customize it to your liking, or clone a voice sample you're particularly fond of. Make your stories come to life with Echo.
- Text extraction from PDF/EPUB/TXT/MD files
- LLM-generated narration script (JSON output with speaker, text, language, emotional tone)
- AI TTS audio output via Qwen3-TTS
- AWS S3 for audio storage, Supabase for database/auth
- Mobile app with Library, Upload, Media Player, Character Customization, and Profile screens
- Character voice customization (describe a voice or upload a clip to clone one)
- Offline playback position sync (remembers where you left off, synced across devices)
- Sleep timer
- Voice activation with wake word + command
- Text tracking/highlighting in the book as each line is narrated
- Spoiler-free book/chapter/character summaries
- Generated pixel art character portraits (or user-uploaded pictures)
- Character Chat — talk to the characters and have them respond to you
- Audiobook sharing hub and community features (browse shared audiobooks, comments/reviews, favorites)
- Audiobook MP3 export with chapter markers
- A way to acknowledge pictures/illustrations, footnotes
| Week | Frontend | Backend |
|---|---|---|
| 1 | Assign roles Install Node, Expo CLI, Python Learn Git Come up with a basic layout and plan for the mobile app Come up with a design theme and create pages in Figma |
Download the Qwen3-TTS model and have everyone play with it for a bit Download a local LLM model and test it out with text processing Set up Supabase and S3 storage containers Decide on a schema for how we will store all our data |
| 2 | Set up Expo and start building the frontend Create barebones pages with just navigation |
Create a basic version of the FastAPI laptop server: text → LLM processing → TTS → audio |
| 3 | Create media player screen with playback capabilities: play/pause, seek bar, rewind/skip, previous/next chapter, playback speed | Connect the laptop server to S3 and Supabase Create a way to identify all characters in a story and create a profile for each |
| 4 | Create Characters screen with components for creating/editing a voice and creating/editing a character sprite | Get the laptop server working at the scale of an entire book — lots of testing |
| 5 | Create home library screen, profile screen, and upload book screen | Create playback position syncing feature (so you don't lose your place when listening offline) |
| 6 | Integration! Frontend features call actual data from S3 and Supabase instead of mock data | Create voice editing pipeline: changing a character's voice re-synthesizes all of that character's lines and re-stitches the audiobook |
| 7 | Voice activation on the media player using wake word + command | Integrate laptop server with mobile app so processing is called from the app; gate these features so they're only available while connected to the laptop server |
| 8 | Final polishing + stretch goals | Final polishing + stretch goals Run the full pipeline on a few books and test the results |
| 9 | Presentation prep! ✨ | Presentation prep! ✨ |
- Mobile App: React Native with Expo
- Laptop Server: FastAPI + Python
- LLM: Up to yall
- Voice Generation: Also up to yall
- Voice Activation: Picovoice
- Database: Supabase (everything except audio, books, and images)
- Storage: AWS S3 (audio, books, images)
- Node.js + npm + Expo CLI
- React Native + NativeWind (Tailwind for React Native)
- Python and pip
- Git + GitHub
- Ollama
- VS Code (or your preferred IDE)
- Supabase account + CLI
- AWS
| Command | Description |
|---|---|
| cd | Change directories over to our repository |
| git status | See what's changed, staged, or untracked in your working directory |
| git branch | Lists branches for you |
| git branch "branch name" | Makes new branch |
| git checkout "branch name" | Switch to branch |
| git checkout -b "branch name" | Same as 2 previous commands together |
| git branch -d "branch name" | Delete a local branch (safe — only works if merged) |
| git branch -D "branch name" | Force-delete a local branch (even if unmerged) |
| git add . | Finds all changed files and adds them to git tracking |
| git commit -m "Testing123" | Commit with message |
| git push origin "branch" | Push to branch |
| git pull origin "branch" | Pull updates from a specific branch |
| git fetch origin | Download changes from remote without merging them into your local branch |
| git merge "branch name" | Merge specified branch into your current branch |
| git merge --abort | Cancel a merge if you hit conflicts and want to back out |
git commit hash (find on GitHub or run git log --oneline in the terminal), then run git revert <commit-hash> --no-edit |
Undo a commit that has been pushed |
| git reset --soft HEAD~ | Undo commit (not pushed) but keep the changes |
| git rm --cached "filename" | Remove a file from git tracking but keep it locally |
| git rm -r --cached "foldername" | Remove a folder from git tracking but keep it locally |
- Project Manager: Allen Zheng
- Industry Mentor: Srinivas Bojja
- Team member: Nitish Raj
- Team Member: Nicole
- Team Member: Juwairiya
- Team Member: Zed Bradley
