我正在尝试使用Sphinx4运行实时语音识别教程。这是主要的课程:
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();
}
}
到目前为止,我正在使用Sphinx提供的字典和声学模型。当我运行该程序时,它一直在生成随机文本,几乎就像是在与自己交谈,无论我通过麦克风说什么,它甚至都没有接近。 例如输出是这样的:
....
{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从一个小型语料库文件中创建了一个小型语言模型文件和相应的字典,如here所述。这次使用sphinx数据库提供的默认声学模型可以更好地准确地工作。我不需要训练声学模型,因为我将主要处理英语(美国)语言。但我想要一个很好的语言模型和通用短句的字典。狮身人面像附带的语言模型对我来说并不顺利。
[UPDATE] 由于Nikolay Shmyrev在下面提到它可能是由于计算性能不佳,这就是我使用的:
如果需要,可以增加处理能力。
答案 0 :(得分: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());
}