2012-05-11 14 views
5

tengo para implementar una aplicación de iPhone que registrará la voz del usuario a medida que empieza a hablar, y cambiar el tono del sonido grabado y reproducirlo. Puedo grabar el audio en la detección del sonido con la ayuda de AVAudiorecorder, y al usar la biblioteca Dirac, he cambiado el tono del sonido grabado. El problema con este enfoque es que el sonido de salida es lo suficientemente ruidoso. Recibí la respuesta por usar SoundEngine, pero no encontré la manera de implementarlo. ¿Alguien puede por favor explicarme sobre cualquier otra forma de implementar esto?Grabar el sonido y reproducirlo con cambiada de tono

my code// 
     -(void)initialSetup 
    { 
     count=0; 
     silenceTime=0; 

    //[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error: nil]; 
    recordSetting = [[NSMutableDictionary alloc] init]; 
    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatAppleLossless] forKey:AVFormatIDKey]; 
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 
    recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"%.0f.%@",[NSDate timeIntervalSinceReferenceDate]*1000.0,     @"caf"]]]; 
    recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error]; 
    //recorder = [[ AVAudioRecorder alloc] init]; 
    [recorder setDelegate:self]; 
    [recorder updateMeters]; 
    [recorder prepareToRecord]; 
    //[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: nil]; 
    //In Order To Move Sound To The Speaker 
    //UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
    //AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof(audioRouteOverride),&audioRouteOverride); 

    NSArray *dirPaths; 
    NSString *docsDir; 
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = [dirPaths objectAtIndex:0]; 
    NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"audio.caf"]; 
    recordedTmpFile1 = [NSURL fileURLWithPath:soundFilePath]; 

    recordSetting1 = [[NSMutableDictionary alloc] init]; 
    recordSetting1 = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithInt:AVAudioQualityMin],AVEncoderAudioQualityKey, 
         //[NSNumber numberWithInt:kAudioFormatAppleIMA4],AVFormatIDKey, 
         [NSNumber numberWithInt:16], 
         AVEncoderBitRateKey, 
         [NSNumber numberWithInt: 2], 
         AVNumberOfChannelsKey, 
         [NSNumber numberWithFloat:44100.0], 
         AVSampleRateKey,nil]; 
    recorder1 = [[AVAudioRecorder alloc] initWithURL:recordedTmpFile1 settings:recordSetting1 error:&error]; 
    [recorder1 prepareToRecord]; 
    [recorder1 setDelegate:self]; 
    if(recorder) 
    { 
     recorder.meteringEnabled = YES; 
     [recorder record]; 
     double val=[recorder peakPowerForChannel:0]; 
     NSLog(@"The Very First Value Of The Recorder Is=%f",val); 
     levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.4 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES]; 
    } 
    else 
    { 
     NSLog(@"error in initilising of the recorder=%@",[error localizedDescription]); 
    } 
} 


-(void)levelTimerCallback:(NSTimer *)timer      
{ 
    [recorder updateMeters]; 
    const double ALPHA = 0.05; 
    //NOISE FILERATION ALGORITHMS 
    double peakPowerForChannel = pow(10,(0.05 *[recorder peakPowerForChannel:0])); 
    double audioMonitorResults1 = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * audioMonitorResults1; 
    double audioMonitorResults; 
    audioMonitorResults= [recorder peakPowerForChannel:0]; 
    NSLog(@"This time only frequency is==>%f",audioMonitorResults1); 
    //if (audioMonitorResults1 >0.020) 
    if(audioMonitorResults1 > .05)//the value of audioMonitorResults may be equal to -10 for device 
    { 

     [recorder1 updateMeters]; 
     recorder1.meteringEnabled=YES; 
     //recorder.meteringEnabled=YES; 
     [recorder1 record]; 
     NSLog(@"SOUND IS DETECTED"); 
     NSLog(@"%f",[recorder1 peakPowerForChannel:0]); 
     NSLog(@"Recording is going on"); 
     count=1; 
     silenceTime=0; 

    } 
    else 
    { 

     NSLog(@"NO SOUND IS DETECTED"); 
     silenceTime=silenceTime+0.3; 
     if(count==1 && silenceTime>1) 
     { 

      [levelTimer invalidate]; 
      [recorder1 stop]; 

     } 

    } 

} 
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag 
{ 
    NSLog(@"Recorder stop delegate is processing"); 
    if(flag) 
    { 
     NSLog(@"Player has finished successfully"); 
     [self playRecording]; 
    } 
    else 
    { 
     NSLog(@"problem in recording.......not recorded"); 
    } 
} 
+0

y no el uso de u Dirac jugador para jugar ese sonido cambiado de tono ??/ –

+0

ya he usado el reproductor Dirac en esto. –

+1

¿Puedes decirme si el reproductor Dirac no es eficiente para reproducir ese sonido de tono modificado? –

Respuesta

2
  1. Cómo detectar el sonido?
    He resuelto mi primer problema con la ayuda de un tutorial ... aquí está el enlace, link: http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
    Aquí podemos entender fácilmente la grabación del sonido cuando se detecta algún ruido.

  2. cómo cambiar el tono del sonido grabado y reproduzca.
    Segundo problema al que me enfrenté al cambiar el tono del sonido. Como solo podemos grabar el sonido con la ayuda de AVAudioRecorder, no podemos alterar el tono con eso.
    Para esto he utilizado una biblioteca externa DIRAC. Here is the link for the Dirac library.
    Esto viene a colación con algún proyecto de ejemplo (para aplicaciones móviles, así como aplicaciones de escritorio) sobre la aplicación de la biblioteca de Dirac a la aplicación.

Otra forma que he encontrado para resolver este problema fue la implementación de Cocoas2D, Cocos Denshion con Dirac. Porque el proceso anterior no funcionaba bien con mi aplicación. Here is the link for implementing this (un proyecto de ejemplo sobre cómo cambiar el tono y reproducir el sonido grabado).

He encontrado another link relacionado con la grabación de sonido.

+0

¿Cómo se las arregló para detectar el sonido y grabar? sin demora al comienzo del registro? –

+1

enlace: http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/ detectará la frecuencia y luego comenzará la grabación. Y por favor vote la pregunta para que el otro también pueda ver es –

+0

Tengo un ligero retraso cortando la primera parte de la primera letra. Lo resolví ejecutando dos grabadoras y alternando, de modo que cuando el monitor detectaba el sonido requerido ya estaba grabando. –

1

En realidad no es una solución más fácil. Use la función de velocidad del reproductor de audio. Oscila entre 0.1f - 2.0f donde el medio más rápido y mayor número de tono squeekier y menor número significa lenta arrastró fuera de sonido (voz grave)

player = [[AVAudioPlayer alloc] initWithContentsOfURL: 
        [NSURL fileURLWithPath:path] error:&err]; 
     player.volume = 0.4f; 
     player.enableRate=YES; 
     [player prepareToPlay]; 
     [player setNumberOfLoops:0]; 
     player.rate=2.0f; 
     [player play]; 
+1

La velocidad es diferente de la afinación ... – Idan

+0

Este código se usa para aumentar la velocidad de la voz, no para el tono (como karoke) –

Cuestiones relacionadas