我想将TextToSpeech引擎的输出写入我的应用程序的缓存目录。为了让TTS在那里写,我首先必须赋予它权限。但我不知道怎么做。我理解通常可以通过递交FileDescriptor
来解决这些问题,从而赋予访问特定文件的权限。但我不能用TTS做到这一点,因为TextToSpeech.synthesizeToFile方法只接受文件路径为String,没有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
答案 0 :(得分:6)
TextToSpeech.synthesizeToFile()在实际设备中不起作用。它只适用于AVD。
我一直在尝试使用原始的Pico TTS引擎和第三方TTS引擎,尝试写入sdcard或内部存储器(在root设备上):
context.getDir("soundfiles", Context.MODE_WORLD_WRITEABLE);
但是,正如您所指出的,该方法返回TextToSpeech.SUCCESS
而不实际创建文件。
如果您必须将TTS输出录制到WAV文件,请将耳机输出连接到PC中声卡的aux输入,然后使用任何录制软件捕获该输出。
答案 1 :(得分:-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平台”和“Goole Inc.的Google API”已为所有Android版本安装了软件包。我不确定哪个软件包版本修复了它,但它再次正常工作。 显然,你可以拥有完美的代码,但是你的开发环境可能会导致问题。 我希望这可以帮助别人。