2015-03-12 1 views
2

J'utilise la dernière démo de pocketphinx android (puissant ordinateur), qui prend l'entrée du microphone. Je veux donner un fichier wav en entrée à la même chose. J'ai essayé d'utiliser la fonction decoder.processrow(). Mais je ne sais pas comment configurer le décodeur à l'aide hmm, lm etc.Donner un fichier en entrée à Pocketsphinx sur Android

Répondre

3

code pour traiter les fichiers dans pocketsphinx-java

Config c = Decoder.defaultConfig(); 
    c.setString("-hmm", "../../model/en-us/en-us"); 
    c.setString("-lm", "../../model/en-us/en-us.lm.dmp"); 
    c.setString("-dict", "../../model/en-us/cmudict-en-us.dict"); 
    Decoder d = new Decoder(c); 

    URL testwav = new URL("file:../../test/data/goforward.wav"); 
    FileInputStream stream = new FileInputStream(new File(testwav))); 

    d.startUtt(); 
    byte[] b = new byte[4096]; 
    try { 
     int nbytes; 
     while ((nbytes = stream.read(b)) >= 0) { 
      ByteBuffer bb = ByteBuffer.wrap(b, 0, nbytes); 

      // Not needed on desktop but required on android 
      bb.order(ByteOrder.LITTLE_ENDIAN); 

      short[] s = new short[nbytes/2]; 
      bb.asShortBuffer().get(s); 
      d.processRaw(s, nbytes/2, false, false); 
     } 
    } catch (IOException e) { 
     fail("Error when reading goforward.wav" + e.getMessage()); 
    } 
    d.endUtt(); 
    System.out.println(d.hyp().getHypstr()); 
    for (Segment seg : d.seg()) { 
     System.out.println(seg.getWord()); 
    } 
} 
1

Ajouter à la réponse de Nikolay, voici comment il peut être fait sur Android, en adaptant l'exemple d'implémentation de SpeechRecognizer Android trouvé ici: http://cmusphinx.sourceforge.net/wiki/tutorialandroid

//statically load our library 
static { 
    System.loadLibrary("pocketsphinx_jni"); 
} 

//convert an inputstream to text 
private void convertToSpeech(final InputStream stream){ 
    new AsyncTask<Void, Void, Exception>() { 
     @Override 
     protected Exception doInBackground(Void... params) { 
      try { 
       Assets assets = new Assets(WearService.this); 
       File assetsDir = assets.syncAssets(); 
       Config c = Decoder.defaultConfig(); 
       c.setString("-hmm", new File(assetsDir, "en-us-ptm").getPath()); 
       c.setString("-dict", new File(assetsDir, "cmudict-en-us.dict").getPath()); 
       c.setBoolean("-allphone_ci", true); 
       c.setString("-lm", new File(assetsDir, "en-phone.dmp").getPath()); 
       Decoder d = new Decoder(c); 

       d.startUtt(); 
       byte[] b = new byte[4096]; 
       try { 
        int nbytes; 
        while ((nbytes = stream.read(b)) >= 0) { 
         ByteBuffer bb = ByteBuffer.wrap(b, 0, nbytes); 

         // Not needed on desktop but required on android 
         bb.order(ByteOrder.LITTLE_ENDIAN); 

         short[] s = new short[nbytes/2]; 
         bb.asShortBuffer().get(s); 
         d.processRaw(s, nbytes/2, false, false); 
        } 
       } catch (IOException e) { 
        fail("Error when reading inputstream" + e.getMessage()); 
       } 
       d.endUtt(); 
       System.out.println(d.hyp().getHypstr()); 
       for (Segment seg : d.seg()) { 
        //do something with the result here 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
}