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