我需要用合成文件创建一个音频文件。
它适用于Android 6(使用合成到文件的重载版本),但在Android 4.1中synthesizeToFile
返回-1
。
synthesizeToFile
官方文件说:
使用指定的参数将给定的文本合成到文件中。此方法是异步的,即该方法只是将请求添加到 TTS 请求队列中,然后返回。
然后,为了知道哪个错误导致了该-1
我在建立此异常的日志中搜索:
E/TextToSpeechService:由于异常,无法使用/data/data/com.domain.my/files/_12345_test.wav java.io.IOException:打开失败:EACCES(权限被拒绝)
Android 6和4.1之间有一些不同的系统配置/设置导致此错误?
我必须通过与getFilesDir()
返回的路径不同的路径synthesizeToFile
?
我必须设置文件权限吗?
我用于安卓 4.1 的代码:
TextToSpeech tts = new TextToSpeech(getApplicationContext(), this, "com.google.android.tts");
public void onInit(int status)
{
if (status == TextToSpeech.SUCCESS)
{
String textToGenerate = "this is a test";
// /data/data/com.domain.my/files is returned by getFilesDir()
String completePathFile = "/data/data/com.domain.my/files/_12345_test.wav";
File fileToGenerate = new File(completePathFile);
String fileName = fileToGenerate.getName();
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, fileName);
int response = tts.synthesizeToFile
(
textToGenerate
, hashMap
, completePathFile
);
Log.d("testTTS", "Generation file " + fileName + " - response = " + response);
}
}
我已经用getEngines()检查了"com.google.android.tts"是否已安装。
我需要将文件保存在内部存储中,因此我不得请求外部存储权限(Android 4.1也是如此?或者对于这个版本,我需要这样做?
如果我故意传递给synthesizeToFile
不存在的路径,logcat 中的错误将更改为file not found exception
,以便该方法正确检查路径completePathFile
是否存在。
我遇到了您的问题,正在寻找解决问题的方法。 在棉花糖 (Android 6) 上的 TTS 中使用声音文件失败并出现权限问题
对我来说,它是TTS中的addspeech()。
我认为 TTS 上的权限问题来自这样一个事实,即设备中的 TTS 是一个单独的应用程序,并且 TTS 应用程序无权写入或读取应用程序的外部或内部存储中的文件。
有趣的是,我在应用程序代码中调用 TTS 实例并使用其所有功能,但它们无法访问我的应用程序的存储。TTS 不是我的应用程序,因此我无法代表 TTS 请求权限。我认为这是谷歌必须处理的一种错误。
无论如何,我在下面的链接中让谷歌团队知道了这个问题。不过他们还没有回应。 https://issuetracker.google.com/issues/152671139
您可以在上面的链接中支持我,或者您可以发布自己的问题,让他们知道有多个开发人员希望 TTS 权限问题得到解决。