Skip to content
Insights · AI Agents

Which voice did that speech use?

Name the voice that speech used: the model, the voice, and the text. Another request can name a different voice, and another log does not hold this file.

Scroll
AI AgentsOct 30, 202611 min readBy Salman Naqvi, Founder & CEO
Which voice did that speech use?

Do not treat the file as the words the customer heard, and do not ask the model which voice it used, until you can name the speech request. Tonight, three proofs, in the log you stored. Name the voice that speech used: the model, the voice, and the text you sent, or a written line that the request was not stored. Show a different request whose model, or whose voice, is not this one. Show that another customer's log does not hold this file. The response is bytes. If you did not store the request, the file cannot tell you the voice. If any of the three needs the person who wired the call and then left, you have not named the voice. You have an mp3 and a guess.

This is the speech request on one call. It is not the prompt. Which prompt did that request send? is the text of a completion. A prompt can be stored while no speech file was written, and a speech input can be a sentence the prompt log does not hold. It is not the category a moderation call flagged. Which category did that call flag? is a boolean and a score. A score is not a voice name. It is not the phase a schedule entered. Which phase did that schedule enter? is two dates on a schedule id. A date is not a model name. It is not the app an installation granted. Which app did that install grant? is a permission. A permission is not an audio format.

None of what follows is a score for this product, and none of it is legal advice. The fields below are one vendor's current description of a speech request, and the response is a file rather than an id. The figures below that are a 2019 paper about how people rate long-form speech. A mean opinion score on other people's paragraphs is not the voice on the request you stored tonight. A paper that never saw this file cannot name the voice.

The create-speech example returns a file, and the example does not return an id you can quote. The request sends model gpt-4o-mini-tts. 15 characters. input is The quick brown fox jumped over the lazy dog. 45 characters, including the period. voice is alloy. 5 characters. The example does not send response_format, and it does not send speed, and it does not send instructions. The output flag writes speech.mp3. 10 characters. The page says the return is a file, content type application/octet-stream, or a stream of audio events. An octet stream is not a JSON object with a voice field. If the log keeps the mp3 and drops the request, you have the bytes and you do not have the voice. A second example on the same page sends the same model, the same input, and the same voice, and adds stream_format sse, and still writes speech.mp3. sse is not mp3. A filename is not a stream format (OpenAI, Create speech).

The model list in the introduction is not the model list in the body, and both mark the example as deprecated. The introduction names tts-1, tts-1-hd, gpt-4o-mini-tts, gpt-4o-mini-tts-2025-03-20, and gpt-4o-mini-tts-2025-12-15. That is 5 names. The body parameter says one of tts-1, tts-1-hd, gpt-4o-mini-tts, or gpt-4o-mini-tts-2025-12-15. That is 4 names. 5 is not 4. The March model, gpt-4o-mini-tts-2025-03-20, is 26 characters, and it is in the introduction and not in that body list. The December model is also 26 characters. tts-1 is 5 characters. tts-1-hd is 8. The page says those models are deprecated and scheduled to shut down on 2027-01-06, and it points new work at gpt-realtime-2.1-mini. 21 characters. The example still sends gpt-4o-mini-tts. A recommended replacement is not the model the example stored. Do not tell the customer the call used the replacement because the deprecation sentence is on the same page.

The voice list is longer than the example, and a custom id is not one of the built-in names. The page lists alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse, marin, and cedar. That is 13 names. The example uses alloy, which is one of them. 13 is not 1. A custom voice is an object with an id, and the page's example of that id is voice_1234. 10 characters. voice_1234 is not alloy. The page says custom voices must be created from audio samples, and that voices created from text prompts are supported only in Live. A text prompt is not a voice id. instructions, which control the voice, do not work with tts-1 or tts-1-hd. The maximum length on instructions is 4096, which is the same maximum as the input. 4096 is not 45. The example model can take instructions, and the example does not send them. An empty instructions field is not a voice.

Formats and speed are defaults the example leaves implicit, and the two ways of printing the default are not the same string. response_format values are mp3, opus, aac, flac, wav, and pcm. That is 6. The default is mp3. The example omits the field and names the file speech.mp3, which matches the default and is still a filename, not the field. stream_format is sse or audio. That is 2. The default is audio. 2 is not 6. sse is not supported for tts-1 or tts-1-hd. The second example sends sse with gpt-4o-mini-tts, which is not tts-1, so the restriction does not forbid that example. It still does not make speech.mp3 into an sse body. speed is optional, default 1, and the sentence also says 1.0 is the default. 1 is not the string 1.0. The minimum is 0.25. The maximum in the constraint line is 4, and the sentence says 4.0. 4 divided by 0.25 is 16. The page does not print 16, and it does not say the speed is a set of 16 steps. A quotient is not a field. The example does not send speed, so the stored request, if you only kept the example shape, has no speed to defend.

The paper people reach for when they want a score of speech is about ratings, and a rating is not a voice name. Rob Clark, Hanna Silen, Tom Kenter, and Ralph Leith compare three ways of rating long-form text-to-speech: sentences in isolation, whole paragraphs, and a sentence after context. 3 settings. They use a scale of 1 to 5, labeled poor, bad, fair, good, and excellent. That is 5 labels, in that order. Raters may use 0.5 increments. From 1 to 5 in steps of 0.5 there are 9 scores: 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, and 5. The page does not print 9. Stimuli are presented in blocks of 10, except full paragraphs, which are blocks of 5. 10 is not 5. Each stimulus is rated 8 times. The minimum number of raters in a task is 35. 8 is not 35. 8 times 10 is 80. 80 is not 35. The page does not print 80 (Clark, Silen, Kenter, and Leith, Evaluating Long-form Text-to-Speech).

