前一段时间,我写了一些代码,将Double转换为String,其中该字符串被格式化为可读分数。
例如
4.75 => "4 and 3 4ths"
1.5 => "1 and 1 half"
1.33 => "1 and 1 3rd"
大多数数字都按预期发音,但有一些值得注意的例外。而不是将文本“ 4ths”发音为“ fourths”,而是将其发音为“ four tee ache ess”。这是一个演示此情况的示例。
//this works
tts.speak("1 and 3 fourths", TextToSpeech.QUEUE_FLUSH, null);
//this works
tts.speak("1 and 1 3rd", TextToSpeech.QUEUE_FLUSH, null);
//this works
tts.speak("1 and 1 4th", TextToSpeech.QUEUE_FLUSH, null);
//this does not work
tts.speak("1 and 3 4ths", TextToSpeech.QUEUE_FLUSH, null);
//this does not work
tts.speak("1 and 3 4thes", TextToSpeech.QUEUE_FLUSH, null);
//this does not work
tts.speak("1 and 3 4th-s", TextToSpeech.QUEUE_FLUSH, null);
最奇怪的是,大约一年前,当我第一次编写代码时,它的效果很好,正如人们所期望的那样,“ ths”后缀被发音了。也许我在这一点上误会了...
无论如何,问题似乎在于,跟着2个字母的数字读起来像是一个完整的单词,而跟着3个或更多字母的数字读起来像是一系列数字。我可以通过将所有数字替换为对应的单词来增加算法的复杂性,但是我从事的时间越长,我就越觉得自己正在重新发明轮子。 API似乎没有表示一种为talk()方法指定发音的方法。我想念什么吗?
答案 0 :(得分:1)
TextToSpeech引擎之间的这种行为将有所不同-例如,Google TTS引擎的行为将不同于SVOX PICO(模拟器 您可能只是在与以前不同的引擎上进行测试...甚至是同一引擎的更新。 您可以仅测试一些主要引擎,例如Samsung,Google和PICO,然后尝试找到行为的共同标准。我怀疑您是对的:在这种情况下,拼写单词是最好的选择。 您可以指定要用作TextToSpeech构造函数的最后一个参数(字符串)的引擎,并且可以通过转到(home \ settings \ language&locale \ TTS)或在Windows中查看在任何特定设备上安装了哪些引擎。像这样的代码: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;
}
答案 1 :(得分:0)
正如Boober Bunz解释的那样,这些功能因一台引擎而异。较新版本的引擎也可能会更改它。我建议最好的选择是将所有内容都转换为单词,例如 Fourths ,以使其在引擎之间保持一致。要快速解决问题,您可以尝试 第四名 ,因为它似乎比您提到的其他无效词更有效。