¿Cómo navegar por una aplicación de Google Glass GDK Immersion usando sólo comandos de voz?

¿Cómo podría yo ir sobre la codificación de un disparador de voz para navegar 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 

Las tarjetas que necesito para mostrar son texto simple e imágenes, me pregunto si puedo configurar un oyente de algún tipo para escuchar los comandos de voz mientras se muestra la tarjeta.


He investigado Glass comando de voz más cercano de la lista determinada, pero no fue capaz de ejecutar el código, aunque sí tengo todas las bibliotecas.

Nota lateral: Es importante que el usuario siga viendo la tarjeta cuando utilice el comando de voz. También sus manos están ocupadas, así que toque / deslice no es una opción.

¿Alguna idea sobre cómo controlar la línea de tiempo dentro de mi aplicación de inmersión usando solo control de voz? Sería muy apreciado!

También estoy siguiendo https://code.google.com/p/google-glass-api/issues/detail?id=273 .


Mi investigación en curso me hizo mirar hacia atrás a Google Glass Developer para usar la sugerida manera de escuchar gestos de Google: https://developers.google.com/glass/develop/gdk/input/touch#detecting_gestures_with_a_gesture_detector

¿Cómo podemos activar estos gestos con comandos de voz?


Android acaba de lanzar beta-dispositivos portátiles de actualización para Android http://developer.android.com/wear/notifications/remote-input.html , ¿Hay alguna manera de que podamos usar esto para responder a mi pregunta? Todavía se siente como que todavía estamos a un paso de distancia ya que podemos llamar al servicio, pero no lo tienen "dormir" y "despertar" como un servicio de fondo cuando hablamos.

Esto define en el método 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"); 

Esta clase de oyente simplemente agrega en tu clase

 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); } } 

Estoy escribiendo el código completo en detalle, ya que me tomó tanto tiempo para conseguir este trabajo .. tal vez va a ahorrar a alguien más valioso tiempo.

Este código es la implementación de Google Contextual Voice Commands como se describe en Google Developers aquí: Comandos de voz contextuales

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 (diseño)

  <?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> 

Ha sido probado y funciona muy bien bajo Google Glass XE22!

Es posible que desee probar los comandos de voz contextuales disponibles en el GDK. Mientras que temporalmente cubre la pantalla con un menú, que permite la entrada de voz sólo.

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

Hice algo muy similar para una de mis aplicaciones. No requiere la pantalla de cristal ok en absoluto, pero el usuario necesita saber los comandos antes de tiempo. He explicado un poco de él y ha proporcionado enlaces sobre esta cuestión: Echa un vistazo a mi respuesta aquí: Glass GDk: comandos de voz contextuales sin el "Ok Glass"

¡Espero que esto ayude!

  • ¿Cuál es el tamaño máximo de un apk en Google Glass?
  • Después de actualizar a kitkat, mi aplicación de vidrio que inserta las tarjetas en la línea de tiempo dejó de funcionar
  • Reproducción de un video local en Glass
  • Actualizar el texto de la tarjeta en Google Glass utilizando GDK?
  • Android Studio || GDK 'hola palabra' || Import com.google.android.glass.app.Card || No se puede resolver el símbolo 'google'
  • ¿Se admite Intent.ACTION_CALL en Google Glass GDK?
  • ListVIew en Google Glass
  • ¿Podrá google glass ejecutar aplicaciones normales de Android?
  • No puedo enviar correo desde Google Glass
  • Google Glass no aparece como dispositivo Android por ADB
  • Programa Hello World para Google Glass - Paso a paso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.