はじめに
こんにちは、nukkyです。
音声読み上げはちょっと今更感が漂いますが、案件で使用したばっかというのと、備忘録兼、初心者向けということで書いていきたいと思います。
実装
コード
今回は、シングルトンでどこでも即音声読み上げみたいな形で作りました。
細かい説明は後でとりあえずコードを貼ります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | import AVFoundation class SpeechManager: NSObject, AVSpeechSynthesizerDelegate { static let sharedInstance = SpeechManager() let synthesizer = AVSpeechSynthesizer() override init() { super.init() // delegateの設定 synthesizer.delegate = self } // 音声再生開始 func startSpeech(speechText: String) { synthesizer.speak(setSpeechText(text: speechText)) } // 音声再生停止 func stopSpeech() { synthesizer.stopSpeaking(at: AVSpeechBoundary.immediate) } // 音声設定 private func setSpeechText(text: String) -> AVSpeechUtterance { // AVSpeechUtteranceを作成 let utterance = AVSpeechUtterance(string: text) // 言語を設定 utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP") // 再生速度を設定 utterance.rate = AVSpeechUtteranceDefaultSpeechRate // 声の高さを設定 utterance.pitchMultiplier = 1.0 return utterance } // 読み上げが開始したとき func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) { print("didStart") } // 読み上げが終了したとき func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { print("didFinish") } // 読み上げが一時停止したとき func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) { print("didPause") } // 読み上げが一時停止から再生されたとき func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didContinue utterance: AVSpeechUtterance) { print("didContinue") } // 読み上げが途中で終了したとき func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didCancel utterance: AVSpeechUtterance) { print("didCancel") } // 読み上げ中で字句ごとに呼ばれる func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) { print("willSpeak") } } |
音声の再生処理は以下の処理です、
引数にAVSpeechUtteranceを指定しますがこのクラスで読み上げの声や言語の設定を行います。
| 1 | synthesizer.speak(setSpeechText(text: speechText)) |
喋らせるテキストと言語を設定します。
| 1 2 3 4 | // AVSpeechUtteranceを作成 let utterance = AVSpeechUtterance(string: “ここで喋らせるテキストを設定”) // 言語を設定 utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP") |
音声の読み上げ速度を設定します、3段階ありますが正直Default以外は設定しないかと思います。。。
| 1 2 3 4 | // 再生速度を設定 utterance.rate = AVSpeechUtteranceDefaultSpeechRate utterance.rate = AVSpeechUtteranceMinimumSpeechRate utterance.rate = AVSpeechUtteranceMaximumSpeechRate |
読み上げる声の高さを設定します、0.5〜2.0の範囲で設定できます
1.0で標準のSiriと同じ高さです、個人の感想ですが1.5だと○ッパーみたいな声になります。
| 1 2 3 4 | // 声の高さを設定 utterance.pitchMultiplier = 0.5//低い utterance.pitchMultiplier = 1.0//普通 utterance.pitchMultiplier = 2.0//高い |
呼び出し
サンプルコードを呼び出す際は以下の呼び出し方になります。
| 1 | SpeechManager.sharedInstance.startSpeech(speechText: "2017年の流行語大賞は、インスタ映えと忖度") |
さいごに
音声読み上げいかがでしょうか、ウォークスルーやチュートリアルなどちょっとしたところで使ってみたくなりますね。