DEV Community

Cover image for I built a voice note from the match you missed
Shivansh Singh
Shivansh Singh

Posted on

I built a voice note from the match you missed

DEV Weekend Challenge: Passion Edition Submission

This is a submission for Weekend Challenge: Passion Edition

The hardest part of missing your team's match is not finding the score. That takes one second. It is missing the text from the friend who was there: the message that starts with “you should have heard it” and somehow tells you more than a match report ever could.

I call it A Voice Note From the Match.

What I Built

A Voice Note From the Match turns a real World Cup result into a short, emotional voice note from a friend at the stadium. You pick a match, say which team you support, and choose the friend calling you.

The app then writes and performs a recap that has the messy energy of a real post-match message: excitement, disbelief, a little heartbreak, and someone else shouting in the background.

Demo

Try it: A Voice From the Match
Repository: Github

For the video, I would show this exact flow:

  1. Start on the landing page and briefly show the “score versus feeling” idea.
  2. Pick yesterday's match, enter a name, and choose a side.
  3. Show the recording state as the app builds the note.
  4. Play the result with the transcript visible.
  5. End with the share or download action.

How I Built It

App Architecture

1. Start with real match context

The app fetches the World Cup fixture and result feed from OpenFootball, then groups fixtures into Yesterday, Today, Coming up, and All fixtures. The selected match supplies the teams, venue, score, and scored moments used in the recap.

That matters because the voice note is only convincing if the details are right. It should know which side scored, when the game turned, and whether the final result came after extra time or penalties.

2. Ask Gemini to write like a friend, not a commentator

I use Gemini 3.5 Flash to turn the selected match data into a strict two-speaker JSON script. The prompt asks for a 130 to 180 word note that uses exact events, addresses the user by name, and ends with how the friend feels right now.

It also asks for a single line from a second speaker. That small detail is important. A match is never just one clean voice. It has someone beside you losing their mind, the bar reacting, or the stand suddenly going quiet.

3. Use ElevenLabs as a performer

ElevenLabs

This is the center of the project.

I use the ElevenLabs Text to Dialogue endpoint with the eleven_v3 model. Each line is sent with a speaker voice, so the friend and the person in the background sound like separate people in the same moment.

The script includes ElevenLabs v3 audio tags such as [whispers], [excited], [shouts], [gasps], and [breathes out]. Those are not decoration in the UI. They change the performance. A late winner should not sound like a score notification.

One practical decision: I pin the two voices used by the server to voices that work with the free API tier. This prevents a model-generated Library voice from causing a paid-plan error during a demo.

4. Make the wait part of the story

The generation state does not just show a spinner. It presents the selected match moment, then shows the note being shaped, emotionally directed, and given a second stadium voice. It is a small detail, but it makes the wait feel like a recording is actually happening.

Prize Categories

  • Best Use of ElevenLabs: ElevenLabs v3 audio tags and Text to Dialogue are core to the experience. The app uses two speakers and visible performance cues instead of treating text to speech as a generic final step.
  • Best Use of Google AI: Gemini writes the match-specific, personal dialogue from real fixture data and structured event context.

What I would build next

I would let people bring their own friend's voice into the experience, with clear consent and an easy way to delete voice data. I would also add a stronger live-event source during matches so a voice note can arrive right after the final whistle.

Thanks for reading, and if you missed a match you cared about, I hope this gives you back a tiny piece of the night.

Top comments (0)