Как я могу разрешить TTS записывать файлы в каталоги моего приложения?

Я хочу записать выходные данные механизма 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

person Arnulf    schedule 20.08.2011    source источник
comment
В этой теме предполагается, что TextToSpeech.synthesizeToFile() работает только с AVD, а не с реальными телефоны... Это странно. Я буду исследовать дальше, чтобы увидеть, действительно ли это так.   -  person an00b    schedule 13.10.2011
comment
И эта ветка предполагает, что это возможно использовать TextToSpeech.synthesizeToFile() на реальном устройстве. Но как???   -  person an00b    schedule 13.10.2011
comment
Это безумие: мне удалось больше не получать java.io.IOException и вместо этого получать сообщение SUCCESS Synthesizing to /mnt/sdcard/test.wav, но этот файл test.wav нигде не находится в файловой системе (и определенно не в /mnt/sdcard). В чем дело?   -  person an00b    schedule 13.10.2011


Ответы (2)


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

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

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

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

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

person ateiob    schedule 13.10.2011

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: Отказано в доступе». Затем я зашел в Android SDK Manager и убедился, что все «SDK Platform» и «API Google от Goole Inc.» пакеты были установлены для всех версий Android. Я не уверен, какая именно версия пакета исправила это, но он снова работает. Таким образом, очевидно, у вас может быть отличный код, но что-то может быть не так в вашей среде разработки, что может вызвать проблемы. Я надеюсь, что это может помочь кому-то.

person Trees    schedule 16.01.2012
comment
Только что наткнулся на еще один момент, связанный с этим. Эта ошибка также возникает, если в качестве USB-подключения на устройстве выбран USB Mass Storage. Когда выбран любой из других вариантов, он работает нормально. Я считаю, что это связано с тем, что компьютер монтирует устройство как USB-накопитель, и в этот момент оно становится недоступным для чего-либо, кроме компьютера. - person Trees; 17.01.2012
comment
На каком устройстве (марка и модель, рутированные?) у вас это работало? +1 на данный момент, хотя я тестировал это на 5 разных телефонах Android, и ни один из них не привел к сохранению файла. - person ateiob; 29.02.2012
comment
У меня он работает по крайней мере на Motorola Atrix, Motorola Xoom и Samsung Moment. - person Trees; 01.03.2012
comment
Кроме того, устройства не были рутированы. - person Trees; 01.03.2012
comment
Я пробовал это на устройствах Android 2.x. Какие версии Android работают на ваших рабочих устройствах? - person ateiob; 04.04.2012
comment
Я не могу видеть файл .wav, что бы я ни делал. Может ли кто-нибудь помочь мне со ссылкой на это? - person Sreekanth Karumanaghat; 18.10.2012