背景:我的应用程序正在向用户拥有的任何TTS引擎发送句子。句子是用户生成的,可能包含标点符号。
问题:Some users report that在SVOX,Loquendo和其他人可能会大声朗读标点符号(TTS说“逗号”等)。
题:
看到Loquendo问题的同一用户,对于另一个名为FBReader的Android应用程序没有这个问题。所以我猜第三种选择不是正确的做法。
我的一个应用程序遇到了同样的问题。
输入字符串是:
Next alarm in 10 minutes,it will be 2:45 pm
并且TTS引擎会说:
Next alarm in 10 minutes comma it will be 2:45 pm
。
只需在逗号之后添加一个空格就可以修复问题:
Next alarm in 10 minutes, it will be 2:45 pm
这是一个愚蠢的错误,也许你的问题比这更复杂,但它对我有用。 :)
所以,你担心用户可能会选择作为默认值的后巷获取的文本到语音引擎......可能是因为你不希望你的应用看起来很糟糕,因为这个引擎未知/不良行为。可以理解的。
(好的)事实是,除非您决定在应用程序中嵌入引擎,否则TTS的行为实际上不是您的责任(难度:难,推荐?否)。
引擎可以而且应该被认为遵守Android规则和行为规定here ...并且假定在Android系统设置(home \ settings \ language&locale \ TTS)中提供他们自己的足够的配置选项,其中可能包括或不包括发音选项。还应该假定用户足够智能以安装他们满意的引擎。
对于预测和“纠正”未知和不需要的引擎行为(至少在您没有自己测试的引擎中)来说,这是一个滑坡。
一个简单而好的选择(难度:容易):
更好的选择(难度:中等):
此外,需要注意的一点是,引擎之间存在许多差异(无论是使用嵌入式语音与在线,响应时间,初始化时间,对Android规范的可靠性/依从性,跨Android API级别的行为,跨自己版本历史记录的行为)声音的质量,更不用说语言能力了......对于用户而言,与标点符号是否发音相比,这些差异可能更为重要。
你说“我的应用程序正在向用户提供的任何TTS引擎发送句子”。嗯......“那就是你的问题。”为什么不让用户选择使用什么引擎?
并引导我们......
一个更好的选择(难度:艰难和好![以我的拙见]):
private ArrayList<String> whatEnginesAreInstalled(Context context) {
final Intent ttsIntent = new Intent();
ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
final PackageManager pm = context.getPackageManager();
final List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent, PackageManager.GET_META_DATA);
ArrayList<String> installedEngineNames = new ArrayList<>();
for (ResolveInfo r : list) {
String engineName = r.activityInfo.applicationInfo.packageName;
installedEngineNames.add(engineName);
// just logging the version number out of interest
String version = "null";
try {
version = pm.getPackageInfo(engineName,
PackageManager.GET_META_DATA).versionName;
} catch (Exception e) {
Log.i("XXX", "try catch error");
}
Log.i("XXX", "we found an engine: " + engineName);
Log.i("XXX", "version: " + version);
}
return installedEngineNames;
}
SIDE-NOTES: