1. Ý tưởng đến từ xem kênh kiến thức

Tôi muốn làm một kênh YouTube về lập trình. Ngoài chuyện hướng dẫn code, tôi còn muốn nói về những điều mình liên hệ được từ lúc học lập trình với cuộc sống và những chuyện xảy ra xung quanh.

Tôi cũng có ý định làm một kênh kể chuyện cổ tích. Tôi hình dung video sẽ có giọng kể, còn hình minh họa thì được vẽ dần theo câu chuyện.

Tôi tìm thử một số phần mềm và thấy VideoScribe khá giống thứ mình cần. Có điều giá của nó hơi cao nếu dùng lâu dài.

Khi xem những video dạng này, tôi để ý hình minh họa thường được tạo từ các nét vẽ trong Illustrator hoặc từ ảnh line-art. Chương trình cho các nét hiện ra trước, sau đó mới có màu.

Tôi nghĩ nếu đã có sẵn hình thì có thể tách phần nét ra, tìm một đường để đi qua những nét đó rồi cho chúng xuất hiện lại. Phần ảnh màu có thể giấu đi lúc đầu, sau đó mở dần ra như đang được tô.

Tôi không biết cách nghĩ đó có đúng không nên bắt đầu thử bằng OpenCV.

Giao diện trang dịch vụ
Giao diện trang dịch vụ

2. Cách chương trình xử lý hình

Chương trình đọc ảnh màu rồi chuyển nó sang ảnh xám. Sau đó, nó dùng ngưỡng độ sáng để tìm những pixel tối có khả năng là nét mực.

Từ phần nét tìm được, chương trình tính đường di chuyển theo hai cách.

Cách đầu tiên là chia hình thành nhiều ô nhỏ. Ô nào có nét thì được đánh dấu, sau đó chương trình tìm đường đi qua các ô đó.

Cách còn lại là dùng thuật toán skeletonization Zhang–Suen. Thuật toán này làm một nét dày thành một đường mảnh nằm gần giữa nét. Chương trình lần theo đường mảnh đó để tạo hướng di chuyển.

Hình bàn tay đi theo đường đã tính và phần nét gần đầu bút được mở ra dần. Nếu dùng lưới, đường đi sẽ đều và ổn định hơn. Nếu dùng skeleton, bàn tay có thể bám gần vào nét của hình hơn.

Sau khi hiện phần nét, chương trình lấy màu từ chính ảnh gốc rồi mở dần ra. Nó không tự nghĩ ra màu mới và cũng không vẽ lại bức hình từ đầu.

Người dùng tự khoanh khu vực nào cần xuất hiện. Mỗi khu vực trở thành một lớp mask để chương trình chỉ vẽ phần nằm bên trong. Nhờ vậy, những chi tiết cần xuất hiện sau sẽ không bị lộ trước.

Tất nhiên, bàn tay vẫn chỉ là mô phỏng. Nó không thể đi chính xác như một họa sĩ đang cầm bút vẽ từng nét. Nhưng khi hình xuất hiện cùng với chuyển động của bàn tay thì cảm giác nhìn cũng khá giống một video vẽ tay.

Giao diện trang ứng dụng
Giao diện trang ứng dụng

3. Tôi làm thêm giao diện để sử dụng cho video của mình

Lúc đầu tôi chỉ muốn biết ý tưởng tách nét có chạy được không. Khi thấy nó chạy được, tôi bắt đầu làm thêm giao diện vì không thể mỗi lần tạo video lại ngồi sửa code.

Hiện tại tôi có thể tải hình và giọng kể lên, sau đó khoanh từng phần của bức hình. Tôi chọn phần nào xuất hiện trước, phần nào xuất hiện sau và mỗi phần kéo dài bao lâu.

Một câu chuyện có thể chia thành nhiều cảnh. Mỗi cảnh có hình, giọng đọc và vùng vẽ riêng. Tôi cũng có thể kéo cảnh về trước, đưa ra sau hoặc thêm một cảnh vào giữa.

Ứng dụng đã có timeline, xem thử từng cảnh, thêm chữ và xuất video MP4 có cả hình lẫn tiếng.

