私は、ユーザーがiPhoneのマイクに吹いているときを検出しようとしています。今私はNSTimerにiPhoneマイクの吹き出しを検出していますか?
if ([[SCListener sharedListener] peakPower] > 0.99)
を呼び出すためにStephen CelisからSCListenerクラスを使用しています。しかし、これは私が吹いていないときに時々真実を返します。ユーザーがマイクに吹き込んでいるかどうかを確認するためのサンプルコードがありますか?
私は、ユーザーがiPhoneのマイクに吹いているときを検出しようとしています。今私はNSTimerにiPhoneマイクの吹き出しを検出していますか?
if ([[SCListener sharedListener] peakPower] > 0.99)
を呼び出すためにStephen CelisからSCListenerクラスを使用しています。しかし、これは私が吹いていないときに時々真実を返します。ユーザーがマイクに吹き込んでいるかどうかを確認するためのサンプルコードがありますか?
まず電源信号をlow-pass filteringとお勧めします。瞬間的な測定値を混乱させるような、一時的なノイズが常に存在します。ローパスフィルタリングはそれを緩和するのに役立ちます。
// Make this a global variable, or a member of your class:
double micPower = 0.0;
// Tweak this value to your liking (must be between 0 and 1)
const double ALPHA = 0.05;
// Do this every 'tick' of your application (e.g. every 1/30 of a second)
double instantaneousPower = [[SCListener sharedListener] peakPower];
// This is the key line in computing the low-pass filtered value
micPower = ALPHA * instantaneousPower + (1.0 - ALPHA) * micPower;
if(micPower > THRESHOLD) // 0.99, in your example
// User is blowing on the microphone
音量レベルがしきい値を超えても録音を停止できますか?つまり、ボップアプリを持っていれば、消防車のサイレンが会話に轟音を上げたくないのですが、スレッショルドを超えるとマイクを一時停止できますか? –
http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
このチュートリアルでは、シミュレータで正常に動作しますが、そのiphoneで動作していないiPhoneのマイク
使用からの応答がない:素晴らしく、簡単なローパスフィルタはこのようなものになるだろうlowPassResults
が0.55より大きいと返します。これは正常に動作している:iPhone上で実行した場合
-(void)readyToBlow1 { NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.01 target: self selector: @selector(levelTimerCallback1:) userInfo: nil repeats: YES];
} else
NSLog(@"%@",[error description]);
}
-(void)levelTimerCallback1:(NSTimer *)timer { [recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
double lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
if (lowPassResults > 0.55) {
lowPassResults = 0.0;
[self invalidateTimers];
NextPhase *objNextView =[[NextPhase alloc]init];
[UIView transitionFromView:self.view
toView:objNextView.view
duration:2.0
options:UIViewAnimationOptionTransitionCurlUp
completion:^(BOOL finished) {}
];
[self.navigationController pushViewController:objNextView animated:NO];
**return;**
}
}
ここで、コード内でlowPassResultsを設定していますか? – user513790
今、あなたはlowPassResultsを見ることができます。それはちょうど整列していませんでした。申し訳ありません:) –
+1良い答えshashank –
は、あなたはそれが私のために正常に動作して、これを試してみてください[レコーダーprepareToRecorder]
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
後に次のコードを追加する必要があります。ありがとう@神華遼
- (void)viewDidLoad {
[super viewDidLoad];
lowPassResults = 0.0;
[self readyToBlow1];
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
} else
NSLog([error description]);
}
- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
NSLog(@"lowpassResult is %f",lowPassResults);
if (lowPassResults > 0.95){
NSLog(@"Mic blow detected");
[levelTimer invalidate];
}
}
多分風が吹いています。 :)申し訳ありませんが、この質問は私を笑わせました。 –
Hah、nah。私が内部にいても、単に画面をタップすると機能が起動します –