Bối cảnh và vấn đề nghiên cứu

Sách là nguồn tri thức được tích lũy và đúc kết qua nhiều thế hệ, đóng vai trò quan trọng trong việc truyền tải kiến thức, phục vụ nhu cầu giải trí và phát triển cá nhân. Trong bối cảnh công nghệ thông tin phát triển mạnh mẽ, phương thức tiếp cận tri thức từ sách đã có sự thay đổi rõ rệt với sự xuất hiện của sách điện tử (e-book) và sách nói (audiobook). Sự thuận tiện và linh hoạt của các định dạng kỹ thuật số cho phép người dùng đọc hoặc nghe sách trong các hoạt động thường nhật như khi di chuyển trên xe buýt, làm việc nhà hoặc nghỉ ngơi mà không cần mang theo sách giấy truyền thống.

Trên thị trường ứng dụng di động và web, đa số các nền tảng thường chỉ tập trung chuyên sâu vào một trong hai định dạng: hoặc là sách nói, hoặc là sách điện tử. Rất ít ứng dụng kết hợp song song cả hai hình thức này. Trên thế giới, nền tảng Audible là đại diện tiêu biểu khi cho phép người dùng chuyển đổi linh hoạt giữa việc đọc và nghe sách nhờ cơ chế đồng bộ. Tại thị trường Việt Nam, các ứng dụng như Waka và Fonos đã chiếm lĩnh thị phần đáng kể với thư viện sách đa dạng, giao diện tối ưu cùng các tiện ích quản lý tủ sách. Tuy nhiên, nhu cầu về một hệ sinh thái tích hợp toàn diện cho cộng đồng độc giả vẫn còn rất lớn.

Đề tài tốt nghiệp "Phát triển ứng dụng Web quản lý sách nói và sách điện tử" của tác giả Hoàng Anh Đức (lớp D19CNPM04, Khoa Công nghệ Thông tin 1, Học viện Công nghệ Bưu chính Viễn thông) được thực hiện dưới sự hướng dẫn của TS. Dương Trần Đức vào tháng 12 năm 2023. Đồ án nằm trong một dự án tổng thể gồm ba phân hệ nghiên cứu độc lập nhưng có sự liên kết chặt chẽ:

  1. Phân hệ Web quản lý sách nói, sách điện tử và module đồng bộ dữ liệu giữa sách nói và sách điện tử (do tác giả Hoàng Anh Đức thực hiện).
  2. Phân hệ ứng dụng di động hỗ trợ nghe sách nói, đọc sách điện tử kết hợp hệ thống khuyến nghị sách (do sinh viên Lê Thanh Bình thực hiện).
  3. Phân hệ ứng dụng di động thương mại điện tử phục vụ đặt mua sách giấy, sách nói và sách điện tử (do sinh viên Đinh Như Cương thực hiện).

Mục tiêu cụ thể của đồ án bao gồm:

  1. Xây dựng ứng dụng web quản trị giúp người quản lý dễ dàng quản lý thông tin các đầu sách, thông tin nhà xuất bản và thông tin tác giả.
  2. Thiết kế và cài đặt chức năng đồng bộ dữ liệu giữa sách nói và sách điện tử, cho phép xác định chính xác vị trí đoạn văn bản trong sách điện tử tương ứng với mốc thời gian phát âm thanh trong sách nói.

Phạm vi nghiên cứu tập trung vào hệ thống quản lý danh mục sách phía Web cho quản trị viên, kết hợp cơ chế xử lý sự kiện bất đồng bộ và trích xuất dữ liệu âm thanh - văn bản trong môi trường kỹ thuật của đồ án tốt nghiệp đại học ngành Công nghệ Thông tin.

Cơ sở lý thuyết và phương pháp

