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");
}
}
y no el uso de u Dirac jugador para jugar ese sonido cambiado de tono ??/ –
ya he usado el reproductor Dirac en esto. –
¿Puedes decirme si el reproductor Dirac no es eficiente para reproducir ese sonido de tono modificado? –