目次
概要
時に、英語の勉強や、目の不自由な人向けなどに文章を読み上げてほしい時もあるだろう。
そんなときは、AVSpeechSynthesizerを使用することで簡単に文章を読み上げる機能を実装できる。
今回は割と遊び心を入れている。
ソースコード
import SwiftUI
@main
struct TestApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
SpeechView()
}
}
}
View表示部分
import SwiftUI
struct SpeechView: View {
@ObservedObject var viewModel: SpeechViewModel = SpeechViewModel()
@FocusState private var focus: Bool
var body: some View {
VStack {
Spacer()
TextEditor(text: self.$viewModel.speechText)
.focused(self.$focus)
.overlay(RoundedRectangle(cornerRadius: 5).stroke(.gray, lineWidth: 1))
.padding(EdgeInsets(top: 0.0, leading: 16.0, bottom: 0.0, trailing: 16.0))
Spacer()
Button {
self.viewModel.readText()
} label: {
Text("読み上げ")
}
Spacer()
}
.onTapGesture {
self.focus = false
}
}
}
処理部分
import AVFAudio
import Foundation
class SpeechViewModel: ObservableObject {
private let speechSynthesizer = AVSpeechSynthesizer()
@Published var speechText: String = ""
func readText() {
speechSynthesizer.stopSpeaking(at: .immediate)
let utterance = AVSpeechUtterance(string: speechText)
utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
utterance.pitchMultiplier = 1.0
utterance.rate = 0.6
speechSynthesizer.speak(utterance)
}
}
デモ動画
日本語
英語
詳細
話すオブジェクトとして使われるのがAVSpeechUtteranceだが、大まかに言うと以下のプロパティがある。
AVSpeechUtteranceのプロパティ内容
プロパティ名 | 用途 |
voice | 地域設定をして音声を設定する 英語なら”en-US”、日本語なら”ja-JP”を設定する。 |
rate | 読み上げのスピード |
pitchMultiplier | 読み上げる音声の高さ 0.5~2.0を設定でき、デフォルトは1となっている。 |
AVSpeechSynthesizerのspeakメソッドで読み上げをしてもらう。
stopSpeakingメソッドを最初に読んでいるのは、連打された時に音声を逐一止めるため。
ちなみに、“ja-JP”でも英語を入力すれば英語読みをしてくれるが、カタカナ英語という感じ。
また、読み間違いも多々ある。