2014-04-15 14 views
5

Próbuję dostosować "Dialog" podczas rozpoznawania mowy. enter image description hereAndroid Niestandardowe rozpoznawanie głosu GUI Dialog

Jeśli dobrze rozumiem, muszę użyć SpeechRecognizer, aby dostosować GUI rozpoznawania mowy na powyższym obrazku.

Ten How to get audio amplitude with speech recognizer?, jest podobny do mojego pytania, ale pyta o dodanie wskaźnika amplitudy przy użyciu onRmsChanged, ponieważ już zorientował się, jak zaimplementować nowy GUI podczas rozpoznawania, więc jego pytanie, choć przydatne, jest nieco dalej niż gdzie jestem.

Czy istnieją istniejące przykładowe projekty, tuts wyjaśniające, w jaki sposób ten niestandardowy interfejs użytkownika jest zaimplementowany. Spojrzałem na próbkę ApiDemo VoiceRecognition, ale nadal nie wiem gdzie ustawić/zmienić interfejs użytkownika ..

Z dokumentacji devs, rozumiem, że to musi być w głównym wątku UI. Tak więc moim pseudo podejście byłoby stworzenie SpeechDialogClass, klasa okno dialogowe, która rozszerza dialog i implementuje RecognitionListener. Coś takiego. Wyobrażam sobie, że gdzieś w metodach ustawiam kontekst, instrukcję onRmsChanged itp., Ale stamtąd jestem prawie zagubiony.

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

} 

My 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

Odpowiedz

1

Mogę sobie wyobrazić, że gdzieś w metodach chciałbym ustawić kontekst, onRmsChanged przekazanie etc .. ale stamtąd Im dość dużo stracił .

coś takiego:

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

Tak będzie pulsować na skutecznej zmiany. Zmieniasz obraz w zależności od poziomu rms. Możesz zmienić różne metody ImageView, aby zmienić rzeczywisty obraz.

Innym problemem jest to, że onRmsChanged nie zawsze jest wywoływane w zależności od wersji Androida, więc utrudnia wdrożenie tej funkcji. Najprawdopodobniej najprościej byłoby pozostać przy oryginalnym oknie dialogowym.

+0

Wielkie dzięki za pomoc. Spróbuję tego. "Innym problemem jest to, że onRmsChanged nie zawsze jest wywoływany w zależności od wersji Androida" Tak, o tym też czytam, zastanawiam się, dlaczego tak się stało. Jeszcze raz dziękuję – Mcorv

+0

Ponieważ Google nie chce pozwolić Ci na zmianę marki swojego silnika. –

Powiązane problemy