Обнаружить удар в микрофон - PullRequest

Ответы [ 3 ]

4 голосов
/ 18 мая 2011

API уровня звука AVAudioRecorder не предназначен для получения надежных результатов в отделении звуков от других звуков, полученных микрофоном.

Я предлагаю использовать Audio Queue или Audio Unit RemoteIO API, измеряяСреднеквадратичная энергия сигнала, длительность огибающей, а затем использование библиотеки Accelerate FFT для проверки спектра на наличие широкополосного шума в сравнении с пиками, которые могут предполагать озвучивание разговора, а не передачу.чем 1 вызов ОС.

2 голосов
/ 23 января 2013
Use return as you get first lowpass results >0.55

I have solve the issue have a look.

-(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])); lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; //NSLog(@"lowPassResults= %f",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 голосов
/ 18 мая 2011

Я добился хорошего успеха, используя AudioQueueGetProperty () для kAudioQueueProperty_CurrentLevelMeter.

...