desert-ant-labs/ear

Model

Ear

9

21 commits

1 linked in READMEs

updated Oct 17, 2026

See the code

README

Ear

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.

Files

FileFormatSizeContents
ear.mlmodelcCore ML, 6-bit weights, compiled5.0MBThe detector for iOS, macOS, tvOS and visionOS
ear.tfliteLiteRT, int810.7MBThe detector for Android, Linux, Windows, Node and the web
ear_meta.jsonJSON2.2kBThe front end's geometry and the tensor names per runtime
languages.jsonJSON0.6kBThe language codes, in output order
mel_filters.f32Binary table64kBThe 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.

Inputs and outputs

  • In: 16kHz mono audio, up to 30s.
  • Out: a probability for each language, in the order of languages.json. The language with the highest probability is Ear's answer.
  • Reliable or not: an answer is reliable when the top two probabilities are at least 0.25 apart. The SDK always marks Norwegian, Swedish and Danish as unreliable.

Languages

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.

Results

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.

CorpusClips per length5s10s15s20s30s
Common Voice, 15 languages1,5000.9460.9800.9890.9910.995
VoxPopuli, 16 languages825 to 4580.9780.9960.9970.9981.000
NST, Norwegian and Swedish2000.9850.9951.0001.0001.000
Multilingual LibriSpeech, 7 languages5320.9790.9920.9960.9980.994
English, LibriSpeech audiobooks1000.9901.0001.0001.0001.000
English, AMI meetings1000.9501.0001.0001.0001.000
English, CHiME-6 dinner parties320.9381.0001.0001.0001.000
English, NOTSOFAR-1 meetings1000.9000.8900.9600.9600.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.

CorpusClipsRight modelWrong modelReliableRight when reliable
Common Voice7,5000.9900.0140.9860.994
VoxPopuli3,2210.9980.0000.9950.999
NST1,0001.0000.000always unreliable
Multilingual LibriSpeech2,6600.997every language handled0.9940.998
English, four conditions1,6600.980every language handled0.9720.991

Whole recordings. Ear's answers on three 30s clips from each recording, averaged.

CorpusRecordingsRight modelReliableRight when reliableReliable and wrong
Common Voice4570.9930.9960.9962
VoxPopuli2561.0001.0001.0000
NST801.000always unreliable0
Multilingual LibriSpeech1731.0001.0001.0000
English, four conditions1280.9840.9840.9921

More test sets, Core ML build.

SetClipsAccuracyRight modelWrong model
FLEURS test, the 32 product languages6400.9770.9970.000
FLEURS test, all 102 languages2,0400.9540.9930.010
VoxLingua107 dev, YouTube audio, languages Ear offers1,0940.9420.973
VoxLingua107 dev, YouTube audio, languages Ear does not offer5150.012
120 VoxPopuli recordings, whole files1201.000

Performance

7.6ms per clip on the Apple Neural Engine. One 30s clip, after warm-up, median.

BuildDeviceComputeSizeLatency
Core ML, 6-bit weightsMacBook Pro, M5 Pro, macOS 26Apple Neural Engine, 100% resident5.0MB7.6ms
LiteRT, int8MacBook Pro, M5 Pro, macOS 26CPU, 4 threads10.7MB26.8ms

Limitations

  • Far-field recordings. Ear is less accurate when the speakers are far from the microphone. On NOTSOFAR-1 meetings, Ear gets the language right 90% of the time on 5s clips, versus 98% on 30s clips. For room recordings, pass Ear the full 30s, and when an answer is unreliable, ask a user to confirm the language.
  • Galician. Ear labels Galician as Spanish about 4% of the time.
  • Norwegian, Swedish and Danish. Ear tells Norwegian and Swedish apart 98.5-100% of the time on NST. The SDK still marks all three as unreliable, so you can route them to a transcription model that handles them well.
  • Mixed-language recordings. Ear returns one language per clip, even if the speakers switch languages.
  • Languages outside the 102. Ear returns the closest supported language. The reliability rule catches most of these answers, but not all of them.
  • Ear detects the language and doesn't transcribe. For a transcript, pair Ear with Voz or another transcription model.

Credits

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.

License

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].

See THIRD_PARTY_NOTICES.md.

Citation

@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

apple-neural-engine
audio-classification
core-ml
edge-ai
langid
language-detection
language-identification
litert
mobile
model-index
multilingual
offline
on-device
speech
spoken-language-identification
tflite

