如何允许 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 将文件写入我的应用程序目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的文件写入 NSBundle?

如何允许用户将文件拖出 Cocoa 应用程序

将文件写入 Web 服务器 - ASP.NET

配置GCS存储桶以允许公共写入但不允许覆盖

如何将 automake 文件写入递归构建子目录?

如何将图像写入文件?