当前位置: 首页 > 知识库问答 >
问题:

关于语音识别的Android附加功能不起作用

花和宜
2023-03-14

我目前正忙于语音识别,我希望语音识别器能永远不间断地听我说话。该应用程序的目的是,它将等待特定关键字的语音:当用户说出该关键字时,服务将准备好接收用户语音命令。经过研究,我发现我们可以手动计算识别器收听的时间。通过这些常量:

顺便说一下,默认识别器服务侦听大约10秒。(谷歌api)

     String EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS   The amount of time that it should take after we stop hearing speech to consider the input complete.
     String EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS    The minimum length of an utterance.
     String EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS  The amount of time that it should take after we stop hearing speech to consider the input possibly complete.

http://java.llp2.dcc.ufmg.br/apiminer/docs/reference/android/speech/RecognizerIntent.html

这些是捆绑类的附加功能。

问题是,当我在代码中使用这些常量时,它不起作用。

这是我的代码:

   intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 5000);
   intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);
   intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);

识别器仍然听我大约10秒,尽管我写了5000毫秒,如你所见。

你能想到这个问题吗?也许我不知道如何使用extras,也许这是关于权限的,也许它跳过了我的代码,或者我应该添加一些其他代码。

任何帮助都将受到感谢。

编辑:以下是我的完整代码:

语音识别活动。Java语言

public class VoiceRecognitionActivity extends Activity implements
    TextToSpeech.OnInitListener {

private static final int REQUEST_CODE = 1234;
private Button mTalkButton;
private ListView wordsList;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_voice_recognition);
    mTalkButton = (Button) findViewById(R.id.talk_button);
    wordsList = (ListView) findViewById(R.id.listView1);
    // Disable button if no recognition service is present
    PackageManager pm = getPackageManager();
    List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
            RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
    if (activities.size() == 0) {
        mTalkButton.setEnabled(false);
        mTalkButton.setText("Recognizer not present");
    } else {
        mTalkButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(
                        RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                        RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                        "Voice recognition Demo...");
                String defaultLanguage = Locale
                        .getDefault().toString();
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale
                        .getDefault());

                intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 5000);
                intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);
                intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);

                startActivityForResult(intent, REQUEST_CODE);

            }
        });
    }
}

/**
 * Handle the results from the voice recognition activity.
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        // Populate the wordsList with the String values the recognition
        // engine thought it heard
        ArrayList<String> matches = data
                .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        wordsList.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, matches));
    }
    super.onActivityResult(requestCode, resultCode, data);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_voice_recognition, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.menu_settings:
        startActivity(new Intent(this, SettingsActivity.class));
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onInit(int status) {
    // TODO Auto-generated method stub

}

}

TTSUtils。Java语言

公共类TTSUtils实现TextToSpeech。OnInitListener{

private TextToSpeech mTts;
private static TTSUtils mInstance;
private Context mContext;

public static TTSUtils getInstance(Context c) {
    if (mInstance == null) {
        mInstance = new TTSUtils(c);
    }
    return mInstance;
}

private TTSUtils(Context c) {
    mContext = c;
    mTts = new TextToSpeech(mContext, this);
    mInstance = this;
}

@Override
public void onInit(int status) {
    // TODO Auto-generated method stub

}

public void destroyTTS() {
    if (mTts != null) {
        mTts.stop();
        mTts.shutdown();
    }
}

public int setLanguage(Locale l) {
    return mTts.setLanguage(l);
}

public int speak(String s, int i, HashMap<String, String> h) {
    return mTts.speak(s, i, h);
}

}

设置活动。Java语言

公有类设置活动扩展首选项活动{

/**
 * Determines whether to always show the simplified settings UI, where
 * settings are presented in a single list. When false, settings are shown
 * as a master/detail two-pane view on tablets. When true, a single pane is
 * shown on tablets.
 */

private static final boolean ALWAYS_SIMPLE_PREFS = false;

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    setupSimplePreferencesScreen();
}

/**
 * Shows the simplified settings UI if the device configuration if the
 * device configuration dictates that a simplified, single-pane UI should be
 * shown.
 */
