API GenAI Proofreading

L'API GenAI Proofreading de ML Kit vous permet d'aider les utilisateurs à vérifier la grammaire et l'orthographe de courts textes.

Capacités clés

  • Relire le texte saisi au clavier ou par saisie vocale
  • Les requêtes renvoient au moins une suggestion. Si plusieurs suggestions sont renvoyées, les résultats sont triés par ordre décroissant de confiance.

Exemples de résultats

Entrée

Type d'entrée

Sortie

Ceci est un court message

Clavier

Ceci est un court message

Le projet est presque terminé, mais doit être examiné.

Clavier

Le projet est presque terminé, mais doit être examiné

Please meat me at the bear,

Voice

Veuillez me rejoindre au bar.

Premiers pas

Pour commencer à utiliser l'API GenAI Proofreading, ajoutez cette dépendance au fichier de compilation de votre projet.

implementation("com.google.mlkit:genai-proofreading:1.0.0-beta1")

Ensuite, configurez et obtenez un client Proofreader avec des paramètres de langue et de type d'entrée spécifiques. Vérifiez et assurez-vous que les fonctionnalités de modèle sur l'appareil nécessaires sont disponibles (en déclenchant un téléchargement si nécessaire). Envoyez le texte que vous souhaitez analyser dans un ProofreadingRequest, exécutez l'inférence de relecture, puis traitez les suggestions renvoyées pour corriger le texte.

Kotlin

val textToProofread = "The praject is compleet but needs too be reviewd"

// Define task with required input and output format
val options = ProofreaderOptions.builder(context)
    // InputType can be KEYBOARD or VOICE. VOICE indicates that
    // the user generated text based on audio input.
    .setInputType(ProofreaderOptions.InputType.KEYBOARD)
    // Refer to ProofreaderOptions.Language for available
    // languages
    .setLanguage(ProofreaderOptions.Language.ENGLISH)
    .build()
val proofreader = Proofreading.getClient(options)

suspend fun prepareAndStartProofread() {
    // Check feature availability, status will be one of the
    // following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = proofreader.checkFeatureStatus().await()

    if (featureStatus == FeatureStatus.DOWNLOADABLE) {
        // Download feature if necessary.
        // If downloadFeature is not called, the first inference
        // request will also trigger the feature to be downloaded
        // if it's not already downloaded.
        proofreader.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(
                totalBytesDownloaded: Long
            ) {}

            override fun onDownloadCompleted() {
                startProofreadingRequest(textToProofread, proofreader)
            }
        })
    } else if (featureStatus == FeatureStatus.DOWNLOADING) {
        // Inference request will automatically run once feature is
        // downloaded.
        // If Gemini Nano is already downloaded on the device, the
        // feature-specific LoRA adapter model will be downloaded
        // very quickly. However, if Gemini Nano is not already
        // downloaded, the download process may take longer.
        startProofreadingRequest(textToProofread, proofreader)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startProofreadingRequest(textToProofread, proofreader)
    }
}

