1

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

4

2 回答 2

3

我以前使用过 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
    }
}

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

于 2012-10-19T00:33:53.023 回答
0

我有 bbodayle 推荐的类似实现,它确实有效。一些好的阈值是 0.4,这意味着带有一些远程背景噪音的静音。

于 2012-10-24T22:16:40.783 回答