private void setupSimplePreferencesScreen() {
    if (!isSimplePreferences(this)) {
        return;
    }

    // In the simplified UI, fragments are not used at all and we instead
    // use the older PreferenceActivity APIs.

    // Add 'general' preferences.
    addPreferencesFromResource(R.xml.pref_general);

    // Add 'notifications' preferences, and a corresponding header.
    PreferenceCategory fakeHeader = new PreferenceCategory(this);
    fakeHeader.setTitle(R.string.pref_header_notifications);
    getPreferenceScreen().addPreference(fakeHeader);
    addPreferencesFromResource(R.xml.pref_notification);

    // Add 'data and sync' preferences, and a corresponding header.
    fakeHeader = new PreferenceCategory(this);
    fakeHeader.setTitle(R.string.pref_header_data_sync);
    getPreferenceScreen().addPreference(fakeHeader);
    addPreferencesFromResource(R.xml.pref_data_sync);

    // Bind the summaries of EditText/List/Dialog/Ringtone preferences to
    // their values. When their values change, their summaries are updated
    // to reflect the new value, per the Android Design guidelines.
    bindPreferenceSummaryToValue(findPreference("example_text"));
    bindPreferenceSummaryToValue(findPreference("example_list"));
    bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
    bindPreferenceSummaryToValue(findPreference("sync_frequency"));
}

/** {@inheritDoc} */
@Override
public boolean onIsMultiPane() {
    return isXLargeTablet(this) && !isSimplePreferences(this);
}

/**
 * Helper method to determine if the device has an extra-large screen. For
 * example, 10" tablets are extra-large.
 */
private static boolean isXLargeTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}

/**
 * Determines whether the simplified settings UI should be shown. This is
 * true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device
 * doesn't have newer APIs like {@link PreferenceFragment}, or the device
 * doesn't have an extra-large screen. In these cases, a single-pane
 * "simplified" settings UI should be shown.
 */
private static boolean isSimplePreferences(Context context) {
    return ALWAYS_SIMPLE_PREFS
            || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
            || !isXLargeTablet(context);
}

/** {@inheritDoc} */
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List<Header> target) {
    if (!isSimplePreferences(this)) {
        loadHeadersFromResource(R.xml.pref_headers, target);
    }
}

/**
 * A preference value change listener that updates the preference's summary
 * to reflect its new value.
 */
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
        String stringValue = value.toString();

        if (preference instanceof ListPreference) {
            // For list preferences, look up the correct display value in
            // the preference's 'entries' list.
            ListPreference listPreference = (ListPreference) preference;
            int index = listPreference.findIndexOfValue(stringValue);

            // Set the summary to reflect the new value.
            preference
                    .setSummary(index >= 0 ? listPreference.getEntries()[index]
                            : null);

        } else if (preference instanceof RingtonePreference) {
            // For ringtone preferences, look up the correct display value
            // using RingtoneManager.
            if (TextUtils.isEmpty(stringValue)) {
                // Empty values correspond to 'silent' (no ringtone).
                preference.setSummary(R.string.pref_ringtone_silent);

            } else {
                Ringtone ringtone = RingtoneManager.getRingtone(
                        preference.getContext(), Uri.parse(stringValue));

                if (ringtone == null) {
                    // Clear the summary if there was a lookup error.
                    preference.setSummary(null);
                } else {
                    // Set the summary to reflect the new ringtone display
                    // name.
                    String name = ringtone
                            .getTitle(preference.getContext());
                    preference.setSummary(name);
                }
            }

        } else {
            // For all other preferences, set the summary to the value's
            // simple string representation.
            preference.setSummary(stringValue);
        }
        return true;
    }
};

/**
 * Binds a preference's summary to its value. More specifically, when the
 * preference's value is changed, its summary (line of text below the
 * preference title) is updated to reflect the value. The summary is also
 * immediately updated upon calling this method. The exact display format is
 * dependent on the type of preference.
 * 
 * @see #sBindPreferenceSummaryToValueListener
 */
private static void bindPreferenceSummaryToValue(Preference preference) {
    // Set the listener to watch for value changes.
    preference
            .setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    // Trigger the listener immediately with the preference's
    // current value.
    sBindPreferenceSummaryToValueListener.onPreferenceChange(
            preference,
            PreferenceManager.getDefaultSharedPreferences(
                    preference.getContext()).getString(preference.getKey(),
                    ""));
}

