API de GenAI Proofreading

Con la API de revisión de texto con IA generativa de ML Kit, puedes ayudar a los usuarios a verificar su ortografía y gramática en textos cortos.

Funciones clave

  • Revisa el texto ingresado con el teclado o la voz.
  • Las solicitudes devolverán al menos una sugerencia. Si se muestran varias sugerencias, los resultados se ordenarán de forma descendente según la confianza.

Resultados de ejemplo

Entrada

Tipo de entrada

Resultado

Este es un mensaje corto.

Teclado

Este es un mensaje corto

El proyecto está casi completo, pero debe revisarse.

Teclado

El proyecto está casi completo, pero debe revisarse.

Por favor, carne conmigo en el oso.

Voz

Por favor, encuéntrame en el bar.

Comenzar

Para comenzar a usar la API de GenAI Proofreading, agrega esta dependencia al archivo de compilación de tu proyecto.

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

Luego, configura y obtén un cliente de Proofreader con parámetros de configuración específicos de idioma y tipo de entrada. Verifica y asegúrate de que las funciones necesarias del modelo integrado en el dispositivo estén disponibles (si es necesario, activa una descarga). Envía el texto que deseas analizar en un ProofreadingRequest, ejecuta la inferencia de corrección y, por último, procesa las sugerencias que se devolvieron para corregir el texto.

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();

Cómo el modelo controla diferentes tipos de entrada

Cuando el modelo tiene más información sobre cómo el usuario ingresó el texto (teclado o voz), puede predecir mejor el tipo de errores que pueden estar presentes. El texto ingresado con el teclado es más propenso a errores ortográficos con teclas cercanas, mientras que el texto ingresado por voz es más propenso a errores ortográficos de palabras con la misma pronunciación.

Funciones admitidas y limitaciones

La revisión de pruebas se admite en los siguientes idiomas: inglés, japonés, francés, alemán, italiano, español y coreano, y se definen en ProofreaderOptions.Language. La entrada debe tener menos de 256 tokens.

La disponibilidad de la configuración de la función específica (especificada por ProofreaderOptions) puede variar según la configuración del dispositivo en particular y los modelos que se descargaron en él.

La forma más confiable para que los desarrolladores se aseguren de que la función de la API deseada sea compatible con un dispositivo con el ProofreaderOptions solicitado es llamar al método checkFeatureStatus(). Este método proporciona el estado definitivo de la disponibilidad de la función en el dispositivo durante el tiempo de ejecución.

Problemas comunes de configuración

Las APIs de IA generativa de ML Kit dependen de la app de AICore de Android para acceder a Gemini Nano. Cuando se configura un dispositivo (incluido el restablecimiento) o se restablece la app de AICore (p.ej., se borran los datos, se desinstala y se vuelve a instalar), es posible que la app de AICore no tenga tiempo suficiente para finalizar la inicialización (incluida la descarga de las configuraciones más recientes del servidor). Como resultado, es posible que las APIs de IA generativa de ML Kit no funcionen según lo esperado. A continuación, se muestran los mensajes de error de configuración comunes que puedes ver y cómo controlarlos:

Ejemplo de mensaje de error Cómo manejarla
AICore falló con el tipo de error 4-CONNECTION_ERROR y el código de error 601-BINDING_FAILURE: No se pudo vincular el servicio de AICore. Esto podría ocurrir cuando instalas la app con las APIs de IA generativa de ML Kit inmediatamente después de configurar el dispositivo o cuando se desinstala AICore después de instalar la app. Actualizar la app de AICore y, luego, reinstalar tu app debería solucionar el problema.
AICore falló con el tipo de error 3-PREPARATION_ERROR y el código de error 606-FEATURE_NOT_FOUND: La función … no está disponible. Esto podría suceder cuando AICore no haya terminado de descargar los parámetros de configuración más recientes. Cuando el dispositivo está conectado a Internet, la actualización suele tardar entre unos minutos y unas horas. Reiniciar el dispositivo puede acelerar la actualización.

Ten en cuenta que, si el bootloader del dispositivo está desbloqueado, también verás este error, ya que la API no admite dispositivos con bootloaders desbloqueados.
AICore falló con el tipo de error 1-DOWNLOAD_ERROR y el código de error 0-UNKNOWN: La función … falló con el estado de falla 0 y el error esz: UNAVAILABLE: No se pudo resolver el host … Mantén la conexión de red, espera unos minutos y vuelve a intentarlo.