iOSアプリ開発 入門 (5) - AVSpeechSynthesizer
iOSアプリの「AVSpeechSynthesizer」による「音声合成」の実装方法をまとめました。
・iOS 14
前回
1. AVSpeechSynthesizer
iOSアプリで「音声合成」を実装するには、「AVSpeechSynthesizer」を使います。
2. コード
コードは、次のとおりです。
import UIKit
import AVFoundation
// ViewController
class ViewController: UIViewController {
var synthesizer: AVSpeechSynthesizer!
var voice: AVSpeechSynthesisVoice!
// ビューのロード時に呼ばれる
override func viewDidLoad() {
super.viewDidLoad()
// 音声合成の準備
self.synthesizer = AVSpeechSynthesizer()
self.voice = AVSpeechSynthesisVoice.init(language: "ja-JP")
// 発話
speak("こんにちは")
}
// 発話
func speak(_ text: String) {
let utterance = AVSpeechUtterance.init(string: text)
utterance.voice = self.voice
self.synthesizer.speak(utterance)
}
}
手順は、次のとおりです。
(1) 音声合成の準備
「AVSpeechSynthesizer」と「AVSpeechSynthesisVoice」を生成します。
(2) 発話
テキストを「AVSpeechUtterance」でラップし、「AVSpeechSynthesisVoice」を選択し、「AVSpeechSynthesizer」のspeak()で発話します。
3. 発話の実行・一時停止・再開・停止
「AVSpeechSynthesizer」には、発話の実行・一時停止・再開・停止を行うメソッドが用意されています。
・speak(AVSpeechUtterance) : 発話の実行
・pauseSpeaking(at: AVSpeechBoundary) : 一時停止
・continueSpeaking() : 再開
・stopSpeaking(at: AVSpeechBoundary) : 停止
「AVSpeechBoundary」は、以下の定数を持っています。
・.immediate : すぐに一時停止・停止
・.word : 現在の単語の発話を終了後に一時停止・停止
「AVSpeechSynthesizer」には、発話の実行中か、一時停止中かを調べるプロパティも用意されています。
・isSpeaking : 発話の実行中かどうか
・isPaused : 一時停止中かどうか
4. 発話の設定
「AVSpeechUtterance」で設定できます。
◎ 声
utterance.voice = self.voice
◎ ピッチ
デフォルト1.0で、大きいほど高く、小さいほど低い声になります。
utterance.pitchMultiplier = 0.8
◎ 音量
デフォルト1.0で、値が大きいほど大きく、小さいほど小さい声になります。
utterance.volume = 1.0
◎ 発話速度
utterance.rate = 0.6
最小発話速度、最大発話速度の定数も用意されています。
・AVSpeechUtteranceMinimumSpeechRate : 最小発話速度 (0.0)
・AVSpeechUtteranceMaximumSpeechRate : 最大発話速度 (1.0)
・AVSpeechUtteranceDefaultSpeechRate : デフォルト発話速度 (0.5)
◎ 発話タイミング
発話前に一時停止する時間、発話後に次発話を実行する前に一時停止する時間を指定することができます。
var preUtteranceDelay: TimeInterval
var postUtteranceDelay: TimeInterval
◎ アクセシビリティの設定よりも優先するか
デフォルトfalseです。
utterance.prefersAssistiveTechnologySettings = false
5. ボイスの設定
◎ 利用可能な日本語ボイスの確認
以下のコードで、利用可能な日本語ボイスを確認できます。
// 利用可能な日本語音声の確認
let voices = AVSpeechSynthesisVoice.speechVoices()
for voice in voices {
if voice.language == "ja-JP" {
print(voice)
}
}
Language: ja-JP, Name: Hattori, Quality: Default [com.apple.ttsbundle.siri_male_ja-JP_compact]
Language: ja-JP, Name: Kyoko, Quality: Default [com.apple.ttsbundle.Kyoko-compact]
Language: ja-JP, Name: O-ren, Quality: Default [com.apple.ttsbundle.siri_female_ja-JP_compact]
◎ 日本語ボイスのダウンロード
「設定」の「アクセシビリティ → VoiceOver → 読み上げ」でダウンロード可能な日本語音声を確認できます。クリックでダウンロードします。
利用可能な日本語ボイスを再度確認すると、増えてることがわかります。
Language: ja-JP, Name: Otoya (Enhanced), Quality: Enhanced [com.apple.ttsbundle.Otoya-premium]
Language: ja-JP, Name: Hattori, Quality: Default [com.apple.ttsbundle.siri_Hattori_ja-JP_compact]
Language: ja-JP, Name: Kyoko, Quality: Default [com.apple.ttsbundle.Kyoko-compact]
Language: ja-JP, Name: O-ren, Quality: Default [com.apple.ttsbundle.siri_O-ren_ja-JP_compact]
Language: ja-JP, Name: Otoya, Quality: Default [com.apple.ttsbundle.Otoya-compact]
◎ ボイスの設定
AVSpeechSynthesisVoice.init(identifier:)でボイスIDでボイスを設定できます。ダウンロードされてないボイスは利用できないので、存在チェックは必須になります。
// 日本語ボイスの生成
func makeVoice(_ identifier: String) -> AVSpeechSynthesisVoice! {
let voices = AVSpeechSynthesisVoice.speechVoices()
for voice in voices {
if voice.identifier == identifier {
return AVSpeechSynthesisVoice.init(identifier: identifier)
}
}
return AVSpeechSynthesisVoice.init(language: "ja-JP")
}
self.voice = self.makeVoice("com.apple.ttsbundle.Otoya-premium")
◎ ボイスの属性
var quality: AVSpeechSynthesisVoiceQuality - 品質
・.default : デフォルトでデバイスにある基本品質版
・.enhanced : ユーザーがダウンロードする必要のある高品質版
var gender: AVSpeechSynthesisVoiceGender - 性別
・.unspecified : 非特定
・.male : 男性
・.female : 女性
6. AVSpeechSynthesizerDelegate
「AVSpeechSynthesizerDelegate」は、音声合成の実行状況を把握するためのデリゲートです。
主なメソッドは、次のとおりです。
func speechSynthesizer(AVSpeechSynthesizer, didStart: AVSpeechUtterance)
開始時に呼ばれる。
func speechSynthesizer(AVSpeechSynthesizer, didFinish: AVSpeechUtterance)
完了時に呼ばれる。
func speechSynthesizer(AVSpeechSynthesizer, didPause: AVSpeechUtterance)
一時停止時に呼ばれる。
func speechSynthesizer(AVSpeechSynthesizer, didContinue: AVSpeechUtterance)
再開時に呼ばれる。
func speechSynthesizer(AVSpeechSynthesizer, didCancel: AVSpeechUtterance)
キャンセル時に呼ばれる。
func speechSynthesizer(AVSpeechSynthesizer, willSpeakRangeOfSpeechString: NSRange, utterance: AVSpeechUtterance)
テキストの一部を発話する直前に呼ばれる。
次回
この記事が気に入ったらサポートをしてみませんか?