🪶

SwiftUIで、テキストを読み上げる

2024/08/12に公開

🔬AVSpeechSynthesizer

An object that produces synthesized speech from text utterances and enables monitoring or controlling of ongoing speech.

テキストの発話から合成音声を生成し、進行中の音声の監視や制御を可能にするオブジェクト。

https://developer.apple.com/documentation/avfaudio/avspeechsynthesizer

テキストを話すには、テキストを含む AVSpeechUtterance インスタンスを作成し、それを音声合成インスタンスの speak(_:) に渡します。また、オプションで AVSpeechSynthesisVoice を取得し、 発話の Voice プロパティに設定することで、 発話のテキストを話すときに音声合成がその音声を使用します。

音声合成器は、自分が話す発話のキューを保持する。シンセサイザーが話していない場合、speak(_:)を呼び出すと、その発話をすぐに、または必要に応じてpreUtteranceDelayの間、一時停止した後に話し始めます。シンセサイザーが話している場合、シンセサイザーは発話をキューに追加し、それらを受信した順に話します。

発話開始後、シンセサイザーオブジェクトを使用して、発話を一時停止または停止することができます。一時停止後、一時停止した時点からスピーチを再開するか、スピーチを完全に停止し、キューに残っているすべての発話を削除することができます。

isSpeakingとisPausedプロパティを調べるか、AVSpeechSynthesizerDelegateに準拠したデリゲートを設定することで、音声合成を監視することができます。デリゲートは、音声合成中に発生した重要なイベントを受信します。

AVSpeechSynthesizerはまた、スピーチが再生されるルートを制御します。詳細については、音声出力を指示するを参照してください。

公式読んでも作り方わからない😭

作ってみた。テキストを読み上げてはくれるようだ。

import SwiftUI
import AVFoundation

struct ContentView: View {
    @State private var speechSynthesizer = AVSpeechSynthesizer()
    let textToSpeak = "こんにちは、世界!これは音声合成のサンプルです。"

    var body: some View {
        VStack {
            Text(textToSpeak)
                .padding()
            
            Button(action: {
                speakText()
            }) {
                Text("読み上げる")
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(10)
            }
        }
    }
    
    func speakText() {
        let utterance = AVSpeechUtterance(string: textToSpeak)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        utterance.rate = 0.5
        speechSynthesizer.speak(utterance)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

このコードの説明:

  1. AVFoundation フレームワークをインポートしています。これには AVSpeechSynthesizer が含まれています。
  2. @State プロパティラッパーを使用して speechSynthesizer を宣言しています。これにより、ビュー間で状態を保持できます。
  3. textToSpeak 定数に読み上げるテキストを日本語で定義しています。
  4. ビューの中に、テキストを表示する Text ビューと、読み上げを開始するための Button を配置しています。
  5. speakText() 関数では:
  • AVSpeechUtterance オブジェクトを作成し、読み上げるテキストを設定しています。
  • AVSpeechSynthesisVoice を使用して日本語の音声を指定しています("ja-JP")。
  • rate プロパティを 0.5 に設定して、読み上げ速度を調整しています。
  • speechSynthesizer.speak() メソッドを呼び出して、テキストの読み上げを開始しています。

このサンプルを使用すると、ボタンをタップすることで日本語のテキストが読み上げられます。必要に応じて、テキストの内容、読み上げ速度、音量などをカスタマイズすることができます。

最後に

ボタンを押すと日本語でテキストを読み上げてくれます。お試しあれ。Flutterだとパッケージ入れるのですが、OSのエラーで詰まることあるから、困りました😅
パッケージがサポートされなくなったら、新しく探さないといけませんしね。そこが、クロスプラットフォームの悩みでしたね。

Discussion