স্ক্রিন রিডার (Screen Reader) এমন একটি প্রোগ্রাম যা পাঠ্য এবং গ্রাফিক্যাল ইন্টারফেস উপাদানকে বক্তৃতা বা ব্রেইল ডিসপ্লে আউটপুটে রূপান্তর করে, যাতে অন্ধ এবং দৃষ্টিপ্রতিবন্ধী ব্যবহারকারীরা চাক্ষুষ নিয়ন্ত্রণ ছাড়াই ডিভাইসের সাথে ইন্টারঅ্যাক্ট করতে পারেন। মোবাইল প্ল্যাটফর্মে প্রধান স্ক্রিন রিডারগুলো হল iOS-এ VoiceOver এবং Android-এ TalkBack। বিশ্ব স্বাস্থ্য সংস্থা (2023)-এর তথ্য অনুযায়ী, স্ক্রিন রিডার বিশ্বব্যাপী দৃষ্টিপ্রতিবন্ধী ২৮৫ মিলিয়ন লোকের জন্য ডিজিটাল প্রযুক্তিতে প্রবেশের প্রধান হাতিয়ার।
মূল বিষয়
স্ক্রিন রিডার (Screen Reader) একটি সহায়ক প্রযুক্তি (Assistive Technology, AT) যা গ্রাফিক্যাল ইউজার ইন্টারফেস ব্যাখ্যা করে এবং এটি অ-চাক্ষুষ আকারে উপস্থাপন করে: সংশ্লেষিত বক্তৃতা বা স্পর্শযোগ্য ব্রেইল ডিসপ্লের মাধ্যমে। স্ক্রিন রিডার সম্পূর্ণ বা আংশিক দৃষ্টিশক্তি হারানো লোকদের জন্য কম্পিউটার এবং মোবাইল ডিভাইসে প্রবেশের প্রধান মাধ্যম।
প্রথম স্ক্রিন রিডার ১৯৮০-এর দশকের শেষে MS-DOS-এর জন্য (যেমন Vocal-Eyes) এবং পরে Windows-এর জন্য (JAWS, NVDA) আবির্ভূত হয়। মোবাইল প্ল্যাটফর্মে, স্ক্রিন রিডার সিস্টেম স্তরে একীভূত হয়: Apple ২০০৯ সালে iPhone 3GS-এ VoiceOver একীভূত করে, Google একই বছর Android 1.6-এ TalkBack একীভূত করে। ২০২৫ সালের মধ্যে, প্রায় সব আধুনিক স্মার্টফোনে একটি অন্তর্নির্মিত স্ক্রিন রিডার থাকে যার জন্য অতিরিক্ত সফ্টওয়্যার ইনস্টলেশনের প্রয়োজন হয় না।
একটি স্ক্রিন রিডার কেবল স্ক্রিন থেকে পাঠ্য পড়ে না — এটি ইন্টারফেস শ্রেণিবিন্যাস বিশ্লেষণ করে, উপাদানের ধরন (বাটন, লিংক, শিরোনাম, ইনপুট ফিল্ড), তাদের অবস্থা (সক্ষম/অক্ষম, নির্বাচিত/অনির্বাচিত) এবং সম্পর্ক (প্যারেন্ট-চাইল্ড, গ্রুপ) নির্ধারণ করে। এই তথ্য ব্যবহারকারীর কাছে ভয়েস প্রম্পট বা ব্রেইল ডিসপ্লের স্পর্শকাতর অনুভূতির মাধ্যমে পৌঁছায়, যা ফোকাস অবস্থান অনুযায়ী রিয়েল টাইমে কোষ আপডেট করে।
স্ক্রিন রিডার অপারেটিং সিস্টেমের সাথে ঘনিষ্ঠভাবে কাজ করে, এর ইন্টারফেসের অভ্যন্তরীণ উপস্থাপনা — অ্যাক্সেসিবিলিটি ট্রি (Accessibility Tree)-তে প্রবেশাধিকার লাভ করে। এই প্রক্রিয়াটি iOS এবং Android-এ একই, যদিও API-এর নাম ভিন্ন।
স্ক্রিন রিডারের প্রধান আউটপুট চ্যানেল হল একটি বক্তৃতা সংশ্লেষক (Text-To-Speech, TTS)। যখন অ্যাক্সেসিবিলিটি ফোকাস কোনো উপাদানে আসে, স্ক্রিন রিডার তার পাঠ্য বিষয়বস্তু (বা ডেভেলপারের দেওয়া বিবরণ) বের করে TTS ইঞ্জিনে পাঠায়। আধুনিক TTS ইঞ্জিন, যেমন Apple Speech Synthesis এবং Google Text-to-Speech, বিরামচিহ্ন এবং বিষয়বস্তুর ধরন অনুযায়ী সঠিক স্বর, বিরতি এবং জোর সহ প্রাকৃতিক বক্তৃতা উৎপন্ন করতে নিউরাল নেটওয়ার্ক ব্যবহার করে।
ব্যবহারকারী বক্তৃতার গতি (সাধারণত আরামদায়ক ধারণার জন্য সর্বোচ্চের ৬০–৮০%), পিচ এবং ভলিউম সামঞ্জস্য করতে পারে। কিছু স্ক্রিন রিডার একাধিক কণ্ঠস্বর সমর্থন করে এবং বিষয়বস্তুর ধরন অনুযায়ী সেগুলোর মধ্যে স্যুইচ করে — উদাহরণস্বরূপ, পাঠ্য পড়ার জন্য ধীর কণ্ঠ এবং ইন্টারফেস নেভিগেশনের জন্য দ্রুত কণ্ঠ। ব্রেইল ডিসপ্লে Bluetooth-এর মাধ্যমে সংযুক্ত হয় এবং একবারে ৪০–৮০টি অক্ষর প্রদর্শন করে, প্রতিটি ফোকাস পরিবর্তনে লাইন আপডেট করে।
স্ক্রিন রিডার অ্যাক্সেসিবিলিটি ফোকাস (Accessibility Focus) ধারণা ব্যবহার করে, যা সাধারণ ইনপুট ফোকাস থেকে ভিন্ন। ব্যবহারকারী ইশারা (স্পর্শ, সোয়াইপ) ব্যবহার করে অ্যাক্সেসিবিলিটি ফোকাস সরায়, এবং স্ক্রিন রিডার ফোকাসের অধীনে উপাদান ঘোষণা করে। নেভিগেশন ক্রম ডিফল্টভাবে চাক্ষুষ ক্রম অনুসরণ করে: বাম থেকে ডান, উপর থেকে নীচ। ডেভেলপার জটিল লেআউটের জন্য এই ক্রম ওভাররাইড করতে পারে।
স্ক্রিন রিডার বিভিন্ন নেভিগেশন মোডও সমর্থন করে যা ব্যবহারকারী রোটার (VoiceOver) বা মেনু (TalkBack) মাধ্যমে স্যুইচ করে: শিরোনাম, লিংক, অক্ষর, শব্দ, ফর্ম অনুযায়ী। শিরোনাম মোডে, স্ক্রিন রিডার শুধুমাত্র H1–H6-এর মধ্যে চলে — দীর্ঘ পৃষ্ঠা এবং ডকুমেন্টে দক্ষ নেভিগেশনের জন্য এটি অত্যন্ত গুরুত্বপূর্ণ। অক্ষর মোড নিশ্চিতকরণ কোড বা জটিল পাসওয়ার্ড প্রবেশের সময় সাহায্য করে, প্রতিটি অক্ষর আলাদাভাবে উচ্চারণ করে।
দুটি স্ক্রিন রিডার মোবাইল প্ল্যাটফর্মে আধিপত্য করে: iOS-এ VoiceOver এবং Android-এ TalkBack। তাদের ভিন্ন API, ইশারা এবং ক্ষমতা রয়েছে, তবে সাধারণ নীতি হল অ্যাক্সেসিবিলিটি ট্রি পড়া এবং ইশারা নিয়ন্ত্রণ।
VoiceOver হল Apple-এর স্ক্রিন রিডার, যা iOS, iPadOS এবং macOS-এ নির্মিত। এটি উপাদান সম্পর্কে তথ্য পেতে UIAccessibility API ব্যবহার করে এবং নেভিগেশন মোড পরিবর্তনের জন্য রোটার সমর্থন করে। VoiceOver iCloud (ডিভাইস জুড়ে সেটিংস সিঙ্ক), Apple Pay (Touch ID বা Face ID-এর মাধ্যমে পেমেন্ট নিশ্চিতকরণ) এবং ডায়নামিক টেক্সট (ফন্ট ব্যবহারকারীর সেটিংসের সাথে খাপ খায়) সহ একীভূত।
VoiceOver-এর ইশারা TalkBack থেকে ভিন্ন: এটি দুই-আঙুল ঘূর্ণন (রোটার), স্ক্রিন কার্টেনের জন্য ট্রিপল-ট্যাপ এবং ক্রিয়া বাতিল করতে দুই-আঙুল ডাবল-ট্যাপ ব্যবহার করে। VoiceOver কাস্টম রোটার সমর্থন করে যা ডেভেলপার UIAccessibilityCustomRotor-এর মাধ্যমে যোগ করে — উদাহরণস্বরূপ, মানক ক্রম এড়িয়ে অ্যাপ বিভাগে দ্রুত নেভিগেশনের জন্য।
TalkBack হল Google-এর স্ক্রিন রিডার, যা Android Accessibility Suite-এর অংশ। এটি ইন্টারফেসে প্রবেশের জন্য AccessibilityService এবং AccessibilityNodeInfo ব্যবহার করে। TalkBack L-আকৃতির সোয়াইপের মাধ্যমে গ্লোবাল মেনু, উপাদানের জন্য কাস্টম অ্যাকশন এবং ডায়নামিক আপডেটের জন্য LiveRegion সমর্থন করে। Android 14 থেকে শুরু করে, TalkBack এক-হাতের ইশারা সমর্থন এবং Google Assistant-এর সাথে উন্নত একীকরণ পেয়েছে।
TalkBack-এর VoiceOver-এর তুলনায় আরও নমনীয় ইশারা ব্যবস্থা রয়েছে: ব্যবহারকারী প্রায় যেকোনো ইশারা যেকোনো অ্যাকশনে নির্ধারণ করতে পারে। TalkBack অন-স্ক্রিন ব্রেইল ইনপুট (BrailleBack) সমর্থন করে — ব্যবহারকারী প্রতি আঙুলে বিশেষ 3×2 লেআউটে সরাসরি টাচস্ক্রিনে ব্রেইল অক্ষর দিয়ে টেক্সট প্রবেশ করে, যা অন-স্ক্রিন কিবোর্ডের তুলনায় টেক্সট প্রবেশকে উল্লেখযোগ্যভাবে গতি দেয়।
| বৈশিষ্ট্য | VoiceOver (iOS) | TalkBack (Android) |
|---|---|---|
| API | UIAccessibility | AccessibilityService |
| নেভিগেশন | রোটার (২ আঙুল) | গ্লোবাল মেনু (L-সোয়াইপ) |
| ভাষা | ৪০+ | ৩০+ |
| কাস্টম অ্যাকশন | UIAccessibilityCustomRotor | AccessibilityDelegate |
| ব্রেইল | বাহ্যিক ডিসপ্লে | BrailleBack + বাহ্যিক |
| ডায়নামিক আপডেট | UIAccessibility.post | accessibilityLiveRegion |
VoiceOver এবং TalkBack ছাড়াও কম সাধারণ মোবাইল স্ক্রিন রিডার রয়েছে: Select to Speak (Android, নির্বাচিত এলাকা বলে), Samsung Voice Assistant (One UI-সহ Samsung ডিভাইসে TalkBack প্রতিস্থাপন করে) এবং নির্দিষ্ট ক্ষেত্রের জন্য থার্ড-পার্টি সমাধান — যেমন, Google পরিষেবা ছাড়া চীনা স্মার্টফোন ব্যবহারকারীদের জন্য।
স্ক্রিন রিডারের অ্যাপের UI উপাদানে সরাসরি প্রবেশাধিকার নেই। পরিবর্তে, এটি একটি স্তরের মাধ্যমে কাজ করে — অপারেটিং সিস্টেমের অ্যাক্সেসিবিলিটি API। অপারেটিং সিস্টেম একটি অ্যাক্সেসিবিলিটি ট্রি (Accessibility Tree) তৈরি করে যা স্ক্রিন রিডার ট্রাভার্স এবং বিশ্লেষণ করে।
iOS-এ, অ্যাক্সেসিবিলিটি ট্রি স্ক্রিনের প্রতিটি View-এর সাথে সামঞ্জস্যপূর্ণ UIAccessibilityElement অবজেক্ট থেকে তৈরি হয়। প্রতিটি উপাদানে label (মূল পাঠ্য), traits (উপাদানের ধরন: বাটন, শিরোনাম, লিংক), hint (টুলটিপ), value (স্লাইডার এবং নির্দেশকের জন্য বর্তমান মান) এবং frame (স্পর্শ এলাকা) থাকে। সিস্টেম মানক UI উপাদানের জন্য স্বয়ংক্রিয়ভাবে উপাদান তৈরি করে, তবে ডেভেলপার সেগুলো যোগ এবং কাস্টমাইজ করতে পারে।
Android-এ, অ্যাক্সেসিবিলিটি ট্রি AccessibilityNodeInfo অবজেক্ট থেকে তৈরি হয়। প্রতিটি নোডে থাকে: text (পাঠ্য বা contentDescription), className (উপাদানের ধরন), contentDescription (বিবরণ), stateDescription (অবস্থা), isEnabled, isChecked, isClickable এবং অন্যান্য ফ্ল্যাগ। Android AccessibilityAction-ও সমর্থন করে — ক্রিয়ার একটি তালিকা যা স্ক্রিন রিডার ব্যবহারকারীর পক্ষে সম্পাদন করতে পারে: ক্লিক, লং প্রেস, স্ক্রল, ফোকাস সেট করা, টেক্সট সেট করা।
যখন ইন্টারফেসে কোনো পরিবর্তন ঘটে (নতুন উপাদান দেখা দেয়, পাঠ্য পরিবর্তিত হয়, কোনো উপাদান দৃশ্যমান বা অদৃশ্য হয়), অপারেটিং সিস্টেম একটি AccessibilityEvent পাঠায়। স্ক্রিন রিডার এই ইভেন্টগুলোর সদস্যতা নেয় এবং সেগুলোতে প্রতিক্রিয়া জানায়: উদাহরণস্বরূপ, যখন একটি ডায়ালগ দেখা দেয়, স্ক্রিন রিডার স্বয়ংক্রিয়ভাবে ফোকাস তার শিরোনামে সরিয়ে নেয় এবং বিষয়বস্তু ঘোষণা করে।
// 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)
}
}
}
iOS-এ, অনুরূপ ইভেন্ট UIAccessibility.Notification-এর মাধ্যমে সামলানো হয়: layoutChanged (লেআউট পরিবর্তিত হয়েছে), screenChanged (সম্পূর্ণ নতুন স্ক্রিন), announcement (কাস্টম ঘোষণা), pageScrolled (পৃষ্ঠা স্ক্রল)। ডেভেলপার UIAccessibility.post-এর মাধ্যমে এই ইভেন্ট পাঠায় যাতে স্ক্রিন রিডার পরিবর্তনে সঠিকভাবে সাড়া দেয়। উদাহরণস্বরূপ, একটি মডেল উইন্ডো খোলার সময়, নতুন শিরোনাম সহ screenChanged পাঠানো প্রয়োজন — অন্যথায় VoiceOver উইন্ডোর নীচে আগের উপাদানে থেকে যাবে।
একটি অ্যাক্সেসিবল অ্যাপ তৈরি করার অর্থ প্রতিটি উপাদানে contentDescription যোগ করা নয় — বরং অ-চাক্ষুষ ইন্টারঅ্যাকশনের জন্য ব্যবহারকারীর অভিজ্ঞতা ডিজাইন করা। মৌলিক নিয়ম দুটি প্ল্যাটফর্মের জন্যই একই, যদিও বাস্তবায়ন ভিন্ন।
সব ইন্টারঅ্যাকটিভ উপাদানের অর্থপূর্ণ বিবরণ থাকতে হবে: একটি “জমা দিন” বাটনকে “বার্তা জমা দিন” হিসাবে বর্ণনা করা উচিত, শুধু “বাটন” নয়। আলংকারিক উপাদান (বিভাজক, পটভূমির ছবি, অ-কার্যকরী আইকন) স্ক্রিন রিডার থেকে লুকানো উচিত। নেভিগেশন ক্রম স্ক্রিনের যৌক্তিক প্রবাহ অনুসরণ করা উচিত, চাক্ষুষ বিন্যাস নয়। পাঠ্য বৈপরীত্য মূল পাঠ্যের জন্য কমপক্ষে ৪.৫:১ এবং বড় পাঠ্যের জন্য ৩:১ (WCAG AA) হতে হবে।
// iOS: জটিল উপাদানের জন্য সঠিক কনফিগারেশন
let customControl = UIControl()
customControl.isAccessibilityElement = true
customControl.accessibilityLabel = "শব্দ ভলিউম"
customControl.accessibilityValue = "৭৫ শতাংশ"
customControl.accessibilityTraits = [
.adjustable,
.button
]
customControl.accessibilityHint =
"ভলিউম বাড়ায় বা কমায়"
// মান পরিবর্তনে আপডেট
func didChangeVolume(newValue: Float) {
customControl.accessibilityValue =
"\(Int(newValue)) শতাংশ"
UIAccessibility.post(
notification: .layoutChanged,
argument: customControl
)
}
iOS-এ, isAccessibilityElement ফ্ল্যাগ কাস্টম উপাদানের জন্য VoiceOver সমর্থন সক্ষম করে। traits সংমিশ্রণ (.adjustable + .button) VoiceOver-কে জানায় যে উপাদানটি উপরে/নীচে সোয়াইপ করে সামঞ্জস্য করা যায় এবং ডাবল-ট্যাপ দিয়ে সক্রিয় করা যায়। মান পরিবর্তনের পরে, একটি layoutChanged বিজ্ঞপ্তি পাঠানো আবশ্যক — অন্যথায় VoiceOver পুরানো মান ঘোষণা করতে থাকবে।
iOS-এর জন্য: পড়ার ক্রম ওভাররাইড করতে accessibilityElements, কনটেক্সট মেনুতে অতিরিক্ত অ্যাকশনের জন্য accessibilityCustomActions এবং উপাদানকে যৌক্তিক গ্রুপে গ্রুপ করতে shouldGroupAccessibilityChildren ব্যবহার করুন। SwiftUI-র জন্য, .accessibilityLabel(), .accessibilityAddTraits() এবং .accessibilityRespondsToUserInteraction() মডিফায়ার ব্যবহার করুন। ইন্টারঅ্যাকটিভ চাইল্ড উপাদান ধারণকারী কন্টেইনারে isAccessibilityElement = false সেট করা এড়িয়ে চলুন — এটি তাদের VoiceOver থেকে লুকাবে।
Android-এর জন্য: নেভিগেশন ক্রমের জন্য accessibilityTraversalBefore এবং accessibilityTraversalAfter, কাস্টম উপাদানের জন্য AccessibilityDelegate এবং ডায়নামিক আপডেটের জন্য LiveRegion (polite/assertive) ব্যবহার করুন। Compose-এ, contentDescription, stateDescription এবং customActions সহ .semantics {} মডিফায়ার ব্যবহার করুন। অ-ইন্টারঅ্যাকটিভ উপাদানে focusable = true সেট করা এড়িয়ে চলুন — এটি TalkBack-এর জন্য মিথ্যা ফোকাস পয়েন্ট তৈরি করে এবং ব্যবহারকারীকে বিভ্রান্ত করে।
স্ক্রিন রিডার দিয়ে পরীক্ষণ একটি ভৌত ডিভাইসে করা আবশ্যক। একটি এমুলেটর/সিমুলেটর মৌলিক ধারণা দেয়, কিন্তু ইশারা এবং প্রতিক্রিয়ার গতি ভিন্ন। iOS-এর জন্য Accessibility Inspector (Xcode) এবং স্বয়ংক্রিয় সমস্যা সনাক্তকরণের জন্য Accessibility Scanner (Android) ব্যবহার করুন।
মূল পরীক্ষণের পরিস্থিতি: নিবন্ধন (ফর্ম পূরণ, বৈধতা, জমা), অনুসন্ধান এবং ক্যাটালগ নেভিগেশন, চেকআউট, পাসওয়ার্ড পুনরুদ্ধার। প্রতিটি পরিস্থিতি চাক্ষুষ নিয়ন্ত্রণ ছাড়াই সম্পন্নযোগ্য হতে হবে — শুধুমাত্র স্ক্রিন রিডারের ভয়েস প্রম্পটের মাধ্যমে। যদি কোনো স্ক্রিন রিডার ব্যবহারকারী সাধারণ ব্যবহারকারীর সমান সময়ে (±১৫০%) কোনো পরিস্থিতি সম্পন্ন করতে না পারে, তাহলে অ্যাপটির অ্যাক্সেসিবিলিটি উন্নতি প্রয়োজন।
সচরাচর জিজ্ঞাসা
এটি একটি প্রোগ্রাম যা স্মার্টফোনের স্ক্রিনে ঘটে যাওয়া সবকিছু বলে: পাঠ্য, বাটন, বিজ্ঞপ্তি। ব্যবহারকারী ইশারা দিয়ে ডিভাইস নিয়ন্ত্রণ করে — একটি উপাদান স্পর্শ করে তার নাম শোনে এবং সক্রিয় করতে ডাবল-ট্যাপ করে। স্ক্রিন রিডার দৃষ্টিকে কণ্ঠ দিয়ে প্রতিস্থাপন করে।
iOS-এ — VoiceOver (Apple-এর অন্তর্নির্মিত সিস্টেম স্ক্রিন রিডার)। Android-এ — TalkBack (Google-এর Android Accessibility Suite-এর অংশ)। দুটোই ইশারা নিয়ন্ত্রণ, ভয়েস ফিডব্যাক এবং Bluetooth-এর মাধ্যমে ব্রেইল ডিসপ্লে সমর্থন করে।
সকল ইন্টারঅ্যাকটিভ উপাদানের জন্য contentDescription (Android) বা accessibilityLabel (iOS) সেট করুন। আলংকারিক উপাদান স্ক্রিন রিডার থেকে লুকান। ডায়নামিক পরিবর্তনে বিজ্ঞপ্তি পাঠান। চাক্ষুষ নিয়ন্ত্রণ ছাড়া ভৌত ডিভাইসে স্ক্রিন রিডার চালু করে পরীক্ষণ করুন।
প্রধান পার্থক্য API এবং ইশারায়। VoiceOver iOS-এ UIAccessibility এবং নেভিগেশনের জন্য রোটার (দুই-আঙুল ঘূর্ণন) ব্যবহার করে। TalkBack Android-এ AccessibilityService এবং L-আকৃতির সোয়াইপের মাধ্যমে গ্লোবাল মেনু ব্যবহার করে। কাজের নীতি — অ্যাক্সেসিবিলিটি ট্রি ট্রাভার্স করা — একই।
স্ক্রিন রিডার কোনো ছবি “দেখতে” পারে না। এটি ডেভেলপার contentDescription (Android) বা accessibilityLabel (iOS)-এর মাধ্যমে দেওয়া টেক্সট বিবরণ পড়ে। যদি কোনো বিবরণ সেট না থাকে, স্ক্রিন রিডার ফাইলের নাম পড়তে পারে বা কেবল “ছবি” বলতে পারে — যা ব্যবহারকারীর জন্য অকেজো।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন