SwiftUIで、テキストを読み上げる
🔬AVSpeechSynthesizer
An object that produces synthesized speech from text utterances and enables monitoring or controlling of ongoing speech.
テキストの発話から合成音声を生成し、進行中の音声の監視や制御を可能にするオブジェクト。
テキストを話すには、テキストを含む 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()
}
}
このコードの説明:
- AVFoundation フレームワークをインポートしています。これには AVSpeechSynthesizer が含まれています。
- @State プロパティラッパーを使用して speechSynthesizer を宣言しています。これにより、ビュー間で状態を保持できます。
- textToSpeak 定数に読み上げるテキストを日本語で定義しています。
- ビューの中に、テキストを表示する Text ビューと、読み上げを開始するための Button を配置しています。
- speakText() 関数では:
- AVSpeechUtterance オブジェクトを作成し、読み上げるテキストを設定しています。
- AVSpeechSynthesisVoice を使用して日本語の音声を指定しています("ja-JP")。
- rate プロパティを 0.5 に設定して、読み上げ速度を調整しています。
- speechSynthesizer.speak() メソッドを呼び出して、テキストの読み上げを開始しています。
このサンプルを使用すると、ボタンをタップすることで日本語のテキストが読み上げられます。必要に応じて、テキストの内容、読み上げ速度、音量などをカスタマイズすることができます。
最後に
ボタンを押すと日本語でテキストを読み上げてくれます。お試しあれ。Flutterだとパッケージ入れるのですが、OSのエラーで詰まることあるから、困りました😅
パッケージがサポートされなくなったら、新しく探さないといけませんしね。そこが、クロスプラットフォームの悩みでしたね。
Discussion