Как я могу позволить TTS записывать файлы в каталоги моего приложения? - PullRequest
2 голосов
/ 20 августа 2011

Я хочу записать вывод из движка TextToSpeech в каталог кэша моего приложения. Для того, чтобы TTS мог писать там, я сначала должен дать ему разрешение на это. Но я не знаю как. Я понимаю, что обычно такие проблемы могут быть решены путем передачи FileDescriptor, что дает права доступа к конкретному файлу. Но я не могу сделать это с TTS, так как метод TextToSpeech.synthesizeToFile принимает только путь к файлу в виде строки, но не FileDescriptor. Так что же делать?

Чтобы подчеркнуть, что у TTS действительно нет прав на запись в каталоги моего приложения, вот код ...:

TextToSpeech mTts = new new TextToSpeech(context, this);
mTts.synthesizeToFile(text, null, getCacheDir() + "/" + "speech.wav");

И журнал отладчика:

08-20 14:46:11.257: ERROR/TtsService(336): Can't create
/data/data/com.myorg.myapp/cache/speech.wav due to exception java.io.IOException: Permission denied

Ответы [ 2 ]

6 голосов
/ 13 октября 2011

TextToSpeech.synthesizeToFile () не работает на реальных устройствах. Работает только в AVD.

Я тоже экспериментировал с этим, используя как оригинальный движок Pico TTS, так и сторонний движок TTS, пытаясь записать данные либо на SD-карту, либо во внутреннюю память (на корневом устройстве):

context.getDir("soundfiles", Context.MODE_WORLD_WRITEABLE);

Но, как вы заметили, метод возвращает TextToSpeech.SUCCESS без фактического создания файла.

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

0 голосов
/ 17 января 2012

TextToSpeech.synthesizeToFile () на самом деле работает на реальных устройствах, хотя это немного странно. У меня была та же самая проблема, но в конечном счете заставил это работать. Код, который я использую:

speakTextTxt = speakText.getText().toString();
HashMap<String, String> myHashRender = new HashMap<String, String>();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_SAVE_ID);

String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
File appTmpPath = new File(exStoragePath + "/sounds/");
appTmpPath.mkdirs();
String tempFilename = "tmpaudio.wav";
tempDestFile = appTmpPath.getAbsolutePath() + "/" + tempFilename;

mTts.synthesizeToFile(speakTextTxt, myHashRender, tempDestFile);

Однако сегодня я нашел кое-что еще довольно странное. Я переключился на другой компьютер для разработки, а затем снова начал получать ту же ошибку "java.io.IOException: Permission denied". Затем я зашел в Android SDK Manager и убедился, что все «SDK Platform» и «Google APIs от Goole Inc.» пакеты были установлены для всех версий Android. Я не уверен, какая именно версия пакета исправила это, но он снова работает. Очевидно, у вас может быть прекрасный код, но что-то не так с вашей средой разработки, что может вызвать проблемы. Я надеюсь, что это может кому-то помочь.

...