Mit ML Kit und CameraX die Sprache erkennen, die Sprache erkennen und Text übersetzen: Android

1. Einführung

ML Kit ist ein mobiles SDK, das die Expertise von Google im Bereich maschinelles Lernen in einem leistungsstarken und dennoch benutzerfreundlichen Paket für Android- und Android-Apps bereitstellt. Egal, ob Sie neu im Bereich maschinelles Lernen sind oder bereits Erfahrung haben, Sie können die benötigten Funktionen ganz einfach mit wenigen Codezeilen implementieren. Sie benötigen keine fundierten Kenntnisse über neuronale Netze oder Modelloptimierung, um loszulegen.

Wie funktioniert das?

Mit ML Kit können Sie ML-Techniken ganz einfach in Ihren Apps anwenden, da die ML-Technologien von Google wie Mobile Vision und TensorFlow Lite in einem einzigen SDK zusammengefasst sind. Ganz gleich, ob Sie die Leistungsfähigkeit der Echtzeitfunktionen der On-Device-Modelle von Mobile Vision oder die Flexibilität benutzerdefinierter TensorFlow Lite-Modelle benötigen – mit ML Kit ist das mit nur wenigen Codezeilen möglich.

In diesem Codelab zeigen wir Ihnen Schritt für Schritt, wie Sie Ihrer vorhandenen Android-App Texterkennung, Spracherkennung und Übersetzung aus einem Echtzeit-Kamerafeed hinzufügen. Außerdem werden Best Practices für die Verwendung von CameraX mit ML Kit APIs erläutert.

Überblick

In diesem Codelab entwickeln Sie eine Android-App mit ML Kit. Ihre App verwendet die On-Device API der ML Kit Text Recognition, um Text aus dem Echtzeit-Kamerafeed zu erkennen. Mithilfe der ML Kit Language Identification API wird die Sprache des erkannten Texts ermittelt. Anschließend übersetzt Ihre App diesen Text mithilfe der ML Kit Translation API in eine von 59 möglichen Sprachen.

Das Ergebnis sollte in etwa so aussehen wie im Bild unten.

e2a9b80f1ff442d7.png

Aufgaben in diesem Lab

  • Mit dem ML Kit SDK jede Android-App einfach um Funktionen für maschinelles Lernen ergänzen.
  • ML Kit-Texterkennung, Spracherkennung und Übersetzungs-APIs und ihre Funktionen
  • CameraX-Bibliothek mit ML Kit APIs verwenden

Voraussetzungen

  • Eine aktuelle Version von Android Studio (Version 4.0 oder höher)
  • Ein physisches Android-Gerät
  • Beispielcode
  • Grundkenntnisse in der Android-Entwicklung mit Kotlin

In diesem Codelab geht es um ML Kit. Irrelevante Konzepte und Codeblöcke sind bereits vorhanden und implementiert.

2. Einrichtung

Code herunterladen

Klicken Sie auf den folgenden Link, um den gesamten Code für dieses Codelab herunterzuladen:

Entpacken Sie die heruntergeladene ZIP-Datei. Dadurch wird ein Stammordner (mlkit-android) mit allen erforderlichen Ressourcen entpackt. Für dieses Codelab benötigen Sie nur die Ressourcen im Unterverzeichnis translate.

Das Unterverzeichnis translate im Repository mlkit-android enthält das folgende Verzeichnis:

  • android_studio_folder.pngstarter: Der Startcode, auf dem Sie in diesem Codelab aufbauen.

3. Projekt importieren und ML Kit- und CameraX-Abhängigkeiten prüfen

Importieren Sie das Startprojekt in Android Studio. Prüfen Sie in der Datei app/build.gradle, ob die erforderlichen ML Kit- und CameraX-Abhängigkeiten enthalten sind:

// 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. Start-App ausführen

Nachdem Sie das Projekt in Android Studio importiert und die ML Kit-Abhängigkeiten geprüft haben, können Sie die App zum ersten Mal ausführen. Klicken Sie in der Android Studio-Symbolleiste auf Ausführen ( execute.png).

Die App sollte auf Ihrem Gerät gestartet werden und Sie können die Kamera auf verschiedenen Text richten, um einen Livefeed zu sehen. Die Texterkennungsfunktion wurde jedoch noch nicht implementiert.

bd1489441c334de3.png

5. Texterkennung hinzufügen

In diesem Schritt fügen wir Ihrer App Funktionen hinzu, mit denen Text von der Videokamera erkannt wird.

ML Kit-Texterkennung instanziieren

Ersetzen Sie die TODO oben in TextAnalyzer.kt, um TextRecognition zu instanziieren. So erhalten Sie einen Handle für den Texterkennungsdienst, den Sie in späteren Schritten verwenden können. Außerdem müssen wir den Detektor als Lebenszyklusbeobachter hinzufügen, damit er ordnungsgemäß geschlossen wird, wenn er nicht mehr benötigt wird.

TextAnalyzer.kt

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

init {
   lifecycle.addObserver(detector)
}

