2

我想將TextToSpeech引擎的輸出寫入我的應用的緩存目錄。爲了讓TTS寫在那裏,我首先必須授予它這樣做的權限。但我不知道如何。我明白,通常可以通過交付FileDescriptor來解決這些問題,因此可以授予訪問特定文件的權限。但是我不能用TTS做到這一點,因爲TextToSpeech.synthesizeToFile方法只接受文件路徑作爲字符串,沒有FileDescriptor。那麼該怎麼辦?我如何允許TTS將文件寫入我的應用程序的目錄?

爲了使我的觀點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 
+1

[This thread](http://groups.google.com/group/android-developers/browse_thread/thread/79c0c4d9399b38ac)表明'TextToSpeech.synthesizeToFile()'只適用於AVD,而不是真正的手機...這很奇怪。我將進一步調查,看看是否確實如此。 – an00b

+1

而[此線程](http://groups.google.com/group/android-developers/browse_thread/thread/d1365a29214b8cb3?fwc=1)表明可以在真實中使用'TextToSpeech.synthesizeToFile()'設備。但是,如何? – an00b

+2

這是瘋了:我設法不再獲取java.io.IOException,而是接收SUCCESS消息'Synthesizing to/mnt/sdcard/test.wav',但是test.wav無法在文件系統(並且絕對不在/ mnt/sdcard上)。這是怎麼回事? – an00b

回答

6

TextToSpeech.synthesizeToFile()沒有按在真實的設備上工作。它只適用於AVDs。

我一直在嘗試這也同時使用原來的Pico TTS引擎和第三方TTS引擎,試圖寫入無論是SD卡或內部存儲器(有根的設備上):

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

但是,正如您所述,該方法在不實際創建文件的情況下返回TextToSpeech.SUCCESS

如果您必須將您的TTS輸出錄製到WAV文件,請將耳機輸出連接到PC上聲卡的輔助輸入,並使用任何錄製軟件來捕獲。

-1

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」和「Goole Inc.的Google API」所有Android版本都安裝了軟件包。我不確定哪個軟件包版本修正了它,但它再次運行。 因此,顯然你可以有完美的代碼,但是你的開發環境可能會導致問題。 我希望這可以幫助某人。

+0

剛剛碰到與此相關的另一點。如果我在設備上選擇「USB Mass Storage」作爲USB連接,也會出現此錯誤。當選擇任何其他選項時,它可以正常工作。我相信這是由於計算機將設備安裝爲USB驅動器,並且此時除了計算機以外的任何設備都無法訪問。 – Trees

+1

你在哪個設備(品牌和型號,紮根?)上有效?+1現在,雖然我測試了這5個不同的Android手機,並沒有一個導致保存的文件。 – ateiob

+0

我至少在摩托羅拉Atrix,摩托羅拉Xoom和三星時刻工作。 – Trees

相關問題