Đề tài kết hợp các lý thuyết về phát triển phần mềm hiện đại, kiến trúc hướng sự kiện và công nghệ xử lý tiếng nói. Các cơ sở lý thuyết và tài liệu tham khảo chính được tác giả sử dụng gồm:

  • ReactJS và NextJS: Dựa trên tài liệu "The Road to React" của Robin Wieruch, ReactJS được ứng dụng nhờ mô hình lập trình hướng thành phần (component-based) và cơ chế DOM ảo (Virtual DOM) giúp tối ưu hiệu năng kết xuất giao diện. Framework NextJS (thuộc sở hữu của Vercel) được tích hợp để tận dụng các đặc tính như kết xuất phía máy chủ (Server-side Rendering - SSR), tạo trang tĩnh (Static Site Generation - SSG), tối ưu hóa công cụ tìm kiếm (SEO) và hỗ trợ ngôn ngữ TypeScript.
  • NestJS: Framework backend mã nguồn mở xây dựng trên nền tảng Node.js, sử dụng TypeScript. NestJS cung cấp cấu trúc ứng dụng rõ ràng lấy cảm hứng từ Angular thông qua cơ chế Dependency Injection (DI), phân chia module chức năng, sử dụng Controllers, Providers, Middleware, Interceptors và cơ chế Exception handling.
  • Apache Kafka: Dựa trên giáo trình "Kafka: The Definitive Guide" của Todd Palino, Gwen Shapira và Neha Narkhede, hệ thống áp dụng Apache Kafka làm nền tảng truyền phát thông điệp phân tán (distributed messaging system) theo mô hình Publish/Subscribe và nhật ký phân vùng (partitioned log). Đặc biệt, hệ thống triển khai Kafka theo kiến trúc Kafka KRaft (Kafka Raft Metadata mode) thay thế cho việc sử dụng Zookeeper truyền thống, giúp đơn giản hóa việc cài đặt, bảo trì, tăng khả năng mở rộng và phục hồi sự cố.
  • Nhận dạng giọng nói tự động (Automatic Speech Recognition - ASR): Dựa trên công trình "Speech and Language Processing" của Daniel Jurafsky và James H. Martin (2018), công nghệ ASR được dùng để chuyển đổi ngôn ngữ nói thành văn bản. Pipeline xử lý ASR bao gồm các công đoạn: tiền xử lý âm thanh (Audio preprocessing), trích xuất đặc trưng (Feature extraction), gán trọng số mô hình ngôn ngữ (Language model weighting), mô hình hóa âm học (Acoustic modeling), gán nhãn người nói (Speaker labeling) và lọc từ ngữ không phù hợp (Profanity filtering).
  • Hạ tầng cơ sở dữ liệu và ảo hóa: Hệ thống sử dụng hệ quản trị cơ sở dữ liệu quan hệ PostgreSQL và công cụ Docker nhằm ảo hóa các dịch vụ, đảm bảo tính đồng nhất khi triển khai.

Phương pháp nghiên cứu thực tế được thực hiện qua các bước:

  1. Phân tích và thiết kế hệ thống hướng đối tượng (OOAD) sử dụng ngôn ngữ mô hình hóa UML để xây dựng biểu đồ use case, biểu đồ lớp (pha phân tích và pha thiết kế) và biểu đồ tuần tự.
  2. Xây dựng kiến trúc xử lý hướng sự kiện (Event-Driven Architecture) với Message Broker để bóc tách các tác vụ xử lý tính toán nặng ra khỏi luồng xử lý web chính.
  3. Thiết kế giải thuật trích xuất văn bản từ định dạng EPUB (extract_text_epub) và so khớp văn bản với kết quả nhận dạng từ mô hình ASR.
Thành phần hệ thống Vai trò và nhiệm vụ Công nghệ sử dụng
Front-end Giao diện tương tác cho người quản lý hệ thống ReactJS, NextJS
Back-end Cung cấp RESTful API, quản lý logic nghiệp vụ NestJS, TypeScript
Message Service Quản lý luồng thông điệp và điều phối sự kiện bất đồng bộ Apache Kafka (kiến trúc KRaft)
Matching Service Trích xuất văn bản EPUB và nhận dạng giọng nói để tạo dữ liệu đồng bộ Python, Mô hình ASR
Database & DevOps Lưu trữ dữ liệu quan hệ và container hóa ứng dụng PostgreSQL, Docker

Thiết kế và triển khai hệ thống

Hệ thống được thiết kế theo mô hình phân tán nhằm tách rời giao diện quản trị, logic xử lý nghiệp vụ và tiến trình xử lý dữ liệu đồng bộ.

