Gemini ranks voices
Give it the character's images, the casting brief and a set of voices (each with its
library preview) and you get every voice rated for fit from 1 to 10, best first, with
what the voice sounds like, its strengths and its problems. It is one listener's
opinion and a noisy one: it decides which 3 voices get auditioned and gives the person
notes, but the person picks. It is for matching a voice to a face or a detailed
character; for a plain request (guide-cast-a-voice), skip it and audition 3 picked on
metadata.
Inputs
- The pass's
brief.json(fromelevenlabs-voice-search), with its audition passage. - The character images.
- Per voice:
voice_id, library name,previews/<voice_id>.mp3.
Run it
Build one request from references/listening-prompt.md: one user turn of ordered parts
(instructions, images, then per voice its label and preview, then the brief and the
audition passage) and the response schema there. Images and audio are local paths; the
engine uploads them. Find the model's id with models("gemini") and describe it
before the first run in a job (earlier jobs used gemini-3.1-pro-preview):
run("<gemini id>", {
"contents": [{"role": "user", "parts": [
{"text": "<instructions>"},
{"fileData": {"mimeType": "image/jpeg", "fileUri": "<pass>/images/front.jpg"}},
{"text": "Voice 1: voice_id=<voice_id> (<library name>)"},
{"text": "Library preview:"},
{"fileData": {"mimeType": "audio/mpeg", "fileUri": "<pass>/previews/<voice_id>.mp3"}},
…,
{"text": "<closing text>"}]}],
"generationConfig": {"responseMimeType": "application/json",
"responseSchema": <the schema in references/listening-prompt.md>}},
into="<pass>", unit="preview_ratings")
The gateway's Gemini adapter is being built in hn4a; describe gives its exact fields.
One listen per pass: the whole shortlist (12) in one call, previews only, no TTS
spent. Save as preview_ratings.json. Drop any voice_id that wasn't sent and any
duplicate, and sort by fit, highest first. The top 3 are auditioned on the passage
(elevenlabs-tts-v4); the person listens to those, so there is no second listen.
What you get
ratings: per voice voice_id, heard, fit (8 and up means it would cast it),
strengths, problems. Put the top 3 on a review page with each voice's audition and
preview to play, the listener's notes under them, and the brief in the header; the
person picks one or writes a note for another pass. Record the pick, its voice id and
its performance guide in AGENTS.md.
Tips and traps
- The listener is noisy. One voice went from 9/10 to 4/10 between two runs, and the director picked voices it had ranked 3rd and 4th. Never cast from the ranking alone.
- Previews rank worse than auditions: a weak voice can make the top 3. Audition 3, never more, and let the person hear them. If none fits, the person's note starts another pass, or they ask to hear the next 3.
- Some voices degrade under eleven_v4 (the audition doesn't sound like the preview). Asked whether two clips are the same voice, Gemini was inconclusive (5 to 7 out of 10 for every variant). The person hears it on the review page.
- It judges by ear, not by the name: it marked down a polished corporate-tutorial read and voices that sounded younger than the face.
- A different shortlist means a new listen; don't reuse
preview_ratings.json.
Check it
Every voice sent comes back rated once; heard describes sound (pitch, texture, age,
accent, delivery) rather than repeating the library description.


