質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1567閲覧

swiftのAVSpeechSynthesizerの停止が出来ない

AtsushiNakamura

総合スコア46

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/06/29 23:07

swiftでAVSpeechSynthesizerを使ってテキストを読み上げるアプリを作成しています
以下の.swiftファイルを作成して、コントローラーから呼び出して再生しているのですが
再生するコントローラーと停止するコントローラーが違う場合に停止(synthesizer.stopSpeaking(at: .immediate)をしても)が出来なくなる現象が起こります

どのようにするれば読み上げを停止できるかご存知の方がいれば教えて戴きたいです

import UIKit import AVFoundation class SpeechService: NSObject, AVSpeechSynthesizerDelegate { var synthesizer = AVSpeechSynthesizer() // 再生速度を設定 var rate: Float = AVSpeechUtteranceDefaultSpeechRate // 言語を英語に設定 var voice = AVSpeechSynthesisVoice(language: "ja-JP") override init() { super.init() // delegateの設定 synthesizer.delegate = self } func playSpeech(_ text: String) { let utterance = AVSpeechUtterance(string: text) utterance.rate = rate utterance.voice = voice synthesizer.speak(utterance) } // 音声再生停止 func stopSpeech() { synthesizer.stopSpeaking(at: .immediate) } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2020/06/30 02:01

呼び出し方がわからないのでなんとも言えませんが、`再生するコントローラーと停止するコントローラーが違う場合に停止が出来なくなる`とのことですが、単純に考えると、syntesizerインスタンスが異なるからなのでは?
guest

回答1

0

ベストアンサー

再生するコントローラーと停止するコントローラーが違う場合に停止(synthesizer.stopSpeaking(at: .immediate)をしても)が出来なくなる現象が起こります

再生するコントローラーと停止するコントローラーで同じインスタンスを扱っていれば停止可能であると思います。

一例ですが、SpeechServiceをシングルトンクラスにすると、どのコントローラーからでも再生や停止などを自由に操作できるはずです。

Swift

1class SpeechService: NSObject, AVSpeechSynthesizerDelegate { 2 3 static let sharedInstance = SpeechService() <== 追加 4 5 var synthesizer = AVSpeechSynthesizer() 6 // 再生速度を設定 7 var rate: Float = AVSpeechUtteranceDefaultSpeechRate 8 // 言語を英語に設定 9 var voice = AVSpeechSynthesisVoice(language: "ja-JP") 10 11 private override init() { <== 変更 12 super.init() 13 // delegateの設定 14 synthesizer.delegate = self 15 } 16 17 // 省略 18} 19

呼び出すときは各コントローラーで

Swift

1let speechService = SpeechService.sharedInstance 2 3speachService.stopSpeech()

のように呼び出すと良いと思います。

見当違いでしたらすみません。

投稿2020/07/10 07:19

esepatisie

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AtsushiNakamura

2020/07/12 09:12

停止することが出来ました! あえりがとうございます!! すごく助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問