1. Giới thiệu
MediaPipe là gì?
Các giải pháp MediaPipe cho phép bạn áp dụng các giải pháp học máy (ML) cho ứng dụng của mình. Nó cung cấp một khung để định cấu hình các quy trình xử lý được tạo sẵn, mang lại đầu ra tức thì, hấp dẫn và hữu ích cho người dùng. Bạn thậm chí có thể tuỳ chỉnh nhiều giải pháp trong số này bằng MediaPipe Model Maker để cập nhật các mô hình mặc định.
Chuyển văn bản thành hình ảnh là một trong số các tác vụ học máy mà MediaPipe Solutions cung cấp.
Trong Lớp học lập trình này, bạn sẽ bắt đầu với một ứng dụng Android gần như trống, sau đó trải qua nhiều bước cho đến khi có thể tạo hình ảnh mới ngay trên thiết bị Android của mình.
Kiến thức bạn sẽ học được
- Cách triển khai tính năng chuyển văn bản thành hình ảnh chạy cục bộ trong một ứng dụng Android bằng MediaPipe Tasks.
Bạn cần có
- Một phiên bản Android Studio đã cài đặt (lớp học lập trình này được viết và kiểm thử bằng Android Studio Giraffe).
- Thiết bị Android có RAM ít nhất 8 GB.
- Kiến thức cơ bản về cách phát triển Android và khả năng chạy một tập lệnh Python được viết sẵn.
2. Thêm MediaPipe Tasks vào ứng dụng Android
Tải ứng dụng khởi đầu cho Android xuống
Lớp học lập trình này sẽ bắt đầu bằng một mẫu được tạo sẵn bao gồm giao diện người dùng sẽ được dùng cho phiên bản cơ bản của tính năng tạo hình ảnh. Bạn có thể tìm thấy ứng dụng khởi động đó trong kho lưu trữ Mẫu MediaPipe chính thức tại đây. Sao chép kho lưu trữ hoặc tải tệp zip xuống bằng cách nhấp vào Mã > Tải xuống tệp ZIP.
Nhập ứng dụng vào Android Studio
- Mở Android Studio
- Trên màn hình Chào mừng bạn đến với Android Studio, hãy chọn Mở ở góc trên cùng bên phải.

- Chuyển đến nơi bạn sao chép hoặc tải kho lưu trữ xuống rồi mở thư mục codelabs/image_generation_basic/android/start.
- Ở giai đoạn này, ứng dụng không được biên dịch vì bạn chưa thêm phần phụ thuộc MediaPipe Tasks.
Bạn sẽ sửa ứng dụng và chạy ứng dụng bằng cách chuyển đến tệp build.gradle rồi di chuyển xuống // Step 1 - Add dependency. (Bước 1 – Thêm phần phụ thuộc). Từ đó, hãy thêm dòng sau rồi nhấn vào nút Sync Now (Đồng bộ hoá ngay) xuất hiện trong biểu ngữ ở đầu Android Studio.
// Step 1 - Add dependency
implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
Sau khi quá trình đồng bộ hoá hoàn tất, hãy xác minh rằng mọi thứ đã mở và cài đặt đúng cách bằng cách nhấp vào mũi tên run (chạy) màu xanh lục (
) ở trên cùng bên phải của Android Studio. Bạn sẽ thấy ứng dụng mở ra một màn hình có 2 nút chọn và một nút có nhãn INITIALIZE (KHỞI TẠO). Nếu nhấp vào nút đó, bạn sẽ được chuyển ngay đến một giao diện người dùng riêng biệt bao gồm một câu lệnh dạng văn bản và các lựa chọn khác cùng với một nút có nhãn TẠO.

