2016-01-29 4 views
0

Вот моя функция нитьОтправка данных PocketSphinx для рабочего стола Windows, в Java

public void run() { 
     recorder.start(); 
     d.startUtt(); 
     d.setRawdataSize(300000); 
     byte[] b = new byte[4096]; 

     // Skip the first buffer, usually zeroes 
     recorder.read(b, 0, b.length); 
     while ((!interrupted())) 
     { 
      int nbytes; 
      short[] s = null; 
      nbytes = recorder.read(b, 0, b.length); 

      ByteBuffer bb = ByteBuffer.wrap(b, 0, nbytes); 
      s = new short[nbytes/2]; 
      bb.asShortBuffer().get(s); 
      d.processRaw(s, nbytes/2, false, false); 

      if (nbytes > 0) 
      { 
       d.processRaw(s, nbytes, false, false); 

       Hypothesis hypothesis = d.hyp(); 

       if(hypothesis != null) 
        System.out.println(hypothesis.getHypstr()); 
      } 
      if (this.timeoutSamples != -1) { 
       this.remainingSamples -= nbytes; 
      } 
     } 
     recorder.stopRecording(); 
     d.endUtt(); 
    } 

В этом мой микрофон непрерывной записи и я посылаю данные audioInputStream в decoder.processRaw еще до остановки микрофона. Я попробовал это, но как-то. .dll не возвращает никаких журналов, а decoder.hyp() также приходит как null. непрерывно. Я думаю, что поток рекордера возился с потоком библиотеки декодера. в библиотеке C.

EDIT: инициализация декодера

Config c = Decoder.defaultConfig(); 
    String acousticModelLoc = "speech\\model\\en-us-ptm"; 
    String dictLoc = "dictionary\\cmudict-en-us.dict"; 

    String kwFileLoc = "speech\\grammar\\digits.gram"; 


    c.setString("-hmm", acousticModelLoc); 
    c.setString("-jsgf", kwFileLoc); 
    c.setString("-dict", dictLoc); 
    d = new Decoder(c); 

Пожалуйста, помогите

+0

Вам нужно показать, как вы инициализируете декодер. Вам также нужно добавить '-rawlogdir

' для хранения необработанных аудиозаписей. –

+0

@NikolayShmyrev пожалуйста, перейдите по ссылке Редактировать –

+0

Вам нужно поделиться соответствующими файлами данных, вам необходимо сохранить журнал в файл и поделиться им тоже –

ответ

0

Эта линия:

d.processRaw(s, nbytes, false, false); 

является оскорбительным, вы отправляете данные дважды, и вы посылаете неправильный размер данных. Вам нужно удалить его, поскольку вы уже отправляете данные для обработки раньше.

 d.processRaw(s, nbytes/2, false, false); 
     if (nbytes > 0) 
     { 
    ->>>>> d.processRaw(s, nbytes, false, false); 

      Hypothesis hypothesis = d.hyp(); 

      if(hypothesis != null) 
       System.out.println(hypothesis.getHypstr()); 
     } 

Вы можете открыть rawdata в духе и послушать, это должна быть чистая речь. В вашем случае он поврежден, так как вы не отправляете данные должным образом в декодер.

+0

Есть ли какой-то определенный аудиоформат, который мы должны соблюдать? –

+0

Я не уверен, что вы подразумеваете под «follow». Звук имеет 16 кГц 16 бит моно. –

+0

Спасибо большое @Nikolay Я могу получить результаты сейчас. Я думаю, что последний шаг остается. Когда начинается обнаружение речи, как только он обнаруживает что-то, гипотеза не изменилась, даже если я постоянно говорю что-то еще. значит, согласно моей грамматике. если я скажу, ** выберите двадцать два ** сначала я получу правильную гипотезу, не останавливая ничего, если я изменю свое утверждение ** выбираю восемьдесят пять **, тогда он все еще печатает только старую гипотезу .. Он должен обновляться как i скажи правильно? –

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

  • Нет связанных вопросов^_^