2014-04-15 17 views
5

Sto tentando di personalizzare la "finestra di dialogo" durante il riconoscimento vocale. enter image description hereFinestra di dialogo GUI di riconoscimento vocale personalizzata per Android

Se ho capito correttamente ho bisogno di usare SpeechRecognizer per personalizzare la GUI di riconoscimento vocale nell'immagine sopra.

Questo How to get audio amplitude with speech recognizer?, è simile alla mia domanda, ma sta chiedendo di aggiungere l'indicatore di ampiezza usando onRmsChanged, poiché ha già capito come implementare una nuova GUI mentre il riconoscimento sta accadendo, quindi la sua domanda anche se utile, è un po ' più avanti di dove sono a.

Esistono progetti di esempio esistenti, tuts che spiegano come questo tipo di interfaccia utente personalizzata è implementata. Ho esaminato l'esempio di VoiceRecognition ApiDemo, ma non riesco ancora a vedere dove impostare/modificare l'interfaccia ..

Dai documenti di sviluppo, ho capito che questo deve essere sul thread dell'interfaccia utente principale. Quindi il mio approccio pseudo sarebbe creare un SpeechDialogClass, una classe di dialogo che estende Dialog e implementa RecognitionListener. Qualcosa come questo. Immagino che da qualche parte nei metodi vorrei impostare il contesto, la consegna onRmsChanged ecc .. ma da lì sono praticamente perso.

public class SpeechDialogClass extends Dialog implements RecognitionListener { 

    public Activity c; 
    public Dialog d; 
    public ImageView mic, mic_amp; 

    public SpeechDialogClass(Activity a) { 
     super(a); 
     // TODO Auto-generated constructor stub 
     this.c = a; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.speech_dialog_kids); 
     mic = (ImageView) findViewById(R.id.mic_icon); 
     mic_amp = (ImageView) findViewById(R.id.speech_amplitude); 

     // //So I would set some sort of listener to change the selector state 
     // of mic_icon and the 
     // /somewhere I would set the mic_amp to listen/ract to on onRmsChanged 
     // public void onRmsChanged(float arg0)/// 
     // // and this is where Im lost/// 

    } 

    public void onBeginningOfSpeech() { 
     // TODO Auto-generated method stub 
     setContentView(R.layout.speech_dialog_kids); 
    } 

    public void onBufferReceived(byte[] arg0) { 
     // TODO Auto-generated method stub 

    } 

    public void onEndOfSpeech() { 
     // TODO Auto-generated method stub 

    } 

    public void onError(int arg0) { 
     // TODO Auto-generated method stub 

    } 

    public void onEvent(int arg0, Bundle arg1) { 
     // TODO Auto-generated method stub 

    } 

    public void onPartialResults(Bundle arg0) { 
     // TODO Auto-generated method stub 

    } 

    public void onReadyForSpeech(Bundle arg0) { 
     // TODO Auto-generated method stub 

    } 

    public void onResults(Bundle arg0) { 
     // TODO Auto-generated method stub 

    } 

    public void onRmsChanged(float arg0) { 
     // TODO Auto-generated method stub 
     // pseudo code// 
     // mic_amp.doSomething(and a float); 
    } 

} 

mio speech_dialiog_kids.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="150dp" 
    android:background="#3E80B4" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/txt_dia" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_margin="10dp" 
     android:text="Speak Text" 
     android:textColor="@android:color/white" 
     android:textSize="15dp" 
     android:textStyle="bold" > 
    </TextView> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:background="#3E80B4" 
     android:orientation="horizontal" > 

     <ImageView 
      android:id="@+id/speech_amplitude" 
      android:layout_width="78dp" 
      android:layout_height="78dp" 
      android:layout_marginTop="10dp" 
      android:src="@drawable/amplitude_icon" 
      android:visibility="visible" /> 

     <ImageView 
      android:id="@+id/mic_icon" 
      android:layout_width="68dp" 
      android:layout_height="68dp" 
      android:layout_marginLeft="-73dp" 
      android:layout_marginTop="16dp" 
      android:src="@drawable/small_right_grey_white" 
      android:visibility="visible" /> 
    </LinearLayout> 

</LinearLayout> 

enter image description here

risposta

1

mi immagino che da qualche parte nei metodi vorrei impostare il contesto, la consegna onRmsChanged ecc .. ma da lì Im praticamente perso .

Qualcosa di simile a questo:

public void onRmsChanged(float rms) { 
    if (rms < limit1) 
     mic_amp.setImageResource(1); 
    else if (rms < limit2) 
     mic_amp.setImageResource(2); 
    else if (rms < limit3) 
     mic_amp.setImageResource(3); 
} 

ti pulsare sul cambiamento rms. Si modifica l'immagine in base al livello rms. È possibile modificare vari metodi ImageView per modificare l'immagine effettiva.

Un altro problema è che onRmsChanged non viene sempre richiamato a seconda della versione di Android, quindi rende più difficile l'implementazione di questa funzionalità. Quindi probabilmente il modo più semplice sarebbe rimanere con il dialogo originale.

+0

Grazie mille per l'aiuto. Darò una prova. "Un altro problema è che onRmsChanged non è sempre invocato a seconda della versione di Android" Sì, ho letto anche su questo, mi chiedo perché questo sarebbe. Grazie ancora – Mcorv

+0

Perché Google non vuole consentire di rebrandare il proprio motore. –

Problemi correlati