Dzięki interfejsowi GenAI Proofreading API z ML Kit możesz pomóc użytkownikom w sprawdzaniu gramatyki i pisownia w krótkich fragmentach tekstu.
Najważniejsze funkcje
- Sprawdzanie tekstu wpisanego za pomocą klawiatury lub głosu
- Zapytania zwracają co najmniej 1 sugestię. Jeśli zwrócono wiele sugestii, wyniki zostaną posortowane według malejącej wiarygodności.
Przykładowe wyniki
Wejście |
Typ danych wejściowych |
Dane wyjściowe |
to jest krótki komunikat |
Klawiatura |
To jest krótka wiadomość |
Projekt jest prawie gotowy, ale wymaga sprawdzenia |
Klawiatura |
Projekt jest prawie gotowy, ale wymaga sprawdzenia |
Spotkajmy się przy niedźwiedziu. |
Głos |
Spotkajmy się w barze. |
Pierwsze kroki
Aby rozpocząć korzystanie z interfejsu GenAI Proofreading API, dodaj tę zależność do pliku kompilacji projektu.
implementation("com.google.mlkit:genai-proofreading:1.0.0-beta1")
Następnie skonfiguruj klienta Proofreader
i uzyskaj do niego dostęp, korzystając z określonych ustawień języka i typu danych wejściowych. Sprawdź, czy na urządzeniu są dostępne niezbędne funkcje modelu (w razie potrzeby wywołaj pobieranie). Prześlij tekst, który chcesz przeanalizować, w formacie ProofreadingRequest
, wykonaj sprawdzanie poprawności, a na koniec przetwórz zwrócone sugestie w celu poprawienia tekstu.
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();
jak model obsługuje różne typy danych wejściowych;
Gdy model ma więcej informacji o tym, jak użytkownik wprowadził tekst (za pomocą klawiatury lub głosu), może lepiej przewidzieć typy błędów, które mogą wystąpić. Tekst wpisywany za pomocą klawiatury jest bardziej podatny na błędy dotyczące sąsiadujących klawiszy, a tekst wpisywany za pomocą głosu – na błędy dotyczące słów o tej samej wymowie.
Obsługiwane funkcje i ograniczenia
Redakcja jest obsługiwana w tych językach: angielski, francuski, hiszpański, japoński, niemiecki, włoski i koreański. Definicje tych języków znajdziesz w sekcji ProofreaderOptions.Language
. Dane wejściowe powinny mieć mniej niż 256 tokenów.
Dostępność określonej konfiguracji funkcji (określonej przez ProofreaderOptions
) może się różnić w zależności od konfiguracji konkretnego urządzenia i modeli pobranych na to urządzenie.
Najbardziej niezawodnym sposobem na sprawdzenie, czy dana funkcja interfejsu API jest obsługiwana na urządzeniu z żądanym ProofreaderOptions
, jest wywołanie metody checkFeatureStatus()
. Ta metoda zapewnia ostateczny stan dostępności funkcji na urządzeniu w czasie wykonywania.
Typowe problemy z konfiguracją
Interfejsy API ML Kit GenAI korzystają z aplikacji Android AICore, aby uzyskać dostęp do Gemini Nano. Gdy urządzenie jest dopiero konfigurowane (w tym po zresetowaniu) lub aplikacja AICore została właśnie zresetowana (np. przez wyczyszczenie danych, odinstalowanie i ponownie zainstalowanie), może ona nie mieć wystarczająco dużo czasu na zakończenie inicjalizacji (w tym pobranie najnowszych konfiguracji z serwera). W związku z tym interfejsy API ML Kit GenAI mogą nie działać zgodnie z oczekiwaniami. Oto typowe komunikaty o błędach konfiguracji, które mogą się pojawić, oraz sposoby ich rozwiązywania:
Przykładowy komunikat o błędzie | Jak postępować |
Nie udało się uruchomić AICore. Wystąpił błąd typu 4-CONNECTION_ERROR i kod błędu 601-BINDING_FAILURE: nie udało się połączyć usługi AICore. | Może się tak zdarzyć, gdy zainstalujesz aplikację za pomocą interfejsów ML Kit GenAI bezpośrednio po skonfigurowaniu urządzenia lub gdy po zainstalowaniu aplikacji odinstalujesz AICore. Problem powinien rozwiązać zaktualizowanie aplikacji AICore, a następnie ponowne zainstalowanie aplikacji. |
Nie udało się uruchomić AICore. Wystąpił błąd typu 3-PREPARATION_ERROR i kod błędu 606-FEATURE_NOT_FOUND: Funkcja … jest niedostępna. |
Może się tak zdarzyć, gdy AICore nie skończyło pobierania najnowszych konfiguracji. Nie przerywaj połączenia z internetem i zaczekaj kilka minut lub godzin.
Uwaga: jeśli bootloader urządzenia jest odblokowany, zobaczysz ten sam błąd – ten interfejs API nie obsługuje urządzeń ze zwykłym bootloaderem. |
AICore nie powiodło się: błąd typu 1-DOWNLOAD_ERROR i kod błędu 0-UNKNOWN: funkcja ... nie powiodła się ze stanem błędu 0 i błędem esz: UNAVAILABLE: nie można rozpoznać hosta ... | Nie rozłączaj się z siecią, zaczekaj kilka minut i spróbuj ponownie. |