Giao diện editor
Giao diện editor

4. Sau đó tôi nghĩ có thể người khác cũng cần

Ban đầu tôi làm ứng dụng này cho hai kênh YouTube mà mình đang dự định thực hiện.

Nhưng làm một thời gian, tôi thấy có thể những người làm video kể chuyện hoặc video dạy học cũng gặp vấn đề giống tôi. Họ có hình và có giọng đọc, nhưng để ghép thành video thì phải học thêm một phần mềm khác.

Với ứng dụng này, họ chỉ cần chọn khu vực của hình, sắp xếp thứ tự rồi chỉnh thời gian. Phần tìm nét, làm màu xuất hiện, di chuyển bàn tay và ghép video sẽ do chương trình xử lý.

Tôi thấy kết quả cũng khá hay nên bắt đầu nghĩ đến chuyện thương mại. Đây là lần đầu tôi làm một ứng dụng theo hướng này nên còn nhiều thứ chưa biết.

Bấm vào đây để xem Video thành quả

Trong video thì có những lỗi vặt như vẽ bị đúng theo hình vuông đã cắt, tôi đã sửa lại, thêm các chức năng vẽ nhiều hình dạng khác nhau, và cả freehand. Cũng có chức năng chuyển cảnh bằng cách cầm cục tẩy xóa từ trên xuống trắng tờ giấy rồi vẽ cảnh tiếp theo rồi.

5. App chạy được rồi, nhưng chưa có nghĩa là bán được

Ứng dụng hiện đã chạy được trên máy tính của tôi. Tôi đã dùng ảnh và giọng đọc thật để tạo video, chứ không còn là một giao diện mô phỏng.

Nhưng để người khác có thể mở một đường link rồi sử dụng thì còn khá nhiều việc.

Tôi phải xem làm phần đăng ký tài khoản, lưu project, tính số phút sử dụng, thanh toán, bảo mật và sao lưu dữ liệu như thế nào.

Ngoài kỹ thuật, tôi còn phải tìm hiểu về bản quyền, quyền riêng tư, nội dung người dùng tải lên và những quy định khi bán phần mềm. Phần này tôi chưa có nhiều kinh nghiệm nên vẫn đang học.

6. Tôi đang tách phần dịch vụ và phần làm video

Tôi đang chia hệ thống thành hai chương trình.

Một chương trình quản lý website, tài khoản, project, gói sử dụng và số phút còn lại. Đây là phần SaaS.

Chương trình còn lại là Studio, nơi người dùng thêm cảnh, chỉnh hình, sắp timeline và render video.

Tôi muốn nếu Studio bị lỗi thì website và tài khoản của khách hàng vẫn mở được. Project vẫn còn, chỉ riêng phần làm video báo rằng Studio đang tạm dừng.

Hiện cả hai chương trình đang chạy trên máy tính của tôi. Dữ liệu tài khoản được lưu bằng SQLite. Phần thanh toán vẫn là chế độ thử vì tôi chưa kết nối cổng thanh toán thật.

7. Tôi muốn ghi lại quá trình mình làm nó

Tôi bắt đầu từ một suy nghĩ khá đơn giản: nếu hình được tạo bởi các nét thì có thể nào tách những nét đó ra rồi cho chúng xuất hiện lại không?

Từ đó tôi mới tìm hiểu ảnh xám, ngưỡng độ sáng, mask, skeletonization và cách tạo video theo từng frame. Học tới đâu tôi thử tới đó. Có những phần tưởng đơn giản nhưng khi làm mới thấy phải sửa đi sửa lại khá nhiều.

Tôi chưa biết ứng dụng này sau cùng sẽ phát triển đến mức nào. Hiện tại nó đã giúp tôi tạo được kiểu video mà trước đây tôi chỉ mới hình dung.

Nếu bạn cũng muốn làm video kể chuyện, video dạy học hoặc video có hình minh họa, bạn có thể theo dõi dự án. Khi có bản cho người khác dùng thử, tôi sẽ cập nhật trên trang.