ハイライト
Apple は
AVSpeechSynthesizerにprefersAssistiveTechnologySettingsを追加し、App の音声が VoiceOver など現在の補助技術の声、速度、音高設定に従えるようにしました。
主要内容
多くの App が音声を足すとき、まず AVSpeechSynthesizer を作ります。地図の方向案内、AAC(Augmentative and Alternative Communication、拡張代替コミュニケーション)App、低視力ユーザー向けの環境説明ツールでは妥当です。これらの体験は音声を中心に据え、いつ話すか、何を話すか、どの声を使うかを App が決める必要があります。
同じやり方をスクリーンリーダー場面に持ち込むと問題になります。ユーザーが既に VoiceOver や他の補助技術を使っているとき、App が独自の AVSpeechSynthesizer で読み上げると、補助技術向けに設定した声や速度を迂回する可能性があります。セッションはまず境界を引きます。VoiceOver ユーザーに偶発イベントの説明を少し足すだけなら、UIAccessibility.post(notification: .announcement, ...) で実行中の補助技術に依頼します。
本当に AVSpeechSynthesizer が必要なのは、App の音声体験自体に独立した価値がある場面です。iOS 14 の新機能はここにあります。AVSpeechUtterance.prefersAssistiveTechnologySettings で現在の補助技術の音声設定を要求できます。Seeing AI のような App は、ユーザーが既に使っている VoiceOver に近い読み上げを保ちつつ、ビューファインダー内の物体を説明できます。
後半は2つの実務問題を扱います。AAC App ではユーザーが自分の声、速度、音高、音量を選ぶことがあり、通話中は合成音声を電話や FaceTime に送る必要があります。音声の多い App では、speech が App 共有の audio session を占有するかも決め、音楽、動画、効果音との干渉を避けます。
詳細
一時的なイベントは補助技術に任せる
(01:25) App が VoiceOver ユーザーに偶発イベント、たとえば状態変化や操作完了を補足するだけなら、ローカルスクリーンリーダーを作る必要はありません。UIAccessibility 経由で announcement を送れば、VoiceOver が読み上げを管理します。
UIAccessibility.post(notification: .announcement, argument: "Hello World")
キーポイント:
notification: .announcementは現在の補助技術が読み上げる公告であることを示します。argumentは読み上げるテキストです。- この経路は少量の音声補足向きで、音声中心の App 機能構築には向きません。
AVSpeechSynthesizer を作成して保持する
(02:55) 音声中心の機能では App 自身が読み上げを制御する必要があります。最小フローは synthesizer 作成、utterance 作成、speak(_:) 呼び出しです。講者は特に、AVSpeechSynthesizer オブジェクトを音声終了まで保持することを強調します。
self.synthesizer = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: "Hello World")
self.synthesizer.speak(utterance)
キーポイント:
AVSpeechSynthesizer()は音声をスケジュールするオブジェクトです。AVSpeechUtterance(string:)に読み上げテキストが入ります。speak(utterance)で utterance を synthesizer に渡して再生します。self.synthesizerはインスタンスが保持し、音声終了前に解放されないようにします。
VoiceOver など補助技術の音声設定に従う
(04:08) デフォルトでは AVSpeechSynthesizer はデバイスの Accessibility Spoken Content 設定を使います。iOS 14 の prefersAssistiveTechnologySettings で、実行中の補助技術の設定、声、速度、音高を要求できます。
self.synthesizer = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: "Hello World")
utterance.prefersAssistiveTechnologySettings = true
self.synthesizer.speak(utterance)
キーポイント:
prefersAssistiveTechnologySettings = trueはAVSpeechUtteranceに設定します。- VoiceOver など補助技術が実行中なら、その声、速度、音高が優先されます。
- 補助技術がなければ、システムは Spoken Content 設定か utterance に明示した属性を続けます。
- AAC App ではユーザー独自の声が必要な場合があり、プロダクト目標に応じてこの属性を評価します。
音声中心型 App 向けに声をカスタマイズする
(05:42) AAC App ではユーザーが自分を表す声を選ぶことがあります。AVSpeechUtterance は言語コードや voice identifier で voice を指定でき、システムのインストール済み voice 一覧も読めます。講者は、Siri voices は Spoken Content 設定で選べても AVSpeechSynthesizer API から直接使えず、システムは言語コードに合う voice にフォールバックすると説明します。
let utterance = AVSpeechUtterance(string: "Hello World")
// Choose a voice using a language code
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
// Choose a voice using an identifier
utterance.voice = AVSpeechSynthesisVoice(identifier: AVSpeechSynthesisVoiceIdentifierAlex)
// Get a list of installed voices
let voices = AVSpeechSynthesisVoice.speechVoices()
キーポイント:
AVSpeechSynthesisVoice(language:)は言語でシステム voice を選ぶのに適します。AVSpeechSynthesisVoice(identifier:)は既知の voice を指定するのに適します。AVSpeechSynthesisVoice.speechVoices()は現在利用可能なシステム voice を返し、ユーザーが新しい voice をダウンロードすると更新されます。- Siri voices はこの API で直接選べる範囲ではありません。
速度、音高、音量を調整する
(06:16) App が音声スタイルを自分で制御するなら、utterance の rate、pitch multiplier、volume を設定します。transcript の範囲は rate 0〜1、pitch multiplier 0.5〜2、volume 0〜1 です。
let utterance = AVSpeechUtterance(string: "Hello World")
// Choose a rate between 0 and 1, 0.5 is the default rate
utterance.rate = 0.75
// Choose a pitch multiplier between 0.5 and 2, 1 is the default multiplier
utterance.pitchMultiplier = 1.5
// Choose a volume between 0 and 1, 1 is the default value
utterance.volume = 0.5
キーポイント:
rateは読み上げ速度。例はデフォルト 0.5 を 0.75 に上げます。pitchMultiplierは音高倍率。デフォルトは 1 です。volumeはこの utterance の音量。デフォルトは 1 です。prefersAssistiveTechnologySettingsもオンで補助技術が実行中なら、補助技術設定が優先されます。
合成音声を進行中の通話に送る
(06:34) AAC App の重要シーンは、非言語ユーザーが電話や FaceTime でコミュニケーションすることです。mixToTelephonyUplink はこのための設計で、発信中の通話があれば speech は通話へ、なければデフォルト audio route です。
self.synthesizer = AVSpeechSynthesizer()
self.synthesizer.mixToTelephonyUplink = true
キーポイント:
mixToTelephonyUplinkはAVSpeechSynthesizerに設定します。- 活動中の通話は電話でも FaceTime でも構いません。
- 通話がなければ、システムはデフォルト再生経路を無理に変えません。
speech audio session をシステムに任せる
(07:02) デフォルトでは speech audio は App 共有の audio session を使います。usesApplicationAudioSession を false にすると、システムが speech audio を管理し、audio interruption 処理、session の active/inactive、他 App 音声との duck and mix を扱います。
self.synthesizer = AVSpeechSynthesizer()
self.synthesizer.usesApplicationAudioSession = false
キーポイント:
usesApplicationAudioSessionのデフォルトはtrueです。falseにすると speech audio は App 共有 audio session を使いません。- システムが中断処理と session 活性状態を管理します。
- 音楽、動画、効果音も再生する App では、speech と他音声の干渉を減らせます。
重要ポイント
- ビューファインダー系ツールに制御可能な物体読み上げを追加する
何をするか:物体認識、ガイド、スキャン系 App で AVSpeechSynthesizer を使い、ビューファインダーで認識した物体や環境変化を読み上げる。
なぜ価値があるか:セッションは Seeing AI で、盲人や低視力ユーザー向け App が VoiceOver アクセス可能を保ちつつ、synthesizer で物体説明のタイミングを制御できることを示す。
始め方:UI 要素に正しい accessibility label を付ける。物体認識結果が安定したら AVSpeechUtterance を作る。VoiceOver 実行中なら prefersAssistiveTechnologySettings を true にする。
- AAC App に電話コミュニケーションモードを追加する
何をするか:ユーザーがフレーズをタップしたら、合成音声を進行中の電話や FaceTime に送る。
なぜ価値があるか:transcript は mixToTelephonyUplink が active outgoing call に speech をルーティングできると明示し、非言語ユーザーに重要。
始め方:既存のフレーズ構築 UI を再利用。AVSpeechSynthesizer を初期化。通話モードで mixToTelephonyUplink = true。通話がなければ通常のスピーカー経路を維持。
- VoiceOver ユーザー向けに一貫した App 内読み上げを提供する
何をするか:App 自身が読み上げる機能では、現在の補助技術の声、速度、音高を採用する。
なぜ価値があるか:セッションデモはデフォルト speech と VoiceOver 設定が食い違う違和感を示す。prefersAssistiveTechnologySettings で2段目の読み上げを VoiceOver に近づけられる。
始め方:各 AVSpeechUtterance 作成点を確認。補助技術ユーザー向け utterance に prefersAssistiveTechnologySettings = true。ユーザーが明示的に voice をカスタムする AAC シーンは別設定を残す。
- App 内音声をメイン audio session から分離する
何をするか:音楽、動画、効果音の多い App で speech audio をシステム管理に任せ、オーディオフォーカス競合を減らす。
なぜ価値があるか:usesApplicationAudioSession = false 後、システムが speech audio の中断、active 状態を扱い、他 App 音声と duck and mix する。
始め方:App 内の speech 出口を洗い出す。非録音シーンでまず usesApplicationAudioSession = false を試す。音楽再生、動画再生、着信中断で回帰テストする。
関連セッション
- VoiceOver efficiency with custom rotors — 同じく VoiceOver ユーザー体験を中心に、custom rotors で複雑 UI のナビゲーション効率を上げる方法を扱う。
- App accessibility for Switch Control — Switch Control が accessibility 情報を再利用する方法を説明し、本セッションの UIAccessibility 境界と合わせて読むのに適する。
- Make your app visually accessible — 音声体験に加え、視覚的アクセシビリティの UI 適応を補う。
- Accessibility design for Mac Catalyst — Mac Catalyst のキーボード、グループ化、Accessibility Inspector などクロスプラットフォーム無障害の詳細。
- Evaluate and optimize voice interaction for your app — Siri と会話型インタラクションの観点から、音声入口の設計評価方法を補う。
コメント
GitHub Issues · utterances