Nhận dạng, xác định ngôn ngữ và dịch văn bản bằng Bộ công cụ học máy và CameraX: Android

Bộ công cụ học máy là một SDK di động mang chuyên môn về học máy của Google đến với Android và các ứng dụng Android trong một gói mạnh mẽ nhưng dễ sử dụng. Cho dù mới làm quen hay đã có kinh nghiệm về công nghệ học máy, bạn đều có thể dễ dàng triển khai chức năng mình cần chỉ bằng một vài dòng mã. Bạn không cần có kiến thức chuyên sâu về mạng nơron hoặc tối ưu hoá mô hình để bắt đầu.

Tính năng này hoạt động ra sao?

Nhờ bộ công cụ học máy, bạn dễ dàng áp dụng các kỹ thuật học máy trong ứng dụng của mình bằng cách tích hợp các công nghệ học máy của Google như Mobile VisionTensorFlow Lite vào một SDK duy nhất. Cho dù bạn cần sức mạnh của các tính năng theo thời gian thực của các mô hình trên thiết bị của Mobile Vision hay tính linh hoạt của các mô hình TensorFlow Lite tuỳ chỉnh, Bộ công cụ học máy đều có thể đáp ứng nhu cầu của bạn chỉ với một vài dòng mã.

Trong lớp học lập trình này, bạn sẽ được hướng dẫn từng bước đơn giản để thêm tính năng Nhận dạng văn bản, Nhận dạng ngôn ngữ và Dịch từ nguồn cấp dữ liệu máy ảnh theo thời gian thực vào ứng dụng Android hiện có. Lớp học lập trình này cũng sẽ nêu bật các phương pháp hay nhất để sử dụng CameraX với API Bộ công cụ máy học.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ xây dựng một ứng dụng Android bằng Bộ công cụ học máy. Ứng dụng của bạn sẽ sử dụng API Nhận dạng văn bản trên thiết bị của Bộ công cụ học máy để nhận dạng văn bản từ nguồn cấp dữ liệu máy ảnh theo thời gian thực. Ứng dụng này sẽ sử dụng API Nhận dạng ngôn ngữ của Bộ công cụ học máy để xác định ngôn ngữ của văn bản được nhận dạng. Cuối cùng, ứng dụng của bạn sẽ dịch văn bản này sang bất kỳ ngôn ngữ nào được chọn trong số 59 ngôn ngữ bằng cách sử dụng API Dịch của Bộ công cụ học máy.

Cuối cùng, bạn sẽ thấy nội dung tương tự như hình ảnh bên dưới.

Kiến thức bạn sẽ học được

  • Cách sử dụng SDK Bộ công cụ máy học để dễ dàng thêm các tính năng Máy học vào bất kỳ ứng dụng Android nào.
  • API Nhận dạng văn bản, Nhận dạng ngôn ngữ, Dịch của Bộ công cụ học máy và các chức năng của các API này.
  • Cách sử dụng thư viện CameraX với các API Bộ công cụ học máy.

Bạn cần có

  • Một phiên bản Android Studio gần đây (phiên bản 4.0 trở lên)
  • Thiết bị Android thực
  • Mã mẫu
  • Kiến thức cơ bản về phát triển Android bằng Kotlin

Lớp học lập trình này tập trung vào Bộ công cụ máy học. Các khái niệm và khối mã không liên quan đã được cung cấp và triển khai cho bạn.

Tải mã nguồn xuống

Nhấp vào đường liên kết sau đây để tải toàn bộ mã nguồn cho lớp học lập trình này:

Tải mã nguồn xuống

Giải nén tệp zip đã tải xuống. Thao tác này sẽ giải nén một thư mục gốc (mlkit-android) có tất cả tài nguyên bạn cần. Đối với lớp học lập trình này, bạn sẽ chỉ cần các tài nguyên trong thư mục con translate.

Thư mục con translate trong kho lưu trữ mlkit-android chứa thư mục sau:

  • android_studio_folder.pngstarter – Mã khởi đầu mà bạn sẽ xây dựng trong lớp học lập trình này.

Trong tệp app/build.gradle, hãy xác minh rằng bạn đã thêm các phần phụ thuộc cần thiết của Bộ công cụ học máy và 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'

Giờ đây, khi đã nhập dự án vào Android Studio và kiểm tra các phần phụ thuộc của Bộ công cụ học máy, bạn đã sẵn sàng chạy ứng dụng lần đầu tiên! Khởi động trình mô phỏng Android Studio rồi nhấp vào biểu tượng Chạy (execute.png) trong thanh công cụ Android Studio.

Ứng dụng sẽ khởi chạy trên thiết bị của bạn và bạn có thể hướng camera vào nhiều văn bản để xem nguồn cấp dữ liệu trực tiếp, nhưng chức năng nhận dạng văn bản chưa được triển khai.

Ở bước này, chúng ta sẽ thêm chức năng vào ứng dụng để nhận dạng văn bản từ máy quay video.

Tạo thực thể cho Trình phát hiện văn bản của Bộ công cụ học máy

Thêm trường sau vào đầu TextAnalyzer.kt. Đây là cách bạn lấy một handle (tên gọi) cho trình nhận dạng văn bản để sử dụng trong các bước sau.

