概要
iOSでは標準で利用可能な音声合成(AVSpeechSynthesizer)が用意されている。
普通に利用する場合、女性の声が利用可能だが、声を男性に変更する方法をメモする。
AVSpeechSynthesizerの基本的な使い方については以下の記事を参照。
https://qiita.com/maKunugi/items/dc9da201a663c8773c8c
音声の変更
let voices = AVSpeechSynthesisVoice.speechVoices()
利用可能な声は、AVSpeechSynthesisVoiceクラスのspeechVoicesメソッドから取得が可能。
voiceの中身は下記のような内容。
name: Kyoko
gender(rawvalue): 0
lang: ja-JP
identifier: com.apple.ttsbundle.Kyoko-compact
speechVoicesメソッドから利用したい声を取得したら、AVSpeechUtteranceクラスにsetしてあげればOK。
let synthesizer = AVSpeechSynthesizer()
...
let utterance = AVSpeechUtterance(string:text)
utterance.pitchMultiplier = 1.0
utterance.voice = voice
synthesizer.speak(utterance)
利用可能な日本語音声
手元の端末で確認できた日本語の音声はこちら。
- Otoya (Enhanced) #男性
ja-JP
com.apple.ttsbundle.Otoya-premium
- Hattori #男性
ja-JP
com.apple.ttsbundle.siri_male_ja-JP_compact
- Kyoko #女性 (Default)
ja-JP
com.apple.ttsbundle.Kyoko-compact
- O-ren #女性
ja-JP
com.apple.ttsbundle.siri_female_ja-JP_compact
- Otoya #男性
ja-JP
com.apple.ttsbundle.Otoya-compact
上記の音声が確認できました。男性の声も2種類指定が可能なので、「Hattori」もしくは「Otoya」の音声を指定してあげれば男性の声で読み上げをすることが可能です。
注意事項
音声が端末で利用できるかの確認
何もしない場合はDefaultの女性の声(Kyoko)が読み上げに利用されます。
端末内にない存在しない音声を利用しようとするとクラッシュします。
そのため、端末で利用したい音声が存在しているかは必ず確認する必要があります。
var voice:AVSpeechSynthesisVoice? = voices.first{
$0.identifier == "com.apple.ttsbundle.siri_male_ja-JP_compact"
}
if let voice = voice {
~~~~~
} else {
~~~~~
}
ユーザが音声をダウンロードすることで利用可能な音声が増える
初期状態ではほとんどの端末がDefaultの音声しか利用ができない。(シミュレータは増やせない模様)
Siriの設定やアクセシビリティの設定等で音声の変更を行うと、追加の音声データを端末にダウンロードができる。その手順を踏んだ端末には上述したような複数の音声が利用可能になる。
そのため、必ず男性の声でなければならないといった制約のあるアプリを提供したい際は、男性の音声データが端末にダウンロードされている状態にするため、うまくユーザを誘導する必要がある。