2016-02-27 48 views
-1

對不起,我一直堅持這一個月,我想提供儘可能多的細節......它只是一個文件沒有發現異常在一個簡單的庫...: )文件未找到異常? (語音識別)

我對我的variances文件中獲取文件未發現異常:

enter image description here

,不過我會,有差異文件:

enter image description here

我試圖簡單地在我的後臺服務中實現語音識別,以便我可以檢測到用戶說出單詞hello(使用pocketsphinx)。

的問題發生在這個方法:createSphinxDir();

這裏是我的服務:

@Override 
    public void onCreate() { 
     super.onCreate(); 
     setupRecog(); 

     } 
    private void setupRecog() { 
    String sphinxDir = createSphinxDir(); 
    Log.v(TAG, "ABOUT TO CREATE SETUP"); 
    if (sphinxDir != null) { 
     try { 

      Log.v(TAG, "SETTING UP! :)"); 
      mSpeechRecognizer = defaultSetup() 
        .setAcousticModel(new File(sphinxDir, "en-us-ptm")) 
        .setDictionary(new File(sphinxDir, "hello.dict")) 
        .setBoolean("-allphone_ci", true) //WHAT IS THIS 
        .getRecognizer(); 
      mSpeechRecognizer.addListener(this); 

      Log.v(TAG, "ADDED LISTENER"); 

      if ((new File(sphinxDir + File.separator + "command.gram")).isFile()) { 
       mSpeechRecognizer.addKeywordSearch("hello", 
         new File(sphinxDir + File.separator + "command.gram")); 

       Log.v(TAG, "ADDED KEYWORD SEARCH! :)"); 
      } 

      // Or wherever appropriate 
      mSpeechRecognizer.startListening("wakeup"); //Is this correct? 
      Log.v(TAG, "STARTED LISTENING"); 

     } catch (IOException e) { 

      Log.v("ERROR", TAG); 

     } 
    } 
} 


String createSphinxDir() { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    String sphinxDir = prefs.getString("sphinx", null); 
    if (sphinxDir == null) { 
     Assets assets; 
     Log.v(TAG, "Assets are not synced, should sync now:"); 
     try { 
      Log.v(TAG, "In try block!"); 
      assets = new Assets(this); 
      File sphinxDirFile = assets.syncAssets(); 
      Log.v(TAG, "Syncing assets...should set up listener"); 
      if (sphinxDirFile != null) { 
       sphinxDir = sphinxDirFile.getAbsolutePath(); 
       SharedPreferences.Editor editor = prefs.edit(); 
       editor.putString("sphinx", sphinxDir); 
       editor.commit(); 
       Log.v(TAG, "Set up listener"); 

      }else{ 
       Log.v(TAG, "sphinxDirFile is null!"); 
      } 
     } catch (IOException e) { //THIS IS THE PLACE WHERE I AM GETTING THE ERROR! 
      e.printStackTrace(); 
      Log.d(TAG, e.toString()); 
     } 
    } 
    return sphinxDir; 
} 

我也有所有的回調方法(onPartialResult,onResult等),但他們從來沒有得到調用。

早些時候我得到一個異常說方差.md5文件不存在,所以我把一個空間,在variances.md5之間,但現在我得到這個錯誤,我不知道爲什麼...

請讓我知道,

Ruchir

+0

我沒有看到你所處理的AssetManager通過其加載的資產的代碼。 –

+0

我可以從堆棧跟蹤中看到您正在使用AssetManager。它在Assets類中,我們在這裏看不到。 –

+0

在差異文件末尾添加一個空格,看看它是否可以。您不需要AssetManager,Sphinx的syncAssets方法爲您完成副本。 –

回答

1

早些時候我得到一個異常說.md5文件不存在的方差,所以我把一個空間方差之和.md5,但現在我得到這個錯誤,我不知道爲什麼...

,它引起的問題,而是你需要遵循documentation你不應該做這樣的事情:

的標準方法在您的Android應用程序中發佈資源文件是將它們放到您項目的assets/目錄中。但爲了使它們可用於pocketsphinx文件應該有物理路徑,只要它們在.apk之內就沒有它們。來自pocketsphinx-android的資產類提供了一種方法來自動將資產文件複製到目標設備的外部存儲。 edu.cmu.pocketsphinx.Assets#syncAssets同步assets.lst文件位於頂部assets/的資源讀取項目。在複製之前,如果存在相同的名稱,則匹配資產的MD5校驗和和外部存儲上的文件。如果存在不完整的信息(外部存儲中沒有文件,沒有任何兩個.md5文件),或者存在散列不匹配,它只會進行實際的複製。 PocketSphinxAndroidDemo包含生成assets.lst以及.md5文件的螞蟻腳本,請查找assets.xml

請注意,如果ant構建腳本在構建過程中無法正常運行,資產可能不同步。確保腳本在構建過程中運行。

爲了整合資產同步在應用程序中執行以下操作

包括從演示應用app/asset.xml構建文件到您的應用程序。編輯build.gradle構建文件運行assets.xml

ant.importBuild 'assets.xml' 
    preBuild.dependsOn(list, checksum) 
    clean.dependsOn(clean_assets) 
+0

'asset.xml'的內容應該是什麼? –

+0

請參閱pocketsphinx android演示 –

+0

但演示中'main'中沒有'assets.xml'。 –