6

Zrobiłem dużo dla badań i wypróbowałem sfinks kieszonkowy w trybie offline, ale przyjmuje on głos otaczający, który przyjmuje i inaczej reaguje na moją aplikację. Czy jest jakaś aplikacja offline Google dla powyższego zestawu KitKat 4.4 .. próbuję go od 2 tygodni. Dziękuję za cenną odpowiedź.Rozpoznawanie głosu offline android przy użyciu niechcianego głosu

Szczegóły: Kiedy rozpoczyna działalność pierwszy tekst musi odczytać zawartość (Text To Speech) po zakończeniu czytania rozpoznawania głosu musi wziąć głos i zgodnie poleceń Ex: (następny, poprzedni, forward, opcji, 1, 2, 3, 4 itd.). Zgodnie z poleceniem musi rozpoznawać i reagować na to w metodzie onresult.

Błąd: otrzymuję błąd po zrobieniu jakiś głos

06-18 19:54:00.159: V/onBeginningOfSpeech(3360): onBeginningOfSpeech 
06-18 19:54:01.024: V/onPartialResult(3360): option 
06-18 19:54:01.109: I/cmusphinx(3360): INFO: fsg_search.c(843): 105 frames, 5333 HMMs (50/fr), 7748 senones (73/fr), 371 history entries (3/fr) 
06-18 19:54:01.110: I/SpeechRecognizer(3360): Stop recognition 
06-18 19:54:01.110: E/cmusphinx(3360): ERROR: "fsg_search.c", line 913: Final result does not match the grammar in frame 105 
06-18 19:54:01.111: V/onPartialResult-->(3360): option 
06-18 19:54:01.111: V/onResult(3360): onResult 

Android Hive offline link

Ale jeśli mogę wyłączyć internet nie działa w trybie offline.

W pocketsphinx nie reaguje na poprawne słowo. Jeśli powiem "dalej", to zbliży się do treści głosowej innego, dołącza "klucz" i sprawia mi to duży problem. Czy istnieje rozwiązanie lub biblioteka do użycia w trybie offline. Wszelkie wsparcie offline offline Google Voice.

Poniżej jest mój kod, co próbowali

package com.example.sample1; 

import static edu.cmu.pocketsphinx.SpeechRecognizerSetup.defaultSetup; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Locale; 
import edu.cmu.pocketsphinx.RecognitionListener; 
import android.app.Activity; 
import android.graphics.Color; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ExpandableListView; 
import android.widget.ExpandableListView.OnChildClickListener; 
import android.widget.ExpandableListView.OnGroupClickListener; 
import android.widget.ExpandableListView.OnGroupExpandListener; 
import android.widget.TextView; 
import android.widget.Toast; 
import edu.cmu.pocketsphinx.Assets; 
import edu.cmu.pocketsphinx.Hypothesis; 
import edu.cmu.pocketsphinx.SpeechRecognizer; 

public class Sam extends Activity implements RecognitionListener, TextToSpeech.OnInitListener { 

    /* Named searches allow to quickly reconfigure the decoder */ 

    private static final String DIGITS_SEARCH = "digits"; 

    private SpeechRecognizer recognizer; 
    private HashMap<String, Integer> captions; 
    private TextView caption_text; 
    private TextView result_text; 
    ArrayList<String> result1; 
    private Button buttonLeft; 
    private Button buttonRight; 
    int count = 0; 
    private ArrayList<DataAnswer> dummyListTemp; 
    private ArrayList<DataAnswer> dummyList; 
    AnswerDataAdapter listAdapter = null; 
    int conteo = 0; 
    Handler a = new Handler(); 
    private TextToSpeech tts; 
    String readIt =""; 

    HashMap<String, String> params = new HashMap<String, String>(); 

