TalkBackは、Android用Googleのビルトインスクリーンリーダーで、Android Accessibility Suiteパッケージの一部です。インターフェイス要素を音声で説明し、ジェスチャでデバイスを操作できるようにし、目が見えないユーザーや視覚に障害のあるユーザーがスマートフォン機能を十分に利用できるようにします。Google Accessibility Help (2025)によると、TalkBackは大多数のAndroidデバイスにプリインストールされており、複数の音声エンジンで30言語以上をサポートしています。
まとめ
TalkBackは、Googleが開発したAndroid用スクリーンリーダーで、Android Accessibility Suiteの一部です。視覚に障害のあるユーザーに音声フィードバックとジェスチャ操作を提供します。TalkBackは、スマートフォン、タブレット、Smart TV、およびWear OSを実行するウェアラブルデバイスで動作します。
TalkBackは2009年にAndroid 1.6 (Donut)で初めて登場しました。最初は単独のプロジェクトでしたが、Android 4.0 (Ice Cream Sandwich)のリリースによってAndroid Accessibility Suiteの一部になりました—これはSwitch AccessやSelect to Speakを含むサービスのセットです。Android 10以降、TalkBackはGoogle Playサービスを搭載するすべてのデバイスにプリインストールされており、パートナーデバイス—Samsung、Xiaomi、Oppoその他を含みます。
TalkBackは、Google Text-to-Speech、Samsung TTS、サードパーティーのものなど、複数の音声エンジンで30言語以上をサポートしています。日本語の場合、Google TTSが自然な発音と正しいイントネーションを提供します。ユーザーはTalkBack設定で話速、ピッチ、そして音声の性別を調整できます。
TalkBackはAccessibilityServiceに基づいて動作します—Androidのシステムメカニズムで、アプリがインターフェイスの状態情報を取得し、プログラムで相互作用できるようにします。TalkBackが有効のとき、すべてのタッチイベントを抱揚し、それらを特別なスクリーンリーダージェスチャに変換します。
TalkBackの仕組みの中心要素はアクセシビリティフォーカスです。標準のインプットフォーカス(テキストフィールドの強調表示)とは異なり、アクセシビリティフォーカスは要素の周りに黄色い枠で表示され、TalkBackを使用しないユーザーには見えません。アクセシビリティフォーカスが要素に移ると、TalkBackがそのコンテンツ、タイプ、状態を音声説明します。
ユーザーはジェスチャでアクセシビリティフォーカスを移動します:右スワイプ(次の要素)、左スワイプ(前の要素)。要素は、AccessibilityNodeInfoが定める順番で翌ります—これはAndroidが各画面について構築するアクセシビリティツリーです。開発者はaccessibilityTraversalBeforeやaccessibilityTraversalAfterプロパティを通じて順番を制御できます。これは、カスタムレイアウトの複雑な画面で特に重要です。
画面上の各Viewは、アクセシビリティツリーのノードで表されます—AccessibilityNodeInfoオブジェクトです。このオブジェクトには、要素のテキスト(contentDescriptionまたはビューテキスト)、要素のタイプ(ボタン、チェックボックス、入力フィールド)、状態(有効/無効/選択中)、画面上の位置、および使用可能なアクションのリストが含まれます。TalkBackはこのツリーを翌り、各ノードを順番に音声説明します。
Viewにテキストコンテンツがない場合(例えば、説明のないImageView)、TalkBackにとって不可視になります—ユーザーはその存在を知ることができません。この問題を解決するために、開発者はcontentDescriptionを設定します—TalkBackが無音の代わりに読み上げるテキスト説明です。Androidはまた、状態が変わる要素(チェック/アンチェック)のstateDescriptionや、ヒントあり入力フィールドのhintTextもサポートしています。
TalkBackは、標準のAndroidジェスチャを特別なスクリーンリーダージェスチャに変換します。大亊まわの操作は1指または2指で実行され、3指のジェスチャはグローバルアクションに使用されます。
| 操作 | ジェスチャ | 結果 |
|---|---|---|
| 要素を音声説明 | 1指でタッチ | 要素の名称とタイプを説明 |
| 実行 | 2回タッチ | ボタン押下または移動 |
| 次へ | 右スワイプ | 次の要素 |
| 前へ | 左スワイプ | 前の要素 |
| スクロール | 2指スワイプ | リストのスクロール |
| TalkBackメニュー | 上左スワイプ | グローバル設定メニュー |
上左スワイプ(L字型スワイプ)でTalkBackのグローバルメニューが開き、話速変更、スクリーンカーテン有効、チュートリアル起動、設定開きなどができます。TalkBackは要素のコンテキストメニューもサポートしています:上右スワイプで現在の要素のアクションリスト(例:テキストフィールドの「コピー」、「ペースト」、チャットメッセージの「削除」)が開きます。
Androidは、アクセシビリティ設定のための豊かなAPIを提供しています。基本レベルはcontentDescriptionですが、質の高いTalkBackサポートにはAccessibilityNodeInfo、AccessibilityDelegate、LiveRegionの扱いが必要です。
android:contentDescription属性は、TalkBackに向けて要素のテキスト説明を設定します。ImageView、ImageButton、FloatingActionButton、およびテキストコンテンツのないカスタムViewに必須です。標準要素(TextView、Button)ではcontentDescriptionはオプショナルです—TalkBackが自動的にテキストを読み上げます。
val avatarView = ImageView(this)
avatarView.contentDescription = "ユーザーアバター"
avatarView.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_YES
val playButton = ImageButton(this)
playButton.contentDescription = "動画を再生"
val progressBar = ProgressBar(this)
progressBar.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_NO
importantForAccessibilityフラグで、TalkBackに対する要素の可視性を制御します。NOは要素をアクセシビリティツリーから非表示にします—装飾画像、指示器、カスタム背景に便利です。YESは、テキストがなくても強制的に要素を翌りに含みます。NOの潜用に注意してください:セマンティックに重要な要素を非表示にすると、TalkBackユーザーがアプリを利用できなくなります。
標準のクリックハンドラーを使用しないカスタムViewでは、AccessibilityDelegateをオーバライドする必要があります—アクセシビリティイベントを処理するクラスです。デリゲートを使うと、カスタム説明や要素タイプ、TalkBackがコンテキストメニューで提示するアクションのリストを設定できます。
class CustomButtonDelegate : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View, info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = "カスタムボタン"
info.className = Button::class.java.name
info.addAction(
AccessibilityNodeInfoCompat.AccessibilityActionCompat(
R.id.custom_action, "シェア"
)
)
}
override fun performAccessibilityAction(
host: View, action: Int, args: Bundle?
): Boolean {
if (action == R.id.custom_action) {
shareContent()
return true
}
return super.performAccessibilityAction(host, action, args)
}
}
例では、デリゲートがTalkBackに要素がボタン(className = Button)であり、TalkBackのコンテキストメニューに「シェア」アクションが表示されることを通知しています。performAccessibilityActionメソッドがこのアクションの実行を処理します。デリゲートがないと、TalkBackはカスタムViewを非インタラクティブな単純領域とみなし、ユーザーは相互作用できません。
完全なTalkBackサポートには、contentDescriptionだけでなく、フォーカス管理、動的更新のためのLiveRegion、スクリーンリーダーを有効にしてのテスト、さまざまなAndroidバージョンへの適応が必要です。
画面のコンテンツがユーザーの明示的な操作なしに変化したとき(例:新しいメッセージの通知やいいね数の更新)、TalkBackは通知を受ける必要があります。このためにXMLのViewにandroid:accessibilityLiveRegion属性か、コードでsetAccessibilityLiveRegion()メソッドを使用します。politeは現在の音声説明が終了した後に発表され、assertiveは即座に中断します。
val statusText = TextView(this)
statusText.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_POLITE
// テキストが更新されると、TalkBackが自動的に
// 変更を発表します
statusText.text = "アンナからの新しいメッセージ"
// クリティカルな通知にはassertive
errorBanner.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
LiveRegionはiOSのUIAccessibility.postに対応するAndroidの機能です。大亊まわの更新(新しいメッセージ、ステータス更新)にはpoliteを使い、assertiveはクリティカルなエラー(決済失敗、コネクション切断)だけに使用します。assertiveの使い過ぎはユーザーエクスペリエンスを悪化させます—TalkBackが精常に音声説明を中断します。
複数のViewが1つの論理単位を形成する複雑な画面では、AccessibilityNodeProviderまたはfocusSearchを使用してナビゲーションをオーバライドします。例えば、42セル(6週×7日)のカスタムカレンダーで、ユーザーが次のブロックに移るために42すべてのアイテムをスクロールする必要はありません。開発者はセルを論理ユニットにグルーピングできます:月)→週)→日。
Jetpack Composeでは、.semantics {}修飾子が似たAPIを提供します:contentDescription、liveRegion、stateDescription、disabled、customActions。Composeはまた、子セマンティクスをひとつに結合するmergeDescendantsをサポートしており、View毎にaccessibilityDelegateを手動設定せずに要素をグルーピングできます。
Button(
onClick = { sendMessage() },
modifier = Modifier.semantics {
contentDescription("メッセージを送信")
stateDescription("送信準備完了")
}
) {
Icon(Icons.Filled.Send, "送信")
}
TalkBackのテストは、サービスを有効にした物理デバイスまたはエミュレーターを使用して行います。画面を非表示にした状態(Screen Curtain)で主なユーザーシナリオを経由することをお勧めします—これで視覚フィードバックがまったくない状況を再現できます。AndroidはまたAccessibility Scannerを提供しています—アクセシビリティ問題を自動検出するツールで、contentDescriptionのない要素、小さすぎるタッチ範囲、低コントラストを強調表示します。
よくある質問
設定→アクセシビリティ→TalkBack→有効にする。クイック有効には、3秒間両方の音量ボタンを同時に押します。Google Assistantの音声コマンド「TalkBackを有効にして」でも有効にできます。
TalkBackはAndroid用スクリーンリーダー、VoiceOverはiOS用です。TalkBackはAccessibilityServiceと黄色い枠のアクセシビリティフォーカスを使用し、VoiceOverはUIAccessibilityとローターを使用します。ジェスチャやメニューが異なり、TalkBackにはグローバルメニューのL字型スワイプがあります。
すべてのImageViewやカスタム要素にcontentDescriptionを設定します。装飾要素を非表示にするにはimportantForAccessibilityを使用します。動的更新にはaccessibilityLiveRegionを設定し、Accessibility Scannerで確認します。Composeでは.semantics{}修飾子を使用します。
アクセシビリティツリーにおけるインターフェイス要素を表すオブジェクトです。テキスト、タイプ、状態、位置、アクションリストを含みます。TalkBackはナビゲーションにこのツリーを使用します。開発者はAccessibilityDelegateまたはXML属性で変更できます。
importantForAccessibilityを確認してください—NOに設定されている可能性があります。テキストのない要素にはcontentDescriptionが設定されていることを確認してください。カスタムViewには、onInitializeAccessibilityNodeInfoを使ったAccessibilityDelegateを実装してください。診断にはAccessibility Scannerを使用してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。