1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【SwiftUI】AVFoundationでText to Speech

Last updated at Posted at 2021-05-21

#きっかけ

時間を読み上げる時報アプリの影響を受けて
とりあえずiPhoneに喋らせてみよう!となりました

#コードを小出しに

###まずはインポート

import
// とりあえずインポート
import SwiftUI
import AVFoundation

###喋るための設定

        // 何を喋らせるか設定
        let utterance = AVSpeechUtterance(string: "こんにちは")
        // 喋る言語の設定
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        // 喋るスピードの設定 個人的に0.5くらいが普通と感じます
        utterance.rate = 0.5
        // よくわからんが設定!
        let synthesizer = AVSpeechSynthesizer()
        // 発話
        synthesizer.speak(utterance)

###でもボタンに仕込むの面倒だからfuncに放り込んだ

    // アンダーバーが肝らしいが使いこなせてません
    func text2speech(_ text: String) {
        let utterance = AVSpeechUtterance(string: text)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        utterance.rate = 0.5
        let synthesizer = AVSpeechSynthesizer()
        synthesizer.speak(utterance)
    }

###変数の設定

    // @Stateで変数の変化に対応
    @State private var text: String = ""

###喋らせたい言葉をTextFieldへ

// $マークが必須
TextField("入力してね", text: $text)
    .padding(30)

###ボタンの設定

// 手抜きボタン!
Button("発話") {
    // テキストフィールドから受け取った言葉をtextToSpeechへ
    text2speech(text)
}
// ボタンを押しやすいように大型化
.font(.largeTitle)
.padding()
.background(Color.blue)
.foregroundColor(.white)

###全体像

import SwiftUI
import AVFoundation

struct ContentView: View {
    @State private var text: String = ""
    
    var body: some View {
        // 上下に並ぶようにVStackで囲います
        VStack {
            Spacer()
            TextField("入力してね", text: $text)
                .padding(30)
            Button("発話") {
                text2speech(text)
            }
            .font(.largeTitle)
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            Spacer()
        }
    }
    
    func text2speech(_ text: String) {
        let utterance = AVSpeechUtterance(string: text)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        utterance.rate = 0.5
        let synthesizer = AVSpeechSynthesizer()
        synthesizer.speak(utterance)
    }
}

#最後に

ネットで検索してもあまり出てこないのね
Speech to Textの方はいくらでも出てきましたが
Text to Speechは少ないですね(特に日本語記事!)

#実際のところ
シミュレーターでは喋ってくれたのですが
実機にインストールしようとしても失敗しちゃうんですよね…
なんでだろ

#環境

MacBook pro 2014 Mid Big Sur
Xcode 12.5
iPhone 12 Pro iOS 14.5.1

#お願いします

インストールできない理由がわかる方居たら助けてください
よろしくお願いします

Communication with Apple failed.
Your maximum App ID limit has been reached.
You may create up to 10 App IDs every 7 days.

だそうです…

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?