使用没有Maven的sphinx4 jar时出错

时间:2015-03-28 01:14:35

标签: java speech-recognition voice-recognition speech-to-text sphinx4

我对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

感谢您的帮助=)

2 个答案:

答案 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

https://oss.sonatype.org/service/local/repositories/snapshots/content/edu/cmu/sphinx/sphinx4-core/1.0-SNAPSHOT/sphinx4-core-1.0-20150223.210646-7.jar

https://oss.sonatype.org/service/local/repositories/snapshots/content/edu/cmu/sphinx/sphinx4-data/1.0-SNAPSHOT/sphinx4-data-1.0-20150223.210601-7.jar

你从一些可能含有病毒或rootkit的随机网站中获取了恶意罐子。

  

此处:https://github.com/erka/sphinx-java-api

这也是一个错误的链接。正确的链接是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();
    }
}

这就是全部!