使用AVSpeechSynthesizer在文本到语音中崩溃

时间:2018-03-30 14:52:57

标签: avspeechsynthesizer

我的新闻应用程序中有一个文本到语音功能,我的用户用它来朗读新闻文章。为此,我使用了AVSpeechSynthesizer。我在我的实时应用程序中看到了很多崩溃,在Crashlytics上显示。通过XCode运行应用程序时,我也无法在测试设置中重现此崩溃,也无法在iPhone上使用实时应用程序。我在这里附上Crashlytics堆栈跟踪:

#16
Crashed: AXSpeech
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x000041a1b76ca3c1

Crashed: AXSpeech
0  libsystem_pthread.dylib        0x1860ff764 pthread_mutex_lock$VARIANT$mp + 354
1  CoreFoundation                 0x18639793c CFRunLoopSourceSignal + 68
2  Foundation                     0x186de00c4 performQueueDequeue + 464
3  Foundation                     0x186ecf218 __NSThreadPerformPerform + 136
4  CoreFoundation                 0x18647b77c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
5  CoreFoundation                 0x18647b6fc __CFRunLoopDoSource0 + 88
6  CoreFoundation                 0x18647afd8 __CFRunLoopDoSources0 + 288
7  CoreFoundation                 0x186478b5c __CFRunLoopRun + 1048
8  CoreFoundation                 0x186398c58 CFRunLoopRunSpecific + 436
9  Foundation                     0x186dcd594 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
10 libAXSpeechManager.dylib       0x195ccf854 -[AXSpeechThread main] + 284
11 Foundation                     0x186ecf0f4 __NSThread__start__ + 996
12 libsystem_pthread.dylib        0x1860fc2b4 _pthread_body + 308
13 libsystem_pthread.dylib        0x1860fc180 _pthread_body + 310
14 libsystem_pthread.dylib        0x1860fab74 thread_start + 4

很明显,AXSpeech线程崩溃了。有人可以帮我这个,因为我一直在拉我的头发无济于事,无崩溃用户的下降百分比一直困扰着我。

1 个答案:

答案 0 :(得分:0)

我的应用与AVSpeechSynthesizer存在同样的问题。 Crashlytics显示当应用程序尝试在主线程中初始化AVSpeechSynthesizer时会发生这种情况。崩溃发生在与您的堆栈跟踪相同的其他线程中。这是主线程的堆栈跟踪。似乎问题可能与共享音频会话有关。希望这会以某种方式帮助你。

class vc1: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView = UITableView()
    let options: [Int] = [1,2]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return options.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vc = vc2()

        //Not sure where to put the setup to be honest
        //option 1:
        vc.setupTableView(forCell: indexPath.item)
        present(vc, animated: true) {
            //option 2:
            vc.setupTableView(forCell: indexPath.item)
        }
    }
}

class vc2: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView = UITableView()
    var selectedCell: Int!
    //Having an nested array in an array will solve this custom "page" you are looking for
    let results: [[String]] = [["test1", "test2"], ["test3", "test4"]]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

    func setupTableView(forCell cell: Int) {
        selectedCell = cell
        tableView.reloadData()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return results[selectedCell].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel = results[selectedCell][indexPath.item]
        return UITableViewCell()
    }
}