【问题标题】:How to check whether Google TTS voice data installed for Hindi Language如何检查是否为印地语安装了 Google TTS 语音数据
【发布时间】:2015-01-04 17:33:12
【问题描述】:

我正在使用 Google TTS 引擎进行印地语文本转语音。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case ACTIVITY_TTS_PASS:
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            tts = new TextToSpeech(getApplicationContext(), this);
            int availability = tts.isLanguageAvailable(new Locale("hin-IND"));
            switch(availability) {
            case TextToSpeech.LANG_AVAILABLE:
                Log.d("TTS", "Language available");
                break;
            case TextToSpeech.LANG_NOT_SUPPORTED:
                Log.d("TTS", "Language not supported");

                Intent installTTSIntent = new Intent();
                installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                ArrayList<String> languages = new ArrayList<String>();
                languages.add("hin-IND"); // hin - hindi, IND - INDIA
                installTTSIntent.putStringArrayListExtra(
                        TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, languages);
                startActivity(installTTSIntent);
                break;
            case TextToSpeech.LANG_MISSING_DATA:
                Log.d("TTS", "Language missing data");
                break;
            case TextToSpeech.LANG_COUNTRY_AVAILABLE:
                Log.d("TTS", "Contry available");
                break;
            default:
                Log.d("TTS", "default");
            }
        }
        else {
            Log.d("TTS", "fail");
            Intent installTTSIntent = new Intent();
            installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            ArrayList<String> languages = new ArrayList<String>();
            languages.add("hin-IND"); // hin - hindi, IND - INDIA
            installTTSIntent.putStringArrayListExtra(
                    TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, languages);
            startActivity(installTTSIntent);
        }

        break;
    default:
        Log.d("TTS", "case default");
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);

}

这是我如何检查是否安装了 TTS 数据以及是否支持印地语。 此 Intent 提供了为某些语言安装语音数据的选项。然后我选择了印地语(印度)并安装了。

即使在那之后 tts.isLanguageAvailable(new Locale("hin-IND")); 返回 TextToSpeech.LANG_NOT_SUPPORTED。

还尝试使用“hi-IN”而不是“hin-IND”,结果相同。 现在语音数据已经安装了,但是如何通过代码检查呢?

【问题讨论】:

    标签: android


    【解决方案1】:

    “hi_IN”是印地语(印度)的语言环境。在调用 onInit(int result) 方法后检查可用性 tts.isLanguageAvailable(new Locale("hi-IN")) 工作正常。所以在 onActivityResult 方法中启动 tts 实例并在 onInit 方法中检查可用性。

    2017 年更新 根据要求提供使用 TTS 的代码。

    检查tts数据是否存在:

    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
    

    将调用 OnActivityResult 方法

    protected void onActivityResult(
            int requestCode, int resultCode, Intent data) {
        if (requestCode == MY_DATA_CHECK_CODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                // success, create the TTS instance
                initTTS();
            } else {
                // missing data, install it
                Intent installIntent = new Intent();
                installIntent.setAction(
                    TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                ArrayList<String> languages = new ArrayList<String>();
                languages.add("hin-IND"); // hin - hindi, IND - INDIA
                installIntent.putStringArrayListExtra(
                        TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, languages);
                startActivity(installIntent);
            }
        }
    }
    

    initTTS方法如下:

    private TextToSpeech mTts;
    public void initTTS() {
        //mTts = new TextToSpeech(this, this);
        mTts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if(status != TextToSpeech.ERROR) {
    
                    int isLanguageAvailable = t1.isLanguageAvailable(new Locale("hi_IN"));
                    switch (isLanguageAvailable) {
                        case TextToSpeech.LANG_AVAILABLE:
                            //t1.setLanguage(Locale.UK);
                            t1.setLanguage(new Locale("hin"));
                            t1.setPitch(1.2f);
                            t1.setSpeechRate(0.8f);
                            Toast.makeText(context, "हाँ, मैं हिंदी बोल सकता हूँ", Toast.LENGTH_LONG).show();
                            t1.speak("हाँ, मैं हिंदी बोल सकता हूँ", TextToSpeech.QUEUE_FLUSH, null,null);
    
                            break;
                    }
                } else {
                    Toast.makeText(context, "TTS initialization Failed", Toast.LENGTH_LONG).show();
                }
            }
        });
    }
    

    【讨论】:

    • 你能发布你的代码吗,因为我需要检查用户设备是否支持印地语
    • 这里用什么ACTION_CHECK_TTS_DATA?您没有为意图设置任何额外内容,它如何知道要检查哪种语言?
    • @user924 此操作用于检查 TTS 资源是否存在。 (参考:developer.android.com/reference/android/speech/tts/…)。获得成功结果后,您可以通过创建 TTS 实例来检查特定语言。您可以在此处探索有关它的详细信息android-developers.googleblog.com/2009/09/…
    • Language_AVAILABLE 并不意味着为该语言安装了语音数据。
    • 供以后参考。投反对票,因为它没有回答问题。此外,isLanguageAvailable API 虽然提到它可以返回LANG_MISSING_DATA,但它永远不会。所以 afaik,没有任何文本到语音 API 可用于查看是否为特定语言安装了语音数据。尽管stackoverflow.com/a/54317988/6671572 按照这个答案的建议有一种方法,但它只适用于 API 21 +
    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多