Con la API de revisión de texto de IA generativa de ML Kit, puedes ayudar a los usuarios a verificar su gramática y ortografía en textos cortos.
Funciones clave
- Revisar el texto ingresado con el teclado o la voz
- Las solicitudes mostrará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 |
Encuéntrame en el oso. |
Voz |
Nos vemos 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 Proofreader
con parámetros de configuración específicos de idioma y tipo de entrada. Verifica y asegúrate de que las funciones del modelo integradas en el dispositivo necesarias estén disponibles (activa una descarga si es necesario). Envía el texto que deseas analizar en un ProofreadingRequest
, ejecuta la inferencia de revisión de texto y, por último, procesa las sugerencias que se muestran 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 tener errores ortográficos con teclas cercanas, mientras que el texto ingresado por voz es más propenso a tener errores ortográficos en palabras con la misma pronunciación.
Funciones admitidas y limitaciones
La revisión de texto se admite en los siguientes idiomas: alemán, español, francés, inglés, italiano, japonés 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 API prevista 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 funciones 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 Android AICore para acceder a Gemini Nano. Cuando un dispositivo se acaba de configurar (incluidos los restablecimientos) o se acaba de restablecer la app de AICore (p.ej., se borraron los datos, se desinstaló y se volvió a instalar), es posible que la app de AICore no tenga suficiente tiempo para terminar la inicialización (incluida la descarga de las configuraciones más recientes del servidor). Como resultado, es posible que las APIs de GenAI de ML Kit no funcionen como se espera. Estos son los mensajes de error de configuración comunes que podrías ver y cómo manejarlos:
Ejemplo de mensaje de error | Cómo manejar |
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 puede ocurrir cuando instalas la app con las APIs de GenAI de ML Kit inmediatamente después de la configuración del dispositivo o cuando se desinstala AICore después de instalar la app. Actualizar la app de AICore y, luego, reinstalar la tuya 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 puede suceder cuando AICore no terminó de descargar las configuraciones más recientes. Mantén la conexión de red y espera unos minutos o unas horas.
Ten en cuenta que, si el bootloader del dispositivo está desbloqueado, también verás este error. Esta API no es compatible con dispositivos con bootloaders desbloqueados. |
AICore falló con el tipo de error 1-DOWNLOAD_ERROR y el código de error 0-UNKNOWN: Feature ... falló con el estado de error 0 y el error esz: UNAVAILABLE: Unable to resolve host ... | Mantén la conexión de red, espera unos minutos y vuelve a intentarlo. |