[SwiftUI/Swift]文章を読み上げる

目次

概要

時に、英語の勉強や、目の不自由な人向けなどに文章を読み上げてほしい時もあるだろう。
そんなときは、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”でも英語を入力すれば英語読みをしてくれるが、カタカナ英語という感じ。
また、読み間違いも多々ある。

参照:
英語の早口言葉25選!発音の練習をしてレベルアップを目指そう