/**
 * This fragment shows general preferences only. It is used when the
 * activity is showing a two-pane settings UI.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_general);

        // Bind the summaries of EditText/List/Dialog/Ringtone preferences
        // to their values. When their values change, their summaries are
        // updated to reflect the new value, per the Android Design
        // guidelines.
        bindPreferenceSummaryToValue(findPreference("example_text"));
        bindPreferenceSummaryToValue(findPreference("example_list"));
    }
}

/**
 * This fragment shows notification preferences only. It is used when the
 * activity is showing a two-pane settings UI.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class NotificationPreferenceFragment extends
        PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_notification);

        // Bind the summaries of EditText/List/Dialog/Ringtone preferences
        // to their values. When their values change, their summaries are
        // updated to reflect the new value, per the Android Design
        // guidelines.
        bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
    }
}

/**
 * This fragment shows data and sync preferences only. It is used when the
 * activity is showing a two-pane settings UI.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class DataSyncPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_data_sync);

        // Bind the summaries of EditText/List/Dialog/Ringtone preferences
        // to their values. When their values change, their summaries are
        // updated to reflect the new value, per the Android Design
        // guidelines.
        bindPreferenceSummaryToValue(findPreference("sync_frequency"));
    }
}

}

共有2个答案

平俊茂
2023-03-14

这只适用于果冻豆

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
    // Populate the wordsList with the String values the recognition
    // engine thought it heard
    ArrayList<String> matches = data
            .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
    wordsList.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, matches));
}
else {
finishActivity(REQUEST_CODE);
          startAndroidVoiceRecognition();
}
super.onActivityResult(requestCode, resultCode, data);
}  

public startAndroidVoiceRecognition()
{
    Intent intent = new Intent(
                    RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                    RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                    "Voice recognition Demo...");
            String defaultLanguage = Locale
                    .getDefault().toString();
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale
                    .getDefault());
    startActivityForResult(intent, REQUEST_CODE);
}
苏鸿卓
2023-03-14

在最近的谷歌搜索更新中,这些参数不再适用于Jelly Bean设备。一段时间以来,我一直想提交一份关于if的错误报告。它们仍然适用于ICS及以下设备。

如果要继续侦听关键字而不超时,则必须执行循环,从而在onPartialResults中检查关键字。如果调用了结果,并且在这些结果中也没有检测到关键字,则需要立即重新启动识别。

您需要处理无声死亡错误并将系统音频流静音以防止Jelly Bean哔哔声。

这些问题使实施变得非常混乱和令人沮丧。整理一下谷歌。。。。

 类似资料:
  • 我正在使用SpeechRecognitor API在Google Glass上制作一个可以接收语音的应用程序。我遇到的问题是,如果语音检测器没有听到任何声音,它会很快停止收听并结束识别过程。 我发现可以添加以下额外内容:Extra\u SPEECH\u INPUT\u COMPLETE\u SILENCE\u LENGTH\u MILLIS Extra\u SPEECH\u INPUT\u mab

  • 我使用RecognizerIntent并实现RecognitionListener,并实现其所有回调方法来执行语音命令。我试着调整参数EXTRA\u SPEECH\u INPUT\u MINIMUM\u LENGTH\u MILLIS、EXTRA\u SPEECH\u INPUT\u mably\u COMPLETE\u SILENCE\u LENGTH\u MILLIS和EXTRA\u SPEE

  • 小能sdk有语音识别功能,即可以将语音转为文字发送出去,SDK的语音识别功能使用的是科大讯飞的包,因此针对具体情况提供以下方案,请根据自己的需求选择方案: 一、不需要该功能,SDK集成不需要做任何的操作,可以在PC端客服端设置下该功能的开关:设置—>访客客服设置—>访客聊窗—>SDK—>访客端功能进行开关控制,如果您不需要该功能可以不勾选该选项。 二、需要该功能,又分为以下具体情况: (1)如果您

  • 小能sdk有语音识别功能,即可以将语音转为文字发送出去;该功能的开关可以在客服端的设置—>访客客服设置—>访客聊窗—>SDK—>访客端功能进行开关控制,如果您不需要该功能可以勾掉该选项。 具体界面如下: 语音识别功能使用的是科大讯飞的包。 如果您的APP也使用了科大讯飞的语音识别功能,则请使用下面的接口传入您的appid,同时将NtalkerChatUI/libs目录下的与科大讯飞相关的jar和s

  • 本文向大家介绍轻松实现Android语音识别功能,包括了轻松实现Android语音识别功能的使用技巧和注意事项,需要的朋友参考一下 苹果的iphone有语音识别用的是Google的技术,做为Google力推的Android 自然会将其核心技术往Android 系统里面植入,并结合google 的云端技术将其发扬光大。 所以Google Voice Recognition在Android 的实现就变

  • 我正在为嵌入式设备的语音相关语音识别解决方案寻找解决方案。我已经研究过Pocketsphinx,但由于我仍然不熟悉它,我想也许更有经验的人可能会知道。是否有可能使用Pocketsphinx来实现这样的语音识别。它应该记录音频,提取其特征,然后将其与所说的任何内容进行匹配,而不是使用声学和语言模型。是否有可能使用Pocketsphinx实现此流程?如果没有,有人能为这样的解决方案指出正确的方向吗?谢