Google TTS Chirp 3 HD vs Qwen3 TTS Instruct Flash
Which one, when — curated verdict, not a benchmark table
qwen3-tts-instruct-flash is 2.6x cheaper per million characters ($11.5 against $30) and takes plain-language voice direction, but it accepts only 600 characters per request against 5000 bytes on google-tts-chirp3-hd, so long copy has to be chunked. Google's model covers the wider locale list and exposes numeric voice parameters, with SSML in preview. Pick qwen3-tts-instruct-flash for short lines with a described delivery, google-tts-chirp3-hd for long text and locale breadth.
Pricing
| Google TTS Chirp 3 HD | Qwen3 TTS Instruct Flash | Δ | |
|---|---|---|---|
| Per 1M characters | $30 | $11.5 | 2.6× |
Rates from the live catalog at build time; each model page carries the current card.
Where they sit — price per 1M characters across all 7 text-to-speech models on this billing unit (log scale)
Capabilities
| Google TTS Chirp 3 HD | Qwen3 TTS Instruct Flash | |
|---|---|---|
| Streaming | yes | yes |
| SSML | preview | undocumented |
| Billing unit | character | character |
Specs
| Google TTS Chirp 3 HD | Qwen3 TTS Instruct Flash | |
|---|---|---|
| Input modalities | text | text |
| Output modalities | audio | audio |
| Request limit | 5000 bytes | 600 characters |
| Voices | Voices are named after stars and published with a gender: Achernar, Achird, Algenib, Algieba, Alnilam, Aoede, Autonoe, Callirrhoe, Charon, Despina, Enceladus, Erinome, Fenrir, Gacrux, Iapetus, Kore, Laomedeia, Leda, Orus, Pulcherrima, Puck, Rasalgethi, Sadachbia, Sadaltager, Schedar, Sulafat, Umbriel, Vindemiatrix, Zephyr and Zubenelgenubi. A locale prefix forms the id, e.g. en-US-Chirp3-HD-Charon. Google describes the set as 30 distinct styles across many languages. | System voices published with one-line personas, among them Cherry (a sunny, positive, friendly and natural young woman), Serena, Ethan, Chelsie, Momo, Vivian, Moon, Maia, Kai, Nofish (a designer who cannot pronounce retroflex sounds), Bella, Eldric Sage, Mia, Mochi, Bellona, Vincent, Bunny, Neil, Elias, Arthur, Nini, Seren, Pip and Stella the Qwen-TTS voice list pairs each voice with the exact model ids that accept it. |
| Languages | ar-XA, bn-IN, bg-BG, yue-HK, hr-HR, cs-CZ, da-DK, nl-BE, nl-NL, en-AU, en-IN, en-GB, en-US, et-EE, fi-FI, fr-CA, fr-FR, de-DE, el-GR, gu-IN, he-IL, hi-IN, hu-HU, id-ID, it-IT, ja-JP, kn-IN, ko-KR, lv-LV, lt-LT, ml-IN, cmn-CN, mr-IN, nb-NO, pl-PL, pt-BR, pa-IN, ro-RO, ru-RU, sr-RS, sk-SK, sl-SI, es-ES, es-US, sw-KE, sv-SE, ta-IN, te-IN, th-TH, tr-TR, uk-UA, ur-IN and vi-VN. | Chinese (Mandarin), English, German, Italian, Portuguese, Spanish, Japanese, Korean, French and Russian. language_type defaults to Auto for mixed-language or undetermined input, which Alibaba documents as not guaranteeing accuracy naming a single language is documented to significantly improve synthesis quality. Unlike the Qwen3-TTS-Flash series, the Instruct series lists no Chinese dialect voices (Beijing, Shanghainese, Sichuan, Nanjing, Shaanxi, Hokkien, Tianjin, Cantonese). |
| Voice control |
|
|
| Limits | Content limit of 5,000 total bytes per synthesize request. Default response format LINEAR16 streaming supports ALAW, MULAW, OGG_OPUS and PCM, batch adds MP3, so MP3 is not available on the streaming path. The only voice type Google's comparison table marks as streaming-capable. Generally available in the global, us and eu endpoints plus asia-southeast1, europe-west2 and asia-northeast1, but out of scope for regionalization and data residency. Billed per character including spaces and newlines, with all SSML tags except <mark> counted. | HTTP non-real-time speech synthesis API the -realtime suffix marks the WebSocket sibling. Input text capped at 600 characters, multilingual mixed input allowed. Non-streaming returns an audio file URL valid for 24 hours streaming returns Base64-encoded PCM in chunks with the URL only in the final packet, played back in the official samples as 24 kHz mono 16-bit audio. Billed by input text characters, reported as usage.characters (input_tokens and output_tokens are always 0 on the Qwen3-TTS series) output audio is free. |
Specs are transcribed from each vendor’s documentation; a row a vendor does not publish is left out rather than inferred. Full sources: Google TTS Chirp 3 HD · Qwen3 TTS Instruct Flash
Switch between them with one line
Both ids are in every tab below — the highlighted pair of lines is the only edit. Same endpoint, same key, same request shape.
from openai import OpenAI
client = OpenAI(
base_url="https://synthorai.io/v1",
api_key="sk-syn-...",
)
resp = client.audio.transcriptions.create(
model="google-tts-chirp3-hd",
# model="qwen3-tts-instruct-flash", # uncomment this line, comment the one above
file=open("meeting.mp3", "rb"),
language="en",
)
print(resp.text)import OpenAI from "openai";
import fs from "node:fs";
const client = new OpenAI({
baseURL: "https://synthorai.io/v1",
apiKey: "sk-syn-...",
});
const resp = await client.audio.transcriptions.create({
model: "google-tts-chirp3-hd",
// model: "qwen3-tts-instruct-flash", // uncomment this line, comment the one above
file: fs.createReadStream("meeting.mp3"),
});
console.log(resp.text);curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer sk-syn-..." \
-F model="google-tts-chirp3-hd" \
# -F model="qwen3-tts-instruct-flash" \ # uncomment this line, comment the one above
-F file=@meeting.mp3package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
)
func main() {
client := openai.NewClient(
option.WithBaseURL("https://synthorai.io/v1"),
option.WithAPIKey("sk-syn-..."),
)
f, _ := os.Open("meeting.mp3")
resp, _ := client.Audio.Transcriptions.New(context.TODO(), openai.AudioTranscriptionNewParams{
Model: "google-tts-chirp3-hd",
// Model: "qwen3-tts-instruct-flash", // uncomment this line, comment the one above
File: f,
})
fmt.Println(resp.Text)
}import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.audio.transcriptions.*;
import java.nio.file.Paths;
OpenAIClient client = OpenAIOkHttpClient.builder()
.baseUrl("https://synthorai.io/v1")
.apiKey("sk-syn-...")
.build();
Transcription resp = client.audio().transcriptions().create(
TranscriptionCreateParams.builder()
.model("google-tts-chirp3-hd")
// .model("qwen3-tts-instruct-flash") // uncomment this line, comment the one above
.file(Paths.get("meeting.mp3"))
.build()).asTranscription();
System.out.println(resp.text());FAQ
Which is cheaper, Google TTS Chirp 3 HD or Qwen3 TTS Instruct Flash?
Qwen3 TTS Instruct Flash is cheaper on per 1m characters ($11.5 vs $30, 2.6× apart). Other rows may point the other way — the table above carries the full card, and real cost depends on your mix.
Can I A/B test Google TTS Chirp 3 HD against Qwen3 TTS Instruct Flash without two integrations?
Yes. Both are served through the same OpenAI-compatible endpoint with one API key — switching is a one-line model-string change, so you can route a fraction of traffic to each and compare bills directly.
How is text-to-speech billed?
Per character of input text, with a per-request character ceiling shown in the spec table. Long scripts must be chunked across requests on either model.