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 wiedzę Google w zakresie uczenia maszynowego w aplikacjach na Androida w postaci zaawansowanego, ale łatwego w użyciu pakietu. Niezależnie od tego, czy dopiero zaczynasz przygodę z uczeniem maszynowym, czy masz już doświadczenie w tej dziedzinie, możesz łatwo zaimplementować potrzebne funkcje za pomocą zaledwie kilku wierszy kodu. Aby zacząć, nie musisz mieć dogłębnej wiedzy o sieciach neuronowych ani optymalizacji modeli.

Jak to działa?

ML Kit ułatwia stosowanie technik uczenia maszynowego w aplikacjach, ponieważ łączy technologie Google w tej dziedzinie, takie jak Mobile Vision i TensorFlow Lite, w jednym pakiecie SDK. Niezależnie od tego, czy potrzebujesz mocy modeli działających na urządzeniu w czasie rzeczywistym, czy elastyczności niestandardowych modeli TensorFlow Lite, ML Kit umożliwia to za pomocą zaledwie kilku wierszy kodu.

To ćwiczenie z programowania przeprowadzi Cię przez proste kroki, które pozwolą Ci dodać do istniejącej aplikacji na Androida rozpoznawanie tekstu, identyfikację języka i tłumaczenie z przekazu z kamery w czasie rzeczywistym. W tym ćwiczeniu omówimy też sprawdzone metody korzystania z CameraX w połączeniu z interfejsami API ML Kit.

Co utworzysz

W tym ćwiczeniu z programowania utworzysz aplikację na Androida z ML Kit. Twoja aplikacja będzie używać interfejsu API ML Kit do rozpoznawania tekstu na urządzeniu, aby rozpoznawać tekst z przekazu z kamery w czasie rzeczywistym. Będzie używać interfejsu API ML Kit do identyfikacji języka, aby określić język rozpoznanego tekstu. Na koniec Twoja aplikacja przetłumaczy ten tekst na dowolny z 59 języków za pomocą interfejsu API ML Kit do tłumaczenia.

Na koniec zobaczysz coś podobnego do obrazu poniżej.

e2a9b80f1ff442d7.png

Czego się nauczysz

  • Jak używać pakietu SDK ML Kit, aby łatwo dodawać funkcje uczenia maszynowego do dowolnej aplikacji na Androida.
  • Interfejsy API ML Kit do rozpoznawania tekstu, identyfikacji języka i tłumaczenia oraz ich możliwości.
  • Jak używać biblioteki CameraX z interfejsami API ML Kit.

Czego potrzebujesz

  • Najnowsza wersja Android Studio (wersja 4.0 lub nowsza)
  • Fizyczne urządzenie z Androidem
  • Przykładowy kod
  • Podstawowa wiedza na temat tworzenia aplikacji na Androida w języku Kotlin

To ćwiczenie z programowania koncentruje się na ML Kit. Nieistotne koncepcje i bloki kodu zostały już podane i zaimplementowane.

2. Przygotowania

Pobieranie kodu

Kliknij ten link, aby pobrać cały kod do tego ćwiczenia z programowania:

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

Podkatalog translate w repozytorium mlkit-android zawiera ten katalog:

  • android_studio_folder.pngstarter – kod początkowy, na którym będziesz pracować w tym ćwiczeniu.

3. Importowanie projektu i sprawdzanie zależności ML Kit i CameraX

Zaimportuj projekt początkowy do Android Studio. W pliku app/build.gradle sprawdź, czy są uwzględnione 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 po raz pierwszy uruchomić aplikację. Na pasku narzędzi Android Studio kliknij Uruchom ( execute.png).

Aplikacja powinna się uruchomić na urządzeniu. Możesz skierować aparat na różne teksty, aby zobaczyć aktywny kanał, ale funkcja rozpoznawania tekstu nie została jeszcze zaimplementowana.

bd1489441c334de3.png

5. Dodawanie rozpoznawania tekstu

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

Tworzenie instancji detektora tekstu ML Kit

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

TextAnalyzer.kt

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

init {
   lifecycle.addObserver(detector)
}

Uruchamianie rozpoznawania tekstu na obrazie wejściowym (utworzonym za pomocą bufora z kamery)

