使用机器学习套件和 CameraX 识别文本、识别语言和翻译文本:Android

1. 简介

机器学习套件是一个移动 SDK,它通过强大且易用的软件包将 Google 的机器学习专业知识融入到 Android 和 Android 应用中。无论您是刚开始接触机器学习,还是拥有丰富的相关经验,只需几行代码即可轻松实现所需的功能。您无需具备丰富的神经网络或模型优化知识即可开始使用该 SDK。

运作方式

借助机器学习套件,可将 Google 的机器学习技术(如 Mobile VisionTensorFlow Lite)整合到一个 SDK 中,从而使您能够轻松地在应用中运用机器学习技术。无论您是需要 Mobile Vision 设备端模型的强大实时功能,还是想要自定义 TensorFlow Lite 模型的灵活性,机器学习套件都只需几行代码即可实现。

此 Codelab 会引导您逐步完成一些简单步骤,以向现有 Android 应用添加对实时摄像头画面进行文本识别、语言识别和翻译的功能。此 Codelab 还将重点介绍有关将 CameraX 与机器学习套件 API 搭配使用的最佳做法。

构建内容

在此 Codelab 中,您将使用机器学习套件构建一个 Android 应用。您的应用将使用机器学习套件的设备端文本识别 API 来识别实时摄像头画面中的文本。它将使用机器学习套件 Language Identification API 来识别识别出的文本的语言。最后,您的应用将使用机器学习套件 Translation API,将这些文本翻译成 59 个选项中任何选定的语言。

最后,您应该会看到类似下图的内容。

e2a9b80f1ff442d7.png

学习内容

  • 如何使用机器学习套件 SDK 向任何 Android 应用轻松添加机器学习功能。
  • 机器学习套件 Text Recognition API、Language Identification API、Translation API 以及它们的功能。
  • 如何将 CameraX 库与 ML Kit API 搭配使用。

您将需要满足的条件

  • 最新版 Android Studio (v4.0+)
  • 实体 Android 设备
  • 示例代码
  • 使用 Kotlin 进行 Android 开发的基础知识

此 Codelab 重点介绍机器学习套件。无关的概念和代码块则已为您提供和实现。

2. 准备工作

下载代码

点击下面的链接可下载本 Codelab 的所有代码:

解压下载的 ZIP 文件。此操作会解压缩一个根文件夹 (mlkit-android),其中包含您需要的所有资源。在此 Codelab 中,您只需要 translate 子目录中的资源。

mlkit-android 代码库中的 translate 子目录包含以下目录:

  • android_studio_folder.pngstarter - 在此 Codelab 中帮助您开始构建的起始代码。

3. 导入项目并验证机器学习套件和 CameraX 依赖项

将起始项目导入 Android Studio。在 app/build.gradle 文件中,确认已添加必要的机器学习套件和 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. 运行起始应用

现在,您已将项目导入 Android Studio 并检查了机器学习套件的依赖项,可以首次运行应用了!点击 Android Studio 工具栏中的 Run 图标 ( execute.png)。

应用应当在您的设备上启动,您可以将摄像头对准各种文本以查看动态图像,但文本识别功能尚未实现。

bd1489441c334de3.png

5. 添加文本识别功能

在此步骤中,我们会为您的应用添加功能,使其能够识别来自摄影机的文本。

实例化机器学习套件文本检测器

替换 TextAnalyzer.kt 顶部的 TODO,以实例化 TextRecognition。这样,您就可以获取文本识别器的句柄,以便在后续步骤中使用。我们还需要将检测器添加为生命周期观察器,以便在不再需要检测器时正确关闭检测器。

TextAnalyzer.kt

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

init {
   lifecycle.addObserver(detector)
}

对(使用摄像头的缓冲区创建的)输入图片运行文本识别

CameraX 库提供来自摄像头的图像数据流,可用于图像分析。替换 TextAnalyzer 类中的 recognizeText() 方法,以便对每个图像帧使用机器学习套件文本识别。

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

以下代码行显示了我们如何调用上述方法开始执行文本识别。在 analyze() 方法的末尾添加以下代码行。请注意,在图片分析完成后,您必须调用 imageProxy.close,否则实时摄像头画面将无法处理更多图片以供分析。

TextAnalyzer.kt

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

在您的设备上运行应用

现在,点击 Android Studio 工具栏中的 Run 图标 ( execute.png)。应用加载后应该会开始实时识别来自摄像头的文本。将摄像头对准任意文本进行确认。如果您的应用无法识别任何文本,请尝试先将相机对准空白处,然后再将相机对准文本,以“重置”检测功能。

6. 添加语言识别

实例化机器学习套件语言标识符

MainViewModel.kt 位于主文件夹中。前往该文件,然后将以下字段添加到 MainViewModel.kt。这样,您就可以获取语言标识符的句柄,以便在下一步中使用。

MainViewModel.kt

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

此外,您还需要确保客户端在不再需要时正确关闭。为此,请替换 ViewModelonCleared() 方法。

MainViewModel.kt

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

对检测到的文本运行设备端语言识别

使用机器学习套件语言标识符,确定从图像中检测到的文本所用的语言。

MainViewModel.kt 中的 sourceLang 字段定义中的 TODO 替换为以下代码。此代码段会调用语言识别方法,并在结果不为未定义(“und”)时进行分配。未定义的语言表示 API 无法根据支持的语言列表识别语言。

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
}

在您的设备上运行应用

现在,点击 Android Studio 工具栏中的 Run 图标 ( execute.png)。应用加载后应该会开始实时识别来自摄像头的文本,并识别文本所用的语言。将摄像头对准任意文本进行确认。

7. 添加译文

MainViewModel.kt 中的 translate() 函数替换为以下代码。此函数会接受源语言值、目标语言值和源文本,然后执行翻译。请注意,如果所选目标语言模型尚未下载到设备上,我们会调用 downloadModelIfNeeded() 进行下载,然后继续进行翻译。

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

在模拟器上运行应用

现在,点击 Android Studio 工具栏中的 Run 图标 ( execute.png)。应用加载后,现在应看起来像下面的移动图像,其中显示了文本识别和已识别的语言结果,以及所选语言的翻译文本。有 59 种语言可供选择。

e2a9b80f1ff442d7.png

8. 恭喜!

恭喜!您刚刚使用机器学习套件,向应用添加了设备端文本识别、语言识别和翻译功能!现在,您可以实时地识别来自动态摄像头画面的文本及其所用语言,并将此文本翻译成您选择的语言。

所学内容

  • 如何将机器学习套件添加到 Android 应用
  • 如何使用机器学习套件的设备端文本识别功能来识别图像中的文本
  • 如何使用机器学习套件的设备端语言识别功能来识别文本所用的语言
  • 如何使用机器学习套件的设备端翻译功能将文本动态翻译成 59 种语言
  • 如何将 CameraX 与机器学习套件 API 结合使用

后续步骤

  • 在您自己的 Android 应用中使用机器学习套件和 CameraX!

了解详情