文字转语音发音的数字,例如“ 4th”,“ 8ths”或“ 2nd”

时间:2018-09-18 18:43:36

标签: android text-to-speech

前一段时间,我写了一些代码,将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()方法指定发音的方法。我想念什么吗?

2 个答案:

答案 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 ,以使其在引擎之间保持一致。要快速解决问题,您可以尝试 第四名 ,因为它似乎比您提到的其他无效词更有效。