Make the native billing unit explicit
TTS pricing can count characters, UTF-8 bytes, tokens, audio duration, or credits. ElevenLabs publishes character rates, while Fish Audio publishes rates per million UTF-8 bytes. A multilingual character may occupy several bytes, so converting both providers to a fake character rate would distort the comparison. Count the final encoded request after templates, pronunciation markup, and localization, then keep that native unit through the calculation.
The calculator adds a rerender allowance because pronunciation errors, clipped audio, style changes, and editorial rejection create more billable work. For a conversational product, separate pre-generated prompts from real-time responses. Cached fixed audio and live generation have different cost, latency, and availability profiles.
A voice shortlist needs a listening protocol
Use the same scripts across names, numbers, dates, acronyms, code-switching, emotional passages, long-form narration, and noisy conversational turns. Record the exact model, voice ID, language, stability or style settings, output format, sample rate, and streaming mode. Blind reviewers should score pronunciation, naturalness, speaker consistency, pacing, and task suitability.
Quality and price are not the only gates. Confirm commercial rights, voice consent, cloning restrictions, data retention, regional processing, content policy, latency percentiles, concurrency, rate limits, streaming behavior, and model-version stability. A low character rate cannot compensate for a voice that fails the product's language or compliance requirement.
- Track billed provider-native text units from usage, not only source-document length.
- Separate text-to-speech, speech-to-text, voice agents, and audio-processing meters.
- Cache reusable approved audio where the license and product experience allow it.
- Create a fallback voice and a visible degraded state for provider outages.
Keep the voice integration replaceable
Map product concepts such as voice, language, speed, and output format into an internal request, then adapt it to each provider. Do not scatter provider voice IDs and unsupported parameters across the application. The adapter should return a stable job ID, usage fields, provider request ID, output metadata, and a typed error category.
Retry only requests that are documented as safe, cap retries, and check whether a timed-out job was accepted before submitting again. Log identifiers and error class without storing text or audio unnecessarily. This architecture makes a provider switch testable, reversible, and deletable.
Common comparison mistakes
- Treating a UTF-8 byte as one character or assuming every provider counts SSML the same way.
- Comparing a fast conversational model with a long-form quality model as one offer.
- Ignoring rerenders caused by pronunciation and editorial approval.
- Mixing TTS, STT, voice-agent, and audio-processing prices.
- Hardcoding provider voice IDs throughout product code.
Questions developers ask
What is the cheapest TTS API?
Among routes that pass your language, quality, latency, rights, and policy gates, compare the measured cost using each route's documented native text unit and your rerender rate.
Do SSML tags count toward TTS pricing?
The rule varies. Read the exact provider documentation and use billed usage; do not assume visible text length equals billable characters.
Should speech-to-text be compared on this page?
No. STT is normally billed by audio duration and has a different accuracy job. Keep it as a separate scenario even when one provider sells both products.