Попытка воспроизвести системный звук до распознавания речи с SpeechKit

Я пытаюсь реализовать распознавание голоса в приложении iOS Swift. Когда пользователь нажимает кнопку "микрофон", я пытаюсь воспроизвести системный звук, а затем использую SpeechKit для распознавания голоса. Распознавание голоса работает нормально, а звук воспроизводится нормально, если я закомментирую код SpeechKit. Однако, когда я соединяю их, у меня нет звука. Кроме того, я не получаю звук в конце, после завершения распознавания речи.

Вот код:

@IBAction func listenButtonTapped(sender: UIBarButtonItem) {
    let systemSoundID: SystemSoundID = 1113
    AudioServicesPlaySystemSound (systemSoundID)

    let session = SKSession(URL: NSURL(string: "nmsps://{my Nuance key}@sslsandbox.nmdp.nuancemobility.net:443"), appToken: "{my Nuance token}")

    session.recognizeWithType(SKTransactionSpeechTypeDictation,
                          detection: .Long,
                          language: "eng-USA",
                          delegate: self)
}

func transaction(transaction: SKTransaction!, didReceiveRecognition recognition: SKRecognition!) {
    var speechString = recognition.text
    print(speechString!)

    let systemSoundID: SystemSoundID = 1114
    AudioServicesPlaySystemSound (systemSoundID)
}

В любом случае, распознавание голоса всегда работает нормально. Если я это закомментирую, то звук системы звучит нормально.

например, при каждом нажатии на кнопку звук будет воспроизводиться нормально:

@IBAction func listenButtonTapped(sender: UIBarButtonItem) {
    let systemSoundID: SystemSoundID = 1113
    AudioServicesPlaySystemSound (systemSoundID)
}

Я пробовал разные очереди без успеха. Я думаю, что мне нужно переместить код SpeechKit к обратному вызову или закрытию некоторого типа, но я не уверен, как это сконструировать.

1 ответ

Решение этой проблемы описано здесь https://developer.apple.com/documentation/audiotoolbox/1405202-audioservicesplayalertsound

SpeechKit добавляет категорию записи в AVSession, чтобы звуки больше не воспроизводились. Что вы хотите сделать, это:

    let systemSoundID: SystemSoundID = 1113

    //Change from record mode to play mode
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
    } catch let error as NSError {
        print("Error \(error)")
    }
    AudioServicesPlaySystemSoundWithCompletion(systemSoundID) {
        //do the recognition
    } 
Другие вопросы по тегам