Detect spoken language from 30 seconds audio.
On-device spoken language identification across 102 languages.
Detect the spoken language of a recording with Ear before you transcribe it, so you run the right transcription model. Ear works on 5-30s of speech and takes 7.6ms on a MacBook Pro, entirely on the device.
Ear is a spoken language identification model for 102 languages. Ear gives each language a confidence score. When the top two are too close to call, Ear flags the answer as unreliable. You can then ask the user or fall back to a general model instead of transcribing in the wrong language. The model is 5.0MB as Core ML for Apple platforms and 10.7MB as LiteRT for Android, Linux, Windows and Node.
| File | Format | Size | Contents |
|---|---|---|---|
ear.mlmodelc | Core ML, 6-bit weights, compiled | 5.0MB | The detector for iOS, macOS, tvOS and visionOS |
ear.tflite | LiteRT, int8 | 10.7MB | The detector for Android, Linux, Windows, Node and the web |
ear_meta.json | JSON | 2.2kB | The front end's geometry and the tensor names per runtime |
languages.json | JSON | 0.6kB | The language codes, in output order |
mel_filters.f32 | Binary table | 64kB | The mel filterbank, 80 by 201, little-endian |
Load the detector for your platform together with ear_meta.json, languages.json and mel_filters.f32. The SDK uses them to prepare the audio, so there's no separate model for that step.
languages.json. The language with the highest probability is Ear's answer.Ear covers 102 languages, from Afrikaans to Zulu, listed in output order in languages.json. For any other language, Ear returns the closest supported language, so check that each answer is reliable before picking a transcription model.
The right transcription model, 99% of the time. Measured on the files in this repo, with speakers who weren't in the training data.
Accuracy by clip length. How often Ear's top answer is the right language.
| Corpus | Clips per length | 5s | 10s | 15s | 20s | 30s |
|---|---|---|---|---|---|---|
| Common Voice, 15 languages | 1,500 | 0.946 | 0.980 | 0.989 | 0.991 | 0.995 |
| VoxPopuli, 16 languages | 825 to 458 | 0.978 | 0.996 | 0.997 | 0.998 | 1.000 |
| NST, Norwegian and Swedish | 200 | 0.985 | 0.995 | 1.000 | 1.000 | 1.000 |
| Multilingual LibriSpeech, 7 languages | 532 | 0.979 | 0.992 | 0.996 | 0.998 | 0.994 |
| English, LibriSpeech audiobooks | 100 | 0.990 | 1.000 | 1.000 | 1.000 | 1.000 |
| English, AMI meetings | 100 | 0.950 | 1.000 | 1.000 | 1.000 | 1.000 |
| English, CHiME-6 dinner parties | 32 | 0.938 | 1.000 | 1.000 | 1.000 | 1.000 |
| English, NOTSOFAR-1 meetings | 100 | 0.900 | 0.890 | 0.960 | 0.960 | 0.980 |
Routing, every clip. Right model: the clip went to a transcription model that handles its language. Wrong model: it went to one that doesn't. Reliable: the answer passed the reliability rule. Right when reliable: how many reliable answers were correct.
| Corpus | Clips | Right model | Wrong model | Reliable | Right when reliable |
|---|---|---|---|---|---|
| Common Voice | 7,500 | 0.990 | 0.014 | 0.986 | 0.994 |
| VoxPopuli | 3,221 | 0.998 | 0.000 | 0.995 | 0.999 |
| NST | 1,000 | 1.000 | 0.000 | always unreliable | |
| Multilingual LibriSpeech | 2,660 | 0.997 | every language handled | 0.994 | 0.998 |
| English, four conditions | 1,660 | 0.980 | every language handled | 0.972 | 0.991 |
Whole recordings. Ear's answers on three 30s clips from each recording, averaged.
| Corpus | Recordings | Right model | Reliable | Right when reliable | Reliable and wrong |
|---|---|---|---|---|---|
| Common Voice | 457 | 0.993 | 0.996 | 0.996 | 2 |
| VoxPopuli | 256 | 1.000 | 1.000 | 1.000 | 0 |
| NST | 80 | 1.000 | always unreliable | 0 | |
| Multilingual LibriSpeech | 173 | 1.000 | 1.000 | 1.000 | 0 |
| English, four conditions | 128 | 0.984 | 0.984 | 0.992 | 1 |
More test sets, Core ML build.
| Set | Clips | Accuracy | Right model | Wrong model |
|---|---|---|---|---|
| FLEURS test, the 32 product languages | 640 | 0.977 | 0.997 | 0.000 |
| FLEURS test, all 102 languages | 2,040 | 0.954 | 0.993 | 0.010 |
| VoxLingua107 dev, YouTube audio, languages Ear offers | 1,094 | 0.942 | 0.973 | |
| VoxLingua107 dev, YouTube audio, languages Ear does not offer | 515 | 0.012 | ||
| 120 VoxPopuli recordings, whole files | 120 | 1.000 |
7.6ms per clip on the Apple Neural Engine. One 30s clip, after warm-up, median.
| Build | Device | Compute | Size | Latency |
|---|---|---|---|---|
| Core ML, 6-bit weights | MacBook Pro, M5 Pro, macOS 26 | Apple Neural Engine, 100% resident | 5.0MB | 7.6ms |
| LiteRT, int8 | MacBook Pro, M5 Pro, macOS 26 | CPU, 4 threads | 10.7MB | 26.8ms |
Open models and tools this work builds on, with their licenses:
None of them is redistributed here. Dataset attributions are in THIRD_PARTY_NOTICES.md.
Desert Ant Labs Source-Available License. Free for most apps, and a commercial license is required at scale. Full terms are at the link. Licensing: [email protected].
@software{ear_2026,
title = {Ear: On-device spoken language identification across 102 languages},
author = {Desert Ant Labs},
year = {2026},
url = {https://huggingface.co/desert-ant-labs/ear},
}
© 2026 Desert Ant Labs · https://desertant.com
Detect spoken language from 30 seconds audio.
On-device spoken language identification across 102 languages.
Detect the spoken language of a recording with Ear before you transcribe it, so you run the right transcription model. Ear works on 5-30s of speech and takes 7.6ms on a MacBook Pro, entirely on the device.
Ear is a spoken language identification model for 102 languages. Ear gives each language a confidence score. When the top two are too close to call, Ear flags the answer as unreliable. You can then ask the user or fall back to a general model instead of transcribing in the wrong language. The model is 5.0MB as Core ML for Apple platforms and 10.7MB as LiteRT for Android, Linux, Windows and Node.
| File | Format | Size | Contents |
|---|---|---|---|
ear.mlmodelc | Core ML, 6-bit weights, compiled | 5.0MB | The detector for iOS, macOS, tvOS and visionOS |
ear.tflite | LiteRT, int8 | 10.7MB | The detector for Android, Linux, Windows, Node and the web |
ear_meta.json | JSON | 2.2kB | The front end's geometry and the tensor names per runtime |
languages.json | JSON | 0.6kB | The language codes, in output order |
mel_filters.f32 | Binary table | 64kB | The mel filterbank, 80 by 201, little-endian |
Load the detector for your platform together with ear_meta.json, languages.json and mel_filters.f32. The SDK uses them to prepare the audio, so there's no separate model for that step.
languages.json. The language with the highest probability is Ear's answer.Ear covers 102 languages, from Afrikaans to Zulu, listed in output order in languages.json. For any other language, Ear returns the closest supported language, so check that each answer is reliable before picking a transcription model.
The right transcription model, 99% of the time. Measured on the files in this repo, with speakers who weren't in the training data.
Accuracy by clip length. How often Ear's top answer is the right language.
| Corpus | Clips per length | 5s | 10s | 15s | 20s | 30s |
|---|---|---|---|---|---|---|
| Common Voice, 15 languages | 1,500 | 0.946 | 0.980 | 0.989 | 0.991 | 0.995 |
| VoxPopuli, 16 languages | 825 to 458 | 0.978 | 0.996 | 0.997 | 0.998 | 1.000 |
| NST, Norwegian and Swedish | 200 | 0.985 | 0.995 | 1.000 | 1.000 | 1.000 |
| Multilingual LibriSpeech, 7 languages | 532 | 0.979 | 0.992 | 0.996 | 0.998 | 0.994 |
| English, LibriSpeech audiobooks | 100 | 0.990 | 1.000 | 1.000 | 1.000 | 1.000 |
| English, AMI meetings | 100 | 0.950 | 1.000 | 1.000 | 1.000 | 1.000 |
| English, CHiME-6 dinner parties | 32 | 0.938 | 1.000 | 1.000 | 1.000 | 1.000 |
| English, NOTSOFAR-1 meetings | 100 | 0.900 | 0.890 | 0.960 | 0.960 | 0.980 |
Routing, every clip. Right model: the clip went to a transcription model that handles its language. Wrong model: it went to one that doesn't. Reliable: the answer passed the reliability rule. Right when reliable: how many reliable answers were correct.
| Corpus | Clips | Right model | Wrong model | Reliable | Right when reliable |
|---|---|---|---|---|---|
| Common Voice | 7,500 | 0.990 | 0.014 | 0.986 | 0.994 |
| VoxPopuli | 3,221 | 0.998 | 0.000 | 0.995 | 0.999 |
| NST | 1,000 | 1.000 | 0.000 | always unreliable | |
| Multilingual LibriSpeech | 2,660 | 0.997 | every language handled | 0.994 | 0.998 |
| English, four conditions | 1,660 | 0.980 | every language handled | 0.972 | 0.991 |
Whole recordings. Ear's answers on three 30s clips from each recording, averaged.
| Corpus | Recordings | Right model | Reliable | Right when reliable | Reliable and wrong |
|---|---|---|---|---|---|
| Common Voice | 457 | 0.993 | 0.996 | 0.996 | 2 |
| VoxPopuli | 256 | 1.000 | 1.000 | 1.000 | 0 |
| NST | 80 | 1.000 | always unreliable | 0 | |
| Multilingual LibriSpeech | 173 | 1.000 | 1.000 | 1.000 | 0 |
| English, four conditions | 128 | 0.984 | 0.984 | 0.992 | 1 |
More test sets, Core ML build.
| Set | Clips | Accuracy | Right model | Wrong model |
|---|---|---|---|---|
| FLEURS test, the 32 product languages | 640 | 0.977 | 0.997 | 0.000 |
| FLEURS test, all 102 languages | 2,040 | 0.954 | 0.993 | 0.010 |
| VoxLingua107 dev, YouTube audio, languages Ear offers | 1,094 | 0.942 | 0.973 | |
| VoxLingua107 dev, YouTube audio, languages Ear does not offer | 515 | 0.012 | ||
| 120 VoxPopuli recordings, whole files | 120 | 1.000 |
7.6ms per clip on the Apple Neural Engine. One 30s clip, after warm-up, median.
| Build | Device | Compute | Size | Latency |
|---|---|---|---|---|
| Core ML, 6-bit weights | MacBook Pro, M5 Pro, macOS 26 | Apple Neural Engine, 100% resident | 5.0MB | 7.6ms |
| LiteRT, int8 | MacBook Pro, M5 Pro, macOS 26 | CPU, 4 threads | 10.7MB | 26.8ms |
Open models and tools this work builds on, with their licenses:
None of them is redistributed here. Dataset attributions are in THIRD_PARTY_NOTICES.md.
Desert Ant Labs Source-Available License. Free for most apps, and a commercial license is required at scale. Full terms are at the link. Licensing: [email protected].
@software{ear_2026,
title = {Ear: On-device spoken language identification across 102 languages},
author = {Desert Ant Labs},
year = {2026},
url = {https://huggingface.co/desert-ant-labs/ear},
}
© 2026 Desert Ant Labs · https://desertant.com