我目前正忙于语音识别,我希望语音识别器能永远不间断地听我说话。该应用程序的目的是,它将等待特定关键字的语音:当用户说出该关键字时,服务将准备好接收用户语音命令。经过研究,我发现我们可以手动计算识别器收听的时间。通过这些常量:
顺便说一下,默认识别器服务侦听大约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"));
}
}
}
这只适用于果冻豆
@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);
}
在最近的谷歌搜索更新中,这些参数不再适用于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实现此流程?如果没有,有人能为这样的解决方案指出正确的方向吗?谢