Java 在没有Maven的情况下使用sphinx4 JAR时出错

Java 在没有Maven的情况下使用sphinx4 JAR时出错,java,speech-recognition,voice-recognition,speech-to-text,sphinx4,Java,Speech Recognition,Voice Recognition,Speech To Text,Sphinx4,我对API Sphinx4有一个问题,我不明白为什么它不工作 我尝试编写一个小类来捕获用户的声音,并将其讲话写入文件 1) 我已经在Eclispe上创建了一个新的java项目 2) 我已经创建了TranscriberDemo类 3) 我已经创建了一个文件夹“文件” 4) 我已经复制了文件夹“en-us”和文件夹“file”上的文件“cmudit en-us.dict”、“en-us.lm.dmp”、“10001-90210-01803.wav” 5) 我不使用maven,所以我只包含jar文件“

我对API Sphinx4有一个问题,我不明白为什么它不工作

我尝试编写一个小类来捕获用户的声音,并将其讲话写入文件

1) 我已经在Eclispe上创建了一个新的java项目

2) 我已经创建了TranscriberDemo类

3) 我已经创建了一个文件夹“文件”

4) 我已经复制了文件夹“en-us”和文件夹“file”上的文件“cmudit 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”

您可以在此处下载:

核心:

数据:

我知道源代码是可用的

在这里:

或在此:

但我不使用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
加载模型。。。
线程“main”java.lang.NoClassDefFoundError中出现异常:com/google/common/base/Function
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:191)
位于edu.cmu.sphinx.util.props.ConfigurationManager.getPropertySheet(ConfigurationManager.java:91)
位于edu.cmu.sphinx.util.props.ConfigurationManagerUtils.listAllsPropNames(ConfigurationManagerUtils.java:556)
位于edu.cmu.sphinx.util.props.ConfigurationManagerUtils.setProperty(ConfigurationManagerUtils.java:609)
位于edu.cmu.sphinx.api.Context.setLocalProperty(Context.java:198)
位于edu.cmu.sphinx.api.Context.setAcousticModel(Context.java:88)
位于edu.cmu.sphinx.api.Context.(Context.java:61)
位于edu.cmu.sphinx.api.Context.(Context.java:44)
位于edu.cmu.sphinx.api.AbstractSpeechRecognizer.(AbstractSpeechRecognizer.java:37)
位于edu.cmu.sphinx.api.StreamSpeechRecognizer.(StreamSpeechRecognizer.java:35)
位于TranscriberDemo.main(TranscriberDemo.java:27)
原因:java.lang.ClassNotFoundException:com.google.common.base.Function
在java.net.URLClassLoader$1.run(URLClassLoader.java:366)
在java.net.URLClassLoader$1.run(URLClassLoader.java:355)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:354)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:425)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 还有12个

感谢您的帮助=)

您的代码和操作存在多个问题:

3) 我已经创建了一个文件夹“文件”

不需要

4) 我已经复制了文件夹“en-us”和文件夹“file”上的文件“cmudit en-us.dict”、“en-us.lm.dmp”、“10001-90210-01803.wav”

不需要,您已经将模型作为sphinx4数据包的一部分

5) 我不使用maven,所以我只包含jar文件“sphinx4-core-1.0-SNAPSHOT.jar”和“sphinx4-data-1.0-SNAPSHOT.jar”

这是非常错误的,因为您从未经授权的位置拿走了过时的罐子。教程中列出了下载JAR的正确位置

您从某个随机网站获取了恶意JAR,其中可能包含病毒或rootkit

在这里:

这也是一个错误的链接。正确的链接是

这里您使用file:URL方案,它指向不适当上下文中的文件。如果要从文件创建InputStream,请执行以下操作:

 InputStream stream = new FileInputStream(new File("10001-90210-01803.wav"));
线程“main”java.lang.NoClassDefFoundError中出现异常:com/google/common/base/Function

这个错误是因为您从其他地方拿走了一个jar,它说您需要额外的依赖项。当您看到ClassDefFoundError时,这意味着您需要向类路径中添加额外的jar。使用官方狮身人面像X4时,您不应看到此错误。

已解决

事实上,这是一个愚蠢的错误

谢谢你@Nikolay的回答。我已经接受你的回答,但我在这里继续这个过程:

1) 从下载sphinx4 core和sphinx4数据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();
    }
}
就这些

  • 如果您需要Sphinx4的源代码:

我需要文件夹结构以及在何处添加依赖项文件?不需要,该模型已包含在sphinx4数据中。如果您搜索其他模型,您可能需要使用gradle或maven。。。或者使用另一个sphinx4数据。
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();
    }
}