Rozpoznawanie, rozpoznawanie i tłumaczenie tekstu za pomocą ML Kit i AparatuX: Android

1. Wprowadzenie

ML Kit to mobilny pakiet SDK, który udostępnia funkcje uczenia maszynowego Google w przypadku systemu Android i aplikacji na Androida w ramach potężnego, a jednocześnie łatwego w użyciu pakietu. Niezależnie od tego, czy dopiero zaczynasz korzystać z systemów uczących się, czy masz już doświadczenie w tej dziedzinie, możesz łatwo wdrożyć potrzebną funkcję za pomocą kilku linii kodu. Nie musisz mieć rozległej wiedzy o sieciach neuronowych ani optymalizacji modeli, aby zacząć korzystać z tej funkcji.

Jak to działa?

ML Kit ułatwia stosowanie technik uczenia maszynowego w aplikacjach, ponieważ łączy w jednym pakiecie SDK technologie uczenia maszynowego od Google, takie jak Mobile VisionTensorFlow Lite. Niezależnie od tego, czy potrzebujesz potężnych możliwości modeli na urządzeniu Mobile Vision czy elastyczności niestandardowych modeli TensorFlow Lite, ML Kit umożliwia to za pomocą kilku linii kodu.

W tym ćwiczeniu z programowania poznasz proste kroki, które pozwolą Ci dodać rozpoznawanie tekstu, identyfikację języka i tłumaczenie z obrazu z kamery w czasie rzeczywistym do istniejącej aplikacji na Androida. Dowiesz się też, jak korzystać z interfejsów API CameraX i ML Kit.

Co utworzysz

W tym ćwiczeniu z programowania utworzysz aplikację na Androida za pomocą ML Kit. Twoja aplikacja będzie używać interfejsu API rozpoznawania tekstu ML Kit na urządzeniu do rozpoznawania tekstu z pliku danych z kamery w czasie rzeczywistym. Do identyfikacji języka rozpoznanego tekstu zostanie użyte ML Kit Language Identification API. Na koniec aplikacja przetłumaczy ten tekst na dowolny z 59 dostępnych języków za pomocą interfejsu ML Kit Translation API.

Powinieneś zobaczyć coś podobnego do tego, co widać na obrazku poniżej.

e2a9b80f1ff442d7.png

Czego się nauczysz

  • Jak używać pakietu ML Kit SDK, aby łatwo dodawać możliwości systemów uczących się do dowolnej aplikacji na Androida.
  • Interfejsy ML Kit do rozpoznawania tekstu, identyfikacji języka i tłumaczenia oraz ich możliwości.
  • Jak używać biblioteki CameraX z interfejsami ML Kit

Czego potrzebujesz

  • najnowsza wersja Android Studio (4.0 lub nowsza);
  • fizyczne urządzenie z Androidem,
  • Przykładowy kod
  • podstawowa znajomość tworzenia aplikacji na Androida w Kotlinie;

Ten moduł dotyczy ML Kit. Nieistotne koncepcje i bloki kodu zostały już zaimplementowane.

2. Konfiguracja

Pobieranie kodu

Aby pobrać cały kod tego ćwiczenia, kliknij ten link:

Rozpakuj pobrany plik ZIP. Spowoduje to rozpakowanie folderu głównego (mlkit-android) ze wszystkimi potrzebnymi zasobami. W tym ćwiczeniu będziesz potrzebować tylko zasobów z podkatalogu translate.

Podkatalog translate w repozytorium mlkit-android zawiera ten katalog:

  • android_studio_folder.pngstarter – kod startowy, na którym możesz budować w tym ćwiczeniu z programowania.

3. Zaimportuj projekt i sprawdź zależności ML Kit i CameraX

Zaimportuj projekt startowy do Android Studio. Sprawdź, czy plik app/build.gradle zawiera niezbędne zależności ML Kit i CameraX:

// CameraX dependencies
def camerax_version = "1.0.0-beta05"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:1.0.0-alpha12"

// ML Kit dependencies
implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.0.0'
implementation 'com.google.mlkit:language-id:16.0.0'
implementation 'com.google.mlkit:translate:16.0.0'

