You count the characters in your script files, divide by a thousand, multiply by the per-thousand rate, and hand the number to whoever approves the budget. Then the batch settles at several times that figure and nobody can explain the gap. The discrepancy almost never comes from a wrong rate. It comes from two mechanics baked into how speech jobs are metered: a per-file floor that ignores how short your text actually is, and a normalisation pass that rewrites the character count before anything gets billed. Both are documented, both are trivial to model in code, and both are routinely skipped by teams estimating from raw file sizes.
What a Character Minimum Really Does to a Per-File Estimate
It helps to separate two ideas that sound identical but behave very differently. The first is a minimum charge on a submission — a floor applied to the whole batch, however small it is. Y-PAD’s pricing page, as of 7 November 2026, states plainly that there is no minimum charge on a request and that one file costs the same per unit as a thousand. The second is a per-file unit minimum, which is a floor applied to each item inside the batch. Qwen3-TTS carries one of these: a 500-character minimum per file, a ceiling of 20,000 characters per file, and a rate of $0.0150 per 1,000 characters, with list and launch prices identical during the beta. Those figures are provisional fares published as of 7 November 2026, so confirm them on the live pricing page before you commit a budget.
The arithmetic consequence is severe for short inputs. Suppose you are generating voice prompts for a product catalogue: 1,200 lines, averaging 40 characters each. Raw count gives you 48,000 characters, which at $0.0150 per 1,000 characters looks like $0.72. The billable count is different. Every one of those 1,200 files sits under the floor, so each one bills as 500 characters, producing 600,000 billable characters and a settlement of $9.00 — roughly twelve and a half times the naive estimate. Nothing has gone wrong. The estimator simply ignored a rule that the model page states explicitly.
This changes how you design a batch, not just how you price it. The useful metric is utilisation: folded characters divided by 500, per file. A file at 480 characters wastes almost nothing. A file at 40 characters wastes 92% of what you pay for. If your workload is naturally short — status messages, IVR fragments, alert strings — the economically rational move is to concatenate related lines into a single file with deliberate pauses between them, trading per-line granularity for a much lower effective rate. The trade-off is real: one failed item now invalidates a larger chunk of work, and you lose the ability to re-run a single line. Rebuild cost, not just unit cost, should drive that decision.
The same shape appears across other model families, which is why the habit is worth internalising. Whisper large-v3 applies a 30-second minimum per file, so a thousand ten-second clips bill as 500 minutes rather than the 167 minutes their real duration implies. DeepSeek V4.1 Flash applies a 100-token minimum per file. Per-file floors are a general property of batch metering, not a quirk of one model.
Whitespace Folding: Why Uploaded Length and Billed Length Diverge
For Qwen3-TTS, characters are counted after whitespace is folded. Folding normalises runs of spaces, tabs, blank lines and line breaks before the meter runs. What that means in practice is that your billable number is neither the file size on disk nor the raw character count your editor reports — it is the length of the text after that normalisation, subject to the 500-character floor and the 20,000-character ceiling.
For dense prose the difference is small; for formatted material it can be large. Consider a corpus of teleprompter scripts with deep indentation and double-spaced paragraphs, a set of Markdown tables with padded columns, or subtitle files carrying timestamps and alignment spaces. All of those contain long stretches of whitespace that contribute to your raw count and vanish from the folded count. If you budget from raw characters, you will overestimate on this kind of material — which sounds harmless until you realise the estimate drives how much prepaid balance you top up and how many items you schedule per batch.
The opposite error is more expensive. If you pre-clean aggressively — collapsing blank lines, trimming indentation, stripping markup — you can push a file below the 500-character floor while removing content you actually wanted spoken. You then pay the floor anyway and ship a thinner script. Fold-then-measure is the right order of operations; fold-then-delete is not.
Two further details bite teams working in mixed languages. First, the unit is characters, not bytes: a UTF-8 file full of Japanese or Korean text occupies far more bytes than characters, so any estimator that divides file size by a byte-per-character assumption will be badly wrong. Second, characters are not words — a 500-character Spanish script and a 500-character German script are both 500 billable characters, even though they read at different lengths. Count code points, and count them after folding. If your files sit close to the 20,000-character ceiling, verify the current wording on the model page rather than assuming the normalisation that produces the minimum also governs the cap.
Building an Estimator That Survives Both Effects
The fix is a short, testable function rather than a better spreadsheet formula. Implement the same folding rule the service documents — collapse whitespace runs, trim the edges — and run it over every file before you price anything. Take the length of the folded string, apply max(folded_length, 500), sum across the batch, divide by 1,000, and multiply by $0.0150. Then validate each item against the ceiling so you catch oversized files before submission rather than after a rejected item costs you queue time.
If you are wiring this into a pipeline, the model page for the text to speech api is the correct place to confirm the current per-file floor, ceiling and counting rule before you freeze a budget — treat any number in this article as a 7 November 2026 snapshot of provisional beta fares. The workflow around the meter matters too. Uploads allow up to 100 files per call and batches up to 2,000 items; upload links last an hour, there are no webhooks so you poll, and outputs are retained for seven days. A first payment unlocks uploads at all, since there is no free storage tier.
Cash flow needs its own model, because the estimate and the invoice are computed at different moments. At submit, the service holds the sum of your declared maximum units multiplied by list price; at settlement it charges only succeeded units, applies launch pricing where a launch seat is held, and returns the unused hold. Failed and cancelled items cost nothing, which is why per-file sizing is a budgeting decision rather than a risk decision. Qwen3-TTS is single-priced during the beta, so seat logic does not move its per-character rate — but the hold still ties up balance proportional to how much text you declared.
The practical discipline is to log two numbers for every item: folded character count and billed units. After one pilot batch of fifty files, you can back-test the estimator against the settlement instead of guessing, and you will know whether your corpus shrinks or holds steady under folding. Playground runs and a small dry-run batch before the full submission turn the estimate from a hope into a calibrated figure.
Kathmandu mountaineer turned Sydney UX researcher. Sahana pens pieces on Himalayan biodiversity, zero-code app builders, and mindful breathing for desk jockeys. She bakes momos for every new neighbor and collects vintage postage stamps from expedition routes.