Kiến trúc dữ liệu và mô hình thực thể

Trong pha phân tích và thiết kế, các thực thể chính trong hệ thống quản trị gồm:

  • Người quản lý (Admin): Chứa các thông tin định danh, tài khoản và thông tin cá nhân.
  • Nhà xuất bản (Publisher): Quản lý thông tin tên, mô tả, danh sách địa chỉ và các kênh liên hệ.
  • Tác giả (Author): Quản lý họ tên, ngày sinh và tiểu sử tóm tắt.
  • Sách (Book): Chứa các thuộc tính về tên, mô tả, số lượng, giá bán, ảnh bìa, mã chuẩn ISBN, ngày phát hành, quốc gia, ngôn ngữ, đường dẫn file sách điện tử và đường dẫn file sách nói.
  • Chương sách (AudioChapter): Đại diện cho các phân đoạn/chương của sách nói.
  • Dữ liệu đồng bộ (SyncData): Lưu trữ thông tin ánh xạ giữa từng đoạn văn bản trong sách điện tử và mốc thời gian phát tương ứng trong sách nói.

Mối quan hệ số lượng giữa các thực thể được xác định cụ thể:

  • Nhà xuất bản - Sách: quan hệ 1 – n (Một nhà xuất bản phát hành nhiều đầu sách; mỗi đầu sách thuộc về một nhà xuất bản).
  • Tác giả - Sách: quan hệ n – n (Một tác giả có thể viết nhiều sách; một cuốn sách có thể được viết bởi nhiều tác giả, do đó hệ thống thiết kế một lớp trung gian kết nối giữa hai thực thể).
  • Người quản lý - Sách: quan hệ 1 – n (Người quản lý có quyền đăng tải nhiều đầu sách).
  • Sách - Chương sách: quan hệ 1 – n (Một cuốn sách gồm nhiều chương).
  • Sách - Dữ liệu đồng bộ: quan hệ 1 – n (Một đầu sách chứa nhiều mẩu thông tin ánh xạ đồng bộ).

Quy trình xử lý và luồng dữ liệu của chức năng đồng bộ

Cơ chế đồng bộ giữa sách nói và sách điện tử được thiết kế theo luồng xử lý bất đồng bộ để tránh gây nghẽn hệ thống khi xử lý các tệp âm thanh có dung lượng lớn:

  1. Khởi tạo dữ liệu: Người quản trị truy cập giao diện tạo sách mới, nhập các thông tin thuộc tính, tải lên tệp sách điện tử (định dạng EPUB) và tệp sách nói (âm thanh), đồng thời chọn tùy chọn kích hoạt đồng bộ.
  2. Kích hoạt sự kiện: Sau khi NestJS backend lưu thông tin cơ bản của sách và các chương sách nói vào cơ sở dữ liệu, một sự kiện nghiệp vụ mang tên book.created được phát ra và chuyển đến bộ lắng nghe sự kiện (Listener).
  3. Phát thông điệp qua Message Broker: Listener gọi module kafkajs.producer để đóng gói dữ liệu và gửi thông điệp vào topic có tên books-events trên Kafka Server. Hệ thống ngay lập tức phản hồi thông báo tạo sách thành công về cho người quản trị.
  4. Xử lý trích xuất và so khớp (Matching Service): Phân hệ Matching Service (viết bằng Python) tiêu thụ (consume) thông điệp từ topic books-events. Phân hệ này sử dụng hàm extract_text_epub để bóc tách toàn bộ các đoạn văn bản trong tệp sách điện tử, đồng thời đưa tệp âm thanh qua mô hình ASR để bóc tách chuỗi ký tự kèm mốc thời gian (timestamps).
  5. Hoàn tất đồng bộ: Thuật toán so khớp tiến hành bắt cặp các đoạn từ khớp nhau giữa văn bản trích xuất và kết quả nhận dạng âm thanh. Kết quả ánh xạ (đoạn văn - thời gian bắt đầu/kết thúc) được ghi nhận vào bảng dữ liệu đồng bộ trong PostgreSQL, đồng thời trạng thái của đầu sách được cập nhật sang trạng thái hoàn tất trích xuất.

Nội dung chính theo từng chương

