Как установить высоту звука в аудиофайле или записанном аудиофайле в iphone SDK?

Я записываю файл или у меня есть аудиофайл. Я хочу изменить высоту звука и воспроизвести аудиофайл. Как я могу установить высоту звука в программе iphone, которая использует target-c.

Пожалуйста, помогите мне выйти из этого.

Спасибо, Мадан Мохан.

3 ответа

Наивный подход заключается в воспроизведении с использованием другой частоты дискретизации по сравнению с частотой дискретизации, используемой для записи файла. Например, если файл был записан с Fs=44100 Гц, то воспроизведение его с Fs=22050 Гц даст вам половину исходного шага.

Конечно, этот наивный подход включает в себя изменение длительности файла и других артефактов, связанных со звуком. Если вам нужно что-то менее наивное, вам придется самостоятельно реализовать алгоритм смещения высоты тона, и это огромная тема - я предлагаю вам начать с поиска pitch shift в гугле.

Вы можете воспроизводить звук с измененной высотой звука, используя AVAudioEngine, AVAudioPlayerNode. Образец протестированного кода приведен ниже.

@interface ViewController (){

    AVAudioEngine *engine;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self playAudio];
}

-(void)playAudio{

    engine = [[AVAudioEngine alloc] init];
    NSString* path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"];
    NSURL *soundUrl = [NSURL fileURLWithPath:path];
    AVAudioFile* File = [[AVAudioFile alloc] initForReading: soundUrl error: nil];
    AVAudioPlayerNode* node = [AVAudioPlayerNode new];

    [node stop];
    [engine stop];
    [engine reset];
    [engine attachNode: node];
    AVAudioUnitTimePitch* changeAudioUnitTime = [AVAudioUnitTimePitch new];


    //change this rate variable to play fast or slow .         
    changeAudioUnitTime.rate = 1;

    //change pitch variable to according your requirement.
    changeAudioUnitTime.pitch = 100;
    [engine attachNode: changeAudioUnitTime];
    [engine connect:node to: changeAudioUnitTime format: nil];
    [engine connect:changeAudioUnitTime to: engine.outputNode format:nil];
    [node scheduleFile:File atTime: nil completionHandler: nil];
    [engine startAndReturnError: nil];
    [node play];


}

Убедитесь, что переменная пути имеет правильный путь к файлу

Примечание: этот код протестирован на реальном устройстве и работает нормально в моем проекте. Не забудьте добавить CoreAudio.framework, AVFoundation.framework.

You can use the soundtouch open source project to change pitch

Вот ссылка: http://www.surina.net/soundtouch/

После того, как вы добавите soundtouch в свой проект, вы должны указать путь к входному звуковому файлу, путь к выходному звуковому файлу и изменение высоты тона в качестве входных данных.

Так как обработка звука занимает больше времени, лучше изменить soundtouch так, чтобы при записи голоса непосредственно передавались данные для обработки. Это сделает ваше приложение лучше.

Рекомендации

Real-time Pitch Shifting on the iPhone

Create pitch changing code?

Другие вопросы по тегам