GenAI Proofreading API ของ ML Kit ช่วยให้คุณช่วยผู้ใช้ตรวจสอบไวยากรณ์และการสะกดคำในข้อความสั้นๆ ได้
ความสามารถหลัก
- พิสูจน์อักษรข้อความที่ป้อนผ่านแป้นพิมพ์หรือเสียง
- คำขอจะแสดงคําแนะนําอย่างน้อย 1 รายการ หากระบบแสดงคําแนะนําหลายรายการ ระบบจะจัดเรียงผลลัพธ์ตามระดับความเชื่อมั่นจากมากไปน้อย
ตัวอย่างผลการแข่ง
อินพุต |
ประเภทอินพุต |
เอาต์พุต |
this is a short msg |
แป้นพิมพ์ |
ข้อความนี้เป็นข้อความสั้น |
โปรเจ็กต์เกือบเสร็จแล้ว แต่ต้องได้รับการตรวจสอบ |
แป้นพิมพ์ |
โปรเจ็กต์เกือบเสร็จสมบูรณ์แล้ว แต่ต้องได้รับการตรวจสอบ |
โปรดมาพบฉันที่รูปหมี |
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 นี้ML Kit GenAI API ต้องใช้แอป Android AICore เพื่อเข้าถึง Gemini Nano เมื่อเพิ่งตั้งค่าอุปกรณ์ (รวมถึงรีเซ็ต) หรือเพิ่งรีเซ็ตแอป AICore (เช่น ล้างข้อมูล ถอนการติดตั้งแล้วติดตั้งอีกครั้ง) แอป AICore อาจไม่มีเวลาพอที่จะเริ่มต้นใช้งานให้เสร็จสมบูรณ์ (รวมถึงการดาวน์โหลดการกำหนดค่าล่าสุดจากเซิร์ฟเวอร์) ด้วยเหตุนี้ ML Kit GenAI API จึงอาจไม่ทำงานตามที่คาดไว้ ข้อความแสดงข้อผิดพลาดที่พบบ่อยในการตั้งค่าที่คุณอาจเห็นและวิธีจัดการมีดังนี้
ตัวอย่างข้อความแสดงข้อผิดพลาด | วิธีจัดการ |
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: ไม่สามารถแก้ไขโฮสต์ ... | เชื่อมต่อเครือข่ายไว้ รอ 2-3 นาที แล้วลองอีกครั้ง |