4. Uruchamianie aplikacji startowej

Po zaimportowaniu projektu do Android Studio i sprawdzeniu zależności ML Kit możesz uruchomić aplikację po raz pierwszy. Na pasku narzędzi Android Studio kliknij Wykonaj ( execute.png).

Aplikacja powinna się uruchomić na urządzeniu. Możesz skierować aparat na wybrany tekst, aby zobaczyć podgląd transmisji na żywo, jednak funkcja rozpoznawania tekstu nie jest jeszcze wdrożona.

bd1489441c334de3.png

5. Dodawanie rozpoznawania tekstu

W tym kroku dodamy do Twojej aplikacji funkcję rozpoznawania tekstu z kamery wideo.

Tworzenie wystąpienia narzędzia do wykrywania tekstu ML Kit

Zastąp TODO na górze TextAnalyzer.kt, aby utworzyć instancję TextRecognition. W ten sposób uzyskasz obiekt rozpoznawania tekstu, który będzie potrzebny w kolejnych krokach. Musimy też dodać detektor jako obserwatora cyklu życia, aby prawidłowo go zamknąć, gdy nie będzie już potrzebny.

TextAnalyzer.kt

private val detector = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

init {
   lifecycle.addObserver(detector)
}

Uruchom rozpoznawanie tekstu na obrazie wejściowym (utworzonym za pomocą bufora z aparatu)

Biblioteka CameraX udostępnia strumień obrazów z aparatu gotowy do analizy. Zastąp metodę recognizeText() w klasie Text Analysisr, aby używać rozpoznawania tekstu przez narzędzie ML Kit w każdej ramce obrazu.

TextAnalyzer.kt

private fun recognizeText(
   image: InputImage
): Task<Text> {
   // Pass image to an ML Kit Vision API
   return detector.process(image)
       .addOnSuccessListener { text ->
           // Task completed successfully
           result.value = text.text
       }
       .addOnFailureListener { exception ->
           // Task failed with an exception
           Log.e(TAG, "Text recognition error", exception)
           val message = getErrorMessage(exception)
           message?.let {
               Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
           }
       }
}

Na tym wierszu widać, jak wywołujemy powyższą metodę, aby rozpocząć rozpoznawanie tekstu. Dodaj poniższy wiersz na końcu metody analyze(). Pamiętaj, że po zakończeniu analizy obrazu musisz wywołać funkcję imageProxy.close. W przeciwnym razie transmisja na żywo z kamery nie będzie mogła przetwarzać kolejnych obrazów na potrzeby analizy.

TextAnalyzer.kt

recognizeText(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
   imageProxy.close()
}

Uruchom aplikację na urządzeniu

Teraz na pasku narzędzi Android Studio kliknij Uruchom ( execute.png). Po załadowaniu aplikacja powinna w czasie rzeczywistym rozpoznawać tekst z aparatu. Skieruj aparat na dowolny tekst, aby go potwierdzić. Jeśli aplikacja nie rozpoznaje tekstu, spróbuj „zresetować” wykrywanie, kierując aparat na pustą przestrzeń, a potem na tekst.

6. Dodawanie identyfikacji języka

Utwórz instancję identyfikatora języka ML Kit

MainViewModel.kt znajduje się w głównym folderze. Przejdź do pliku i dodaj do pliku MainViewModel.kt to pole: W ten sposób uzyskasz nick dla identyfikatora języka, którego użyjesz w następnym kroku.

MainViewModel.kt

private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

Musisz też mieć pewność, że klienci są prawidłowo wyłączani, gdy nie są już potrzebne. Aby to zrobić, zastąpij metodę onCleared() klasy ViewModel.

MainViewModel.kt

override fun onCleared() {
   languageIdentifier.close()
   translators.evictAll()
}

Wykonywanie rozpoznawania języka na urządzeniu na wykrytym tekście

Użyj narzędzia ML Kit Language Identifier, aby poznać język wykrytego tekstu na obrazie.

