2016-05-31 40 views
1

我正在开发语音识别应用程序。我已使用pocketspjinx演示。此外,我创建了字典使用http://www.speech.cs.cmu.edu/tools/lextool.html 但我说话时,它不能识别正确的单词,而是它提供了另一个词。下面是我的代码Pocketsphinx无法准确识别印度语的单词

package edu.cmu.pocketsphinx.demo; 

import android.app.Service; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 

import edu.cmu.pocketsphinx.Assets; 
import edu.cmu.pocketsphinx.Hypothesis; 
import edu.cmu.pocketsphinx.RecognitionListener; 
import edu.cmu.pocketsphinx.SpeechRecognizer; 
import edu.cmu.pocketsphinx.SpeechRecognizerSetup; 

import static android.widget.Toast.makeText; 

public class FirstService extends Service implements 
     RecognitionListener { 

    /* Named searches allow to quickly reconfigure the decoder */ 
    private static final String KWS_SEARCH = "wakeup"; 
    // private static final String FORECAST_SEARCH = "pimple"; 
// private static final String DIGITS_SEARCH = "help"; 
// private static final String PHONE_SEARCH = "phones"; 
    private static final String MENU_SEARCH = "menu"; 

    /* Keyword we are looking for to activate menu */ 
    private static final String KEYPHRASE = "hello"; 

    /* Used to handle permission request */ 
    private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 1; 

    private SpeechRecognizer recognizer; 
    private HashMap<String, Integer> captions; 

    private static String TAG = "Inchoo.net tutorial"; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     /* TODO Auto-generated method stub */ 
     return null; 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     // TODO Auto-generated method stub 
     super.onStart(intent, startId); 
     Log.d(TAG, "FirstService started"); 
     runRecognizerSetup(); 
     // this.stopSelf(); 
    } 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     Log.d(TAG, "FirstService destroyed"); 
    } 
    private void runRecognizerSetup() { 
     // Recognizer initialization is a time-consuming and it involves IO, 
     // so we execute it in async task 
     new AsyncTask<Void, Void, Exception>() { 
      @Override 
      protected Exception doInBackground(Void... params) { 
       try { 
        Assets assets = new Assets(FirstService.this); 
        File assetDir = assets.syncAssets(); 
        setupRecognizer(assetDir); 
       } catch (IOException e) { 
        return e; 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Exception result) { 
       if (result != null) { 

       } else { 
        switchSearch(KWS_SEARCH); 
       } 
      } 
     }.execute(); 
    } 




    /** 
    * 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) { 
     if (hypothesis == null) 
      return; 

     String text = hypothesis.getHypstr(); 
     Log.d("TEMP RESULT",text); 

     /// if (text.equals(KEYPHRASE)) 
     switchSearch(MENU_SEARCH); 
//  else if (text.equals(DIGITS_SEARCH)) 
//   switchSearch(DIGITS_SEARCH); 
//  else if (text.equals(PHONE_SEARCH)) 
//   switchSearch(PHONE_SEARCH); 
//  else if (text.equals(FORECAST_SEARCH)) 
//   switchSearch(FORECAST_SEARCH); 
     // else 
     //((TextView) findViewById(R.id.result_text)).setText(text); 
    } 

    /** 
    * This callback is called when we stop the recognizer. 
    */ 
    @Override 
    public void onResult(Hypothesis hypothesis) { 


     if (hypothesis != null) { 
      String text = hypothesis.getHypstr(); 
      Log.d(" RESULT",text); 
      makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onBeginningOfSpeech() { 
    } 

    /** 
    * We stop recognizer here to get a final result 
    */ 
    @Override 
    public void onEndOfSpeech() { 

     Log.d("getSearchName()",recognizer.getSearchName()); 
     if (!recognizer.getSearchName().equals(KWS_SEARCH)) 
      switchSearch(KWS_SEARCH); 
    } 

    private void switchSearch(String searchName) { 
     recognizer.stop(); 

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

//  String caption = getResources().getString(captions.get(searchName)); 
//  ((TextView) findViewById(R.id.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 

     recognizer = SpeechRecognizerSetup.defaultSetup() 
       .setAcousticModel(new File(assetsDir, "en-us-ptm")) 
       .setDictionary(new File(assetsDir, "cmudict-en-us.dict")) 

       .setRawLogDir(assetsDir) // To disable logging of raw audio comment out this call (takes a lot of space on the device) 
       .setKeywordThreshold(1e-45f) // Threshold to tune for keyphrase to balance between false alarms and misses 
       .setBoolean("-allphone_ci", true) // Use context-independent phonetic search, context-dependent is too slow for mobile 


       .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 selection between demos 
     File menuGrammar = new File(assetsDir, "menu.gram"); 
     recognizer.addGrammarSearch(MENU_SEARCH, menuGrammar); 

//  // Create grammar-based search for digit recognition 
//  File digitsGrammar = new File(assetsDir, "digits.gram"); 
//  recognizer.addGrammarSearch(DIGITS_SEARCH, digitsGrammar); 
// 
//  // Create language model search 
//  File languageModel = new File(assetsDir, "weather.dmp"); 
//  recognizer.addNgramSearch(FORECAST_SEARCH, languageModel); 
// 
//  // Phonetic search 
//  File phoneticModel = new File(assetsDir, "en-phone.dmp"); 
//  recognizer.addAllphoneSearch(PHONE_SEARCH, phoneticModel); 
    } 

    @Override 
    public void onError(Exception error) { 

    } 

    @Override 
    public void onTimeout() { 


     Log.d("TIME OUt","TIMEOUT"+KWS_SEARCH); 
     switchSearch(KWS_SEARCH); 
    } 

} 

回答

0

默认的模型是美国英语创建的,它不支持印度英语,而不是期待高精确度的印度英语。

印度英语无疑是我们的首要任务,但我们需要本地人来帮助我们建立系统。你作为本地人可以提供很多帮助,否则你必须等到有人收集足够的数据。