0

我正在开发一个小应用程序,它让用户可以选择“说出”应用程序将响应的几个命令。

我已经让语音识别工作并注册了命令。他们正在被认可,无论如何,应该播放答案。

唯一的问题是:它没有。

这是我用来确定谷歌的 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);

它会返回“不支持的语言”错误。这很奇怪,因为我只尝试使用一种默认语言:英语(英国、美国,没关系,它“不支持”)。

所以,很明显,当我尝试跑步时

speaker.getLanguage();

它返回空...

更奇怪的是,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 侦听器并立即执行:它有效!

这是我的 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 回答