💁‍♀️

【iOS】AVSpeechSynthesizerでiPhoneを喋らせてみる

2024/03/10に公開

iOSのAVSpeechSynthesizerでiPhoneを喋らせてみよう

AVSpeechSynthesizerを使用することで、テキストを自然な音声で読み上げさせることが可能になります。この記事では、様々な話し方でiPhoneに喋らせる方法を紹介します。

話し方の実装

TextToSpeechConverterクラスでは、speakFastspeakSlowspeakHighPitchspeakLowPitch、およびspeakNormalの各メソッドを公開します。これらのメソッドは、それぞれ異なるパラメータをAVSpeechUtteranceに設定し、AVSpeechSynthesizerを使ってテキストを読み上げます。

public class TextToSpeechConverter {
    let speechSynthesizer:AVSpeechSynthesizer

    public init() {
        speechSynthesizer = AVSpeechSynthesizer()
    }

    // 早口で話す
    public func speakFast(text: String, language: String = "ja-JP") {
        let speechUtterance = AVSpeechUtterance(string: text)
        speechUtterance.voice = AVSpeechSynthesisVoice(language: language)
        speechUtterance.rate = AVSpeechUtteranceMaximumSpeechRate
        speechUtterance.pitchMultiplier = 1.0
        speechUtterance.volume = 1.0
        speechSynthesizer.speak(speechUtterance)
    }

    // ゆっくり話す
    public func speakSlow(text: String, language: String = "ja-JP") {
        let speechUtterance = AVSpeechUtterance(string: text)
        speechUtterance.voice = AVSpeechSynthesisVoice(language: language)
        speechUtterance.rate = AVSpeechUtteranceMinimumSpeechRate
        speechUtterance.pitchMultiplier = 1.0
        speechUtterance.volume = 1.0
        speechSynthesizer.speak(speechUtterance)
    }

    // 高いピッチで話す
    public func speakHighPitch(text: String, language: String = "ja-JP") {
        let speechUtterance = AVSpeechUtterance(string: text)
        speechUtterance.voice = AVSpeechSynthesisVoice(language: language)
        speechUtterance.rate = AVSpeechUtteranceDefaultSpeechRate
        speechUtterance.pitchMultiplier = 2.0
        speechUtterance.volume = 1.0
        speechSynthesizer.speak(speechUtterance)
    }

    // 低いピッチで話す
    public func speakLowPitch(text: String, language: String = "ja-JP") {
        let speechUtterance = AVSpeechUtterance(string: text)
        speechUtterance.voice = AVSpeechSynthesisVoice(language: language)
        speechUtterance.rate = AVSpeechUtteranceDefaultSpeechRate
        speechUtterance.pitchMultiplier = 0.5
        speechUtterance.volume = 1.0
        speechSynthesizer.speak(speechUtterance)
    }

    // 通常の話し方
    public func speakNormal(text: String, language: String = "ja-JP") {
        let speechUtterance = AVSpeechUtterance(string: text)
        speechUtterance.voice = AVSpeechSynthesisVoice(language: language)
        speechUtterance.rate = AVSpeechUtteranceDefaultSpeechRate
        speechUtterance.pitchMultiplier = 1.0
        speechUtterance.volume = 1.0
        speechSynthesizer.speak(speechUtterance)
    }
}

SwiftUIの作成

SwiftUIを使用して、ユーザーが異なる話し方を選択できるインターフェースを提供します。AVSpeechSynthesizerViewという名前のビューを定義し、内部でTextToSpeechConverterのインスタンスを使用して、ボタンタップに応じてテキストの読み上げを行います。


struct AVSpeechSynthesizerView: View {
    private let speechConverter = TextToSpeechConverter()

    var body: some View {
        VStack(spacing: 20) {
            Button("早口で話す") {
                speechConverter.speakFast(text: "こんにちは、世界!")
            }

            Button("ゆっくり話す") {
                speechConverter.speakSlow(text: "今日はいい天気ですね。")
            }

            Button("高いピッチで話す") {
                speechConverter.speakHighPitch(text: "何をして遊びますか?")
            }

            Button("低いピッチで話す") {
                speechConverter.speakLowPitch(text: "昨日は遅くまで起きていました。")
            }

            Button("通常の話し方") {
                speechConverter.speakNormal(text: "このアプリは音声合成をサポートしています。")
            }
        }
    }
}

実装のポイント

  • 言語の選択: AVSpeechSynthesisVoiceを使用して、読み上げる言語を指定します。これにより、多言語アプリケーションに対応できます。
  • 読み上げ速度の調整: AVSpeechUtterancerateプロパティを変更することで、読み上げの速度を調整できます。
  • ピッチの調整: pitchMultiplierプロパティを使って、声の高さ(ピッチ)を調整します。
  • 音量の調整: volumeプロパティで、読み上げの音量を調整できます。

まとめ

以上がAVSpeechSynthesizerで発話させる方法でした。
今回の実装は下記のリポジトリで確認できますので、合わせて確認してください
https://github.com/entaku0818/AudioMaster

Discussion