GenAI Proofreading API

Dengan GenAI Proofreading API ML Kit, Anda dapat membantu pengguna memeriksa tata bahasa dan ejaan pada potongan teks pendek.

Kemampuan utama

  • Mencermati teks yang dimasukkan melalui keyboard atau suara
  • Permintaan akan menampilkan setidaknya satu saran. Jika beberapa saran ditampilkan, hasil akan diurutkan berdasarkan keyakinan menurun.

Hasil contoh

Input

Jenis Input

Output

this is a short msg

Keyboard

Ini adalah pesan singkat

Project ini hampir selesai, tetapi perlu ditinjau

Keyboard

Project ini hampir selesai, tetapi perlu ditinjau

Tolong temui saya di beruang,

Suara

Temui saya di bar.

Memulai

Untuk memulai GenAI Proofreading API, tambahkan dependensi ini ke file build project Anda.

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

Kemudian, konfigurasikan dan dapatkan klien Proofreader dengan setelan bahasa dan jenis input tertentu. Periksa dan pastikan fitur model di perangkat yang diperlukan tersedia (memicu download jika diperlukan). Kirimkan teks yang ingin Anda analisis dalam ProofreadingRequest, jalankan inferensi pemeriksaan tata bahasa, dan akhirnya proses saran yang ditampilkan untuk mengoreksi teks.

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

Cara model menangani berbagai jenis input

Jika model memiliki lebih banyak informasi tentang cara pengguna memasukkan teks (keyboard atau suara), model tersebut dapat memprediksi jenis error yang mungkin ada dengan lebih baik. Teks yang dimasukkan dengan keyboard lebih rentan terhadap kesalahan ejaan dengan tombol di dekatnya, sedangkan teks yang dimasukkan dengan suara lebih rentan terhadap kesalahan ejaan kata dengan pengucapan yang sama.

Fitur yang didukung dan batasan

Koreksi tata bahasa didukung untuk bahasa berikut: Inggris, Jepang, Prancis, Jerman, Italia, Spanyol, dan Korea, dan bahasa tersebut ditentukan di ProofreaderOptions.Language. Input harus kurang dari 256 token.

Ketersediaan konfigurasi fitur tertentu (ditentukan oleh ProofreaderOptions) dapat bervariasi bergantung pada konfigurasi perangkat tertentu dan model yang telah didownload ke perangkat.

Cara paling andal bagi developer untuk memastikan bahwa fitur API yang diinginkan didukung di perangkat dengan ProofreaderOptions yang diminta adalah dengan memanggil metode checkFeatureStatus(). Metode ini memberikan status definitif ketersediaan fitur di perangkat saat runtime.

Masalah penyiapan umum

API GenAI ML Kit mengandalkan aplikasi Android AICore untuk mengakses Gemini Nano. Saat perangkat baru saja disiapkan (termasuk direset), atau aplikasi AICore baru saja direset (misalnya, menghapus data, meng-uninstal, lalu menginstal ulang), aplikasi AICore mungkin tidak memiliki cukup waktu untuk menyelesaikan inisialisasi (termasuk mendownload konfigurasi terbaru dari server). Akibatnya, ML Kit GenAI API mungkin tidak berfungsi seperti yang diharapkan. Berikut adalah pesan error penyiapan umum yang mungkin Anda lihat dan cara menanganinya:

Contoh pesan error Cara menangani
AICore gagal dengan jenis error 4-CONNECTION_ERROR dan kode error 601-BINDING_FAILURE: Layanan AICore gagal melakukan binding. Hal ini dapat terjadi saat Anda menginstal aplikasi menggunakan ML Kit GenAI API segera setelah penyiapan perangkat atau saat AICore di-uninstal setelah aplikasi diinstal. Mengupdate aplikasi AICore, lalu menginstal ulang aplikasi Anda akan memperbaikinya.
AICore gagal dengan jenis error 3-PREPARATION_ERROR dan kode error 606-FEATURE_NOT_FOUND: Fitur ... tidak tersedia. Hal ini dapat terjadi jika AICore belum selesai mendownload konfigurasi terbaru. Pastikan koneksi jaringan tetap aktif dan tunggu selama beberapa menit hingga beberapa jam.

Perlu diperhatikan bahwa jika bootloader perangkat tidak terkunci, Anda juga akan melihat error ini—API ini tidak mendukung perangkat dengan bootloader yang tidak terkunci.
AICore gagal dengan jenis error 1-DOWNLOAD_ERROR dan kode error 0-UNKNOWN: Fitur ... gagal dengan status kegagalan 0 dan error esz: UNAVAILABLE: Tidak dapat me-resolve host ... Pastikan koneksi jaringan tetap aktif, tunggu beberapa menit, lalu coba lagi.