Подтвердить что ты не робот

Вывод AVSpeechSynthesizer в аудиофайл

Я использую AVSpeechSynthesizer в своем приложении, и я хочу сохранить устный текст в аудиофайл или AVAsset. Я прошел через документы Apple и ничего не видел, но решил, что поставил бы вопрос, чтобы убедиться. Ниже мой текущий код.

AVSpeechUtterance * utterance = [AVSpeechUtterance speechUtteranceWithString:textView.text];
float rate = [speedSlider value]/1.5;
utterance.rate =  rate;
[speechSynthesizer speakUtterance:utterance];
4b9b3361

Ответ 1

Можно записывать аудио, созданные вашим приложением (не из других приложений). Хотя AVSpeech не предоставляет API для сохранения сгенерированного звука, Apple имеет другие API, которые могут выполнять эту работу. Решение, вероятно, не так чисто, как вам бы хотелось, но оно должно работать.

Apple предоставляет инфраструктуру, называемую Audio Unit Framework для управления расширенной обработкой и записью звука. Это единственная платформа в SDK iOS (насколько мне известно), которая может воспроизводить и записывать аудио одновременно. Руководство по размещению аудиоустройств выглядит многообещающим, а также приложение Audio Mixer Sample App.

Примечание. Я не пробовал использовать Audio Unit Framework с AVSpeechSynthesizer (может работать или не работать). Однако, учитывая, что AVSpeechSynthesizer отлично работает с CoreAudio, более вероятно, что он будет работать с AudioUnits.


Если вышеупомянутое решение не работает, то простой способ обхода может сделать трюк. AVSpeechSynthesizer не требует какого-либо сетевого подключения для правильной работы, поэтому во многих случаях вам может не понадобиться сохранять аудио. Вместо этого вы можете сохранить текст для последующего использования с помощью NSFileManager:

NSString *textToSynthesize = @"Just what do you think you are doing, Dave?";

NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths firstObject];

[textToSynthesize writeToFile:[documentsDirectory stringByAppendingPathComponent:@"synthText.txt"] atomically:YES encoding:NSUTF8StringEncoding error:&error];

Когда вы будете готовы синтезировать текст, просто прочитайте его из файла и подключите обратно к AVSpeechSynthesizer. Я понимаю, что это решение не будет работать или применяться во всех случаях (например, если вам нужно отправить аудиофайл кому-то).


Это всего лишь несколько возможных решений проблемы, оба из которых являются обходными решениями и могут работать или не работать в зависимости от вашего конкретного сценария. YMMV. Удачи!