Cantonese speech-to-text
ExcellentWe sent 30 Cantonese test clips through this API. Whisper Large v3 made 5.1% character errors, about one character in 20. $0.002 per audio minute, word timestamps, SRT and VTT subtitles, files up to 100 MB.
Measured accuracy
| Model | Word error rate | Character error rate | Clips with no errors | Empty transcripts | Speed |
|---|---|---|---|---|---|
Whisper Large v3openai/whisper-large-v3 | 88% | 5.1% | 7 of 30 | 0 of 30 | 0.08× real time |
Excellent. Production quality. Transcripts can be used as they are for notes, search and subtitles. Scored on characters. The inference backend has no separate Cantonese mode, so language=yue is sent as zh; the result above is what that produces on Cantonese audio. The clips are clean, single-speaker read speech, so treat this as a best case for your own recordings. How we measured, and all 83 languages.
What a transcript looks like
The clip with the median error rate from the test, reference text against what the API returned.
| Spoken | 遊客仍須聽取當局建議、遵守所有標示,並密切注意安全警示。 |
| Whisper Large v3 | 遊客仍需聽取當局建議遵守所有標示並密切注意安全警示 |
Language detection
Send language=yue. Of 10 clips sent without it, only 0 were identified as Cantonese; the others were labelled Thai (4), Chinese (3), Vietnamese (2), English (1). When detection is wrong, Whisper writes the transcript in the language it guessed.
Quickstart
The request is the OpenAI transcription request with a different base URL. language is optional in the API but, as shown above, not optional in practice for Cantonese.
curl https://api.inferenceapis.com/v1/audio/transcriptions \
-H "Authorization: Bearer $INFERENCE_API_KEY" \
-F "model=openai/whisper-large-v3" \
-F "language=yue" \
-F "file=@recording.mp3" \
-F "response_format=verbose_json"import os
from openai import OpenAI
client = OpenAI(base_url="https://api.inferenceapis.com/v1", api_key=os.environ["INFERENCE_API_KEY"])
with open("recording.mp3", "rb") as f:
r = client.audio.transcriptions.create(model="openai/whisper-large-v3", file=f, language="yue", response_format="verbose_json")
print(r.text)Subtitles and timestamps
response_format=srt or vtt returns a subtitle file with cues of up to two lines, broken at sentence ends and pauses. verbose_json with timestamp_granularities[]=word returns a start and end time for every word if you want to build your own.
Cost
$0.002 per minute of audio on either model: $0.12 for an hour, $12 for a hundred hours. Duration is measured from the file you upload. There is no daily cap on minutes and no subscription; enough to run your own Cantonese test.
Notes for Cantonese
- Send
language=yue(orzh; they are treated the same). Do not rely on auto-detection: none of our ten Cantonese clips was identified correctly without it. - Output is written Chinese in Traditional characters, not a phonetic rendering of spoken Cantonese.
FAQ
How accurate is Whisper for Cantonese?
On 30 clean read-speech clips it made 5.1% character errors, about one character in 20. Production quality. Transcripts can be used as they are for notes, search and subtitles. Real recordings with noise, accents or several speakers will score worse.
Does language auto-detection work for Cantonese?
Not reliably. Of 10 clips sent without a language, 0 were identified as Cantonese; the rest were labelled Thai (4), Chinese (3), Vietnamese (2), English (1). A wrong label means the transcript is written in the wrong language, so always send language=yue.
Can it translate Cantonese speech to English?
The API returns Cantonese text. For English, transcribe first and translate the text with a chat model on the same key.
Related languages: Chinese (9.5%)
