5

話し始めるとユーザーの声を録音し、録音した音の高さを変えて再生するiPhoneアプリケーションを実装する必要があります。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");
    }
}
4

2 に答える 2

2
  1. 音を検出する方法は?
    私はチュートリアルの助けを借りて私の最初の問題を解決しました..これへのリンクはここにあります、リンク:http: //mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
    ここにノイズを検出すると、録音を簡単に理解できます。

  2. 録音した音の高さを変えて再生する方法。
    音の高さを変える際に直面した2番目の問題。私たちは助けを借りてのみ音を録音することAVAudioRecorderができるので、それによってピッチを変えることはできません。
    この目的のために、私は外部ライブラリDIRACを使用しました。 これがDiracライブラリへのリンクです。
    これにより、アプリケーションへのdiracライブラリの実装に関するサンプルプロジェクト(モバイルアプリおよびデスクトップアプリ用)が作成されます。

Cocoas2D、Cocos Denshion with Diracを実装することで、この問題を解決する別の方法を見つけました。上記のプロセスが私のアプリケーションでうまく機能していなかったためです。 これを実装するためのリンクは次のとおりです(ピッチの変更と録音されたサウンドの再生に関するサンプルプロジェクト)。

録音に関連する別のリンクを見つけました。

于 2012-06-26T08:35:49.370 に答える
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];
于 2013-06-07T15:06:36.263 に答える