Вопрос по ios, iphone – Запишите звук и воспроизведите его с измененным тоном

5

Мне нужно реализовать приложение для iphone, которое будет записывать голос пользователя, когда вы начинаете говорить, изменять высоту записанного звука и воспроизводить его. Я могу записать звук при обнаружении звука с помощью AVAudiorecorder, и с помощью библиотеки Dirac я изменил высоту записанного звука. Проблема с этим подходом состоит в том, что выходной звук достаточно шумный. Я получил ответ об использовании SoundEngine, но не смог реализовать его. Может кто-нибудь объяснить, пожалуйста, о каком-либо другом способе реализации этого?

<code>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");
    }
}
</code>
когда вы записываете звук, то этот записанный звук также состоит из этого шумного звука? Nikhil Bansal
Можете ли вы сказать мне, не является ли проигрыватель Dirac неэффективным для воспроизведения измененного звука? Nikhil Bansal
по той причине, что записанный звук не должен иметь шум хррр хррр Nikhil Bansal
[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord error: & err]; ты используешь это ?? Nikhil Bansal
[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord error: & err]; используйте эту строку также во время записи аудио Nikhil Bansal

Ваш Ответ

2   ответа
2
  1. How to detect the sound?
    I solved my first problem with the help of a tutorial..here is the link for this, link: http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
    Here we can easily understand the recording of the sound on detection of some noise.

  2. How to change the pitch of the recorded sound and play back.
    Second problem I faced in changing the pitch of the sound. As we can only record the sound with the help of AVAudioRecorder we can’t alter the pitch by that.
    For this purpose I used an external library DIRAC. Here is the link for the Dirac library.
    This comes up with some sample project (for mobile apps as well as desktop apps)about the implementation of the dirac library to the application.

Я нашел другой способ решения этой проблемы, применив Cocoas2D, Cocos Denshion с Dirac. Поскольку вышеупомянутый процесс не работал хорошо с моим заявлением. Вот ссылка для реализации этого (пример проекта об изменении высоты звука и воспроизведения записанного звука).

я нашелдругая ссылка связанные с записью звука.

Error: User Rate Limit Exceededmobileorchard.com/…Error: User Rate Limit Exceeded Alok SInha
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

На самом деле есть более простое решение. Используйте функцию оценки аудио проигрывателя. Он колеблется в диапазоне от 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];
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы