reparar por microfono limpiar hablo graba funciona frontal escuchan cuando activar iphone

microfono - no me escuchan cuando hablo por mi iphone 7



¿Detectando soplar en el micrófono del iPhone? (5)

Intenta esto, está funcionando bien para mí. Gracias @jinhua liao

- (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]; } }

Estoy tratando de detectar cuándo el usuario está soplando en el micrófono de un iPhone. Ahora mismo estoy usando la clase SCListener de Stephen Celis para llamar

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

en un NSTimer. Sin embargo, esto devuelve cierto a veces cuando no estoy soplando. ¿Alguien tiene algún código de muestra para verificar si el usuario está soplando en el micrófono?


Recomendaría primero el filtrado de paso bajo de la señal de potencia. Siempre habrá una cantidad de ruido transitorio que afectará las lecturas instantáneas; El filtrado de paso bajo ayuda a mitigar eso. Un filtro de paso bajo agradable y fácil sería algo como esto:

// 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


Utilice return como lowPassResults es mayor que 0.55. Esto está funcionando bien:

-(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;** } }


cuando se ejecuta en iPhone, debe agregar el siguiente código después de [recorder prepareToRecorder]

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