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

问题描述 投票:1回答:2

前段时间我写了一些代码,将Double转换为String,其中字符串被格式化为可读分数。

举个例子

4.75 => "4 and 3 4ths"
1.5 => "1 and 1 half"
1.33 => "1 and 1 3rd"

除了一些明显的例外,大多数数字都按预期发音。而不是发音为“4ths”的文本“4ths”,而是发音为“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似乎没有表示为speak()方法指定发音的方法。我错过了什么吗?

android text-to-speech
2个回答
1
投票

TextToSpeech Engines之间的这种行为会有所不同 - 例如,Google TTS引擎的行为与SVOX PICO(仿真器<API 24)引擎的行为不同......因此,每个引擎的行为都不是您的错略有不同......如果有任何发音控制,那么引擎负责通过设置直接向最终用户提供它们。

您可能只是在测试不同于以前的引擎......甚至是对同一引擎的更新。

您可以测试一些主要的引擎,如三星,谷歌和PICO,并尝试找到一个共同的行为标准。我怀疑你是对的:在这种情况下拼出单词是最好的选择。

您可以指定要使用哪个引擎作为TextToSpeech构造函数的最后一个参数(String),您可以通过转到(home \ settings \ language&locale \ 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;
}

0
投票

正如Boober Bunz所解释的那样,这些功能因引擎而异。它也可能随着更新版本的引擎而改变。我建议最好的选择是将所有内容转换为单词,如Fourths,以使其在引擎之间保持一致。为了快速解决问题,您可以尝试使用4th,因为它似乎比您提到的其他工作更有效。

© www.soinside.com 2019 - 2024. All rights reserved.