0

我的目标是获得可用的 TTS 语音引擎及其各自可用的语言。我可以使用以下代码成功获取可用引擎:

    PackageManager pm = getPackageManager();

    Intent ttsIntent = new Intent();
    ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    // ttsIntent.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);

    ArrayList<String> engineInfo = new ArrayList<String>();

    List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent,
            PackageManager.GET_META_DATA);

    for (ResolveInfo appInfo : list) {
        engineInfo.add(appInfo.activityInfo.applicationInfo.packageName);
        engineInfo.add(appInfo.activityInfo.applicationInfo.loadLabel(pm)
                .toString());
    }

上面注释掉的行为意图请求额外的数据。我进行了很多搜索,但找不到queryIntentActivities()以这种方式使用“getExtra”或“putExtra”的示例。

因此,我可以假设,这不是一个选项,我需要回去阅读一些基础知识,为什么这是不可能的!?

如果我尝试检索数据,我会得到一个空指针,即使我正在检查它!=null是否有点奇怪?

appInfo.activityInfo.applicationInfo.metaData.getEtcEtc...

任何帮助将不胜感激,在此先感谢。

postPutEXTRA:API 级别为 9,因此我无法使用getEngines(),尽管这将涉及为每个对象初始化一个 tts 对象,因此无论如何都不理想。

postPutEDIT:我在循环中尝试了以下方法来提取关联的 uid,但它不适用于我测试的语音引擎之一。

    ApplicationInfo ai = null;
    try {
        ai = pm.getApplicationInfo(appInfo.activityInfo.applicationInfo.packageName, 0);
    } catch (NameNotFoundException e) {
        e.printStackTrace();
        return;
    }

    String[] voices = pm.getPackagesForUid(ai.uid);
4

2 回答 2

0

我无法解决这个问题的具体标题,但我确实通过以下方式获得了我想要的关于设备上可用语音引擎及其语言的信息,而无需用户交互:

private void getEngines() {

    Intent ttsIntent = new Intent();
    ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);

    ArrayList<String> engineInfo = new ArrayList<String>();

    PackageManager pm = getPackageManager();

    List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent,
            PackageManager.GET_META_DATA);

    for (ResolveInfo appInfo : list) {
        engineInfo.add(appInfo.activityInfo.applicationInfo.packageName);

        ttsIntent
                .setPackage(appInfo.activityInfo.applicationInfo.packageName);
        ttsIntent
                .getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);

        startActivityForResult(ttsIntent, 33);

    }

    if (DE.BUG) {
        MyLog.d("engineInfo: " + engineInfo.size() + " : "
                + engineInfo.toString());
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 33 && data != null) {

        ArrayList<String> available = data
                .getStringArrayListExtra("availableVoices");

        if (DE.BUG) {
            MyLog.i("Voices: " + available.toString());
        }
    }
}

我留在了我的自定义日志记录类/方法中,以显示我在哪里捕获数据。您可以重新排列上述内容以将所有数据放入一个或多个全局数组列表中。

于 2013-01-05T12:27:09.170 回答
0

我经历了类似的过程,但如果我没记错的话,你不能简单地触发意图查询来获取可用的语言。这绝对是有道理的,因为可用的语言取决于用户将随 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) return;
    // here you should be able to get the info from 'data', i.e.
    ArrayList<String> voices = getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
}

请注意,我从Android 开发博客上的一篇文章中复制粘贴了以上大部分内容。

自从我上次玩 TTS 以来已经有一段时间了,所以如果上述方法不起作用,请随时发表评论,我将仔细研究我当时所做的实现。

于 2012-11-03T22:07:05.367 回答