【问题标题】:Android Text to Speech non google engineAndroid Text to Speech 非谷歌引擎
【发布时间】:2021-11-11 18:24:33
【问题描述】:

在我的 Android 应用中,我有一个使用 Google 引擎的 TTS。

有这样的东西:

tts=new TextToSpeech(MyClass.this, status -> {
    if(status == TextToSpeech.SUCCESS){
       tts.setLanguage(locale);
       tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
            @Override
            public void onDone(String utteranceId) {

                if (utteranceId.equals("***")) {

                runOnUiThread(() -> {
                    Button view2 = findViewById(R.id.speech);
                    view2.setCompoundDrawablesWithIntrinsicBounds(R.drawable.play, 0, 0, 0);
                });
                }
            }

            @Override
            public void onError(String utteranceId) {
            }

            @Override
            public void onStart(String utteranceId) {
            }
        });

    }
});

基本上我使用 2 种语言,斯洛伐克语和英语。两者都可以正常使用 Google TTS。

问题是,三星设备默认设置了自己的 TTS 引擎,因此应用文本转语音无法在这些设备上运行。

用户将设备设置更改为使用 Google TTS 后,它就可以工作了。

但是有没有办法让我的代码支持两个 TTS 引擎?

我发现可能会有这样的工作:

TextToSpeech(Context context, TextToSpeech.OnInitListener listener, String engine) 

例如使用com.google.android.tts 作为引擎参数。

但是在我的代码中,我有 new TextToSpeech(MyClass.this, status -> {... 之类的,它不接受引擎作为第三个参数,我仍然不知道如何检测何时需要三星引擎并相应地切换引擎。

【问题讨论】:

    标签: android text-to-speech


    【解决方案1】:

    值得尝试通过传递第三个参数来强制 TTS 引擎,所以在发布的 sn-p 中交换最后一行

    });
    

    }, "com.google.android.tts");
    

    还有两个有用的方法:getDefaultEngine()getEngines()。只需在开始时创建一些带有两个参数(空侦听器)的虚拟 new TextToSpeech 并检查您拥有的可能性。

    当 Google 引擎不存在时,getAvailableLanguages()isLanguageAvailable(Locale loc) 也可能有用,但默认的引擎仍然可能支持您想要的语言

    【讨论】:

    • 好像上次放错地方了,现在接受第三个参数。但是现在是否强制使用谷歌 TTS?如果三星设备设置了三星 TTS,那它怎么能强制使用谷歌 TTS?您对 getDefaultEngine() 的建议似乎不错,我会看一下,我认为它将获得设备的默认引擎,如果我没有错的话,我可以用它替换第三个参数
    • 根据 doc 这第三个参数强制执行所需的 TTS 而不是默认值,但是......当getEngines() 不会返回 Google 的实现时会发生什么?您必须编写一些代码来检查设备上是否存在您想要的引擎,以及它是否可以用所需的语言说话。如果不是,您仍然可以使用任何其他引擎检查语言可用性
    • 我明白了,这就是为什么我最好不要强制使用谷歌 TTS,所以我希望 getDefaultEngine() 应该可以工作。如果默认引擎是三星,那么它应该可以使用,如果默认引擎是谷歌,那么使用谷歌。那么EN和SK语言对于两个引擎应该都没有问题
    • 请注意,每次创建 new TextToSpeech(...) 时,此对象返回的列表和 getAvailableLanguages() 方法可能不同...有可能根本没有 Google TTS,默认为是 ABC TTS 引擎,但没有您的语言支持以及一些具有所需支持的辅助 XYZ 引擎。恕我直言,您应该创建new TextToSpeech(...)(两个参数),获取所有引擎的列表,然后使用强制引擎(第三个参数)创建另一个new TextToSpeech(...),然后检查语言是否可用
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2017-06-11
    • 2021-10-26
    相关资源
    最近更新 更多