Screen Reader (trình đọc màn hình) là chương trình chuyển đổi văn bản và các yếu tố giao diện đồ họa thành giọng nói hoặc đầu ra màn hình chữ nổi Braille, cho phép người dùng mù và khiếm thị tương tác với thiết bị mà không cần kiểm soát trực quan. Trên các nền tảng di động, trình đọc màn hình chính là VoiceOver trên iOS và TalkBack trên Android. Theo Tổ chức Y tế Thế giới (2023), Screen Reader là công cụ chính để tiếp cận công nghệ kỹ thuật số cho 285 triệu người khiếm thị trên thế giới.
Những điểm chính
Screen Reader (trình đọc màn hình) là công nghệ hỗ trợ (Assistive Technology, AT) giải thích giao diện người dùng đồ họa và trình bày dưới dạng phi trực quan: thông qua giọng nói tổng hợp hoặc màn hình chữ nổi Braille xúc giác. Trình đọc màn hình là phương tiện chính để người mất thị lực hoàn toàn hoặc một phần tiếp cận máy tính và thiết bị di động.
Trình đọc màn hình đầu tiên xuất hiện vào cuối những năm 1980 cho MS-DOS (ví dụ: Vocal-Eyes) và sau đó cho Windows (JAWS, NVDA). Trên nền tảng di động, trình đọc màn hình được tích hợp ở cấp hệ thống: Apple tích hợp VoiceOver vào iPhone 3GS năm 2009, Google tích hợp TalkBack vào Android 1.6 cùng năm. Đến năm 2025, hầu như tất cả điện thoại thông minh hiện đại đều có trình đọc màn hình tích hợp không cần cài đặt phần mềm bổ sung.
Trình đọc màn hình không chỉ đọc văn bản từ màn hình — nó phân tích hệ thống phân cấp giao diện, xác định loại phần tử (nút, liên kết, tiêu đề, trường nhập liệu), trạng thái của chúng (bật/tắt, đã chọn/chưa chọn) và mối quan hệ (cha-con, nhóm). Thông tin này được truyền tải đến người dùng thông qua lời nhắc bằng giọng nói hoặc cảm giác xúc giác từ màn hình chữ nổi, cập nhật các ô theo thời gian thực theo vị trí tiêu điểm.
Trình đọc màn hình làm việc chặt chẽ với hệ điều hành, truy cập vào biểu diễn nội bộ của giao diện — Cây trợ năng (Accessibility Tree). Cơ chế này giống nhau trên iOS và Android, mặc dù tên API khác nhau.
Kênh đầu ra chính của trình đọc màn hình là bộ tổng hợp giọng nói (Text-To-Speech, TTS). Khi tiêu điểm trợ năng đến một phần tử, trình đọc màn hình trích xuất nội dung văn bản (hoặc mô tả do nhà phát triển cung cấp) và gửi đến công cụ TTS. Các công cụ TTS hiện đại, như Apple Speech Synthesis và Google Text-to-Speech, sử dụng mạng nơ-ron để tạo giọng nói tự nhiên với ngữ điệu, ngắt nghỉ và nhấn mạnh chính xác tùy theo dấu câu và loại nội dung.
Người dùng có thể điều chỉnh tốc độ nói (thường 60–80% tối đa để cảm nhận thoải mái), cao độ và âm lượng. Một số trình đọc màn hình hỗ trợ nhiều giọng nói và chuyển đổi giữa chúng tùy theo loại nội dung — ví dụ: giọng chậm hơn để đọc văn bản và giọng nhanh hơn để điều hướng giao diện. Màn hình chữ nổi kết nối qua Bluetooth và hiển thị tới 40–80 ký tự cùng lúc, cập nhật dòng mỗi khi tiêu điểm thay đổi.
Trình đọc màn hình sử dụng khái niệm Tiêu điểm trợ năng (Accessibility Focus), khác với tiêu điểm nhập liệu tiêu chuẩn. Người dùng di chuyển tiêu điểm trợ năng bằng cử chỉ (chạm, vuốt), và trình đọc màn hình thông báo phần tử dưới tiêu điểm. Thứ tự điều hướng mặc định theo thứ tự trực quan: từ trái sang phải, từ trên xuống dưới. Nhà phát triển có thể ghi đè thứ tự này cho các bố cục phức tạp.
Trình đọc màn hình cũng hỗ trợ các chế độ điều hướng khác nhau mà người dùng chuyển đổi qua vòng xoay (VoiceOver) hoặc menu (TalkBack): theo tiêu đề, liên kết, ký tự, từ, biểu mẫu. Ở chế độ tiêu đề, trình đọc màn hình chỉ di chuyển giữa H1–H6 — điều này rất quan trọng để điều hướng hiệu quả qua các trang và tài liệu dài. Chế độ ký tự giúp ích khi nhập mã xác nhận hoặc mật khẩu phức tạp, phát âm từng ký tự riêng lẻ.
Hai trình đọc màn hình thống trị nền tảng di động: VoiceOver trên iOS và TalkBack trên Android. Chúng có API, cử chỉ và khả năng khác nhau, nhưng nguyên tắc chung là đọc Cây trợ năng và điều khiển bằng cử chỉ.
VoiceOver là trình đọc màn hình của Apple, được tích hợp trong iOS, iPadOS và macOS. Nó sử dụng API UIAccessibility để lấy thông tin về các phần tử và hỗ trợ vòng xoay để chuyển đổi chế độ điều hướng. VoiceOver được tích hợp với iCloud (đồng bộ cài đặt giữa các thiết bị), Apple Pay (xác nhận thanh toán qua Touch ID hoặc Face ID) và Văn bản động (phông chữ thích ứng với cài đặt người dùng).
Cử chỉ VoiceOver khác với TalkBack: sử dụng xoay hai ngón tay (vòng xoay), chạm ba lần cho Screen Curtain và chạm đúp hai ngón tay để hủy thao tác. VoiceOver hỗ trợ vòng xoay tùy chỉnh mà nhà phát triển thêm qua UIAccessibilityCustomRotor — ví dụ: để điều hướng nhanh qua các phần ứng dụng, bỏ qua thứ tự tiêu chuẩn.
TalkBack là trình đọc màn hình của Google, một phần của Android Accessibility Suite. Nó sử dụng AccessibilityService và AccessibilityNodeInfo để truy cập giao diện. TalkBack hỗ trợ menu toàn cục qua vuốt hình chữ L, hành động tùy chỉnh cho phần tử và LiveRegion cho cập nhật động. Bắt đầu từ Android 14, TalkBack có hỗ trợ cử chỉ một tay và tích hợp cải thiện với Google Assistant.
TalkBack có hệ thống cử chỉ linh hoạt hơn VoiceOver: người dùng có thể gán hầu như bất kỳ cử chỉ nào cho bất kỳ hành động nào. TalkBack cũng hỗ trợ nhập chữ nổi trên màn hình (BrailleBack) — người dùng nhập văn bản bằng ký tự chữ nổi trực tiếp trên màn hình cảm ứng trong bố cục đặc biệt 3×2 cho mỗi ngón tay, giúp tăng tốc độ nhập văn bản đáng kể so với bàn phím ảo.
| Đặc điểm | VoiceOver (iOS) | TalkBack (Android) |
|---|---|---|
| API | UIAccessibility | AccessibilityService |
| Điều hướng | Vòng xoay (2 ngón tay) | Menu toàn cục (vuốt chữ L) |
| Ngôn ngữ | 40+ | 30+ |
| Hành động tùy chỉnh | UIAccessibilityCustomRotor | AccessibilityDelegate |
| Chữ nổi | Màn hình ngoài | BrailleBack + ngoài |
| Cập nhật động | UIAccessibility.post | accessibilityLiveRegion |
Ngoài VoiceOver và TalkBack, còn có các trình đọc màn hình di động ít phổ biến hơn: Select to Speak (Android, đọc vùng được chọn), Samsung Voice Assistant (thay thế TalkBack trên thiết bị Samsung với One UI) và giải pháp của bên thứ ba cho các thị trường ngách cụ thể — ví dụ: cho người dùng điện thoại thông minh Trung Quốc không có dịch vụ Google.
Trình đọc màn hình không có quyền truy cập trực tiếp vào các thành phần giao diện của ứng dụng. Thay vào đó, nó hoạt động thông qua một lớp — API trợ năng của hệ điều hành. Hệ điều hành xây dựng Cây trợ năng (Accessibility Tree) mà trình đọc màn hình duyệt và phân tích.
Trên iOS, Cây trợ năng được xây dựng từ các đối tượng UIAccessibilityElement tương ứng với mỗi View trên màn hình. Mỗi phần tử chứa label (văn bản chính), traits (loại phần tử: nút, tiêu đề, liên kết), hint (chú giải công cụ), value (giá trị hiện tại cho thanh trượt và chỉ báo) và frame (vùng chạm). Hệ thống tự động tạo phần tử cho các thành phần giao diện tiêu chuẩn, nhưng nhà phát triển có thể thêm và tùy chỉnh chúng.
Trên Android, Cây trợ năng được xây dựng từ các đối tượng AccessibilityNodeInfo. Mỗi nút chứa: text (văn bản hoặc contentDescription), className (loại phần tử), contentDescription (mô tả), stateDescription (trạng thái), isEnabled, isChecked, isClickable và các cờ khác. Android cũng hỗ trợ AccessibilityAction — danh sách hành động mà trình đọc màn hình có thể thực hiện thay mặt người dùng: nhấp, nhấn giữ, cuộn, đặt tiêu điểm, đặt văn bản.
Khi có thay đổi trong giao diện (phần tử mới xuất hiện, văn bản thay đổi, phần tử trở nên hiển thị hoặc ẩn), hệ điều hành gửi một AccessibilityEvent. Trình đọc màn hình đăng ký các sự kiện này và phản ứng với chúng: ví dụ: khi hộp thoại xuất hiện, trình đọc màn hình tự động di chuyển tiêu điểm đến tiêu đề của nó và thông báo nội dung.
// Lắng nghe sự kiện trợ năng trên Android
class CustomAccessibilityService : AccessibilityService() {
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
event ?: return
when (event.eventType) {
TYPE_VIEW_CLICKED ->
handleClick(event)
TYPE_WINDOW_STATE_CHANGED ->
handleWindowChange(event)
TYPE_VIEW_TEXT_CHANGED ->
handleTextChange(event)
}
}
}
Trên iOS, các sự kiện tương tự được xử lý thông qua UIAccessibility.Notification: layoutChanged (bố cục đã thay đổi), screenChanged (màn hình hoàn toàn mới), announcement (thông báo tùy chỉnh), pageScrolled (cuộn trang). Nhà phát triển gửi các sự kiện này qua UIAccessibility.post để trình đọc màn hình phản hồi chính xác với các thay đổi. Ví dụ: khi mở cửa sổ phương thức, cần gửi screenChanged với tiêu đề mới — nếu không VoiceOver sẽ ở lại phần tử trước đó bên dưới cửa sổ.
Tạo ứng dụng có thể truy cập không chỉ là thêm contentDescription vào mọi phần tử — mà là thiết kế trải nghiệm người dùng cho tương tác phi trực quan. Các quy tắc cơ bản giống nhau cho cả hai nền tảng, mặc dù cách triển khai khác nhau.
Tất cả các phần tử tương tác phải có mô tả có ý nghĩa: nút “Gửi” nên được mô tả là “Gửi tin nhắn”, không chỉ “Nút”. Các phần tử trang trí (dấu phân cách, hình nền, biểu tượng không chức năng) nên được ẩn khỏi trình đọc màn hình. Thứ tự điều hướng nên theo luồng logic của màn hình, không phải bố cục trực quan. Độ tương phản văn bản phải ít nhất 4.5:1 cho văn bản chính và 3:1 cho văn bản lớn (WCAG AA).
// iOS: cấu hình đúng cho phần tử phức tạp
let customControl = UIControl()
customControl.isAccessibilityElement = true
customControl.accessibilityLabel = "Âm lượng"
customControl.accessibilityValue = "75 phần trăm"
customControl.accessibilityTraits = [
.adjustable,
.button
]
customControl.accessibilityHint =
"Tăng hoặc giảm âm lượng"
// Cập nhật khi giá trị thay đổi
func didChangeVolume(newValue: Float) {
customControl.accessibilityValue =
"\(Int(newValue)) phần trăm"
UIAccessibility.post(
notification: .layoutChanged,
argument: customControl
)
}
Trên iOS, cờ isAccessibilityElement bật hỗ trợ VoiceOver cho các phần tử tùy chỉnh. Tổ hợp traits (.adjustable + .button) báo cho VoiceOver rằng phần tử có thể được điều chỉnh bằng cách vuốt lên/xuống và kích hoạt bằng chạm đúp. Sau khi thay đổi giá trị, phải gửi thông báo layoutChanged — nếu không VoiceOver sẽ tiếp tục thông báo giá trị cũ.
Cho iOS: sử dụng accessibilityElements để ghi đè thứ tự đọc, accessibilityCustomActions cho các hành động bổ sung trong menu ngữ cảnh và shouldGroupAccessibilityChildren để nhóm các phần tử thành nhóm logic. Cho SwiftUI, sử dụng bộ điều chỉnh .accessibilityLabel(), .accessibilityAddTraits() và .accessibilityRespondsToUserInteraction(). Tránh đặt isAccessibilityElement = false trên các vùng chứa có phần tử con tương tác — điều này sẽ ẩn chúng khỏi VoiceOver.
Cho Android: sử dụng accessibilityTraversalBefore và accessibilityTraversalAfter cho thứ tự điều hướng, AccessibilityDelegate cho phần tử tùy chỉnh và LiveRegion (polite/assertive) cho cập nhật động. Trong Compose, sử dụng bộ điều chỉnh .semantics {} với contentDescription, stateDescription và customActions. Tránh đặt focusable = true trên các phần tử không tương tác — điều này tạo điểm tiêu điểm giả cho TalkBack và gây nhầm lẫn cho người dùng.
Kiểm thử với trình đọc màn hình phải được thực hiện trên thiết bị vật lý. Trình giả lập/mô phỏng cung cấp hiểu biết cơ bản, nhưng cử chỉ và tốc độ phản hồi khác nhau. Sử dụng Accessibility Inspector (Xcode) cho iOS và Accessibility Scanner (Android) để phát hiện vấn đề tự động.
Các kịch bản kiểm thử chính: đăng ký (điền biểu mẫu, xác thực, gửi), tìm kiếm và điều hướng danh mục, thanh toán, khôi phục mật khẩu. Mỗi kịch bản phải hoàn thành được mà không cần kiểm soát trực quan — chỉ thông qua lời nhắc bằng giọng nói của trình đọc màn hình. Nếu người dùng trình đọc màn hình không thể hoàn thành kịch bản trong cùng thời gian với người dùng thông thường (±50%), ứng dụng cần cải thiện trợ năng.
Câu hỏi thường gặp
Đó là chương trình đọc to mọi thứ xảy ra trên màn hình điện thoại thông minh: văn bản, nút bấm, thông báo. Người dùng điều khiển thiết bị bằng cử chỉ — chạm vào phần tử để nghe tên và chạm đúp để kích hoạt. Screen Reader thay thế thị giác bằng giọng nói.
Trên iOS — VoiceOver (trình đọc màn hình hệ thống tích hợp của Apple). Trên Android — TalkBack (một phần của Android Accessibility Suite từ Google). Cả hai đều hỗ trợ điều khiển bằng cử chỉ, phản hồi giọng nói và màn hình chữ nổi qua Bluetooth.
Đặt contentDescription (Android) hoặc accessibilityLabel (iOS) cho tất cả các phần tử tương tác. Ẩn các phần tử trang trí khỏi trình đọc màn hình. Gửi thông báo khi có thay đổi động. Kiểm thử với trình đọc màn hình bật trên thiết bị vật lý mà không có kiểm soát trực quan.
Sự khác biệt chính là ở API và cử chỉ. VoiceOver sử dụng UIAccessibility trên iOS và vòng xoay để điều hướng (xoay hai ngón tay). TalkBack sử dụng AccessibilityService trên Android và menu toàn cục qua vuốt hình chữ L. Nguyên lý hoạt động — duyệt Cây trợ năng — là giống nhau.
Trình đọc màn hình không thể “nhìn thấy” hình ảnh. Nó đọc mô tả văn bản mà nhà phát triển cung cấp qua contentDescription (Android) hoặc accessibilityLabel (iOS). Nếu không có mô tả nào được đặt, trình đọc màn hình có thể đọc tên tệp hoặc chỉ nói “hình ảnh” — điều này vô ích cho người dùng.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm