2016-03-22 7 views
1

私はSphinx4を使ってライブ音声認識のチュートリアルプログラムを実行しようとしています。Sphinx4でライブスピーチを認識するjava api

public class LiveRecognition { 

    public static void main(String[] args) throws Exception { 
     Configuration configuration = new Configuration(); 
     configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us"); 
     configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict"); 
     configuration.setLanguageModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us.lm.bin"); 
     configuration.setUseGrammar(false); 

     LiveSpeechRecognizer recognizer = new LiveSpeechRecognizer(configuration); 

     recognizer.startRecognition(true); 

     SpeechResult result; 
     while ((result = recognizer.getResult()) != null) { 
      for(WordResult word : result.getWords()) { 
       System.out.println(word); 
      } 
     } 
     recognizer.stopRecognition(); 
    } 
} 

これまでのところ、私はスフィンクスが提供する辞書や音響モデルを使用しています:これはメインのクラスです。私がプログラムを実行すると、それは自分と話しているかのように無作為なテキストを生成し続けます。マイクを通して話しているものであれば、それは近いものでもありません。出力例については はこのようなものです:私は間違って何をやっている

.... 
{between, 1.000, [2700:3610]} 
23:21:37.391 INFO speedTracker   This Time Audio: 0.83s Proc: 3.82s Speed: 4.60 X real time 
23:21:37.391 INFO speedTracker   Total Time Audio: 1.58s Proc: 7.66s 4.85 X real time 
23:21:37.391 INFO memoryTracker   Mem Total: 1173.00 Mb Free: 410.17 Mb 
23:21:37.393 INFO memoryTracker   Used: This: 762.83 Mb Avg: 507.82 Mb Max: 762.83 Mb 
23:21:37.393 INFO trieNgramModel  LM Cache Size: 4183 Hits: 990660 Misses: 4183 
{<sil>, 1.000, [3610:5810]} 
{what, 1.000, [5820:6380]} 
23:21:41.615 INFO speedTracker   This Time Audio: 0.55s Proc: 2.21s Speed: 4.01 X real time 
23:21:41.615 INFO speedTracker   Total Time Audio: 2.13s Proc: 9.87s 4.63 X real time 
23:21:41.615 INFO memoryTracker   Mem Total: 1316.50 Mb Free: 540.36 Mb 
23:21:41.615 INFO memoryTracker   Used: This: 776.14 Mb Avg: 597.26 Mb Max: 776.14 Mb 
23:21:41.615 INFO trieNgramModel  LM Cache Size: 5332 Hits: 1263784 Misses: 5332 
{<sil>, 1.000, [6380:9060]} 
{ooh, 1.000, [9070:9280]} 
.... 

?私は "こんにちは世界"と言うとき、 "こんにちは世界"を見たいと思っています。両方の単語が辞書にあります。

[UPDATE] のように小さなコーパスファイルからthis online serviceを使用して小さな言語モデルファイルと対応する辞書を作成しました。今回は、sphinx-dataライブラリで提供されているデフォルトの音響モデルを使用して、より正確に処理しました。私は主に英語(米国)言語を扱うので、音響モデルを訓練する必要はありません。しかし、私は一般的な短い文のための良い言語モデルと辞書がほしいです。スフィンクスに付随する言語モデルは私にとってうまくいきません。

[UPDATE] ニコライShmyrevはそれが不良による演算性能である可能性があり下に言及したので、これは私が使用するものです。

  1. インテル®Core™i7-4790 CPUの@ 3.60GHz
  2. 16ギガバイトDDR3 RAM
  3. のWindows 10とUbuntu 14.04

必要に応じて、電力を増加させることができる処理。

答えて

0

コンピュータの速度が遅すぎるため、リアルタイムでオーディオを処理できないため、不正確です。遅いコンピュータの場合は、代わりにpocketsphinxを使用します。

PocketsphinxすぎるのJava/JNIのAPIを持っている、あなたは一例hereを見つけることができ、それは次のようになります。私は私が遅いとは思わない

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

    FileInputStream ais = new FileInputStream(new File("../../test/data/goforward.raw")); 

    d.startUtt(); 
    d.setRawdataSize(300000); 
    byte[] b = new byte[4096]; 
    int nbytes; 
    while ((nbytes = ais.read(b)) >= 0) { 
     ByteBuffer bb = ByteBuffer.wrap(b, 0, nbytes); 
     bb.order(ByteOrder.LITTLE_ENDIAN); 
     short[] s = new short[nbytes/2]; 
     bb.asShortBuffer().get(s); 
     d.processRaw(s, nbytes/2, false, false); 
    } 
    d.endUtt(); 
    System.out.println(d.hyp().getHypstr()); 

    short[] data = d.getRawdata(); 
    System.out.println("Data size: " + data.length); 
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File("/tmp/test.raw"))); 
    for (int i = 0; i < data.length; i++) { 
     dos.writeShort(data[i]); 
    } 
    dos.close(); 

    for (Segment seg : d.seg()) { 
     System.out.println(seg.getWord()); 
    } 
+0

。私のマシンには多くのRAMと処理能力があります。しかし、私はチュートリアルで提供されているオンラインサービスを使用して、いくつかのlmとdicファイル(言語モデルと辞書)を作成しました。ご協力いただきありがとうございます、私はポケットスフィンクスを見て、あなたのソリューションがうまく機能しているかどうかをお知らせします。ありがとう。 –

+0

ログには4.63 Xリアルタイムが表示されます。これは遅いことを意味します。あなたはおそらくそれにそれ以上のメモリを与えたいと思うでしょう。 –

+0

今、私はそれを見ています。私はより強力なマシンで試してみます。 –