2

我想将 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
4

2 回答 2

6

TextToSpeech.synthesizeToFile()在真实设备中不起作用。它仅适用于 AVD。

我也一直在尝试使用原始 Pico TTS 引擎和第三方 TTS 引擎,尝试写入 sdcard 或内部存储器(在有根设备上):

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

但是,正如您所指出的,该方法在TextToSpeech.SUCCESS没有实际创建文件的情况下返回。

如果您必须将 TTS 输出录制为 WAV 文件,请将耳机输出连接到 PC 声卡中的辅助输入,然后使用任何录制软件来捕获它。

于 2011-10-13T16:07:58.760 回答
-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:权限被拒绝”。然后我进入 Android SDK Manager 并确保所有“SDK 平台”和“Goole Inc. 的 Google API”。已为所有 Android 版本安装了软件包。我不确定究竟是哪个软件包版本修复了它,但它又可以工作了。因此,显然您可以拥有完美的代码,但您的开发环境可能会出现问题,这可能会导致问题。我希望这可以帮助某人。

于 2012-01-16T20:58:39.717 回答