Biblioteka CameraX udostępnia strumień obrazów z kamery gotowych do analizy obrazu. Zastąp metodę recognizeText() w klasie TextAnalyzer, aby używać rozpoznawania tekstu ML Kit w każdej klatce 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()
           }
       }
}

Poniższy wiersz pokazuje, jak wywołujemy powyższą metodę, aby rozpocząć rozpoznawanie tekstu. Na końcu metody analyze() dodaj ten wiersz. Pamiętaj, że po zakończeniu analizy obrazu musisz wywołać imageProxy.close, w przeciwnym razie przekaz na żywo z kamery nie będzie mógł przetwarzać kolejnych obrazów do analizy.

TextAnalyzer.kt

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

Uruchamianie aplikacji na urządzeniu

Na pasku narzędzi Android Studio kliknij Uruchom ( execute.png). Po wczytaniu aplikacji powinna ona zacząć rozpoznawać tekst z kamery w czasie rzeczywistym. Aby to potwierdzić, skieruj aparat na dowolny tekst. Jeśli aplikacja nie rozpoznaje tekstu, spróbuj „zresetować” wykrywanie, kierując aparat na puste miejsce, a następnie na tekst.

6. Dodawanie identyfikacji języka

Tworzenie instancji identyfikatora języka ML Kit

Plik MainViewModel.kt znajduje się w folderze głównym. Otwórz ten plik i dodaj to pole do MainViewModel.kt. W ten sposób uzyskasz dostęp do identyfikatora języka, którego będziesz używać w następnym kroku.

MainViewModel.kt

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

Dodatkowo musisz mieć pewność, że klienci są prawidłowo wyłączani, gdy nie są już potrzebni. Aby to zrobić, zastąp metodę onCleared() klasy ViewModel.

MainViewModel.kt

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

Uruchamianie identyfikacji języka na urządzeniu na wykrytym tekście

Użyj identyfikatora języka ML Kit, aby uzyskać język wykrytego tekstu z obrazu.

Zastąp TODO w definicji pola sourceLang w MainViewModel.kt tym kodem. Ten fragment kodu wywołuje metodę identyfikacji języka i przypisuje wynik, jeśli nie jest on niezdefiniowany („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
}

Uruchamianie aplikacji na urządzeniu

Na pasku narzędzi Android Studio kliknij Uruchom ( execute.png). Po wczytaniu aplikacji powinna ona zacząć rozpoznawać tekst z kamery i identyfikować język tekstu w czasie rzeczywistym. Aby to potwierdzić, skieruj aparat na dowolny tekst.

7. Dodawanie tłumaczenia

Zastąp funkcję translate() w MainViewModel.kt tym kodem. Ta funkcja pobiera wartość języka źródłowego, wartość języka docelowego i tekst źródłowy oraz wykonuje tłumaczenie. Zwróć uwagę, że jeśli wybrany model języka docelowego nie został jeszcze pobrany na urządzenie, wywołujemy downloadModelIfNeeded(), aby to zrobić, a następnie kontynuujemy 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
   }
}

Uruchamianie aplikacji w symulatorze

Na pasku narzędzi Android Studio kliknij Uruchom ( execute.png). Po wczytaniu aplikacja powinna wyglądać jak animacja poniżej, pokazując wyniki rozpoznawania tekstu i identyfikacji języka oraz przetłumaczony tekst na wybrany język. Możesz wybrać dowolny z 59 języków.

e2a9b80f1ff442d7.png

8. Gratulacje!

Gratulacje! Właśnie dodaliśmy do aplikacji rozpoznawanie tekstu, identyfikację języka i tłumaczenie na urządzeniu za pomocą ML Kit. Teraz możesz rozpoznawać tekst i jego język z przekazu z kamery na żywo oraz tłumaczyć ten tekst na wybrany język w czasie rzeczywistym.

Omówione zagadnienia

  • Jak dodać ML Kit do aplikacji na Androida.
  • Jak używać rozpoznawania tekstu na urządzeniu w ML Kit, aby rozpoznawać tekst na obrazach.
  • Jak używać identyfikacji języka na urządzeniu w ML Kit, aby identyfikować język tekstu.
  • Jak używać 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 API ML Kit.

Następne kroki

  • Używaj ML Kit i CameraX we własnej aplikacji na Androida.

Więcej informacji