录制声音并以变化的音高播放

我必须实现一个iphone应用程序,当你开始说话时,它将logging用户的声音,并改变录制的声音的音调并播放。 我能够通过AVAudiorecorder的帮助录制声音的检测,并且使用Dirac库改变了录音的音调。 这种方法的问题是输出的声音很嘈杂。 我得到了使用SoundEngine的响应,但是我没有得到实现它的方法。 任何人都可以请解释我的任何其他方式来实现这一点?

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"); } } 

  1. 如何检测声音?
    我用一个教程帮助解决了我的第一个问题。这里有链接: http : //mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
    在这里,我们可以很容易地理解检测到一些噪音时的声音logging。

  2. 如何改变录制的声音的音调并播放。
    我改变声音的音调所面临的第二个问题。 由于我们只能在AVAudioRecorder的帮助下录制声音, AVAudioRecorder我们无法改变音高。
    为此,我使用了一个外部库DIRAC 。 这是Dirac图书馆的链接。
    这提出了一些示例项目(对于移动应用程序以及桌面应用程序)关于应用程序实现的dirac库。

另一种方式,我发现通过实施Cocoas2D,与狄拉克科科斯Denshion解决这个问题。 因为上述方法与我的申请不一致。 这里是实现这个的链接 (关于改变音高和播放录制的声音的示例项目)。

我发现另一个与录音有关的链接 。

其实有一个更简单的解决scheme。 使用audio播放器的速率function。 它的范围在0.1f – 2.0f之间,数字越大意味着速度越快,尖叫音高越低,数字越小意味着慢速拖出的声音(深沉的声音)

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