WWDC Quick Look 💓 By SwiftGGTeam
Create a seamless speech experience in your apps

Create a seamless speech experience in your apps

元の動画を見る

ハイライト

Apple は AVSpeechSynthesizerprefersAssistiveTechnologySettings を追加し、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 = trueAVSpeechUtterance に設定します。
  • 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

キーポイント:

  • mixToTelephonyUplinkAVSpeechSynthesizer に設定します。
  • 活動中の通話は電話でも FaceTime でも構いません。
  • 通話がなければ、システムはデフォルト再生経路を無理に変えません。

speech audio session をシステムに任せる

(07:02) デフォルトでは speech audio は App 共有の audio session を使います。usesApplicationAudioSessionfalse にすると、システムが 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 と他音声の干渉を減らせます。

重要ポイント

  1. ビューファインダー系ツールに制御可能な物体読み上げを追加する

何をするか:物体認識、ガイド、スキャン系 App で AVSpeechSynthesizer を使い、ビューファインダーで認識した物体や環境変化を読み上げる。

なぜ価値があるか:セッションは Seeing AI で、盲人や低視力ユーザー向け App が VoiceOver アクセス可能を保ちつつ、synthesizer で物体説明のタイミングを制御できることを示す。

始め方:UI 要素に正しい accessibility label を付ける。物体認識結果が安定したら AVSpeechUtterance を作る。VoiceOver 実行中なら prefersAssistiveTechnologySettingstrue にする。

  1. AAC App に電話コミュニケーションモードを追加する

何をするか:ユーザーがフレーズをタップしたら、合成音声を進行中の電話や FaceTime に送る。

なぜ価値があるか:transcript は mixToTelephonyUplink が active outgoing call に speech をルーティングできると明示し、非言語ユーザーに重要。

始め方:既存のフレーズ構築 UI を再利用。AVSpeechSynthesizer を初期化。通話モードで mixToTelephonyUplink = true。通話がなければ通常のスピーカー経路を維持。

  1. VoiceOver ユーザー向けに一貫した App 内読み上げを提供する

何をするか:App 自身が読み上げる機能では、現在の補助技術の声、速度、音高を採用する。

なぜ価値があるか:セッションデモはデフォルト speech と VoiceOver 設定が食い違う違和感を示す。prefersAssistiveTechnologySettings で2段目の読み上げを VoiceOver に近づけられる。

始め方:各 AVSpeechUtterance 作成点を確認。補助技術ユーザー向け utterance に prefersAssistiveTechnologySettings = true。ユーザーが明示的に voice をカスタムする AAC シーンは別設定を残す。

  1. App 内音声をメイン audio session から分離する

何をするか:音楽、動画、効果音の多い App で speech audio をシステム管理に任せ、オーディオフォーカス競合を減らす。

なぜ価値があるかusesApplicationAudioSession = false 後、システムが speech audio の中断、active 状態を扱い、他 App 音声と duck and mix する。

始め方:App 内の speech 出口を洗い出す。非録音シーンでまず usesApplicationAudioSession = false を試す。音楽再生、動画再生、着信中断で回帰テストする。

関連セッション

コメント

GitHub Issues · utterances