我使用Nuance的SpeechKit(特别是SKRecognizer类)来检测用户单击按钮时的语音。但是,如果他们在预定的时间内(3秒左右)没有说话,我想取消录音。在init函数中传递“SKShortEndOfSpeechDetection”似乎并没有解决问题,只有在用户已经说过什么时,它才会停止录制。还有其他方法可以做到这一点吗?

最佳答案

我之前使用过Nuance的SpeechKit,不幸的是它缺少一些东西,我记得这是其中之一。

您可以尝试使用iOS的完全免费的开源语音框架OpenEars

但是,如果您仍要尝试使用SpeechKit,则可以看到的唯一方法是监视audioLevel上的SKRecognizer属性,以完成所需的操作。根据SpeechKit Docs,此属性描述:

录制期间最新音频的平均功率。

我已经检查过了,它不兼容KVO,所以您不能简单地添加观察者来监视它的变化。要监视此变化,您只需添加一个NSTimer即可经常检查该值。

NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(monitorAudioLevel:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

...
-(void)monitorAudioLevel:(NSTimer *)timer {

    float audioLevel = speechRecognizer.audioLevel;

    NSLog(@"level: %f", audioLevel);

    if(audioLevel > THRESHOLD) {
        //user has spoken
        [timer invalidate];
    }
    else {
        //user has not spoken
    }
}

需要进行一些实验才能找到合适的阈值。使用这种方法,您只需要跟踪用户是否讲话,然后使用另一个计时器来查看他们是否在您预定的截止时间之前讲话。

09-05 10:04