アプリ内でシームレスな音声体験を作成する – WWDC2020

Session概要

音声合成を使いアプリのアクセシビリティ体験を拡張しましょう。音声APIを入れる最適な時間と場所を見つけ、アプリを利用する全員がメリットを得られるようにします。
AVSpeechSynthesizerをどのように使用するとVoiceOverのような支援テクノロジーを補完することができるかを学び、代替APIを実行するのはいつがいいのかも伝えます。適切なソースに音声をルーティングし、必要な人、欲しい人全員にシームレスに音声を統合するアプリを作成する方法についてなど。 https://developer.apple.com/videos/play/wwdc2020/10022/

読み上げ機能を使用するケース

  • 読み上げ機能をつけるなら、AVSpeechSynthesizerを使用する
    • 音声案内する対象を利用者全員ではなく、アクセシビリティを使用するユーザに絞りたいケースは適していない
  • Appleのデバイスには、VoiceOverや読み上げソフトなどの機能が組み込まれており、AVSpeechSynthesizer を適用することで独自の読み上げソフトを開発する必要はない
    • UIAccessibility APIを用いて、より使いやすいようにすることもできる
    • 例えば、アプリで発生した何らかのイベントを不定期に読み上げる設定をVoiceOverに追加したい場合は通知機能を使用する
    • UIAccessibility.post(notification:argument)
      • notificationに .announcement, argumentに読み上げる文字列を入れることでVoiceOverに読み上げ機能をデリゲートするので実現可能
  • AAC(Augmentative Alternative Communication) と呼ばれるアプリは読み上げ機能に特化した体験を提供する例の1つ
    • AAC
      • コミュニケーション能力に障害がある人が様々な手段の活用によって,自分の意思を相手に伝えることを支援する臨床活動の領域
  • AVSpeechSynthesizerはカメラで写した物体を説明する際に活躍し、読み上げるタイミングや方法の制御も行います

AVSpeechSynthesizerの使用方法

  • AVSpeechSynthesizerオブジェクトを生成する
    • 読み上げが終わるまで、このオブジェクトを保持しておく
  • AVSpeechUtteranceの設定のために読み上げたい文字をstringに代入する
  • synthesizerにutteranceを代入する
self.synthesizer = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: "Hello World")
// 読み上げ機能の設定を引き継ぐ
utterance.prefersAssistiveTechnologySettings = true
self.synthesizer.speak(utterance)

AVSpeechSynthesizerの仕様

  • アクセシビリティの読み上げコンテンツを使い、発話を構築できるようになっている
  • Siriの声は読み上げコンテンツで設定できますが、AVSpeechSynthesizerは設定できない
    • Siriの声を設定した場合、自動的にその設定と同じ言語コードに合うフォールバック音声を発話(utterance)に構成する
    • 今までは読み上げコンテンツにある設定をAVSpeechSynthesizerに引き継げなかったが、 prefersAssistiveTechnologySettings プロパティで引き継げるようになった
    • 声の選択、話すスピード、ピッチといった読み上げのプロパティを含む
    • これらのプロパティはutteranceに明治的に設定した値よりも優先される

AVSpeechSynthesizerのカスタマイズ

  • ユーザの言語設定に合わせた言語コードの設定が可能
    • 言語コードの一覧は AVSpeechSynthesisVoice.speechVoices()で取得可能
    • この一覧は、アクセシビリティで新しい音声をダウンロードすると更新される
  • mixToTelephonyUplink
    • 音声電話やFaceTimeの発信中でもアプリ内の音声案内を行う
    • 発信中でない場合は、初期値のオーディオルートに従い読み上げる
  • usesApplicationAudioSession
    • 別の音声機能を複数使う(defaultはtrue)
    • falseにすると読み上げ機能のオーディオセッション制御をシステムにデリゲートし、音声の割り込み制御やオーディオセッションのアクティブ・非アクティブの設定も可能となる
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()
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
self.synthesizer = AVSpeechSynthesizer()
self.synthesizer.mixToTelephonyUplink = true
self.synthesizer = AVSpeechSynthesizer()
self.synthesizer.usesApplicationAudioSession = false
最新情報をチェックしよう!