Как использовать приложение Google GDK для погружения Google Glass только с помощью Voice Command?

Как я могу начать кодирование голосового триггера для навигации по Google Glass Cards?

This is how I see it happening: 1) "Ok Glass, Start My Program" 2) Application begins and shows the first card 3) User can say "Next Card" to move to the next card (somewhat the equivalent of swiping forward when in the timeline) 4) User can say "Previous Card" to go back 

Карты, которые мне нужно отображать, – это простой текст и изображения, мне интересно, могу ли я настроить прослушиватель какого-то типа для прослушивания голосовых команд, пока отображается карта.


Я исследовал ближайшее голосовое командование Glass voice от данного списка, но не смог запустить код, хотя у меня есть все библиотеки.

Примечание: важно, чтобы пользователь все еще видел карту при использовании голосовой команды. Также его руки заняты, поэтому tap / swipe не вариант.

Любые идеи о том, как управлять временной шкалой в моем приложении Immersion, используя только голосовое управление? Был бы очень благодарен!

Я также отслеживаю https://code.google.com/p/google-glass-api/issues/detail?id=273 .


Мои текущие исследования заставили меня взглянуть на Google Glass Developer, чтобы использовать предложенный Google способ прослушивания жестов: https://developers.google.com/glass/develop/gdk/input/touch#detecting_gestures_with_a_gesture_detector

Как мы можем активировать эти жесты с помощью голосовых команд?


Android только для бета-версии обновленных носимых устройств для android http://developer.android.com/wear/notifications/remote-input.html , есть ли способ, которым мы можем использовать это, чтобы ответить на мой вопрос? Он по-прежнему чувствует, что мы все еще на расстоянии 1 шага, так как мы можем позвонить в службу, но не будем «спать» и «просыпаться» в качестве фоновой службы, когда мы говорим.

Solutions Collecting From Web of "Как использовать приложение Google GDK для погружения Google Glass только с помощью Voice Command?"

Эта вещь определяется в методе onCreate

 mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); // mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true); sr = SpeechRecognizer.createSpeechRecognizer(context); sr.setRecognitionListener(new listener(context)); // intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US"); intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,context.getPackageName()); sr.startListening(intent); Log.i("111111","11111111"+"in"); 

Этот класс слушателя просто добавляет в ваш класс

 class listener implements RecognitionListener { Context context1; public listener(Context context) { //Log.i("onError startListening","enter"+"nam"); context1=context; } public void onReadyForSpeech(Bundle params) { //Log.d(TAG, "onReadyForSpeech"); } public void onBeginningOfSpeech() { //Log.d(TAG, "onBeginningOfSpeech"); } public void onRmsChanged(float rmsdB) { //Log.d(TAG, "onRmsChanged"); } public void onBufferReceived(byte[] buffer) { //Log.d(TAG, "onBufferReceived"); } public void onEndOfSpeech() { //Log.d(TAG, "onEndofSpeech"); sr.startListening(intent); } public void onError(int error) { //Log.d(TAG, "error " + error); //7 -No recognition result matched. //9 - vInsufficient permissions //6 - No speech input //8 RecognitionService busy. //5 Other client side errors. //3 Audio recording error. // mText.setText("error " + error); if(error==6 || error==7 || error==4 || error==1 || error==2 || error==5 || error==3 || error==8 || error==9 ) { sr.startListening(intent); //Log.i("onError startListening","onError startListening"+error); } } public void onResults(Bundle results) { //Log.v(TAG,"onResults" + results); ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < data.size(); i++) { //Log.d(TAG, "result " + data.get(i)); //str += data.get(i); //Toast.makeText(context1, "results: "+data.get(0).toString(), Toast.LENGTH_LONG).show(); //Log.v("my", "output"+"results: "+data.get(0).toString()); //sr.startListening(intent); } } public void onPartialResults(Bundle partialResults) { //Log.d(TAG, "onPartialResults"); } public void onEvent(int eventType, Bundle params) { //Log.d(TAG, "onEvent " + eventType); } } 

Я подробно излагаю весь код, так как мне потребовалось столько времени, чтобы это работало. Возможно, это спасет кого-то еще ценное время.

Этот код представляет собой реализацию контекстных голосовых команд Google, как описано в Google Developers здесь: Контекстные голосовые команды

ContextualMenuActivity.java

  package com.drace.contextualvoicecommands; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import com.drace.contextualvoicecommands.R; import com.google.android.glass.view.WindowUtils; public class ContextualMenuActivity extends Activity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); // Requests a voice menu on this activity. As for any other // window feature, be sure to request this before // setContentView() is called getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS); setContentView(R.layout.activity_main); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { getMenuInflater().inflate(R.menu.main, menu); return true; } // Pass through to super to setup touch menu. return super.onCreatePanelMenu(featureId, menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { switch (item.getItemId()) { case R.id.dogs_menu_item: // handle top-level dogs menu item break; case R.id.cats_menu_item: // handle top-level cats menu item break; case R.id.lab_menu_item: // handle second-level labrador menu item break; case R.id.golden_menu_item: // handle second-level golden menu item break; case R.id.calico_menu_item: // handle second-level calico menu item break; case R.id.cheshire_menu_item: // handle second-level cheshire menu item break; default: return true; } return true; } // Good practice to pass through to super if not handled return super.onMenuItemSelected(featureId, item); } } 

Activity_main.xml (макет)

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/coming_soon" android:layout_alignParentTop="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/voice_command_test" android:textSize="22sp" android:layout_marginRight="40px" android:layout_marginTop="30px" android:layout_marginLeft="210px" /> </RelativeLayout> 

strings.xml

 <resources> <string name="app_name">Contextual voice commands</string> <string name="voice_start_command">Voice commands</string> <string name="voice_command_test">Say "Okay, Glass"</string> <string name="show_me_dogs">Dogs</string> <string name="labrador">labrador</string> <string name="golden">golden</string> <string name="show_me_cats">Cats</string> <string name="cheshire">cheshire</string> <string name="calico">calico</string> </resources> 

AndroidManifest.xml

  <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.drace.contextualvoicecommands" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="com.drace.contextualvoicecommands.ContextualMenuActivity" android:label="@string/app_name" > <intent-filter> <action android:name="com.google.android.glass.action.VOICE_TRIGGER" /> </intent-filter> <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/voice_trigger_start" /> </activity> </application> </manifest> 

Он прошел тестирование и отлично работает под Google Glass XE22!

Вы можете попробовать этот фрагмент здесь: https://github.com/pscholl/glass_snippets/tree/master/hotword_detection .

Вы можете попробовать контекстные голосовые команды, доступные в GDK. Хотя он временно закрывает экран меню, он позволяет вводить только голос.

https://developers.google.com/glass/develop/gdk/voice

Я сделал что-то очень похожее для одного из моих приложений. Он вообще не требует окна с окном, но пользователю нужно заранее знать команды. Я немного объяснил это и предоставил ссылки на этот вопрос: Посмотрите мой ответ здесь: Glass GDk: Контекстные голосовые команды без «Окного стекла»,

Надеюсь, это поможет!