

Swift4.2での質問です。  
SFSpeechRecognizerとAVSpeechSynthesizerを一つのアプリで使うとき、  
例えばRecognizeViewControllerで音声認識を行い、SpeechViewControllerのspeechButtonで音声読み上げを行うよう組んだのですが、Thread
1: signal
SIGABRTのエラーが出てしまい困っているので質問させていただきます。<https://qiita.com/croquette0212/items/bf0e41ca1b65c6d320b4>  
この記事を読み、AVSessionのsetCategoryによる使い分けを行えばよいと思い、  
音声認識処理では録音処理のメソッドに

[code]

    private func startRecording() throws {
        //ここに録音する処理を記述
        if let recognitionTask = recognitionTask {
            //リセット処理
            recognitionTask.cancel()
            self.recognitionTask = nil
            let audioSession = AVAudioSession.sharedInstance()
            try audioSession.setCategory(AVAudioSession.Category.record, mode: .default)
            try audioSession.setMode(AVAudioSession.Mode.measurement)
            try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
        }
    }
    
[/code]

と書き、 SpeechViewControllerの方には

[code]

    var talker = AVSpeechSynthesizer()
    
    override func viewDidLoad() {
        //speechButtonの生成処理
        speechButton.addTarget(resultCardView, action: #selector(speachButtonTapped(sender: )), for: .touchUpInside 
    }
    
    @objc func speachButtonTapped(sender: Any) {
        let avSession = AVAudioSession.sharedInstance()
        try? avSession.setCategory(AVAudioSession.Category.ambient, mode: .default, options: .mixWithOthers)
        let utterance = AVSpeechUtterance(string:self.Jplabel.text!)
        utterance.voice = AVSpeechSynthesisVoice(language: "en-En")
        utterance.volume = 1.2
        // 実行
        self.talker.speak(utterance)
    }
    
[/code]

このように記述したのですが、Thread 1: signal SIGABRTとなってしまいました。  
わかる方がいましたら、お願いいたします。


CC BY-SA 4.0
2018-12-13T10:52:39.980
51181
2021-01-08T07:03:55.373
2018-12-13T11:55:37.427
76
30215
question
swift ios iphone swift4
SwiftでSFSpeechRecognizerとAVSpeechSynthesizerを一つのアプリで行うときのエラー回避方法


`class`宣言と`func`宣言の間に、`var
speechButton:UIButton!`（`!`又は`?`）がないため、`speechButton`に格納されているインスタンスが`viewDidLoad()`を抜けると解放されてしまうからではないでしょうか？

[code]

    var talker = AVSpeechSynthesizer()
    
[/code]

の、次の行に

[code]

    var speechButton:UIButton!
    
[/code]

を追加し、`speechButton`をクラスのメンバー変数にしてあげ、`viewDidLoad()`の中の`speechButton`の宣言部(`let
speechButton`の`let`)を削れば、クラス（のインスタンス）が存在している間は`speechButton`のインスタンスも保持されるので動くようになると思います。

もう一点、

[code]

    utterance.voice = AVSpeechSynthesisVoice(language: "en-En")
    
[/code]

と、ありますが、`language`には、`en-EN`というコードはなく、  
`en-US`(アメリカ)、`en-GB`（イギリス）、`en-AU`(オーストラリア）、`en-IE`（アイルランド）、`en-
ZA`（南アフリカ）のいずれかを指定する必要があると思います。

また、`setCategory`ですが、`option:`の引数は`[]`となっているので、

[code]

    try? avSession.setCategory(AVAudioSession.Category.ambient, mode: .default, options: [.mixWithOthers])
    
[/code]

ではないでしょうか？


CC BY-SA 4.0
2018-12-13T11:09:46.710
51182
2018-12-13T12:56:52.330
2018-12-13T12:56:52.330
14745
14745
51181
answer