Chương 1: Cơ sở lý thuyết

Chương 1 tập trung khảo cứu các công nghệ then chốt cấu thành giải pháp:

  • Phân tích chi tiết thư viện ReactJS với cơ chế Virtual DOM, cú pháp JSX, tính dễ kiểm thử giao diện cùng các thách thức về đường cong học tập, sự phụ thuộc gói thư viện bên thứ ba và dung lượng gói mã nguồn.
  • Đánh giá framework NextJS với kiến trúc render hỗn hợp (SSR/SSG), khả năng tương tác cao, tối ưu SEO, hỗ trợ TypeScript và các yêu cầu về môi trường chạy trên máy chủ Node.js.
  • Trình bày kiến trúc hướng module và cơ chế Dependency Injection của NestJS, phân tích vai trò của Decorators, Middleware, Interceptors và Exception handling trong việc duy trì tính đóng gói và tái sử dụng mã nguồn.
  • Khảo sát hệ thống Apache Kafka với mô hình truyền phát thời gian thực, cơ chế phân vùng dữ liệu và lợi thế của kiến trúc Kafka KRaft trong việc loại bỏ thành phần Zookeeper phụ thuộc.
  • Phân tích toàn diện công nghệ nhận dạng giọng nói tự động (ASR), làm rõ 6 bước trong quy trình xử lý tín hiệu âm thanh và chỉ ra các rào cản kỹ thuật của ASR như sự phụ thuộc vào chất lượng thu âm, độ trễ ngữ cảnh, khả năng lọc tạp âm, nhận diện giọng người nói và sự biến thiên của phương ngữ.

Chương 2: Phân tích thiết kế hệ thống

Chương 2 mô tả tường minh toàn bộ quá trình phân tích và đặc tả hệ thống:

  • Xác định mục tiêu tổng thể và phạm vi hệ thống bao gồm 5 chức năng cơ bản: Đăng nhập quản trị, Quản lý nhà xuất bản, Quản lý tác giả, Quản lý đầu sách và Đồng bộ sách điện tử sang sách nói.
  • Xây dựng 14 bảng kịch bản Use Case chuẩn hóa, quy định rõ ràng: tác nhân (Actor), tiền điều kiện, hậu điều kiện, luồng sự kiện chính (Main flow) và các nhánh ngoại lệ (Exception flow) cho từng thao tác thêm, sửa, xóa, xem chi tiết và kích hoạt đồng bộ.
  • Phân tích mô hình dữ liệu qua biểu đồ thực thể pha phân tích và pha thiết kế; phân tích các mối quan hệ số lượng (1-1, 1-n, n-n) và thiết kế cấu trúc các bảng trong cơ sở dữ liệu PostgreSQL.
  • Xây dựng 13 biểu đồ tuần tự (Sequence diagrams) mô hình hóa chi tiết sự tương tác giữa các lớp giao diện, bộ điều khiển, tầng dịch vụ và cơ sở dữ liệu cho toàn bộ các chức năng của hệ thống.

Chương 3: Phát triển ứng dụng

Chương 3 trình bày việc hiện thực hóa các phân hệ chức năng trên thực tế:

  • Cài đặt module quản lý đầu sách, cho phép tạo thực thể Book liên kết chặt chẽ với đối tượng AudioChapter, Publisher và Author.
  • Cài đặt cơ chế gửi sự kiện bất đồng bộ book.created qua kafkajs.producer tới topic books-events của Apache Kafka.
  • Hiện thực hóa thuật toán xử lý dữ liệu của chức năng đồng bộ: trích xuất nội dung văn bản qua extract_text_epub, xử lý tệp âm thanh qua mô hình ASR và thuật toán duyệt khớp các cặp phần tử từ vựng giữa hai luồng dữ liệu để xác định mốc thời gian tương ứng.
  • Triển khai các module quản lý nhà xuất bản và quản lý tác giả với đầy đủ các thao tác nghiệp vụ.
  • Thiết lập môi trường phát triển và cấu hình tích hợp giữa NestJS, Python Matching Service, Kafka Broker và cơ sở dữ liệu PostgreSQL.
  • Trình bày hệ thống giao diện thực tế của ứng dụng web, bao gồm: màn hình danh sách đầu sách, xem chi tiết sách, biểu mẫu thêm mới sách, quản lý nhà xuất bản và quản lý tác giả.

