2016-03-22 6 views
1

Ich versuche, das Lernprogramm für die Live-Spracherkennung mit Sphinx4 auszuführen. Dies ist die Hauptklasse:Erkennen von Live-Sprache mit 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(); 
    } 
} 

Bisher verwende ich Wörterbuch und akustische Modelle von Sphinx zur Verfügung gestellt. Wenn ich das Programm laufe, produziert es immer wieder zufälligen Text, fast so, als würde es mit sich selbst sprechen und was auch immer ich durch das Mikrofon spreche, es kommt mir nicht einmal nahe. Zum Beispiel Ausgabe ist wie folgt:

.... 
{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]} 
.... 

Was mache ich falsch? Ich möchte "Hallo Welt" sehen, wenn ich "Hallo Welt" sage. Beide Wörter sind im Wörterbuch vorhanden.

[UPDATE] Ich habe eine kleine Sprachmodelldatei und entsprechendes Wörterbuch mit this online service aus einer kleinen Korpusdatei wie beschrieben here. Dieses Mal wurde mit dem akustischen Standardmodell, das mit der Sphinx-Datenbibliothek geliefert wurde, besser gearbeitet. Ich muss das akustische Modell nicht trainieren, da ich mich hauptsächlich mit Englisch (US) beschäftigen werde. Aber ich möchte ein gutes Sprachmodell und Wörterbuch für allgemeine kurze Sätze. Sprachmodell, das mit Sphinx kommt, läuft mir nicht gut.

[UPDATE] Da Nikolay Shmyrev erwähnt darunter aufgrund der schlechten Rechenleistung sein könnte, das ist, was ich benutze:

  1. Intel® Core ™ i7-4790 CPU @ 3.60GHz
  2. 16 GB DDR3 RAM
  3. Microsoft Windows 10 und Ubuntu 14,04

Verarbeitungsleistung kann bei Bedarf erhöht werden.

Antwort

0

Ihr Computer ist zu langsam, Audio kann nicht in Echtzeit verarbeitet werden, daher ungenau. Für langsame Computer verwenden Sie stattdessen paysphinx.

pocket Java/JNI API hat auch können Sie finden Beispiel here, sollte es so aussehen:

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

Ich glaube nicht, mein langsam ist. Meine Maschine hat eine Menge RAM und rohe Verarbeitungsleistung. Ich habe jedoch einige IM- und Dic-Dateien (Sprachmodelle und Wörterbücher) mit dem Online-Service aus dem Tutorial erstellt und dann mit viel besserer Genauigkeit gearbeitet. Vielen Dank für die Hilfe, ich werde in Pocket Sphinx schauen und Sie wissen lassen, ob Ihre Lösung geholfen hat. Vielen Dank. –

+0

Das Protokoll sagt 4,63 X Echtzeit, was bedeutet, dass es langsam ist. Wahrscheinlich willst du es mehr Speicher geben als –

+0

Ok, jetzt sehe ich das. Ich werde es in einer stärkeren Maschine versuchen. –