尝试在使用 SpeechKit 进行语音识别之前播放系统声音

Posted

技术标签:

【中文标题】尝试在使用 SpeechKit 进行语音识别之前播放系统声音【英文标题】:Trying to play system sound before speech recognition with SpeechKit 【发布时间】:2016-05-18 00:08:12 【问题描述】:

我正在尝试在 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 代码移动到某种类型的回调或闭包中,但不知道如何构造它。

【问题讨论】:

AudioServicesPlaySystemSound know when sound stopped的可能重复 你可以使用AudioServicesAddSystemSoundCompletion 【参考方案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
     

【讨论】:

以上是关于尝试在使用 SpeechKit 进行语音识别之前播放系统声音的主要内容,如果未能解决你的问题,请参考以下文章

第1年5月19日 AVFoundation 文本转语音 Speech Kit实现语音识别

Zephyr下使用TFLite进行语音识别

iOS音频问题通用配置

使用 AVAudioEngine 进行语音识别会在录制后阻止声音

语音识别系列︱利用达摩院ModelScope进行语音识别+标点修复

语音识别系列︱利用达摩院ModelScope进行语音识别+标点修复