Rất tiếc, đó là giới hạn của ứng dụng khởi đầu. Vì vậy, đã đến lúc bạn tìm hiểu cách hoàn tất ứng dụng này và bắt đầu tạo hình ảnh mới trên thiết bị của mình!
3. Thiết lập Trình tạo hình ảnh
Trong ví dụ này, phần lớn công việc tạo hình ảnh sẽ diễn ra trong tệp ImageGenerationHelper.kt. Khi mở tệp này, bạn sẽ thấy một biến ở đầu lớp có tên là imageGenerator. Đây là đối tượng Task sẽ thực hiện các thao tác phức tạp trong ứng dụng tạo hình ảnh của bạn.
Ngay bên dưới đối tượng đó, bạn sẽ thấy một hàm có tên là initializeImageGenerator() với nhận xét sau: // Bước 2 - khởi động công cụ tạo ảnh. Như bạn có thể đoán, đây là nơi bạn sẽ khởi tạo đối tượng ImageGenerator. Thay thế phần nội dung của hàm đó bằng đoạn mã sau để đặt đường dẫn mô hình tạo hình ảnh và khởi chạy đối tượng ImageGenerator:
// Step 2 - initialize the image generator
val options = ImageGeneratorOptions.builder()
.setImageGeneratorModelDirectory(modelPath)
.build()
imageGenerator = ImageGenerator.createFromOptions(context, options)
Bên dưới, bạn sẽ thấy một hàm khác có tên là setInput(). Hàm này chấp nhận 3 tham số: chuỗi prompt (lệnh) sẽ được dùng để xác định hình ảnh được tạo, số lượng iterations (lần lặp) mà Task cần thực hiện trong khi tạo hình ảnh mới và giá trị seed (hạt giống) có thể dùng để tạo các phiên bản mới của hình ảnh dựa trên cùng một lệnh trong khi tạo hình ảnh giống nhau khi dùng cùng một hạt giống. Mục đích của hàm này là đặt các tham số ban đầu này cho trình tạo hình ảnh khi bạn cố gắng tạo một hình ảnh không hiển thị các bước trung gian.
Tiếp tục thay thế phần nội dung setInput() (nơi bạn sẽ thấy chú thích // Step 3 - accept inputs) bằng dòng này:
// Step 3 - accept inputs
imageGenerator.setInputs(prompt, iteration, seed)
Hai bước tiếp theo là nơi diễn ra quá trình tạo. Hàm generate() chấp nhận cùng thông tin đầu vào như setInput, nhưng tạo một hình ảnh dưới dạng lệnh gọi một lần và không trả về bất kỳ hình ảnh nào ở bước trung gian. Bạn có thể thay thế phần nội dung của hàm này (bao gồm cả nhận xét // Step 4 - generate without showing iterations) bằng nội dung sau:
// Step 4 - generate without showing iterations
val result = imageGenerator.generate(prompt, iteration, seed)
val bitmap = BitmapExtractor.extract(result?.generatedImage())
return bitmap
Điều quan trọng cần biết là tác vụ này diễn ra đồng bộ, vì vậy, bạn sẽ cần gọi hàm từ một luồng nền. Bạn sẽ tìm hiểu thêm về vấn đề đó trong phần sau của lớp học lập trình này.
Bước cuối cùng bạn sẽ thực hiện trong tệp này là điền vào hàm execute() (được gắn nhãn là Bước 5). Thao tác này sẽ chấp nhận một tham số cho biết liệu có nên trả về hình ảnh trung gian hay không cho một bước tạo sẽ được thực hiện bằng hàm execute() của ImageGenerator. Thay thế phần nội dung hàm bằng đoạn mã sau:
// Step 5 - generate with iterations
val result = imageGenerator.execute(showResult)
if (result == null || result.generatedImage() == null) {
return Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888)
.apply {
val canvas = Canvas(this)
val paint = Paint()
paint.color = Color.WHITE
canvas.drawPaint(paint)
}
}
val bitmap =
BitmapExtractor.extract(result.generatedImage())
return bitmap
Đó là tất cả nội dung trong tệp trợ giúp. Trong phần tiếp theo, bạn sẽ điền vào tệp ViewModel để xử lý logic cho ví dụ này.
4. Kết hợp các ứng dụng
Tệp MainViewModel sẽ xử lý các trạng thái giao diện người dùng và logic khác liên quan đến ứng dụng ví dụ này. Hãy mở tệp này ngay bây giờ.
Gần đầu tệp, bạn sẽ thấy dòng nhận xét // Step 6 - set model path. Đây là nơi bạn sẽ cho ứng dụng biết vị trí tìm thấy các tệp mô hình cần thiết để tạo hình ảnh. Trong ví dụ này, bạn sẽ đặt giá trị thành /data/local/tmp/image_generator/bins/.
// Step 6 - set model path
private val MODEL_PATH = "/data/local/tmp/image_generator/bins/"
Từ đó, hãy di chuyển xuống hàm generateImage(). Gần cuối hàm này, bạn sẽ thấy cả Bước 7 và Bước 8. Các bước này sẽ được dùng để tạo hình ảnh có các lần lặp lại được trả về hoặc không có lần lặp lại nào, tương ứng. Vì cả hai thao tác này đều diễn ra đồng bộ, nên bạn sẽ thấy chúng được bao bọc trong một coroutine. Bạn có thể bắt đầu bằng cách thay thế // Step 7 - Generate without showing iterations bằng khối mã này để gọi generate() từ tệp ImageGenerationHelper, sau đó cập nhật trạng thái giao diện người dùng.
// Step 7 - Generate without showing iterations
val result = helper?.generate(prompt, iteration, seed)
_uiState.update {
it.copy(outputBitmap = result)
}
Bước 8 sẽ phức tạp hơn một chút. Vì hàm execute() chỉ thực hiện một bước thay vì tất cả các bước để tạo hình ảnh, nên bạn sẽ cần gọi từng bước riêng lẻ thông qua một vòng lặp. Bạn cũng cần xác định xem người dùng có nên thấy bước hiện tại hay không. Cuối cùng, bạn sẽ cập nhật trạng thái giao diện người dùng nếu cần hiển thị lần lặp lại hiện tại. Giờ đây, bạn có thể làm tất cả những việc này.
// Step 8 - Generate with showing iterations
helper?.setInput(prompt, iteration, seed)
for (step in 0 until iteration) {
isDisplayStep =
(displayIteration > 0 && ((step + 1) % displayIteration == 0))
val result = helper?.execute(isDisplayStep)
if (isDisplayStep) {
_uiState.update {
it.copy(
outputBitmap = result,
generatingMessage = "Generating... (${step + 1}/$iteration)",
)
}
}
}
Đến đây, bạn nên có thể cài đặt ứng dụng, khởi động công cụ tạo ảnh rồi tạo một hình ảnh mới dựa trên câu lệnh bằng văn bản
... ngoại trừ việc ứng dụng hiện gặp sự cố khi bạn cố gắng khởi chạy trình tạo hình ảnh. Lý do là bạn cần sao chép các tệp mô hình vào thiết bị của mình. Để biết thông tin đã cập nhật nhất về các mô hình bên thứ ba đã biết là hoạt động, cách chuyển đổi các mô hình đó cho tác vụ MediaPipe này và cách sao chép các mô hình đó vào Thiết bị của bạn, bạn có thể xem phần này trong tài liệu chính thức.
Ngoài việc sao chép trực tiếp các tệp vào thiết bị phát triển, bạn cũng có thể thiết lập Bộ nhớ Firebase để tải các tệp cần thiết xuống trực tiếp thiết bị của người dùng trong thời gian chạy.
5. Triển khai và kiểm thử ứng dụng
Sau tất cả những bước đó, bạn sẽ có một ứng dụng hoạt động được, có thể chấp nhận câu lệnh dạng văn bản và tạo hình ảnh mới hoàn toàn trên thiết bị! Hãy triển khai ứng dụng này vào một thiết bị Android thực để kiểm thử, mặc dù bạn nên nhớ rằng bạn sẽ muốn thử ứng dụng này trên một thiết bị có bộ nhớ ít nhất là 8 GB.
- Nhấp vào Chạy (
) trong thanh công cụ của Android Studio để chạy ứng dụng. - Chọn loại bước tạo (cuối cùng hoặc có các lần lặp lại), rồi nhấn nút KHỞI TẠO.
- Trên màn hình tiếp theo, hãy đặt mọi thuộc tính bạn muốn rồi nhấp vào nút TẠO để xem kết quả mà công cụ này đưa ra.

6. Xin chúc mừng!
Thật tuyệt! Trong lớp học lập trình này, bạn đã tìm hiểu cách thêm tính năng chuyển văn bản thành hình ảnh trên thiết bị vào một ứng dụng Android.
Các bước tiếp theo
Bạn có thể làm nhiều việc hơn nữa với tác vụ tạo hình ảnh, bao gồm cả
- sử dụng hình ảnh cơ sở để cấu trúc hình ảnh được tạo thông qua các trình bổ trợ hoặc huấn luyện các trọng số LoRA bổ sung của riêng bạn thông qua Vertex AI.
- Sử dụng Bộ nhớ Firebase để truy xuất các tệp mô hình trên thiết bị mà không cần dùng công cụ adb.
Chúng tôi rất mong được thấy tất cả những điều thú vị mà bạn tạo ra bằng tác vụ thử nghiệm này, đồng thời hãy chú ý theo dõi thêm nhiều lớp học lập trình và nội dung khác của nhóm MediaPipe!