suspend fun startProofreadingRequest(
    text: String, proofreader: Proofreader
) {
    // Create task request
    val proofreadingRequest =
        ProofreadingRequest.builder(text).build()

    // Start proofreading request with non-streaming response
    // More than 1 result may be returned. If multiple suggestions
    // are returned, results will be sorted by descending confidence.
    val proofreadingResults =
        proofreader.runInference(proofreadingRequest).await().results

    // You can also start a streaming request
    // proofreader.runInference(proofreadingRequest) { newText ->
    //     // show new text in UI
    // }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
proofreader.close()

Java

String textToProofread = "The praject is compleet but needs too be reviewd";

// Define task with required input and output format
ProofreaderOptions proofreaderOptions = 
    ProofreaderOptions
        .builder(context)
        // InputType can be KEYBOARD or VOICE. VOICE indicates that the
        // user generated text based on audio input.
        .setInputType(ProofreaderOptions.InputType.KEYBOARD)
        // Refer to ProofreaderOptions.Language for available languages
        .setLanguage(ProofreaderOptions.Language.ENGLISH)
        .build();
Proofreader proofreader = Proofreading.getClient(proofreaderOptions);

void prepareAndStartProofread(Context context) throws ExecutionException,
        InterruptedException {
    // Check feature availability, status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = proofreader.checkFeatureStatus().get();
        if (featureStatus == FeatureStatus.DOWNLOADABLE) {
            // Download feature if necessary.
            // If downloadFeature is not called, the first inference request
            // will also trigger the feature to be downloaded if it's not
            // already downloaded.
            proofreader.downloadFeature(new DownloadCallback() {
                @Override
                public void onDownloadCompleted() {
                    startProofreadingRequest(textToProofread, proofreader);
                }

                @Override
                public void onDownloadFailed(GenAiException e) {
                }

                @Override
                public void onDownloadProgress(long totalBytesDownloaded) {
                }

                @Override
                public void onDownloadStarted(long bytesDownloaded) {
                }
            });
        } else if (featureStatus == FeatureStatus.DOWNLOADING) {
            // Inference request will automatically run once feature is
            // downloaded.
            // If Gemini Nano is already downloaded on the device, the
            // feature-specific LoRA adapter model will be downloaded
            // very quickly. However, if Gemini Nano is not already
            // downloaded, the download process may take longer.
            startProofreadingRequest(textToProofread, proofreader);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startProofreadingRequest(textToProofread, proofreader);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startProofreadingRequest(String text, Proofreader proofreader) {
    // Create task request
    ProofreadingRequest proofreadingRequest = ProofreadingRequest
            .builder(text).build();

    try {
        // Start proofreading request with non-streaming response
        // More than 1 result may be returned. If multiple suggestions are
        // returned, results will be sorted by descending confidence.
        proofreader.runInference(proofreadingRequest).get().getResults();

        // You can also start a streaming request
        // proofreader.runInference(proofreadingRequest, newText -> {
        //     // Show new text in UI
        // });
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
proofreader.close();

Comment le modèle gère-t-il les différents types d'entrées ?

Lorsque le modèle dispose de plus d'informations sur la façon dont l'utilisateur a saisi le texte (au clavier ou à la voix), il peut mieux prédire le type d'erreurs qui peuvent être présentes. Le texte saisi au clavier est plus sujet aux fautes d'orthographe avec les touches voisines, tandis que le texte saisi à la voix est plus sujet aux fautes d'orthographe des mots ayant la même prononciation.

Fonctionnalités et limites

La relecture est disponible pour les langues suivantes : allemand, anglais, coréen, espagnol, français, italien et japonais. Elles sont définies dans ProofreaderOptions.Language. La saisie doit comporter moins de 256 jetons.

La disponibilité de la configuration de la fonctionnalité spécifique (spécifiée par ProofreaderOptions) peut varier en fonction de la configuration de l'appareil et des modèles qui ont été téléchargés sur l'appareil.

Le moyen le plus fiable pour les développeurs de s'assurer que la fonctionnalité d'API prévue est compatible avec un appareil doté de la ProofreaderOptions demandée consiste à appeler la méthode checkFeatureStatus(). Cette méthode fournit l'état définitif de la disponibilité des fonctionnalités sur l'appareil au moment de l'exécution.

Problèmes de configuration courants

Les API d'IA générative de ML Kit s'appuient sur l'application Android AICore pour accéder à Gemini Nano. Lorsqu'un appareil vient d'être configuré (y compris réinitialisé) ou que l'application AICore vient d'être réinitialisée (par exemple, en effaçant les données, puis en la désinstallant et en la réinstallant), il se peut que l'application AICore n'ait pas eu suffisamment de temps pour terminer l'initialisation (y compris le téléchargement des dernières configurations depuis le serveur). Par conséquent, il est possible que les API ML Kit GenAI ne fonctionnent pas comme prévu. Voici les messages d'erreur de configuration courants que vous pouvez rencontrer et comment les résoudre :

Exemple de message d'erreur Comment répondre
AICore a échoué avec le type d'erreur 4-CONNECTION_ERROR et le code d'erreur 601-BINDING_FAILURE : échec de la liaison du service AICore. Cela peut se produire lorsque vous installez l'application à l'aide des API ML Kit GenAI immédiatement après la configuration de l'appareil ou lorsque AICore est désinstallé après l'installation de votre application. Mettre à jour l'application AICore, puis réinstaller votre application devrait résoudre le problème.
AICore a échoué avec le type d'erreur 3-PREPARATION_ERROR et le code d'erreur 606-FEATURE_NOT_FOUND : la fonctionnalité ... n'est pas disponible. Cela peut se produire lorsque AICore n'a pas terminé de télécharger les dernières configurations. Lorsque l'appareil est connecté à Internet, la mise à jour prend généralement de quelques minutes à quelques heures. Redémarrer l'appareil peut accélérer la mise à jour.

Notez que si le bootloader de l'appareil est déverrouillé, cette erreur s'affichera également. Cette API n'est pas compatible avec les appareils dont le bootloader est déverrouillé.
AICore a échoué avec le type d'erreur 1-DOWNLOAD_ERROR et le code d'erreur 0-UNKNOWN : la fonctionnalité ... a échoué avec l'état d'échec 0 et l'erreur esz : UNAVAILABLE : impossible de résoudre l'hôte ... Maintenez la connexion réseau, patientez quelques minutes, puis réessayez.