1. Giới thiệu
MediaPipe là gì?
MediaPipe Solutions giúp bạn áp dụng các giải pháp học máy (ML) cho các ứng dụng của mình. Thư viện này cung cấp một khung làm việc để định cấu hình quy trình xử lý được tạo sẵn nhằm cung cấp đầ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.
Tạo văn bản thành hình ảnh là một trong nhiều nhiệm 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 hầu như chỉ đơn giản, sau đó thực hiện qua nhiều bước cho đến khi bạn có thể tạo hình ảnh mới ngay trên thiết bị Android.
Kiến thức bạn sẽ học được
- Cách triển khai tính năng tạo văn bản thành hình ảnh chạy cục bộ trong ứng dụng Android bằng MediaPipe Tasks (Tác vụ MediaPipe).
Bạn cần có
- Một phiên bản đã cài đặt của Android Studio (lớp học lập trình này được viết và thử nghiệm bằng Android Studio Giraffe).
- Thiết bị Android có RAM tối thiểu là 8 GB.
- Kiến thức cơ bản về cách phát triển cho Android và khả năng chạy tập lệnh Python viết sẵn.
2. Thêm MediaPipe Tasks vào ứng dụng Android
Tải ứng dụng Android Starter
Lớp học lập trình này sẽ bắt đầu bằng một mẫu tạo sẵn bao gồm giao diện người dùng sẽ dùng cho phiên bản cơ bản của việc 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 tệp ZIP xuống.
Nhập ứng dụng vào Android Studio
- Mở Android Studio
- Trên màn hình Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy chọn Open (Mở) ở góc trên cùng bên phải.

- Chuyển đến vị trí bạn đã sao chép hoặc tải kho lưu trữ xuống rồi mở thư mục codelabs/image_generative_basic/android/start.
- Ở giai đoạn này, ứng dụng không nên biên dịch vì bạn chưa thêm phần phụ thuộc MediaPipe Tasks.
Bạn sẽ sửa lỗi và chạy ứng dụng bằng cách chuyển đến tệp build.gradle rồi di chuyển xuống // Bước 1 – Thêm phần phụ thuộc. Tiếp theo, hãy thêm dòng sau, sau đó nhấn 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ứ đã được mở và cài đặt đúng cách bằng cách nhấp vào mũi tên chạy màu xanh lục (
) ở gó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 Khởi chạy. 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 lời nhắc bằng văn bản và các tuỳ chọn khác cùng với nút có nhãn TẠO.

