С помощью GenAI Proofreading API из ML Kit вы можете помочь пользователям проверять грамматику и правописание в коротких текстах.
Основные возможности
- Проверка правописания текста, введенного с клавиатуры или голосом
- Запросы будут возвращать хотя бы один вариант. Если будет предложено несколько вариантов, они будут отсортированы по убыванию степени достоверности.
Пример результатов
Ввод данных |
Тип ввода |
Выходные данные |
Это короткое сообщение. |
Клавиатура |
Это короткое сообщение. |
Проект почти завершен, но его нужно проверить. |
Клавиатура |
Проект почти завершен, но его нужно проверить. |
Встретимся у медведя. |
Голос |
Встретимся в баре. |
Начало работы
Чтобы начать работу с API GenAI Proofreading, добавьте эту зависимость в файл сборки проекта.
implementation("com.google.mlkit:genai-proofreading:1.0.0-beta1")
Затем настройте и получите клиент Proofreader с определенными настройками языка и типа ввода. Проверьте, доступны ли необходимые функции модели на устройстве (при необходимости запустите скачивание). Отправьте текст, который хотите проанализировать, в ProofreadingRequest, выполните инференс для проверки правописания и обработайте полученные рекомендации по исправлению текста.
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();
Как модель обрабатывает разные типы входных данных
Когда у модели больше информации о том, как пользователь ввел текст (с помощью клавиатуры или голоса), она может лучше прогнозировать возможные ошибки. При вводе с клавиатуры чаще встречаются опечатки, связанные с близким расположением клавиш, а при голосовом вводе – ошибки в написании слов с одинаковым произношением.
Поддерживаемые функции и ограничения
Проверка правописания поддерживается для следующих языков: английский, японский, французский, немецкий, итальянский, испанский и корейский. Они определены в ProofreaderOptions.Language. Входные данные должны содержать менее 256 токенов.
Доступность определенной конфигурации функции (указанной в ProofreaderOptions) может зависеть от конфигурации устройства и моделей, скачанных на него.
Чтобы убедиться, что на устройстве с запрошенной версией ProofreaderOptions поддерживается нужная функция API, разработчики могут вызвать метод checkFeatureStatus(). Этот метод позволяет определить, доступна ли функция на устройстве во время выполнения.
Распространенные проблемы с настройкой
API GenAI ML Kit используют приложение Android AICore для доступа к Gemini Nano. Если устройство только что настроено (в том числе после сброса) или приложение AICore только что сброшено (например, очищены данные, приложение удалено и установлено заново), у AICore может не хватить времени, чтобы завершить инициализацию (в том числе скачать последние конфигурации с сервера). В результате API генеративного ИИ ML Kit могут работать неправильно. Ниже приведены распространенные сообщения об ошибках настройки и способы их устранения.
| Пример сообщения об ошибке | Как действовать |
| AICore не удалось запустить из-за ошибки типа 4 (CONNECTION_ERROR) и кода ошибки 601 (BINDING_FAILURE): не удалось привязать сервис AICore. | Это может произойти, если вы установите приложение с помощью ML Kit GenAI API сразу после настройки устройства или если AICore будет удален после установки приложения. Обновите приложение AICore, а затем переустановите свое приложение. |
| AICore не удалось запустить из-за ошибки типа 3 (PREPARATION_ERROR) и кода ошибки 606 (FEATURE_NOT_FOUND): функция "..." недоступна. |
Это может произойти, если AICore ещё не скачал последние конфигурации. Если устройство подключено к интернету, обновление обычно занимает от нескольких минут до нескольких часов. Перезагрузка устройства может ускорить обновление.
Обратите внимание, что если загрузчик операционной системы устройства разблокирован, вы также увидите эту ошибку. API не поддерживает устройства с разблокированными загрузчиками операционной системы. |
| AICore failed with error type 1-DOWNLOAD_ERROR and error code 0-UNKNOWN: Feature ... failed with failure status 0 and error esz: UNAVAILABLE: Unable to resolve host ... | Сохраните сетевое подключение, подождите несколько минут и повторите попытку. |