如何允许 TTS 将文件写入我的应用程序目录?
Posted
技术标签:
【中文标题】如何允许 TTS 将文件写入我的应用程序目录?【英文标题】:How can I allow the TTS to write files to my app's directories? 【发布时间】:2011-10-31 06:04:00 【问题描述】:我想将 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
【问题讨论】:
This thread 建议TextToSpeech.synthesizeToFile()
仅适用于 AVD,而不适用于真正的手机......这很奇怪。我会进一步调查,看看是否确实如此。
而this thread 建议可以在真实设备上使用TextToSpeech.synthesizeToFile()
。但是怎么做???
这太疯狂了:我设法不再获得java.io.IOException
,而是收到了成功消息Synthesizing to /mnt/sdcard/test.wav
,但是在文件系统的任何地方都找不到test.wav(绝对不是在 /mnt/sdcard 上)。怎么回事?
【参考方案1】:
TextToSpeech.synthesizeToFile() 在真实设备中不起作用。它仅适用于 AVD。
我也一直在试验这个,同时使用原始 Pico TTS 引擎和第三方 TTS 引擎,尝试写入 sdcard 或内部存储器(在有根设备上):
context.getDir("soundfiles", Context.MODE_WORLD_WRITEABLE);
但是,正如您所指出的,该方法返回 TextToSpeech.SUCCESS
而不实际创建文件。
如果您必须将 TTS 输出录制为 WAV 文件,请将耳机输出连接到 PC 声卡中的辅助输入,然后使用任何录制软件来捕获它。
【讨论】:
【参考方案2】: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 版本安装了软件包。我不确定究竟是哪个软件包版本修复了它,但它又可以工作了。 因此,显然您可以拥有完美的代码,但您的开发环境可能会出现问题,这可能会导致问题。 我希望这可以帮助某人。
【讨论】:
刚刚遇到与此相关的另一点。如果我选择“USB Mass Storage”作为设备上的 USB 连接,也会出现此错误。选择任何其他选项时,它会正常工作。我相信这是由于计算机将设备安装为 USB 驱动器,此时除了计算机之外的任何设备都无法访问它。 您在哪个设备(品牌和型号,植根?)上进行了这项工作?暂时 +1,尽管我在 5 部不同的 Android 手机上对此进行了测试,但都没有保存文件。 我至少可以在摩托罗拉 Atrix、摩托罗拉 Xoom 和三星 Moment 上使用它。 另外,设备没有root。 我在 Android 2.x 设备上试过这个。您的工作设备运行哪些版本的 Android?以上是关于如何允许 TTS 将文件写入我的应用程序目录?的主要内容,如果未能解决你的问题,请参考以下文章