    @Override 
    public void onCreate(Bundle state) { 
     super.onCreate(state); 
     Log.v("onCreate", "onCreate"); 

     // Prepare the data for UI 
     captions = new HashMap<String, Integer>(); 

     captions.put(DIGITS_SEARCH, R.string.digits_caption); 

     setContentView(R.layout.quiz); 
     caption_text = (TextView) findViewById(R.id.caption_text); 
     result_text = (TextView) findViewById(R.id.result_text); 
    // listViewAnswer = (ExpandableListView) findViewById(R.id.listViewAnswer); 
     buttonRight = (Button) findViewById(R.id.buttonRight); 
     buttonLeft = (Button) findViewById(R.id.buttonLeft); 
     result_text.setText("Result --->: "); 

     tts = new TextToSpeech(this, this); 

     params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId"); 

     String text = "World is full of chanllenge"; 
     //Speakes the text first and then after comple reading text voice recoginzation must start 
     speakOut(text); 




     buttonRight.setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       try { 
        //onClickRight(); 

        Toast.makeText(getApplicationContext(), "Right", Toast.LENGTH_SHORT).show(); 
       } catch (Exception e){ 
        e.printStackTrace(); 
       } 


      } 
     }); 

     buttonLeft.setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       //onClickLeft(); 
       Toast.makeText(getApplicationContext(), "Left", Toast.LENGTH_SHORT).show(); 
      } 
     }); 


     // Recognizer initialization is a time-consuming and it involves IO, 
     // so we execute it in async task 
     //if(!tts.isSpeaking()) { 
     new AsyncTask<Void, Void, Exception>() { 
      @Override 
      protected Exception doInBackground(Void... params) { 
       try { 
        Assets assets = new Assets(Sam.this); 
        File assetDir = assets.syncAssets(); 
        Log.v("AsyncTask", "AsyncTask"); 
        setupRecognizer(assetDir); 

       } catch (IOException e) { 
        return e; 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Exception result) { 
       Log.v("onPostExecute", "onPostExecute"); 
       try{ 
        if (result != null) { 
         //caption_text.setText("Failed to init recognizer " + result); 
         Toast.makeText(getApplicationContext(), "Failed to init recognizer ", Toast.LENGTH_SHORT).show(); 
        } else { 
         FireRecognition(); 
         //switchSearch(DIGITS_SEARCH); 

        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }.execute(); 
    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.v("onDestroy", "onDestroy"); 
     recognizer.cancel(); 
     recognizer.shutdown(); 

     if (tts != null) { 
      tts.stop(); 
      tts.shutdown(); 
     } 
    } 

    public void FireRecognition(){ 
     Log.d("Recognition","Recognition Started"); 
     //caption_text.setText("Recognition Started!"); 
     //Toast.makeText(getApplicationContext(), "Recognition Started!", Toast.LENGTH_SHORT).show(); 
     recognizer.stop(); 
     //recognizer.startListening("digits"); 

    } 

    /** 
    * In partial result we get quick updates about current hypothesis. In 
    * keyword spotting mode we can react here, in other modes we need to wait 
    * for final result in onResult. 
    */ 
    @Override 
    public void onPartialResult(Hypothesis hypothesis) { 
     try { 
      //Log.v("onPartialResult", "onPartialResult"); 
      if (hypothesis == null) 
       return; 
      Log.v("onPartialResult", hypothesis.getHypstr().toString()); 

      String text = hypothesis.getHypstr(); 
      if(recognizer !=null) 
       recognizer.stop(); 

      caption_text.setText("Partial result -->: " + text); 

      Log.v("onPartialResult-->", text); 

      // Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * This callback is called when we stop the recognizer. 
    */ 
    @Override 
    public void onResult(Hypothesis hypothesis) { 
     try{ 
      Log.v("onResult", "onResult"); 
      // result_text.setText(""); 
      if (hypothesis != null) { 
       String text = hypothesis.getHypstr(); 
       //Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
       // ((TextView) findViewById(R.id.result_text)).setText(text); 

       if(text.toLowerCase().equals("next")) { 
        result_text.setText("Result --->: " + text); 
        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
       } else if(text.toLowerCase().equals("previous")) { 
        result_text.setText("Result --->: " + text); 
        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 

       } else if(text.toLowerCase().trim().equals("option one".toLowerCase().trim())) { 
        result_text.setText("Result --->: " + text); 


        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
        result_text.setText("Result --->: " + text); 
       } else if(text.toLowerCase().trim().equals("option two".toLowerCase().toString())) { 

        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
       } else if(text.toLowerCase().trim().equals("option three".toLowerCase().toString())) { 
        result_text.setText("Result --->: " + text); 
        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
       } else if(text.toLowerCase().trim().equals("option four".toLowerCase().toString())) { 
        result_text.setText("Result --->: " + text); 
        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
       } else { 
        Toast.makeText(getApplicationContext(), " No Access:--" + text, Toast.LENGTH_SHORT).show(); 
       } 




       Log.v("onResult-->", text); 
       if(recognizer != null)    
        recognizer.startListening("digits"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void onBeginningOfSpeech() { 
     Log.v("onBeginningOfSpeech", "onBeginningOfSpeech"); 

    } 

    /** 
    * We stop recognizer here to get a final result 
    */ 
    @Override 
    public void onEndOfSpeech() { 
     Log.v("onEndOfSpeech", "onEndOfSpeech"); 

     if (!recognizer.getSearchName().equals(DIGITS_SEARCH)) 
      switchSearch(DIGITS_SEARCH); 
    } 


    private void switchSearch(String searchName) { 
     Log.v("switchSearch", "switchSearch--->" + searchName); 
     recognizer.stop(); 

     // If we are not spotting, start listening with timeout (10000 ms or 10 seconds). 
     if (searchName.equals(DIGITS_SEARCH)) 
      recognizer.startListening(searchName, 10000); 
     /* else 
      recognizer.startListening(searchName, 10000);*/ 

     /* String caption = getResources().getString(captions.get(searchName)); 
     caption_text.setText(caption);*/ 
    } 

    private void setupRecognizer(File assetsDir) throws IOException { 

     // The recognizer can be configured to perform multiple searches 
     // of different kind and switch between them 
     Log.v("setupRecognizer", "setupRecognizer"); 
     recognizer = defaultSetup() 
       .setAcousticModel(new File(assetsDir, "en-us-ptm")) 
       .setDictionary(new File(assetsDir, "cmudict-en-us.dict")) 

       // To disable logging of raw audio comment out this call (takes a lot of space on the device) 
       .setRawLogDir(assetsDir) 

       // Threshold to tune for keyphrase to balance between false alarms and misses 
       .setKeywordThreshold(1e-20f) //1e-20f 1e-45f 

       // Use context-independent phonetic search, context-dependent is too slow for mobile 
       // .setBoolean("-allphone_ci", true) 

       .getRecognizer(); 
     recognizer.addListener(this); 

     /** In your application you might not need to add all those searches. 
     * They are added here for demonstration. You can leave just one. 
     */ 

     // Create keyword-activation search. 
     // recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE); 



     // Create grammar-based search for digit recognition 
     File digitsGrammar = new File(assetsDir, "digits.gram"); 
     recognizer.addGrammarSearch(DIGITS_SEARCH, digitsGrammar); 

    } 



    @Override 
    public void onError(Exception error) { 
     Log.v("onError", "onError"); 
     //caption_text.setText(error.getMessage()); 
     Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onTimeout() { 
     Log.v("onTimeout", "onTimeout"); 
     switchSearch(DIGITS_SEARCH); 
    } 


    @SuppressWarnings("deprecation") 
    @Override 
    public void onInit(int status) { 

     tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() { 

      @Override 
      public void onUtteranceCompleted(String utteranceId) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         if(recognizer != null) 
          recognizer.startListening("digits"); 
         //Toast.makeText(getApplicationContext(), "Completed", Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 
     }); 

     if (status == TextToSpeech.SUCCESS) { 

      int result = tts.setLanguage(Locale.US); 


      Log.i("Success", "Completed"); 

      if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { 
       Log.e("TTS", "This Language is not supported"); 
      } else { 
       //buttonSpeak.setEnabled(true); 
       // speakOut(); 
       String text = " No Voice Found".toString(); 
       Log.i("else", "else"); 
       // speakOut(text); 
      } 

     } else { 
      Log.e("TTS", "Initilization Failed!"); 
     } 

    } 


    @SuppressWarnings("deprecation") 
    private void speakOut(String text) { 
     if(tts.isSpeaking()) { 
      //recognizer.stop(); 
     } 
     // String text = ((TextView) findViewById(R.id.caption_text)).getText().toString(); 
     tts.speak(text, TextToSpeech.QUEUE_FLUSH, params); 

     Log.i("Speaking-->", "****" + tts.isSpeaking()); 

    } 



} 

aw digit.gram

#JSGF V1.0; 

grammar digits; 

<digit> = option one | 
      option two | 
      option three | 
      option four | 
      back | 
      previous | 
      next; 

public <digits> = <digit>+; 

Powyżej jest mój kod jeśli ktoś pracował na nim proszę dać mi znać rozwiązanie Oto moja xml quiz.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/linearLayout2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/linearLayout1" 
     android:orientation="vertical" > 

     <ExpandableListView 
      android:id="@+id/listViewAnswer" 
      android:layout_width="match_parent" 
      android:layout_height="301dp" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:childDivider="#334455" > 
     </ExpandableListView> 
    </LinearLayout> 

    <RelativeLayout 
     android:id="@+id/relativeLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/linearLayout2" 
     android:layout_marginTop="10dip" 
     android:orientation="horizontal" > 

     <Button 
      android:id="@+id/buttonRight" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_marginRight="10dip" 
      android:text="Next" /> 

     <Button 
      android:id="@+id/buttonLeft" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dip" 
      android:text="Previous" /> 
    </RelativeLayout> 

    <RelativeLayout 
     android:id="@+id/relativeLayout2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/relativeLayout1" > 

     <TextView 
      android:id="@+id/result_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:textColor="#556677" /> 

     <TextView 
      android:id="@+id/caption_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/result_text" 
      android:layout_alignParentLeft="true" 
      android:textColor="#443399" /> 
    </RelativeLayout> 

</RelativeLayout> 

Aktualizacja:

jeśli u używasz addKeywordSearch

File digitsGrammar = new File(context.getFilesDir(), "digits.gram"); 
recognizer.addKeywordSearch(DIGITS_SEARCH, digitsGrammar); 

następnie w digit.gram pisać tylko

option one /1e-1/ 
option two /1e-1/ 
option three /1e-1/ 
option four /1e-1/ 
back /1e-1/ 
previous /1e-1/ 
next /1e-1/ 

lub

jeśli używasz addGrammarSearch

File digitsGrammar = new File(context.getFilesDir(), "digits.gram"); 
recognizer.addGrammarSearch(DIGITS_SEARCH, digitsGrammar); 

następnie w digit.gram

#JSGF V1.0; 

grammar digits; 

<digit> = option one | 
     option two | 
     option three | 
     option four | 
     back | 
     previous | 
     next; 

    public <digits> = <digit>+; 

Odpowiedz

5

trzeba użyć słowa kluczowego tryb plamienia zamiast trybu gramatyki do ciągłego słuchania

można znaleźć przykład tutaj:

Recognizing multiple keywords using PocketSphinx

+0

Jak to zrobić. czy mogę uzyskać próbkę powiązaną z tym. –

+0

zamiast rozpoznawania.addGrammarSzukaj (DIGITS_SEARCH, digitsGrammar); muszę dodać rozpoznawcę.addKeywordSearch (DIGITS_SEARCH, digitsGrammar); obrzęd. Następnie co muszę edytować w digit.gram –

+0

Zaktualizowany powyżej digit.gram jest to sposób zapisu muszę zmienić dla keywordsearch –

2

Począwszy od Androida M, możesz użyć EXTRA_PREFER_ OFFLINE, gdy tworzysz zamiar rozpoznawania.

+0

Czy pracowałeś w dniu EXTRA_PREFER_OFFLINE. Czy to działa dla Ciebie .. Czy możesz udostępnić próbkę, jeśli masz. –

Powiązane problemy