Mình làm app dịch manga bằng Kotlin Multiplatform: pipeline 5 bước và cách giảm chi phí mỗi trang từ $0.05 xuống dưới nửa cent
Chào mọi người, mình là một lập trình viên độc lập. Vài tháng nay mình xây dựng Mangit, một ứng dụng iOS và Android dịch các trang manga, manhwa và truyện tranh. Bạn chụp ảnh hoặc chụp màn hình một trang truyện, ứng dụng sẽ đặt bản dịch vào ngay trong khung thoại, nên đọc như thể trang truyện được viết sẵn bằng ngôn ngữ của bạn.
Bài này chia sẻ cách mình xây dựng nó và những gì mình học được.
Pipeline 5 bước
Mỗi trang đi qua năm bước:
- Phát hiện khung thoại và vùng chữ
- Đọc chữ (OCR)
- Dịch, tự động nhận diện ngôn ngữ gốc
- Xoá chữ gốc (inpainting) mà không làm hỏng nét vẽ
- Dàn chữ bản dịch vào lại đúng khung thoại, tự co cỡ chữ cho vừa
Bước 4 và 5 tốn công nhất. Một bản dịch đúng nhưng tràn khỏi khung thoại, hoặc còn sót nét chữ gốc, sẽ khiến người đọc thấy app "hỏng".
Stack
- Kotlin Multiplatform + Compose Multiplatform: một lớp UI và logic dùng chung cho iOS và Android
- Koin (DI), Ktor (network), Room (thư viện truyện trên máy), RevenueCat (gói đăng ký)
- Firebase Cloud Functions (Node.js) làm backend điều phối các lệnh gọi AI
- Một pipeline xử lý tự host trên Modal cho các bước phát hiện / xoá / dàn chữ
Dùng chung UI cho cả hai nền tảng là điều giúp một người có thể tự ship được. Phần riêng cho từng nền tảng khá nhỏ: chọn ảnh, truy cập file và vài abstraction expect/actual.
Chi phí mới là vấn đề thật sự
Phiên bản đầu gửi mỗi trang tới một model ảnh lớn. Kết quả tốt, nhưng tốn khoảng $0.05 mỗi trang. Người đọc manga không dịch một trang, họ dịch cả chương. Với giá đó thì không thể có gói miễn phí, và ngay cả người dùng trả phí cũng có thể làm mình lỗ.
Vì vậy mình làm một pipeline "lite": nhiều model nhỏ chuyên cho từng bước thay vì một model lớn, cộng với phần dàn chữ tự viết. Hiện chi phí khoảng $0.001 đến $0.004 mỗi trang, model lớn chỉ còn làm phương án dự phòng. Nhờ vậy app mới có gói miễn phí thật sự.
Bài học khi làm đa ngôn ngữ
App dịch sang hơn 30 ngôn ngữ, trong đó có tiếng Việt. Lỗi khó nhất không nằm ở bản dịch mà ở phần hiển thị chữ: một font hỗ trợ chữ Latin có thể hiển thị tiếng Thái, tiếng Ả Rập hay tiếng Hindi thành ô vuông trống, hoặc không hiện gì cả. Nếu bạn tự dàn chữ, hãy test mọi hệ chữ bằng trang truyện thật, đừng chỉ test tiếng Anh.
Dùng thử
- iOS: https://apps.apple.com/app/mangit/id6756326988?pt=126724485&ct=viblo&mt=8
- Android: https://play.google.com/store/apps/details?id=com.measify.mangit&referrer=utm_source%3Dviblo
Miễn phí để dùng thử: 3 trang lúc đầu, sau đó mỗi tuần 3 trang miễn phí. Mình rất mong nhận góp ý, nhất là từ các bạn từng làm text detection, inpainting, dàn chữ, hoặc Compose Multiplatform.
All rights reserved