GenAI Proofreading API

GenAI Proofreading API ของ ML Kit ช่วยให้คุณช่วยผู้ใช้ตรวจสอบไวยากรณ์และ การสะกดคำในข้อความสั้นๆ ได้

ความสามารถหลัก

  • ตรวจตัวอักษรของข้อความที่ป้อนผ่านแป้นพิมพ์หรือเสียง
  • คำขอจะแสดงคำแนะนำอย่างน้อย 1 รายการ หากมีคำแนะนำหลายรายการ ระบบจะจัดเรียงผลลัพธ์ตามความเชื่อมั่นจากมากไปน้อย

ตัวอย่างผลการแข่ง

อินพุต

ประเภทอินพุต

เอาต์พุต

นี่คือข้อความสั้นๆ

แป้นพิมพ์

นี่คือข้อความสั้นๆ

โปรเจ็กต์เกือบเสร็จสมบูรณ์แล้ว แต่ต้องได้รับการตรวจสอบ

แป้นพิมพ์

โปรเจ็กต์เกือบเสร็จสมบูรณ์แล้ว แต่ต้องได้รับการตรวจสอบ

โปรดมาพบฉันที่หมี

Voice

โปรดมาพบฉันที่บาร์

เริ่มต้นใช้งาน

หากต้องการเริ่มต้นใช้งาน GenAI Proofreading API ให้เพิ่มการอ้างอิงนี้ลงในไฟล์บิลด์ของโปรเจ็กต์

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) อาจแตกต่างกันไปตามการกำหนดค่าของอุปกรณ์ที่เฉพาะเจาะจง และโมเดลที่ดาวน์โหลดลงในอุปกรณ์

วิธีที่น่าเชื่อถือที่สุดสำหรับนักพัฒนาแอปในการตรวจสอบว่าฟีเจอร์ API ที่ต้องการ รองรับในอุปกรณ์ที่มี ProofreaderOptions ที่ขอคือการเรียกใช้เมธอด checkFeatureStatus() วิธีนี้จะให้สถานะที่แน่นอน ของความพร้อมใช้งานฟีเจอร์ในอุปกรณ์ขณะรันไทม์

ปัญหาการตั้งค่าที่พบบ่อย

API ของ GenAI ใน ML Kit จะใช้แอป AICore ของ Android เพื่อเข้าถึง Gemini Nano เมื่อเพิ่งตั้งค่าอุปกรณ์ (รวมถึงการรีเซ็ต) หรือเพิ่งรีเซ็ตแอป AICore (เช่น ล้างข้อมูล ถอนการติดตั้งแล้วติดตั้งใหม่) แอป AICore อาจมีเวลาไม่พอที่จะทำการเริ่มต้นให้เสร็จสมบูรณ์ (รวมถึงการดาวน์โหลดการกำหนดค่าล่าสุดจากเซิร์ฟเวอร์) ด้วยเหตุนี้ GenAI 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 ดาวน์โหลดการกำหนดค่าล่าสุดไม่เสร็จ เมื่ออุปกรณ์เชื่อมต่ออินเทอร์เน็ตแล้ว โดยปกติจะใช้เวลา 2-3 นาทีถึง 2-3 ชั่วโมงในการอัปเดต การรีสตาร์ทอุปกรณ์จะช่วยให้อัปเดตได้เร็วขึ้น

โปรดทราบว่าหากปลดล็อก Bootloader ของอุปกรณ์ คุณจะเห็นข้อผิดพลาดนี้ด้วย เนื่องจาก API นี้ไม่รองรับอุปกรณ์ที่มี Bootloader ที่ปลดล็อก
AICore ล้มเหลวโดยมีข้อผิดพลาดประเภท 1-DOWNLOAD_ERROR และรหัสข้อผิดพลาด 0-UNKNOWN: ฟีเจอร์ ... ล้มเหลวโดยมีสถานะความล้มเหลว 0 และข้อผิดพลาด esz: UNAVAILABLE: แก้ไขโฮสต์ ... ไม่ได้ เชื่อมต่อเครือข่ายไว้ รอสักครู่ แล้วลองอีกครั้ง

โค้ดตัวอย่าง