0

アプリが応答するいくつかのコマンドを「話す」オプションをユーザーに提供する小さなアプリに取り組んでいます。

音声認識が機能し、コマンドが登録されました。それらは認識されつつあり、必ず答えを出す必要があります。

唯一の問題は、そうではありません。

Google の tts エンジンでサポートされている言語を特定するために使用するコードは次のとおりです (古いバージョンの Android 用に開発しているため、残念ながら "tts.getAvailableLangues()" は含まれていません)。

Locale[] locales = Locale.getAvailableLocales();
    List<Locale> localeList = new ArrayList<Locale>();
    for (Locale locale : locales) {
        int res = speaker.isLanguageAvailable(locale);
        if (res == TextToSpeech.LANG_COUNTRY_AVAILABLE) {
            Log.d(tag, "language: " + locale);
            localeList.add(locale);
        }
    }
    Log.d(tag, "languages available: " + localeList.size());

その最後のログの出力は常に「利用可能な言語: 0」です。

実際、このコードを実行すると、次のようになります。

int id = speaker.setLanguage(Locale.ENGLISH);
checkId(id);

「言語がサポートされていません」というエラーが返されます。デフォルトの言語の 1 つだけを使用しようとしていることを考えると、これは奇妙です: 英語 (英国、米国は関係ありません。「サポートされていません」)。

だから、明らかに、私が走ろうとすると

speaker.getLanguage();

nullを返します...

さらに奇妙なのは、InitListener が常に "TextToSpeech.SUCCESS" を報告することです。

private OnInitListener listener = new OnInitListener() {

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            Log.d(TAG, "tts engine started succesfully");
        } else if (status == TextToSpeech.ERROR) {
            Log.d(TAG, "seems like an error occured :c");
        }

    }

};

そのため、ログには常に「tts エンジンが正常に開始されました」と表示されます。

そして、これは私がttsを実行するために使用する実際のコードです:

public void speak(String text, Context context, OnInitListener listener) {
    String tag = "dashboardactivity";
    Log.d(tag, "speaking started in dummy module");
    TextToSpeech speaker = new TextToSpeech(context, listener);

    // int id = speaker.setLanguage(Locale.UK);
    int id = speaker.setLanguage(Locale.ENGLISH);

    speaker.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

そのコードには何も問題がないように見えますか、それとも何か不足していますか?

これが私が試した/チェックした/インストールしたもののリストです:

  • ttsがインストールされています
  • ボイスデータ搭載(イギリス英語、アメリカ英語の複数ボイス)
  • 設定で「例を聞く」ボタンを押すと機能します!

だから、私が座っているところから、それが機能しない理由はありません。私の質問は次のとおりです。

  • 私は何かを逃していますか?(特別な権限? 一部のデータ?)
  • なぜ私のコードは、tts エンジンが 400 もの「ロケール」のうち 0 言語をサポートしていると言っているのですか?
  • どうすればこれを修正できますか?
4

1 に答える 1

0

わかりました、私はそれを修正しました。tts エンジンが自身を初期化するのに必要な時間については考えていなかったので、インスタンス化した直後に単に「speak」を呼び出しました。

私は今それを OnInit リスナーと presto に移動しました: それは動作します!

ここに私の OnInitListener があります:

private OnInitListener listener = new OnInitListener() {

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            Log.d(TAG, "tts engine started succesfully");
            Log.d(TAG, "setting language to default");
            int id = tts.setLanguage(Locale.getDefault());
            checkId(id);
            tts.speak(mMessageToSpeak, TextToSpeech.QUEUE_FLUSH, null);
        } else if (status == TextToSpeech.ERROR) {
            Log.d(TAG, "seems like an error occured :c");
        }

    }

};
于 2015-04-10T10:49:40.403 に答える