目次
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
- コミュニケーション能力に障害がある人が様々な手段の活用によって,自分の意思を相手に伝えることを支援する臨床活動の領域
- 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