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

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

工作机制是怎样的?

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

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

构建内容

在此 Codelab 中,您将使用机器学习套件构建一个 Android 应用。您的应用会使用机器学习套件设备端 Text Recognition API 来识别摄像头画面中的文本。它会使用机器学习套件 Language Identification API 对识别出的文本所用的语言进行识别。最后,您的应用会使用机器学习套件 Translation API 将文本翻译成所选语言,共有 59 种语言可供选择。

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

您将学习的内容

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

您将需要满足的条件

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

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

下载代码

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

下载源代码

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

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

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

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'

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

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

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

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

将以下字段添加到 TextAnalyzer.kt 的顶部。这样一来,便可以获取文本识别器的句柄,以便在后续步骤中使用。

TextAnalyzer.kt

private val detector = TextRecognition.getClient()

对(使用摄像头的缓冲区创建的)Vision Image 运行设备端文本识别

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

TextAnalyzer.kt

private fun recognizeTextOnDevice(
   image: InputImage
): Task<Text> {
   // Pass image to an ML Kit Vision API
   return detector.process(image)
       .addOnSuccessListener { visionText ->
           // Task completed successfully
           result.value = visionText.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

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

在您的设备上运行应用

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

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

将以下字段添加到 MainViewModel.kt。这样一来便可以获取语言标识符的句柄,以在下一步中使用。

MainViewModel.kt

private val languageIdentification = LanguageIdentification.getClient()

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

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

MainViewModel.ktsourceLang 字段定义中的 TODO 替换为以下代码。此代码段会调用语言识别方法,如果结果不是未定义 (“und”),则会分配结果。

MainViewModel.kt

languageIdentification.identifyLanguage(text)
   .addOnSuccessListener {
       if (it != "und")
           result.value = Language(it)
   }

在您的设备上运行应用

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

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 种语言可供选择。

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

所学内容

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

后续步骤

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

了解详情