W definicji pola sourceLang w bloku MainViewModel.kt zastąp wartość TODO tym kodem. Ten fragment kodu wywołuje metodę identyfikacji języka i przypisuje wynik, jeśli nie jest on nieokreślony („und”). Niezdefiniowany język oznacza, że interfejs API nie był w stanie zidentyfikować języka na podstawie listy obsługiwanych języków.

MainViewModel.kt

val sourceLang = Transformations.switchMap(sourceText) { text ->
   val result = MutableLiveData<Language>()
   languageIdentifier.identifyLanguage(text)
       .addOnSuccessListener { languageCode ->
           if (languageCode != "und")
               result.value = Language(languageCode)
       }
   result
}

Uruchom aplikację na urządzeniu

Teraz kliknij Uruchom ( execute.png) na pasku narzędzi Android Studio. Po załadowaniu aplikacji powinna ona zacząć rozpoznawać tekst z kamery i określać język tekstu w czasie rzeczywistym. Skieruj aparat na dowolny tekst, aby go potwierdzić.

7. Dodaj tłumaczenie

Zastąp funkcję translate() w pliku MainViewModel.kt tym kodem. Ta funkcja przyjmuje wartość języka źródłowego, wartość języka docelowego i tekst źródłowy, a następnie wykonuje tłumaczenie. Zwróć uwagę, że jeśli wybrany model języka docelowego nie został jeszcze pobrany na urządzenie, wywołujemy funkcję downloadModelIfNeeded(), aby to zrobić, a następnie wykonujemy tłumaczenie.

MainViewModel.kt

private fun translate(): Task<String> {
   val text = sourceText.value
   val source = sourceLang.value
   val target = targetLang.value
   if (modelDownloading.value != false || translating.value != false) {
       return Tasks.forCanceled()
   }
   if (source == null || target == null || text == null || text.isEmpty()) {
       return Tasks.forResult("")
   }
   val sourceLangCode = TranslateLanguage.fromLanguageTag(source.code)
   val targetLangCode = TranslateLanguage.fromLanguageTag(target.code)
   if (sourceLangCode == null || targetLangCode == null) {
       return Tasks.forCanceled()
   }
   val options = TranslatorOptions.Builder()
       .setSourceLanguage(sourceLangCode)
       .setTargetLanguage(targetLangCode)
       .build()
   val translator = translators[options]
   modelDownloading.setValue(true)

   // Register watchdog to unblock long running downloads
   Handler().postDelayed({ modelDownloading.setValue(false) }, 15000)
   modelDownloadTask = translator.downloadModelIfNeeded().addOnCompleteListener {
       modelDownloading.setValue(false)
   }
   translating.value = true
   return modelDownloadTask.onSuccessTask {
       translator.translate(text)
   }.addOnCompleteListener {
       translating.value = false
   }
}

Uruchom aplikację na symulatorze

Teraz na pasku narzędzi Android Studio kliknij Uruchom ( execute.png). Po załadowaniu aplikacja powinna wyglądać jak ruchomy obraz poniżej. Pokazuje rozpoznawanie tekstu, rozpoznane języki oraz przetłumaczony tekst na wybrany język. Możesz wybrać dowolny z 59 języków.

e2a9b80f1ff442d7.png

8. Gratulacje!

Gratulacje! Korzystając z ML Kit, dodałeś/dodałaś do aplikacji rozpoznawanie tekstu, identyfikację języka i tłumaczenie na urządzeniu. Teraz możesz rozpoznawać tekst i jego język na podstawie obrazu z kamery na żywo, a następnie tłumaczyć go na wybrany język – wszystko w czasie rzeczywistym.

Omówione zagadnienia

  • Jak dodać ML Kit do aplikacji na Androida
  • Jak korzystać z rozpoznawania tekstu na urządzeniu w ML Kit do rozpoznawania tekstu na obrazach
  • Jak używać rozpoznawania języka na urządzeniu w ML Kit do identyfikowania języka tekstu
  • Jak korzystać z funkcji tłumaczenia na urządzeniu w ML Kit, aby dynamicznie tłumaczyć tekst na 59 języków
  • Jak używać CameraX w połączeniu z interfejsami ML Kit

Następne kroki

  • Używaj ML Kit i CameraX w swojej aplikacji na Androida.

Więcej informacji