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

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

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 11 4, 2021
account_circleTác giả: carenc

1. Giới thiệu

Bộ công cụ học máy là một SDK di động mang kiến thức chuyên môn về học máy của Google vào các ứng dụng Android và Android trong một gói mạnh mẽ và dễ sử dụng. Cho dù là người mới 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 vài dòng mã. Để bắt đầu, bạn không cần phải có kiến thức chuyên sâu về mạng nơron hoặc tối ưu hoá mô hình.

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. Dù bạn cần sức mạnh của các chức 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 sự 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ể giúp bạn chỉ cần vài dòng mã.

Lớp học lập trình này sẽ hướng dẫn bạn các 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 camera 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 khi sử dụng CameraX bằng API Bộ công cụ học máy.

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ẽ 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 trong nguồn cấp dữ liệu máy ảnh theo thời gian thực. Tính nă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 ngôn ngữ bất kỳ được chọn trong số 59 lựa chọn, bằng cách sử dụng ML Kit Translation API.

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

e2a9b80f1ff442d7.png

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

  • Cách sử dụng SDK Bộ công cụ học máy để dễ dàng thêm các chức năng Học máy vào mọi ứng dụng Android.
  • Nhận dạng văn bản, nhận dạng ngôn ngữ, API dịch và các tính năng của bộ công cụ học má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ó

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

Lớp học lập trình này tập trung vào Bộ công cụ học máy. 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.

2. Thiết lập

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:

Giải nén tệp zip đã tải xuống. Thao tác này sẽ giải nén thư mục gốc (mlkit-android) cùng với 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 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 có chứa thư mục sau:

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

3. Nhập dự án và xác minh Bộ công cụ học máy và các phần phụ thuộc CameraX

Nhập dự án khởi đầu vào Android Studio. Trong tệp app/build.gradle, hãy xác minh rằng các phần phụ thuộc CameraX và Bộ công cụ học máy cần thiết đã được bao gồm:

// 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. Chạy ứng dụng khởi đầu

Giờ đây, sau 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! Nhấp vào Run (Chạy) (thực thi.png) trên 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. Tuy nhiên, chức năng nhận dạng văn bản chưa được triển khai.

bd1489441c334de3.png

5. Thêm tính năng nhận dạng văn bản

Ở bước này, chúng ta sẽ thêm chức năng vào ứng dụng của bạn để nhận dạng văn bản trên 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

Thay thế TODO ở đầu TextAnalyzer.kt để tạo TextRecognition. Đây là cách bạn xử lý trình nhận dạng văn bản để sử dụng trong các bước sau. Chúng ta cũng cần thêm trình phát hiện làm trình quan sát vòng đời để đóng trình phát hiện đúng cách khi không cần dùng nữa.

TextAnalyzer.kt

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

init
{
   lifecycle
.addObserver(detector)
}

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

Thư viện CameraX cung cấp một luồng hình ảnh từ máy ảnh sẵn sàng cho việc phân tích hình ảnh. Thay thế phương thức recognizeText() 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 từng khung hình ảnh.

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

Dòng sau đây cho thấy 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 quá trình phân tích hoàn tất đối với hình ảnh. Nếu không, nguồn cấp dữ liệu camera trực tiếp sẽ không thể xử lý thêm hình ảnh để phân tích.

TextAnalyzer.kt

recognizeText(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 biểu tượng Run (Chạy) (thực thi.png) trên thanh công cụ Android Studio. Sau khi tải, ứng dụng sẽ bắt đầu nhận dạng văn bản qua camera theo thời gian thực. Hướng camera vào một phần văn bản bất kỳ để xác nhận. Nếu ứng dụng của bạn không nhận ra phần văn bản nào, hãy thử "đặt lại" phát hiện bằng cách hướng camera vào một khoảng trống trước khi hướng camera vào văn bản.

6. Thêm thông tin nhận dạng ngôn ngữ

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

MainViewModel.kt nằm trong thư mục chính. Chuyển đến tệp đó rồi thêm trường sau đây vào MainViewModel.kt. Đây là cách bạn xử lý giá trị nhận dạng ngôn ngữ để sử dụng trong bước tiếp theo.

MainViewModel.kt

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

Ngoài ra, bạn cũng muốn đảm bảo rằng các ứng dụng được tắt đúng cách khi không còn cần đến. Để thực hiện việc này, hãy ghi đè phương thức onCleared() của ViewModel.

MainViewModel.kt

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

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

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 phát hiện được trên hình ảnh.

Thay thế TODO trong định nghĩa trường sourceLang trong MainViewModel.kt bằng đoạn 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 xác định ("und"). Ngôn ngữ không xác định có nghĩa là API không thể xác định ngôn ngữ dựa trên danh sách ngôn ngữ được hỗ trợ.

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
}

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

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

7. Thêm bản dịch

Thay thế hàm translate() trong MainViewModel.kt bằng mã sau. Hàm này nhận 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 thuật. 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() để thực hiện việc này rồi tiến hành 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 biểu tượng Run (Chạy) (thực thi.png) trên thanh công cụ Android Studio. Khi ứng dụng tải xong, giờ đây ứng dụng sẽ có dạng như hình ảnh động dưới đây, hiển thị chức năng nhận dạng văn bản và kết quả ngôn ngữ xác định cũng như văn bản được dịch sang ngôn ngữ được chọn. Bạn có thể chọn bất kỳ ngôn ngữ nào trong số 59 ngôn ngữ.

e2a9b80f1ff442d7.png

8. Xin chúc mừng!

Xin chúc mừng! Bạn vừa thêm tính năng nhận dạng văn bản trên thiết bị, nhận dạng ngôn ngữ và dịch 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 đó thông qua nguồn cấp dữ liệu camera trực tiếp, đồng thời dịch văn bản này sang ngôn ngữ 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 dùng tính năng dịch trên thiết bị trong Bộ công cụ học máy để dịch văn bản linh hoạt sang 59 ngôn ngữ
  • Cách sử dụng CameraX cùng với 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