The correlations in that paper do not add up to a voice, and the variance sentence does not match the square. Table 1's eight correlations of sentence scores with paragraph scores are 0.296, 0.087, 0.114, 0.268, 0.234, 0.345, −0.020, and 0.029. The sum is 1.353. The page does not print 1.353, and a sum of correlations is not a correlation. They say only 12% of the variance is accounted for by the maximum sentence score of 0.345. 0.345 times 0.345 is 0.119025, which is 11.9025%. 11.9025 is not 12. The page does not print 0.119025. Table 2, for paragraphs of two sentences, has 46 paragraphs, R squared 0.04, F 0.95, an intercept of 2.50, and sentence coefficients 0.15 and 0.17. 0.15 plus 0.17 is 0.32. 0.32 is not 2.50, and 2.50 is not a mean opinion score you may paste onto alloy. Recorded voices in the dialogue figure sit between 4.6 and 4.7. Synthesized turns in isolation are 3.8 for three voices and 4.0 for one. 4.0 minus 3.8 is 0.2. With context, the synthesized scores rise to 4.3 to 4.4. 4.4 minus 3.8 is 0.6. The page does not print 0.6. A paragraph score is not the 45-character sentence in the API example, and the paper's own conclusion is that a sentence rating does not stand in for the paragraph.

Do the three proofs on one real request, in the log that actually holds it. First, the binding. Copy the model, the voice, and the input. If you also stored response_format, speed, or stream_format, copy those. If you stored only the file, write that the request was not kept, and do not infer alloy because an example uses it, and do not infer mp3 because the file extension is mp3. A filename can lie. If the model is one of the deprecated names, write the name that was sent, not the name the deprecation paragraph recommends. Second, the other request. A different voice, or a different model, is not this one. tts-1 and gpt-4o-mini-tts are that shape on the page, and they are still names in a document. A mean opinion score is not that second request. If you cannot show a request that is not this voice, you have a chart, not a record. Third, the other customer. A file that belongs to someone else is not this call. If the only store is one bucket and you cannot say whose request it was, write that. A tenant you cannot name is the finding. It is not a reason to tell the buyer the voice was alloy.

Three moves feel like the proof and are a second problem. Playing the file to the room and letting people guess the voice, and then describing the missing request as a cleanup. Quoting 4.6 because it looks precise, while the call you were asked about is one file, and 4.6 is a range on recorded speech in a paper, not a voice id. Asking the model which voice it used. The model will pick a name from the list of 13. It will not open the log. A moderation boolean you have not kept, while the customer is arguing about what they heard, is which category did that call flag?. Opening that screen does not name the voice.

The path is ordinary when an operator can open one recording without opening the next person's recording as the way to prove it. ReUniting AI is a platform that turns recordings into interactive companions, with voice as one of the modalities. The shape that matters here is one recording you can point at, distinct from the next recording. That case is not a speech-request ledger. Nothing in the description is a headcount, a duration, or a result figure. If the only control on the screen plays audio and will not name a model and a voice, you do not have this proof. You have a player.

There is a version of this afternoon where a rescue is the wrong purchase. Nothing is in production. No model is being called. The request was not logged, and there is no file either. A customer has already seen another customer's data. The wrong value was already a write. Or no metric was ever named. Hearing a voice you cannot name is unpleasant. It is not yet a system you can measure. If the file is in front of a customer and the log cannot show the model and the voice, the remaining work is specific. An AI pilot failed to reach production engagement is an audit in weeks 1 to 2, then an engagement finished in 8 to 12 weeks, scoped after the audit, unpaid if the agreed metric does not move, with rollout behind a human-review gate. The harness that scores a stored voice against the voice the request names, on your examples, is AI evaluation and observability. An AI integration sprint is the shape where the acceptance sentence can require the three proofs on every stored file. If you do not yet know whether the pilot can be saved, a two-week AI readiness assessment hands you the findings either way. Those are the terms. They are not a promise that a 2019 rating gap will recur, and they are not 4.6.

Before you tell them which voice spoke, do the three proofs and write the name. Name the model, the voice, and the text, or write that the request was not stored. Show a different request that is not that voice. Show another customer's log that does not hold the file. Do not paste a sample voice onto a bare mp3, and do not ask a model which of the thirteen it was. A paper can tell you how raters scored other people's paragraphs, including the variance sentence that prints 12% for a square of 0.119025. The binding is the voice you can defend.

Questions

You stop treating the file as the words the customer heard, and you stop asking the model which voice it used, until you can name the model, the voice, and the text, show a different request whose model or voice is not this one, and show that another customer's log does not hold the file. If you stored only the bytes, write that.

No. A score on other people's paragraphs is not the voice on this request. A voice you can defend is the model, the voice, and the text you stored, or a written line that the request was not stored. 4.6 on a recorded range is not alloy, and 12% is not the square of 0.345.

When nothing is in production, when no model is being called, when the request was not logged, when a customer has already seen another customer's data, when the wrong value was already a write, or when no metric was ever named.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→