ユーザーがボタンをクリックしたときにユーザーからの音声を検出するために、NuanceのSpeechKit(具体的にはSKRecognizerクラス)を使用しています。ただし、あらかじめ決められた時間(3秒程度)以内に何も話さない場合は、録音セッションをキャンセルしたいと思います。init関数で「SKShortEndOfSpeechDetection」を渡すと、うまくいかないようです。ユーザーがすでに何かを話している場合にのみ、録音が停止します。これを達成する他の方法はありますか?
2 に答える
私は以前にNuanceのSpeechKitを使用しましたが、残念ながらいくつか不足しているものがあり、これがその1つであることを覚えています。
OpenEarsと呼ばれるiOS用の完全に無料のオープンソース音声フレームワークを使用してみることができます。
ただし、それでも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
}
}
適切なしきい値を見つけるには、ある程度の実験が必要です。この方法を使用すると、ユーザーが話したかどうかを追跡し、別のタイマーを使用して、事前に決められたカットオフ時間より前に話したかどうかを確認する必要があります。
私はbbodayleが推奨するのと同様の実装を持っていますが、それは機能します。いくつかの適切なしきい値は.4です。これは、リモートのバックグラウンドノイズを伴う無音を意味します。