Kết quả và đóng góp

Đồ án đã đạt được các kết quả kỹ thuật cụ thể:

  • Hoàn thiện ứng dụng Web quản trị hoàn chỉnh với đầy đủ giao diện người dùng và hệ thống API phục vụ các hoạt động CRUD đối với danh mục sách, nhà xuất bản và tác giả.
  • Xây dựng thành công kiến trúc xử lý sự kiện phân tán với Apache Kafka (sử dụng KRaft), tách biệt hiệu quả giữa tầng xử lý nghiệp vụ thông thường (NestJS) và tầng tính toán so khớp dữ liệu nặng (Python Matching Service).
  • Xây dựng và kiểm thử thành công thuật toán trích xuất nội dung EPUB (extract_text_epub) kết hợp mô hình nhận dạng giọng nói ASR để tự động sinh mốc thời gian ánh xạ giữa văn bản sách điện tử và âm thanh sách nói.
  • Cung cấp mô hình phân tích thiết kế hệ thống hoàn chỉnh theo chuẩn UML, bao gồm đầy đủ hệ thống use case, biểu đồ lớp và biểu đồ tuần tự cho ứng dụng quản lý sách đa phương tiện.

Về mặt đóng góp so với các giải pháp hiện hành, đề tài đã đề xuất và thử nghiệm một giải pháp công nghệ mở cho phép tích hợp song song cả ba hình thức phát hành (sách giấy, sách điện tử và sách nói) trong một nền tảng dữ liệu tập trung. Đồng thời, giải pháp xử lý đồng bộ tự động giữa văn bản và âm thanh đã giải quyết được bài toán chuyển đổi trạng thái đọc - nghe linh hoạt tương tự các nền tảng thương mại quốc tế (như Audible) nhưng được thiết kế hướng tới việc ứng dụng cho ngữ cảnh tiếng Việt.

Hạn chế và hướng nghiên cứu tiếp

Dựa trên các phân tích kỹ thuật trong văn bản, đồ án ghi nhận một số hạn chế:

  • Độ chính xác của chức năng đồng bộ phụ thuộc lớn vào chất lượng của mô hình ASR. Khi tệp âm thanh có nhiều tạp âm, tốc độ đọc quá nhanh, phát âm không chuẩn hoặc sử dụng từ ngữ địa phương/phương ngữ phức tạp, độ chính xác của việc nhận dạng văn bản và khớp mốc thời gian có thể bị suy giảm.
  • Việc vận hành kiến trúc phân tán gồm nhiều dịch vụ (NestJS, Kafka, Python Service, PostgreSQL) đòi hỏi cấu hình tài nguyên phức tạp và chi phí giám sát hệ thống tương đối cao.

Hướng nghiên cứu tiếp theo của đề tài tập trung vào việc:

  • Hoàn thiện việc tích hợp và kết nối dữ liệu thời gian thực giữa phân hệ Web quản trị này với hai phân hệ ứng dụng di động còn lại trong dự án tổng thể (ứng dụng nghe/đọc sách có khuyến nghị của Lê Thanh Bình và ứng dụng thương mại điện tử của Đinh Như Cương).
  • Tối ưu hóa thuật toán so khớp và nâng cao độ chính xác của mô hình ASR khi xử lý các bản ghi âm sách nói tiếng Việt có độ dài lớn.

Giá trị tham khảo

Đồ án là tài liệu tham khảo hữu ích cho:

  • Sinh viên các ngành Công nghệ thông tin, Công nghệ phần mềm và Hệ thống thông tin đang thực hiện đồ án tốt nghiệp hoặc các dự án phần mềm liên quan đến kiến trúc Web phân tán và xử lý đa phương tiện.
  • Lập trình viên quan tâm đến việc ứng dụng kiến trúc hướng sự kiện (Event-Driven Architecture) kết hợp giữa Node.js/NestJS và Apache Kafka (kiến trúc KRaft).
  • Các nhà nghiên cứu và phát triển phần mềm muốn tham khảo quy trình phân tích thiết kế hệ thống chuẩn mực bằng UML (use case, kịch bản nghiệp vụ, biểu đồ lớp phân tích/thiết kế và biểu đồ tuần tự) cũng như giải pháp tích hợp mô hình học máy (ASR) vào ứng dụng quản lý xuất bản phẩm số.