Texterkennung auf einem Eingabebild ausführen (mit dem Buffer der Kamera erstellt)

Die CameraX-Bibliothek stellt einen Stream von Bildern von der Kamera bereit, der für die Bildanalyse verwendet werden kann. Ersetzen Sie die Methode recognizeText() in der Klasse „TextAnalyzer“, um die ML Kit-Texterkennung auf jedem Bildframe anzuwenden.

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()
           }
       }
}

In der folgenden Zeile wird gezeigt, wie die oben genannte Methode aufgerufen wird, um die Texterkennung zu starten. Fügen Sie am Ende der Methode analyze() die folgende Zeile hinzu. Hinweis: Sie müssen imageProxy.close aufrufen, sobald die Analyse des Bildes abgeschlossen ist. Andernfalls können über den Live-Kamerafeed keine weiteren Bilder zur Analyse verarbeitet werden.

TextAnalyzer.kt

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

App auf Ihrem Gerät ausführen

Klicken Sie jetzt in der Android Studio-Symbolleiste auf Ausführen ( execute.png). Sobald die App geladen ist, sollte sie Text in Echtzeit von der Kamera erkennen. Richten Sie die Kamera zur Bestätigung auf einen beliebigen Text. Wenn Ihre App keinen Text erkennt, versuchen Sie, die Erkennung zurückzusetzen, indem Sie die Kamera auf eine leere Stelle richten, bevor Sie sie auf den Text richten.

6. Spracherkennung hinzufügen

ML Kit-Sprachkennzeichnung instanziieren

MainViewModel.kt befindet sich im Hauptordner. Rufen Sie die Datei auf und fügen Sie MainViewModel.kt das folgende Feld hinzu. So erhalten Sie einen Handle für die Sprach-ID, die Sie im nächsten Schritt verwenden.

MainViewModel.kt

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

Außerdem sollten Sie darauf achten, dass die Clients ordnungsgemäß heruntergefahren werden, wenn sie nicht mehr benötigt werden. Dazu überschreiben Sie die Methode onCleared() von ViewModel.

MainViewModel.kt

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

Spracherkennung für den erkannten Text auf dem Gerät ausführen

Verwenden Sie die ML Kit-Spracherkennung, um die Sprache des erkannten Texts im Bild abzurufen.

Ersetzen Sie das TODO in der Felddefinition sourceLang in MainViewModel.kt durch den folgenden Code. In diesem Snippet wird die Methode zur Spracherkennung aufgerufen und das Ergebnis zugewiesen, sofern es nicht undefiniert ist („und“). Eine nicht definierte Sprache bedeutet, dass die API die Sprache anhand der Liste der unterstützten Sprachen nicht identifizieren konnte.

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
}

App auf Ihrem Gerät ausführen

Klicken Sie jetzt in der Android Studio-Symbolleiste auf Ausführen ( execute.png). Sobald die App geladen ist, sollte sie Text von der Kamera erkennen und die Sprache des Texts in Echtzeit identifizieren. Richten Sie die Kamera auf einen beliebigen Text, um den Vorgang zu bestätigen.

7. Übersetzung hinzufügen

Ersetzen Sie die Funktion translate() in MainViewModel.kt durch den folgenden Code. Diese Funktion verwendet den Wert für die Ausgangssprache, den Wert für die Zielsprache und den Ausgangstext und führt die Übersetzung durch. Beachten Sie, dass das Modell für die ausgewählte Zielsprache noch nicht auf das Gerät heruntergeladen wurde. Wir rufen downloadModelIfNeeded() auf, um dies zu tun, und fahren dann mit der Übersetzung fort.

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
   }
}

App im Simulator ausführen

Klicken Sie jetzt in der Android Studio-Symbolleiste auf Ausführen ( execute.png). Nach dem Laden sollte die App jetzt wie im bewegten Bild unten aussehen. Hier sind die Ergebnisse der Texterkennung und der erkannten Sprache sowie der übersetzte Text in der ausgewählten Sprache zu sehen. Sie können eine der 59 Sprachen auswählen.

e2a9b80f1ff442d7.png

8. Glückwunsch!

Herzlichen Glückwunsch! Sie haben Ihrer App mit ML Kit die Texterkennung, die Spracherkennung und die Übersetzung auf dem Gerät hinzugefügt. Sie können jetzt Text und die Sprache im Live-Kamerafeed erkennen und diesen Text in Echtzeit in eine von Ihnen ausgewählte Sprache übersetzen lassen.

Behandelte Themen

  • ML Kit zur Android-App hinzufügen
  • On-Device-Texterkennung in ML Kit verwenden, um Text in Bildern zu erkennen
  • On-Device-Spracherkennung in ML Kit verwenden, um die Sprache von Text zu identifizieren
  • Mit der On-Device-Übersetzung in ML Kit Text dynamisch in 59 Sprachen übersetzen
  • CameraX in Verbindung mit ML Kit APIs verwenden

Nächste Schritte

  • ML Kit und CameraX in Ihrer eigenen Android-App verwenden

Weitere Informationen