2013-12-16 13 views
17

Używam AVSpeechSynthesizer w mojej aplikacji i chcę zapisać mówiony tekst do pliku audio lub AVAset. Przeszedłem przez dokumenty Apple'a i nie widziałem nic poza stwierdzeniem, że chcę zadać pytanie. Poniżej znajduje się mój obecny kod.Wypis AVSpeechSynthesizer do pliku audio

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

To API jest nowe, więc może brakować pewnych funkcji, które mogą zostać dodane później. Może zagłębić się w sposób nagrywania dowolnego odtwarzanego dźwięku? – erdekhayser

+0

Tak, już ustawiłem AVAudioRecoder już, ale chciałem tylko sprawdzić, czy było czystsze rozwiązanie. – Sean

+0

Czy znalazłeś odpowiednie rozwiązanie dla tego problemu? Szukam czegoś podobnego. –

Odpowiedz

4

Możliwe jest nagrywanie dźwięku generowane przez aplikacji (nie z innych aplikacji). Chociaż AVSpeech nie zapewnia interfejsu API do zapisywania wygenerowanego dźwięku, Apple ma inne interfejsy API, które mogą wykonać to zadanie. Rozwiązanie prawdopodobnie nie jest tak czyste, jak byś chciał, ale powinno działać.

Firma Apple udostępnia strukturę o nazwie Audio Unit Framework do zarządzania zaawansowanym przetwarzaniem i nagrywaniem dźwięku. Jest to jedyne środowisko w SDK iOS (według mojej wiedzy), które może jednocześnie odtwarzać i nagrywać dźwięk. Model Audio Unit Hosting Guide wygląda obiecująco, podobnie jak wersja Audio Mixer Sample App.

Uwaga: Nie próbowałem używać Audio Unit Framework z AVSpeechSynthesizer (może, ale nie musi działać). Jednakże, biorąc pod uwagę, że AVSpeechSynthesizer gra dobrze z CoreAudio, to najprawdopodobniej będzie działało z AudioUnits.


Jeśli powyższe rozwiązanie nie działa, proste rozwiązanie może pomóc. AVSpeechSynthesizer nie wymaga żadnego połączenia sieciowego w celu prawidłowego działania, więc w wielu przypadkach nie trzeba potrzebujesz, aby zapisać dźwięk. Zamiast tego można zapisać tekst do późniejszego korzystania 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]; 

Gdy jesteś gotowy do syntezy tekstu, tylko czytać z pliku i podłącz go z powrotem do AVSpeechSynthesizer. Rozumiem, że to rozwiązanie nie zadziała lub nie będzie stosowane we wszystkich przypadkach (np. Jeśli musisz wysłać plik dźwiękowy do kogoś).


To tylko kilka z możliwych rozwiązań tego problemu, które stanowią obejście problemu i mogą, ale nie muszą, działać w zależności od konkretnego scenariusza. YMMV. Powodzenia!

+0

Pierwsza część odpowiedzi Sam jest dobra - Apple zapewnia zasoby do używania Audio Unit i kolejki przetwarzania dźwięku do manipulowania, nagrywania i odtwarzania dźwięku, jednak jest to bardzo skomplikowane w użyciu i może być więcej czasu, niż jesteś gotów zainwestować. Jeśli jednak uważasz, że jest to jedyna opcja, powinieneś zajrzeć do The Amazing Audio Engine, który zapewnia łatwiejszy w użyciu interfejs do frameworka Core Audio firmy Apple. [Amazing Audio Engine Website] (http://theamazingaudioengine.com/) – themantalope