2009-04-28 8 views
18

私は、ユーザーがiPhoneのマイクに吹いているときを検出しようとしています。今私はNSTimerにiPhoneマイクの吹き出しを検出していますか?

if ([[SCListener sharedListener] peakPower] > 0.99) 

を呼び出すためにStephen CelisからSCListenerクラスを使用しています。しかし、これは私が吹いていないときに時々真実を返します。ユーザーがマイクに吹き込んでいるかどうかを確認するためのサンプルコードがありますか?

+4

多分風が吹いています。 :)申し訳ありませんが、この質問は私を笑わせました。 –

+0

Hah、nah。私が内部にいても、単に画面をタップすると機能が起動します –

答えて

25

まず電源信号を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 
+0

音量レベルがしきい値を超えても録音を停止できますか?つまり、ボップアプリを持っていれば、消防車のサイレンが会話に轟音を上げたくないのですが、スレッショルドを超えるとマイクを一時停止できますか? –

11

使用からの応答がない:素晴らしく、簡単なローパスフィルタはこのようなものになるだろう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;** 
    } 
} 
+0

ここで、コード内でlowPassResultsを設定していますか? – user513790

+0

今、あなたはlowPassResultsを見ることができます。それはちょうど整列していませんでした。申し訳ありません:) –

+0

+1良い答えshashank –

13

は、あなたはそれが私のために正常に動作して、これを試してみてください[レコーダーprepareToRecorder]

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
+3

これは私にとってうまくいきました。 – slaveCoder

+2

私はこの情報を3時間探していました。それは今働く! – bpolat

+0

ああ、神に感謝する –

2

後に次のコードを追加する必要があります。ありがとう@神華遼

- (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]; 
} 
} 
関連する問題