我对API Sphinx4有疑问,我无法弄清楚它为什么不起作用。
我尝试写一个小班来捕捉用户的声音并在文件上写下他的发言。
1)我在Eclispe上创建了一个新的java项目。
2)我创建了TranscriberDemo类。
3)我创建了一个文件夹" file"。
4)我已经复制了文件夹" en-us"和文件" cmudict-en-us.dict"," en-us.lm.dmp"," 10001-90210-01803.wav"在文件夹"文件"。
5)我不使用maven,所以我只需要包含jar文件" sphinx4-core-1.0-SNAPSHOT.jar"和" sphinx4-data-1.0-SNAPSHOT.jar"。
你可以在这里下载:
核心:https://1fichier.com/?f3y6vqupdr
数据:https://1fichier.com/?lpzz8jyerv
我知道源代码可用
此处:https://github.com/erka/sphinx-java-api
或此处:http://sourceforge.net/projects/cmusphinx/files/sphinx4
但是我没有使用maven所以我无法编译它们。
我的课程:
import java.io.InputStream;
import edu.cmu.sphinx.api.Configuration;
import edu.cmu.sphinx.api.SpeechResult;
import edu.cmu.sphinx.api.StreamSpeechRecognizer;
import edu.cmu.sphinx.result.WordResult;
public class TranscriberDemo
{
public static void main(String[] args) throws Exception
{
System.out.println("Loading models...");
Configuration configuration = new Configuration();
// Load model from the jar
configuration.setAcousticModelPath("file:en-us");
configuration.setDictionaryPath("file:cmudict-en-us.dict");
configuration.setLanguageModelPath("file:en-us.lm.dmp");
StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(configuration);
InputStream stream = TranscriberDemo.class.getResourceAsStream("file:10001-90210-01803.wav");
stream.skip(44);
// Simple recognition with generic model
recognizer.startRecognition(stream);
SpeechResult result;
while ((result = recognizer.getResult()) != null)
{
System.out.format("Hypothesis: %s\n", result.getHypothesis());
System.out.println("List of recognized words and their times:");
for (WordResult r : result.getWords())
{
System.out.println(r);
}
System.out.println("Best 3 hypothesis:");
for (String s : result.getNbest(3))
System.out.println(s);
}
recognizer.stopRecognition();
}
}
我的日志:
Loading models...
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at edu.cmu.sphinx.util.props.ConfigurationManager.getPropertySheet(ConfigurationManager.java:91)
at edu.cmu.sphinx.util.props.ConfigurationManagerUtils.listAllsPropNames(ConfigurationManagerUtils.java:556)
at edu.cmu.sphinx.util.props.ConfigurationManagerUtils.setProperty(ConfigurationManagerUtils.java:609)
at edu.cmu.sphinx.api.Context.setLocalProperty(Context.java:198)
at edu.cmu.sphinx.api.Context.setAcousticModel(Context.java:88)
at edu.cmu.sphinx.api.Context.<init>(Context.java:61)
at edu.cmu.sphinx.api.Context.<init>(Context.java:44)
at edu.cmu.sphinx.api.AbstractSpeechRecognizer.<init>(AbstractSpeechRecognizer.java:37)
at edu.cmu.sphinx.api.StreamSpeechRecognizer.<init>(StreamSpeechRecognizer.java:35)
at TranscriberDemo.main(TranscriberDemo.java:27)
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Function
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 12 more
感谢您的帮助=)
答案 0 :(得分:6)
您的代码和行为存在多个问题:
3)我创建了一个文件夹&#34; file&#34;。
不需要
4)我已经复制了文件夹&#34; en-us&#34;和文件&#34; cmudict-en-us.dict&#34;,&#34; en-us.lm.dmp&#34;,&#34; 10001-90210-01803.wav&#34;在文件夹&#34;文件&#34;。
不需要,您已经将模型作为sphinx4-data包的一部分。
5)我不使用maven,所以我只需要包含jar文件&#34; sphinx4-core-1.0-SNAPSHOT.jar&#34;和&#34; sphinx4-data-1.0-SNAPSHOT.jar&#34;。
这是非常错误的,因为你从未经授权的位置拿走了过时的罐子。下载jar的正确位置列在教程http://oss.sonatype.org
中你从一些可能含有病毒或rootkit的随机网站中获取了恶意罐子。
这也是一个错误的链接。正确的链接是http://github.com/cmusphinx/sphinx4
InputStream stream = TranscriberDemo.class.getResourceAsStream("file:10001-90210-01803.wav");
这里使用file:URL scheme指向不适合上下文中的文件。如果你想从文件创建InputStream,请执行以下操作:
InputStream stream = new FileInputStream(new File("10001-90210-01803.wav"));
线程中的异常&#34; main&#34; java.lang.NoClassDefFoundError:com / google / common / base / Function
这个错误是由于你从其他地方拿了一个jar而且它说你需要额外的依赖项。当您看到ClassDefFoundError时,这意味着您需要在类路径中添加额外的jar。使用官方的sphinx4,你不应该看到这个错误。
答案 1 :(得分:6)
解决。
事实上这是一个愚蠢的错误......
感谢@Nikolay的回答。我已经接受了你的回答,但我在这里恢复了这个过程:
1)从https://oss.sonatype.org/#nexus-search;quick~sphinx4下载sphinx4-core和sphinx4-data jar。
2)将它们包含在您的项目中。
3)测试你的代码。
import edu.cmu.sphinx.api.Configuration;
import edu.cmu.sphinx.api.LiveSpeechRecognizer;
import edu.cmu.sphinx.api.SpeechResult;
public class SpeechToText
{
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.dmp");
LiveSpeechRecognizer recognizer = new LiveSpeechRecognizer(configuration);
recognizer.startRecognition(true);
SpeechResult result;
while ((result = recognizer.getResult()) != null)
{
System.out.println(result.getHypothesis());
}
recognizer.stopRecognition();
}
}
这就是全部!