desert-ant-labs/ear

Model

Ear

9

21 commits

1 linked in READMEs

updated Oct 17, 2026

See the code

README

Ear

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.

Files

FileFormatSizeContents
ear.mlmodelcCore ML, 6-bit weights, compiled5.0MBThe detector for iOS, macOS, tvOS and visionOS
ear.tfliteLiteRT, int810.7MBThe detector for Android, Linux, Windows, Node and the web
ear_meta.jsonJSON2.2kBThe front end's geometry and the tensor names per runtime
languages.jsonJSON0.6kBThe language codes, in output order
mel_filters.f32Binary table64kBThe 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.

Inputs and outputs

  • In: 16kHz mono audio, up to 30s.
  • Out: a probability for each language, in the order of languages.json. The language with the highest probability is Ear's answer.
  • Reliable or not: an answer is reliable when the top two probabilities are at least 0.25 apart. The SDK always marks Norwegian, Swedish and Danish as unreliable.

Languages

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.

Results

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.

CorpusClips per length5s10s15s20s30s
Common Voice, 15 languages1,5000.9460.9800.9890.9910.995
VoxPopuli, 16 languages825 to 4580.9780.9960.9970.9981.000
NST, Norwegian and Swedish2000.9850.9951.0001.0001.000
Multilingual LibriSpeech, 7 languages5320.9790.9920.9960.9980.994
English, LibriSpeech audiobooks1000.9901.0001.0001.0001.000
English, AMI meetings1000.9501.0001.0001.0001.000
English, CHiME-6 dinner parties320.9381.0001.0001.0001.000
English, NOTSOFAR-1 meetings1000.9000.8900.9600.9600.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.

CorpusClipsRight modelWrong modelReliableRight when reliable
Common Voice7,5000.9900.0140.9860.994
VoxPopuli3,2210.9980.0000.9950.999
NST1,0001.0000.000always unreliable
Multilingual LibriSpeech2,6600.997every language handled0.9940.998
English, four conditions1,6600.980every language handled0.9720.991

Whole recordings. Ear's answers on three 30s clips from each recording, averaged.

CorpusRecordingsRight modelReliableRight when reliableReliable and wrong
Common Voice4570.9930.9960.9962
VoxPopuli2561.0001.0001.0000
NST801.000always unreliable0
Multilingual LibriSpeech1731.0001.0001.0000
English, four conditions1280.9840.9840.9921

More test sets, Core ML build.

SetClipsAccuracyRight modelWrong model
FLEURS test, the 32 product languages6400.9770.9970.000
FLEURS test, all 102 languages2,0400.9540.9930.010
VoxLingua107 dev, YouTube audio, languages Ear offers1,0940.9420.973
VoxLingua107 dev, YouTube audio, languages Ear does not offer5150.012
120 VoxPopuli recordings, whole files1201.000

Performance

7.6ms per clip on the Apple Neural Engine. One 30s clip, after warm-up, median.

BuildDeviceComputeSizeLatency
Core ML, 6-bit weightsMacBook Pro, M5 Pro, macOS 26Apple Neural Engine, 100% resident5.0MB7.6ms
LiteRT, int8MacBook Pro, M5 Pro, macOS 26CPU, 4 threads10.7MB26.8ms

Limitations

  • Far-field recordings. Ear is less accurate when the speakers are far from the microphone. On NOTSOFAR-1 meetings, Ear gets the language right 90% of the time on 5s clips, versus 98% on 30s clips. For room recordings, pass Ear the full 30s, and when an answer is unreliable, ask a user to confirm the language.
  • Galician. Ear labels Galician as Spanish about 4% of the time.
  • Norwegian, Swedish and Danish. Ear tells Norwegian and Swedish apart 98.5-100% of the time on NST. The SDK still marks all three as unreliable, so you can route them to a transcription model that handles them well.
  • Mixed-language recordings. Ear returns one language per clip, even if the speakers switch languages.
  • Languages outside the 102. Ear returns the closest supported language. The reliability rule catches most of these answers, but not all of them.
  • Ear detects the language and doesn't transcribe. For a transcript, pair Ear with Voz or another transcription model.

Credits

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.

License

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].

See THIRD_PARTY_NOTICES.md.

Citation

@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

apple-neural-engine
audio-classification
core-ml
edge-ai
langid
language-detection
language-identification
litert
mobile
model-index
multilingual
offline
on-device
speech
spoken-language-identification
tflite