<br />

The MediaPipe Language Detector task lets you identify the language of a piece of text. This
task operates on text data with a machine learning (ML) model and outputs a list
of predictions, where each prediction consists of an [ISO
639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) language code and
a probability.


<iframe class="mp-demo-frame mp-demo-frame--studio" aria-label="Language Detector interactive Web SDK demo" loading="lazy" data-src="https://developers.devsite.google/frame/edge/mediapipe/demos/embed/language_detector.jshtml" allow="camera *; microphone *"></iframe>

[Open in Web Demos](https://google-ai-edge.github.io/mediapipe-samples-web/#/text/language_detector)[Edit in StackBlitz](https://stackblitz.com/github/google-ai-edge/mediapipe-samples-web?file=src/tasks/language-detector.ts)

<br />

## Quickstart

Install the SDK for your platform, initialize the task with a model, and run
inference.

### Web

npm`npm install @mediapipe/tasks-text`[Web demo](https://google-ai-edge.github.io/mediapipe-samples-web/#/text/language_detector)·[Edit in StackBlitz](https://stackblitz.com/github/google-ai-edge/mediapipe-samples-web?file=src/tasks/language-detector.ts)·[Setup guide](https://developers.google.com/edge/mediapipe/solutions/setup_web.md.txt)

```typescript
import { FilesetResolver, LanguageDetector } from "@mediapipe/tasks-text";

const MODEL_URL = "https://storage.googleapis.com/mediapipe-models/language_detector/language_detector/float32/1/language_detector.tflite";

const textFiles = await FilesetResolver.forTextTasks(
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-text@latest/wasm"
);
const languageDetector = await LanguageDetector.createFromOptions(textFiles, {
  baseOptions: { modelAssetPath: MODEL_URL },
});

const inputText = "Bonjour tout le monde, comment allez-vous ?";
const detectionResult = languageDetector.detect(inputText);
```

### Android (Kotlin)

Gradle`implementation("com.google.mediapipe:tasks-text:latest.release")`[Sample code](https://github.com/google-ai-edge/mediapipe-samples/tree/main/examples/language_detector/android)·[Setup guide](https://developers.google.com/edge/mediapipe/solutions/setup_android.md.txt)

```kotlin
import com.google.mediapipe.tasks.core.BaseOptions
import com.google.mediapipe.tasks.text.languagedetector.LanguageDetector
import com.google.mediapipe.tasks.text.languagedetector.LanguageDetector.LanguageDetectorOptions

val baseOptions = BaseOptions.builder()
    .setModelAssetPath("language_detector.tflite")
    .build()
val options = LanguageDetectorOptions.builder()
    .setBaseOptions(baseOptions)
    .setScoreThreshold(0.5f)
    .build()

val languageDetector = LanguageDetector.createFromOptions(context, options)

val inputText = "Bonjour tout le monde, comment allez-vous ?"
val result = languageDetector.detect(inputText)
```

### Android (Java)

Gradle`implementation 'com.google.mediapipe:tasks-text:latest.release'`[Sample code](https://github.com/google-ai-edge/mediapipe-samples/tree/main/examples/language_detector/android)·[Setup guide](https://developers.google.com/edge/mediapipe/solutions/setup_android.md.txt)

```java
import com.google.mediapipe.tasks.core.BaseOptions;
import com.google.mediapipe.tasks.text.languagedetector.LanguageDetector;
import com.google.mediapipe.tasks.text.languagedetector.LanguageDetector.LanguageDetectorOptions;
import com.google.mediapipe.tasks.text.languagedetector.LanguageDetectorResult;

BaseOptions baseOptions = BaseOptions.builder()
    .setModelAssetPath("language_detector.tflite")
    .build();
LanguageDetectorOptions options = LanguageDetectorOptions.builder()
    .setBaseOptions(baseOptions)
    .setScoreThreshold(0.5f)
    .build();

LanguageDetector languageDetector = LanguageDetector.createFromOptions(context, options);

String inputText = "Bonjour tout le monde, comment allez-vous ?";
LanguageDetectorResult result = languageDetector.detect(inputText);
```

### iOS

SwiftPM`https://github.com/google-ai-edge/mediapipe → MediaPipeTasksText`[Package.swift](https://developers.google.com/edge/mediapipe/solutions/setup_ios.md.txt#package_swift)·[Sample code](https://github.com/google-ai-edge/mediapipe-samples/tree/main/examples/language_detector/ios)·[Setup guide](https://developers.google.com/edge/mediapipe/solutions/setup_ios.md.txt)

```swift
import Foundation
import MediaPipeTasksText

guard let modelPath = Bundle.main.path(forResource: "language_detector", ofType: "tflite") else { return }

let options = LanguageDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.scoreThreshold = 0.5

let languageDetector = try LanguageDetector(options: options)

let inputText = "Bonjour tout le monde, comment allez-vous ?"
let result = try languageDetector.detect(text: inputText)
```

### Python

pip`pip install mediapipe`[Sample code](https://colab.research.google.com/github/google-ai-edge/mediapipe-samples/blob/main/examples/language_detector/python/%5BMediaPipe_Python_Tasks%5D_Language_Detector.ipynb)·[Setup guide](https://developers.google.com/edge/mediapipe/solutions/setup_python.md.txt)

```python
import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
LanguageDetector = mp.tasks.text.LanguageDetector
LanguageDetectorOptions = mp.tasks.text.LanguageDetectorOptions

model_path = "language_detector.tflite"
options = LanguageDetectorOptions(base_options=BaseOptions(model_asset_path=model_path), score_threshold=0.5)

input_text = "Bonjour tout le monde, comment allez-vous ?"
with LanguageDetector.create_from_options(options) as detector:
    detection_result = detector.detect(input_text)
```

### Flutter

pub`flutter pub add mediapipe_text`[Live gallery](https://google.github.io/flutter-mediapipe/)·[Sample code](https://github.com/google/flutter-mediapipe/tree/main/samples/text/language_detector)·[Setup guide](https://developers.google.com/edge/mediapipe/solutions/setup_flutter.md.txt)

```dart
import 'package:mediapipe_text/mediapipe_text.dart';

Future<void> detectLanguage(String text) async {
  final detector = await LanguageDetector.create(
    LanguageDetectorOptions(model: TextModels.languageDetector),
  );
  try {
    final result = await detector.detect(text);
    for (final prediction in result.predictions.take(3)) {
      print('${prediction.languageCode}: ${prediction.probability}');
    }
  } finally {
    await detector.dispose();
  }
}
```

## Task details

This section describes the capabilities, inputs, outputs, and configuration
options of this task.

### Features

- **Score threshold** - Filter results based on prediction scores
- **Label allowlist and denylist** - Specify the categories detected

Inputs Language Detector accepts the following input data type:

- String
Outputs The Language Detector outputs a list of predictions containing:

- Language code: An [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) language / locale code (e.g. "en" for English, "uz" for Uzbek, "ja-Latn" for Japanese (romaji)) as a string.
- Probability: the confidence score for this prediction, expressed as a probability between zero and one as floating point value.

### Configuration options

This task has the following configuration options:

### Web

| Option Name | Description | Value Range | Default Value |
|---|---|---|---|
| `displayNamesLocale` | Locale code for display names provided in the model metadata, if available. | Locale code | `"en"` |
| `maxResults` | Maximum number of top-scored language predictions to return (`-1` returns all results). | Integer | `-1` |
| `scoreThreshold` | Prediction score threshold overriding the model metadata default. Predictions lower than this score are rejected. | Float `[0.0, 1.0]` | Not set |
| `categoryAllowlist` | Optional list of allowed BCP 47 language codes. Mutually exclusive with `categoryDenylist`. | List of strings | Not set |
| `categoryDenylist` | Optional list of excluded BCP 47 language codes. Mutually exclusive with `categoryAllowlist`. | List of strings | Not set |

### Android

| Option Name | Description | Value Range | Default Value |
|---|---|---|---|
| `displayNamesLocale` | Locale code for display names provided in the model metadata, if available. | Locale code | `"en"` |
| `maxResults` | Maximum number of top-scored language predictions to return (`-1` returns all results). | Integer | `-1` |
| `scoreThreshold` | Prediction score threshold overriding the model metadata default. Predictions lower than this score are rejected. | Float `[0.0, 1.0]` | Not set |
| `categoryAllowlist` | Optional list of allowed BCP 47 language codes. Mutually exclusive with `categoryDenylist`. | List of strings | Not set |
| `categoryDenylist` | Optional list of excluded BCP 47 language codes. Mutually exclusive with `categoryAllowlist`. | List of strings | Not set |

### iOS

| Option Name | Description | Value Range | Default Value |
|---|---|---|---|
| `displayNamesLocale` | Locale code for display names provided in the model metadata, if available. | Locale code | `"en"` |
| `maxResults` | Maximum number of top-scored language predictions to return (`-1` returns all results). | Integer | `-1` |
| `scoreThreshold` | Prediction score threshold overriding the model metadata default. Predictions lower than this score are rejected. | Float `[0.0, 1.0]` | Not set |
| `categoryAllowlist` | Optional list of allowed BCP 47 language codes. Mutually exclusive with `categoryDenylist`. | List of strings | Not set |
| `categoryDenylist` | Optional list of excluded BCP 47 language codes. Mutually exclusive with `categoryAllowlist`. | List of strings | Not set |

### Python

| Option Name | Description | Value Range | Default Value |
|---|---|---|---|
| `display_names_locale` | Locale code for display names provided in the model metadata, if available. | Locale code | `"en"` |
| `max_results` | Maximum number of top-scored language predictions to return (`-1` returns all results). | Integer | `-1` |
| `score_threshold` | Prediction score threshold overriding the model metadata default. Predictions lower than this score are rejected. | Float `[0.0, 1.0]` | Not set |
| `category_allowlist` | Optional list of allowed BCP 47 language codes. Mutually exclusive with `category_denylist`. | List of strings | Not set |
| `category_denylist` | Optional list of excluded BCP 47 language codes. Mutually exclusive with `category_allowlist`. | List of strings | Not set |

### Flutter

| Option Name | Description | Value Range | Default Value |
|---|---|---|---|
| `displayNamesLocale` | Locale code for display names provided in the model metadata, if available. `null` keeps Google's default (`"en"`). | Locale code | `null` |
| `maxResults` | Maximum number of top-scored language predictions to return (any negative value returns all results; `0` is rejected). | Integer other than `0` | `-1` |
| `scoreThreshold` | Prediction score threshold. Predictions lower than this score are rejected. The value is always sent, so the default `0` keeps every language rather than applying the model metadata's threshold. | Float `[0.0, 1.0]` | `0` |
| `categoryAllowlist` | Optional list of allowed BCP 47 language codes. Mutually exclusive with `categoryDenylist`. | `List<String>` | Empty |
| `categoryDenylist` | Optional list of excluded BCP 47 language codes. Mutually exclusive with `categoryAllowlist`. | `List<String>` | Empty |

### Task output

Each `LanguageDetectorResult` returns a list of `languages` (`LanguagePrediction`) ordered by descending probability (in Dart, the list is named `predictions`):

| Field | Type / Range | Description |
|---|---|---|
| `languageCode` | `string` (BCP-47 / ISO 639-1) | Predicted language code, such as `"fr"`, `"en"`, `"ja"`, or `"und"` when below threshold (`language_code` in Python). |
| `probability` | `float` (`[0.0, 1.0]`) | Confidence score for the predicted language. |

#### Example `LanguageDetectorResult` payload

The following example shows the language prediction for `"Il y a beaucoup de bouches qui parlent et fort peu de têtes qui pensent."`:

```javascript
{
  languages: [
    { languageCode: "fr", probability: 0.9998 }
  ]
}
```

## Models

![Language Detector pipeline overview](https://developers.google.com/static/edge/mediapipe/images/solutions/diagrams/language_detector.svg)

We offer a default, recommended model when you start developing with this task.

### Language detector model (recommended)

This model is built to be lightweight (315 KB) and uses embedding-based, neural
network classification architecture. The model identifies language using an [ISO
639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) language code, and
can identify 110 languages. For a list of languages supported by the model, see
the [label
file](https://storage.googleapis.com/mediapipe-tasks/language_detector/labels.txt),
which lists languages by their ISO 639-1 code.

| Model name | Input shape | Quantization type | Model card | Versions |
|---|---|---|---|---|
| [Language Detector](https://storage.googleapis.com/mediapipe-models/language_detector/language_detector/float32/1/language_detector.tflite) | string UTF-8 | none (float32) | [info](https://storage.googleapis.com/mediapipe-assets/LanguageDetector%20Model%20Card.pdf) | [Latest](https://storage.googleapis.com/mediapipe-models/language_detector/language_detector/float32/1/language_detector.tflite) |

## Task benchmarks

Here are the task benchmarks for the whole pipeline based on the preceding pre-trained
models. The latency result is the average latency on Pixel 6 using CPU / GPU.

| Model name | Device | CPU latency | GPU latency |
|---|---|---|---|
| Language Detector | Pixel 6 | 0.31ms | - |