TextAnalyzer.kt

private val detector = TextRecognition.getClient()

Chạy tính năng nhận dạng văn bản trên thiết bị trên Hình ảnh Vision ( được tạo bằng vùng đệm từ máy ảnh)

Thư viện CameraX cung cấp luồng hình ảnh từ máy ảnh để sẵn sàng phân tích hình ảnh. Thay thế phương thức recognizeTextOnDevice() trong lớp TextAnalyzer để sử dụng tính năng nhận dạng văn bản của Bộ công cụ học máy trên mỗi khung hình ảnh.

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

Dòng sau đây cho biết cách chúng ta gọi phương thức trên để bắt đầu nhận dạng văn bản. Thêm dòng sau vào cuối phương thức analyze(). Xin lưu ý rằng bạn phải gọi imageProxy.close sau khi hoàn tất quá trình phân tích hình ảnh, nếu không, nguồn cấp dữ liệu máy ảnh trực tiếp sẽ không thể xử lý thêm hình ảnh để phân tích.

TextAnalyzer.kt

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

Chạy ứng dụng trên thiết bị

Bây giờ, hãy nhấp vào Run (Chạy) (execute.png) trong thanh công cụ của Android Studio. Sau khi tải, ứng dụng sẽ bắt đầu nhận dạng văn bản từ máy ảnh theo thời gian thực. Hướng máy ảnh vào bất kỳ văn bản nào để xác nhận.

Tạo thực thể cho Trình nhận dạng ngôn ngữ của Bộ công cụ học máy

Thêm trường sau vào MainViewModel.kt. Đây là cách bạn lấy handle cho giá trị nhận dạng ngôn ngữ để sử dụng trong bước tiếp theo.

MainViewModel.kt

private val languageIdentification = LanguageIdentification.getClient()

Chạy tính năng nhận dạng ngôn ngữ trên thiết bị trên văn bản đã phát hiện

Sử dụng Giá trị nhận dạng ngôn ngữ của Bộ công cụ học máy để lấy ngôn ngữ của văn bản được phát hiện từ hình ảnh.

Thay thế TODO trong phần khai báo trường sourceLang trong MainViewModel.kt bằng mã sau. Đoạn mã này gọi phương thức nhận dạng ngôn ngữ và gán kết quả nếu kết quả đó không được xác định ("und").

MainViewModel.kt

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

Chạy ứng dụng trên thiết bị

Bây giờ, hãy nhấp vào Run (Chạy) (execute.png) trong thanh công cụ của Android Studio. Sau khi tải, ứng dụng sẽ bắt đầu nhận dạng văn bản từ máy ảnh và xác định ngôn ngữ của văn bản theo thời gian thực. Hướng máy ảnh vào bất kỳ văn bản nào để xác nhận.

Thay thế hàm translate() trong MainViewModel.kt bằng mã sau. Hàm này lấy giá trị ngôn ngữ nguồn, giá trị ngôn ngữ đích và văn bản nguồn rồi thực hiện việc dịch. Lưu ý rằng nếu mô hình ngôn ngữ đích đã chọn chưa được tải xuống thiết bị, chúng ta sẽ gọi downloadModelIfNeeded() để tải xuống, sau đó tiếp tục dịch.

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

Chạy ứng dụng trên trình mô phỏng

Bây giờ, hãy nhấp vào Run (Chạy) (execute.png) trong thanh công cụ của Android Studio. Sau khi tải, ứng dụng sẽ có dạng như hình ảnh động bên dưới, cho thấy kết quả nhận dạng văn bản và ngôn ngữ đã xác định, cũng như văn bản được dịch sang ngôn ngữ đã chọn. Bạn có thể chọn bất kỳ ngôn ngữ nào trong số 59 ngôn ngữ.

Chúc mừng! Bạn vừa thêm tính năng nhận dạng văn bản, nhận dạng ngôn ngữ và dịch trên thiết bị vào ứng dụng của mình bằng Bộ công cụ học máy! Giờ đây, bạn có thể nhận dạng văn bản và ngôn ngữ của văn bản đó từ nguồn cấp dữ liệu trực tiếp của máy ảnh, đồng thời dịch văn bản này sang ngôn ngữ mà bạn chọn theo thời gian thực.

Nội dung đã đề cập

  • Cách thêm Bộ công cụ học máy vào ứng dụng Android
  • Cách sử dụng tính năng nhận dạng văn bản trên thiết bị trong Bộ công cụ học máy để nhận dạng văn bản trong hình ảnh
  • Cách sử dụng tính năng nhận dạng ngôn ngữ trên thiết bị trong Bộ công cụ học máy để xác định ngôn ngữ của văn bản
  • Cách sử dụng tính năng dịch trên thiết bị trong Bộ công cụ máy học để dịch văn bản một cách linh động sang 59 ngôn ngữ
  • Cách sử dụng CameraX kết hợp với các API Bộ công cụ học máy

Các bước tiếp theo

  • Sử dụng Bộ công cụ học máy và CameraX trong ứng dụng Android của riêng bạn!

Tìm hiểu thêm