Thật không may, đó là về phạm vi của ứng dụng khởi đầu, vì vậy, đã đến lúc tìm hiểu cách hoàn thiện ứng dụng này và bắt đầu tạo hình ảnh mới trên thiết bị của bạn!
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 ở phía trên cùng của lớp có tên là imageGenerator. Đây là đối tượng Tác vụ sẽ đảm nhận phần việc khó khăn 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 như sau: // Bước 2 – khởi chạy trình tạo hình ả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 hàm đó bằng mã sau để thiết lập đường dẫn cho mô hình tạo hình ảnh và khởi tạo đố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 thông số: chuỗi prompt dùng để xác định hình ảnh đã tạo, số vòng lặp mà Tác vụ phải trải qua trong khi tạo hình ảnh mới và giá trị gốc có thể dùng để tạo phiên bản hình ảnh mới dựa trên cùng một câu lệnh trong khi tạo cùng hình ảnh khi sử dụng cùng một nội dung gốc. 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 có hiển thị các bước trung gian.
Hãy tiếp tục và thay thế phần thân setInput() (nơi bạn sẽ thấy chú thích // Bước 3 – chấp nhận dữ liệu đầu vào) bằng dòng sau:
// Step 3 - accept inputs
imageGenerator.setInputs(prompt, iteration, seed)
Hai bước tiếp theo là nơi quá trình tạo diễn ra. Hàm generate() chấp nhận các dữ liệu đầu vào tương tự như setInput, nhưng sẽ tạo hình ảnh dưới dạng lệnh gọi một lần không trả về bất kỳ hình ảnh bước trung gian nào. Bạn có thể thay thế phần nội dung của hàm này (bao gồm nhận xét // Bước 4 - tạo mà không hiển thị lần lặp) bằng đoạn mã sau:
// Step 4 - generate without showing iterations
val result = imageGenerator.generate(prompt, iteration, seed)
val bitmap = BitmapExtractor.extract(result?.generatedImage())
return bitmap
Quan trọng là bạn phải biết tác vụ này diễn ra đồng bộ, vì vậy, bạn sẽ cần gọi hàm này từ luồng trong nền. Bạn sẽ tìm hiểu thêm về chủ đề này ở phần sau trong 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 perform() (đượ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 có trả về hình ảnh trung gian hay không cho một bước trong quá trình tạo mà sẽ được thực hiện bằng hàm thực thi ImageGenerator hàm perform(). Thay thế phần thân hàm bằng 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à kết quả về 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. Tích hợp ứ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 mẫu này. Hãy tiếp tục và mở tệp đó ngay bây giờ.
Về đầu tệp, bạn sẽ thấy nhận xét // Bước 6 – đặt đường dẫn mô hình. Đây là nơi bạn sẽ thông báo cho ứng dụng của mình nơi ứng dụng có thể 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(). Ở cuối hàm này, bạn sẽ thấy cả Bước 7 và Bước 8, sẽ được sử dụng để tạo hình ảnh với các lần lặp được trả về hoặc không có, tương ứng. Vì cả hai thao tác này đều diễn ra đồng bộ, nên bạn sẽ nhận 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ế // Bước 7 – Tạo mà không hiển thị vòng lặp bằng khối mã này để gọi generate() qua 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 phức tạp hơn một chút. Vì hàm perform() chỉ thực hiện một bước thay vì tất cả bước để tạo hình ảnh, nên bạn sẽ cần gọi từng bước riêng lẻ qua một vòng lặp. Bạn cũng cần xác định xem bước hiện tại có hiển thị cho người dùng 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 vòng lặp hiện tại hiển thị. Bạn có thể thực hiện tất cả những việc này ngay bây giờ.
// 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)",
)
}
}
}
Tại thời điểm này, bạn nên có thể cài đặt ứng dụng, khởi chạy trình tạo hình ảnh rồi tạo hình ảnh mới dựa trên câu lệnh dạng văn bản
... ngoại trừ bây giờ, ứng dụng gặp sự cố khi bạn cố gắng khởi chạy trình tạo hình ảnh. Nguyên nhân là vì bạn cần sao chép tệp mô hình vào thiết bị của mình. Để biết thông tin mới nhất về các mô hình đã biết của bên thứ ba, chuyển đổi chúng cho tác vụ MediaPipe này và sao chép chúng vào thiết bị của bạn, bạn có thể xem lại phần này của tài liệu chính thức.
Cùng với việc sao chép tệp trực tiế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 trực tiếp các tệp cần thiết xuống thiết bị của người dùng trong thời gian chạy.
5. Triển khai và thử nghiệm ứng dụng
Sau tất cả các bước đó, bạn sẽ có một ứng dụng hoạt động 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 tiếp tục và triển khai ứng dụng trên một thiết bị Android thực để thử nghiệm ứng dụng đó, mặc dù hãy nhớ rằng bạn sẽ muốn thử điều này với thiết bị có bộ nhớ ít nhất là 8 GB.
- Nhấp vào Run (Chạy) (
) trên thanh công cụ Android Studio để chạy ứng dụng. - Chọn loại bước tạo (cuối cùng hoặc có lần lặp), sau đó nhấn nút KHỞI CHẠY.
- Trên màn hình tiếp theo, hãy đặt bất kỳ thuộc tính nào mà bạn muốn rồi nhấp vào nút TẠO để xem công cụ sẽ tạo ra những gì.

6. Xin chúc mừng!
Các bạn đã làm được! 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 tạo văn bản thành hình ảnh trên thiết bị vào ứng dụng Android.
Các bước tiếp theo
Bạn có thể làm nhiều việc khác với tác vụ tạo hình ảnh, bao gồm
- sử dụng hình ảnh cơ sở để sắp xếp 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 tệp mô hình trên thiết bị của bạn mà không cần sử 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à các bạn tạo ra với nhiệm vụ thử nghiệm này. Hãy theo dõi các lớp học lập trình cũng như nội dung khác của nhóm MediaPipe!