Check this call
- ✓Read
usage.characterson this response. It is not the chat model's tokens and not the length of the mp3. A sentence-end count is cumulative. Do not add it on top of the final usage. - ✓See whether the request hit Bailian's SpeechSynthesizer or an Intelligent Speech Interaction appkey. ISI counts one hanzi as two characters, then each 100 as one call.
- ✓With SSML on, ISI does not count the tags. Bailian does not state that same sentence. Reconcile to the characters it returns, not to the byte length of the markup.
- ✓
hot_fixreplacement text is what gets spoken. Markdown filtering exists only for cosyvoice-v3-flash cloned voices. It changes what is read aloud. The bill still follows characters. - ✓Free quota covers realtime inference in China (Beijing) only. A text model's token balance does not pay speech. Singapore has no new-user free quota.
1. The field is characters, not tokens or seconds
On the Bailian CosyVoice HTTP API, usage.characters is the number of billable characters in the request. In a stream, sentence-end returns the sentence text and the cumulative billed character count. The documented sentence, the one about a large garden behind the house, comes back as 15 in the non-streaming result, in the streaming intermediate result, and in the final result. That 15 is the value the page prints. It is not a glyph count you are free to overwrite. Across several sentences the figure on sentence-end is cumulative. The final usage.characters is already the request total. Adding each cumulative figure on top of it counts the same characters again.
The model page prices speech synthesis per ten thousand characters, with a separate row per model and per region. China (Beijing) and Singapore are not the same row. Unit prices stay on that page and in the console. This article does not freeze one day's number into a standing rate. Speech rate, pitch, sample rate and volume are request parameters. They do not appear in usage. Matching the mp3's duration against this column matches a different ledger. The audio URL lasts 24 hours. A download that fails after that is not a second synthesis. A second API call is.
On the Intelligent Speech Interaction price table, Alibaba Cloud Model Studio speech models sit under speech recognition and bill by audio duration. That row is not CosyVoice synthesis. Recognition by the second and synthesis by the character can land on the same cloud account. They do not collapse into one line because both are about voice.
2. The other API counts a hanzi as two
The ISI billing items turn speech-synthesis calls into UTF-8 character counts. Up to 100 characters, including 100, is one call. Every further 100 adds a call. One request accepts at most 300 characters. One hanzi counts as two characters. A Latin letter and a full-width or half-width punctuation mark count as one. SSML tags are not counted. The page's own examples: 102 characters are two calls, 201 characters are three. On the same table, long-text synthesis is billed by synthesized character count, a different row from the per-call service.
The CosyVoice streaming interface reports payload.measureLength on SynthesisCompleted. The rule is the same: one hanzi is two characters, and one letter, punctuation mark, or space inside a sentence is one. A single synthesis in a session stays within 10,000 characters, and the session total stays within 200,000. This path is commercial only. There is no trial. The completion event reports a character measure, not a call count that has already been bundled. Whether the invoice shows calls or character totals depends on which billing row the service uses. Do not treat measureLength as a call count that has already been divided by 100.
The same Chinese passage can therefore be characters 15 on the Bailian sample and, on the ISI side, a hanzi doubled before it is bundled into calls of 100. The Bailian API page does not define a hanzi as two characters in that sentence. Reconcile Bailian to the 15 it returns. Do not multiply the text you sent by ISI's two and then edit the Bailian bill. The numbers do not add, and one of them does not estimate the other. First check whether the request hit Bailian's SpeechSynthesizer or an ISI project appkey.
3. Tags, replacements and filters change the text that is spoken
Bailian SSML requires enable_ssml set to true, with the body rewritten as markup. ISI states that the tags themselves are not characters. Only the text to be spoken counts. Bailian does not write that as the same rule. The characters it returns are the number it stands behind. A long tag string is not a reason to bill the tag bytes. A short tag string is not a reason to subtract the markup yourself.
Bailian's hot_fix.replace swaps a word for another string before synthesis. The page says the replacement is what actually gets synthesized. The word you typed and the word that is spoken can differ. A pronunciation hint changes the reading. It does not send the pinyin letters off to be read as text. Reconcile to the returned characters. Do not edit that field with the length from before the replacement, and do not assume the swap always lengthens or shortens the bill.
Markdown filtering is available only for cloned voices on cosyvoice-v3-flash. When it is on, markup is stripped before synthesis so hash marks and asterisks are not read aloud. What changes is the reading. The bill still follows characters. Do not assume an asterisk is free, or that it is always billed as typed. v2 does not support this hot fix. Cloned voices on the other models do not get this Markdown switch. A missing switch does not mean the symbols disappear the way you hoped.
4. Free quota does not pay this from the token pool
Bailian's new-user free quota exists only in China (Beijing), and only after real-name verification. It lasts 90 days from the later of account opening, model release, or an approved application. Not using it does not pause the clock. What remains at expiry is void. It is not reissued, extended, or reset. A second account under the same verified entity does not receive another grant. The quota covers realtime model inference only. Batch, tuning, deployment, custom models, PAI-DSW and OSS are outside it. Models do not share. A dated snapshot and the latest alias are two models, and exhausting one does not switch you to the other. The main account and its RAM users share one balance.
The page describes that balance as tokens, with input and output drawing on the same pool. Speech synthesis on the model page is per ten thousand characters, not that token pool. Whatever a text model still has left does not pay this column. Singapore has no new-user free quota. The order of payment is free quota, then resource packs, then savings plans, then pay as you go. A Token Plan or Coding Plan key does not spend the free quota. It bills immediately. The console figure refreshes on the order of a minute, and only after you reload it. With stop-when-exhausted on, calls stop when the quota is gone. With it off, a call already in flight is not cut, and the overflow is pay as you go. Those switches are the same ones in the free-quota article. They are not a formula for speech characters.
Built-in web search bills per call, which is the search article. A knowledge base bills by the hour from the moment it is created, which is the knowledge-base article. All three can show up next to this request's characters. Search calls, knowledge-base hours and speech characters do not collapse into one token line because a model was involved.
5. A top-up does not shorten the character count
Reconcile by the interface this call actually used. On Bailian, read the returned characters, do not add a cumulative stream figure a second time, and do not look for speech rate or sample rate in that object. A URL that dies after 24 hours is not a new charge. On the ISI side, read measureLength with the hanzi-as-two ruler, then see whether the invoice row is calls bundled at 100 characters or the long-text row billed by synthesized characters. SSML tags are excluded on the ISI side. Replacement and Markdown filtering change the text that enters the engine. They do not change the rule that the returned figure is the one to reconcile. Free quota covers Beijing realtime inference only. A text model's tokens stay on that model.
Topping up the Alibaba Cloud account happens before these columns are charged. Swapping a stablecoin on-chain for an asset you can pay the account with does not turn a hanzi from two characters into one, and it does not let a text model's tokens pay the speech column. When that swap is the step you need, a no-signup, non-custodial exchange on AllSwap moves the asset. A completed swap only means the asset changed hands. The characters still follow what this call returned.