Câu hỏi thường gặp

1. Đồ án này nằm trong một dự án tổng thể gồm những phân hệ nào và do ai phụ trách? Dự án tổng thể gồm 3 phân hệ nghiên cứu độc lập của 3 sinh viên:

  • Phân hệ 1: "Phát triển ứng dụng Web quản lý sách nói và sách điện tử" cùng chức năng đồng bộ dữ liệu (Hoàng Anh Đức).
  • Phân hệ 2: "Phát triển ứng dụng nghe sách nói và đọc sách điện tử, kết hợp hệ thống khuyến nghị về sách trên thiết bị di động" (Lê Thanh Bình).
  • Phân hệ 3: "Phát triển ứng dụng thương mại điện tử cho các sản phẩm sách, bao gồm sách giấy, sách nói và sách điện tử" (Đinh Như Cương).

2. Điểm đặc thù trong kiến trúc Apache Kafka được tác giả sử dụng là gì? Hệ thống sử dụng Apache Kafka với kiến trúc Kafka KRaft (Kafka Raft Metadata mode) thay vì kiến trúc truyền thống sử dụng Zookeeper. Lựa chọn này giúp hệ thống quản lý thông điệp dễ mở rộng hơn, tinh giản quy trình cài đặt, giảm thiểu chi phí bảo trì và tăng khả năng phục hồi khi gặp sự cố.

3. Luồng xử lý sự kiện của chức năng đồng bộ sách diễn ra như thế nào? Khi người quản lý tạo sách kèm tùy chọn đồng bộ, NestJS backend lưu dữ liệu và phát sự kiện book.created đến Listener. Listener sử dụng thư viện kafkajs.producer gửi thông điệp vào topic books-events của Kafka server. Phân hệ Matching Service (viết bằng Python) nhận thông điệp, thực hiện trích xuất văn bản EPUB bằng extract_text_epub, nhận dạng giọng nói qua mô hình ASR, so khớp mốc thời gian và ghi dữ liệu đồng bộ vào cơ sở dữ liệu PostgreSQL.

4. Mối quan hệ nhiều-nhiều (n-n) giữa Tác giả và Sách được giải quyết ra sao trong thiết kế? Trong pha phân tích và thiết kế, do một tác giả có thể sáng tác nhiều cuốn sách và một cuốn sách có thể được viết bởi nhiều tác giả, tác giả đã đề xuất thêm một lớp thực thể kết nối trung gian ở giữa bảng Tác giả và bảng Sách để chuẩn hóa quan hệ nhiều - nhiều trong cơ sở dữ liệu quan hệ.

5. Quy trình xử lý nhận dạng giọng nói ASR trong cơ sở lý thuyết bao gồm những công đoạn nào? Quy trình ASR gồm 6 công đoạn: tiền xử lý âm thanh (Audio preprocessing), trích xuất đặc trưng (Feature extraction), gán trọng số mô hình ngôn ngữ (Language model weighting), mô hình hóa âm học (Acoustic modeling), gán nhãn người nói (Speaker labeling) và lọc từ ngữ không phù hợp (Profanity filtering).

Kết luận

Đồ án tốt nghiệp của sinh viên Hoàng Anh Đức đã giải quyết bài toán xây dựng ứng dụng web quản lý danh mục sách nói, sách điện tử, tác giả và nhà xuất bản trên nền tảng công nghệ NestJS, NextJS và PostgreSQL. Đóng góp nổi bật của đề tài là việc hiện thực hóa kiến trúc xử lý sự kiện phân tán với Apache Kafka KRaft và dịch vụ so khớp Python ASR, hỗ trợ đồng bộ chính xác giữa văn bản EPUB và âm thanh sách nói. Đây là công trình có giá trị thực tiễn cao, đóng vai trò là phân hệ quản trị trung tâm trong hệ sinh thái ứng dụng sách toàn diện.