Luke Oliff.

Testing 10 languages with one macOS command

·TIL·4 min read·Luke Oliff

Friday fun: the macOS say command supports voices in ten languages. I found this out by accident while looking for a quick way to generate test audio for Deepgram’s Flux Multilingual model.

I was writing integration examples and needed audio samples in all ten supported languages. English, Spanish, French, German, Hindi, Russian, Portuguese, Japanese, Italian, Dutch. Installing ten different TTS SDKs felt like the wrong kind of project. Recording myself speaking ten languages felt even worse. I checked if the Mac already had something built in.

It does. say writes audio to a file with the -o flag. The -v flag picks the voice. The language locale is embedded in the voice name.

say -v 'Samantha' "Hello, testing one two three." -o test_en.aiff
say -v 'Mónica' "Hola, probando uno dos tres." -o test_es.aiff
say -v 'Thomas' "Bonjour, test un deux trois." -o test_fr.aiff
say -v 'Anna' "Hallo, Test eins zwei drei." -o test_de.aiff

I built a quick loop that generated audio for all ten languages, then piped each file through the STT connection to check whether the model detected the right language and produced a sensible transcript. It caught two bugs in my example code before I ever pushed a branch.

What say gives you that other tools don’t

The output is clean AIFF format audio. You can pipe it through ffmpeg to resample to whatever the API expects. No background noise, no mic artifacts, no variable bitrate surprises. Every test run starts from the same baseline.

The voices are synthetic and they sound synthetic. That’s actually a feature, not a bug. If your STT model handles a clean synthetic voice without degrading, you’ve eliminated the audio quality variable from your debugging. When something breaks, you know it’s the model or the integration, not the recording.

for lang in en es fr de hi ru pt ja it nl; do
  voice=$(get_voice_for_lang "$lang")
  say -v "$voice" "Test phrase in ${lang}" -o "test_${lang}.aiff"
  ffmpeg -y -i "test_${lang}.aiff" -ar 16000 -ac 1 "test_${lang}.wav" 2>/dev/null
done

Why this mattered at the time

Deepgram had just shipped Flux Multilingual at the end of April. Ten languages in one streaming model with automatic language detection and code-switching. The documentation and integration examples needed to show real working code for each language. Not pseudo-code. Not a single English example with a note saying “this also works in other languages.” Real connections, real transcripts, real language detection output.

That meant generating real audio in each language. The say command was already installed on every Mac in the team. Zero setup. No API keys. No rate limits. I spent more time writing the test loop than discovering the tool existed.

What I learned about testing multilingual voice AI

The thing that surprised me most was how much variability comes from the text itself, not the audio. A short phrase in Japanese behaves differently from a long sentence in German. Different sentence structures create different timing patterns. Code-switching, a sentence that starts in one language and ends in another, exposes different parts of the pipeline than single-language audio.

A synthetic voice generator that covers all ten languages let me test these scenarios without needing native speakers on standby. Not a replacement for real voice data. But a much faster iterating loop for the documentation work.

FAQ

How do I find available say voices on macOS?

Run say -v '?' in the terminal. It lists every voice with its locale and a sample sentence. Pipe it through grep to filter by language code.

What format does the say command output?

AIFF by default. Use ffmpeg to convert to 16-bit 16 kHz mono WAV for STT APIs, or pipe the raw audio through a resampling step in your test harness.

Can I use say for production audio testing?

For integration and documentation tests, yes. The synthetic output gives you a clean baseline. For accuracy benchmarks and production validation, use real human speech recordings. Synthetic voices don’t capture the acoustic variability of real conversations.