2015-04-14 3 views
1

Я пытаюсь использовать CMU Sphinx для распознавания речи в java, но результат, который я получаю, неверен, и я не знаю почему.распознавание речи с cmu sphinx - не работает должным образом

У меня есть .wav-файл, который я записал своим голосом, произнеся предложение на английском языке.

Вот мой код в Java:

  Configuration configuration = new Configuration(); 

     // Set path to acoustic model. 
     configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us"); 
     // Set path to dictionary. 
     configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict"); 
     // Set language model. 
     configuration.setLanguageModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us.lm.dmp"); 
     StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(configuration); 

     recognizer.startRecognition(new FileInputStream("assets/voice/some_wav_file.wav")); 
     SpeechResult result = null; 

     while ((result = recognizer.getResult()) != null) { 
      System.out.println("~~ RESULTS: " + result.getHypothesis()); 
     } 

     recognizer.stopRecognition(); 

    } 
    catch(Exception e){ 
     System.out.println("ERROR: " + e.getMessage()); 
    } 

У меня также есть другой код в Android, который не работает, а также:

Assets assets = new Assets(context); 
       File assetDir = assets.syncAssets(); 
       String prefix = assetDir.getPath(); 

       Config c = Decoder.defaultConfig(); 
       c.setString("-hmm", prefix + "/en-us-ptm"); 
       c.setString("-lm", prefix + "/en-us.lm"); 
       c.setString("-dict", prefix + "/cmudict-en-us.dict"); 
       Decoder d = new Decoder(c); 
       InputStream stream = context.getResources().openRawResource(R.raw.some_wav_file); 


       d.startUtt(); 
       byte[] b = new byte[4096]; 
       try { 
        int nbytes; 
        while ((nbytes = stream.read(b)) >= 0) { 
         ByteBuffer bb = ByteBuffer.wrap(b, 0, nbytes); 
         short[] s = new short[nbytes/2]; 
         bb.asShortBuffer().get(s); 
         d.processRaw(s, nbytes/2, false, false); 
        } 
       } catch (IOException e) { 
        Log.d("ERROR: ", "Error when reading file" + e.getMessage()); 
       } 
       d.endUtt(); 
       Log.d("TOTAL RESULT: ", d.hyp().getHypstr()); 
       for (Segment seg : d.seg()) { 
        Log.d("RESULT: ", seg.getWord()); 
       } 

Я использовал this сайт, чтобы преобразовать файл WAV в 16bit, 16khz, mono и little-endian (пробовал все варианты).

Любые идеи, почему это не работает. Я использую встроенные словари и акустические модели, и мой акцент на английском языке не идеален (не знаю, имеет ли это значение).

EDIT:

This is my file. Я записал себя, сказав: «Мой ребенок милый« и это то, что я ожидаю быть выходом. В чистом Java коде, который я получаю: «Я молодежь Эйми» и в андроиде коды getl: «это»

Here is file containing the logs.

+0

Вам нужно объяснить, что не работает точно. Является ли результат не таким, как ожидалось, или у вас есть крушение или что-то еще. Поделитесь файлом, который вы пытаетесь распознать, обмениваетесь ожидаемым результатом, делитесь полученным результатом и обмениваетесь журналом приложений. –

ответ

0

Ваш звук несколько искажен конверсией. Вы должны записывать в wav изначально или в какой-либо другой формат без потерь. Ваше произношение также далеки от английского. Для преобразования между форматами вы можете использовать sox вместо внешнего веб-сайта. Ваш образец андроида кажется правильным, но кажется, что вы декодируете другой файл с помощью android. Вы можете проверить, что у вас есть правильный файл в ресурсах.

Смежные вопросы