2012-02-05 37 views
4

我對Java還比較陌生。我嘗試過尋找解決方案,但我認爲我還不知道足夠的Java,甚至不知道我應該搜索什麼。Java - 如何導入外部包?

我想嘗試使用語音識別功能,所以我下載了CMU的Sphinx-4源代碼並編譯了它。一旦我有所有工作,我就可以運行包含的演示就好了。接下來,我在保存Sphinx-4目錄的目錄中爲我的代碼創建了一個目錄(/ Jarvis /)。在Sphinx-4源代碼目錄中,有一長串目錄導致我玩過的演示(/Sphinx4-1.0beta6/src/apps/edu/cmu/sphinx/demo/)。在demo文件夾中是一個HelloWorld目錄,其中包含一個使用Sphinx-4函數的簡單程序的源代碼。我的第一個目標是在我爲自己的代碼設置的目錄中獲得此演示的副本。所以我製作了一個HelloWorld文件的副本,並將它們放在我的Jarvis目錄中。重命名並更改代碼,以便所有曾經是HelloWorld的東西現在都是Jarvis。不幸的是,我的問題並不像命名問題那麼簡單,而是尋找軟件包的途徑。

對於Java,我大多隻使用過一個簡單的「javac example.java」命令來編譯過去的代碼。我猜在這種情況下我可能需要更多東西,但我不確定具體是什麼。當試圖以這種方式編譯時,我得到的錯誤:

Jarvis.java:15: error: package edu.cmu.sphinx.frontend.util does not exist 
import edu.cmu.sphinx.frontend.util.Microphone; 
           ^
Jarvis.java:16: error: package edu.cmu.sphinx.recognizer does not exist 
import edu.cmu.sphinx.recognizer.Recognizer; 
           ^
Jarvis.java:17: error: package edu.cmu.sphinx.result does not exist 
import edu.cmu.sphinx.result.Result; 
          ^
Jarvis.java:18: error: package edu.cmu.sphinx.util.props does not exist 
import edu.cmu.sphinx.util.props.ConfigurationManager; 
           ^
Jarvis.java:28: error: cannot find symbol 
     ConfigurationManager cm; 
     ^
    symbol: class ConfigurationManager 
    location: class Jarvis 
Jarvis.java:31: error: cannot find symbol 
      cm = new ConfigurationManager(args[0]); 
        ^
    symbol: class ConfigurationManager 
    location: class Jarvis 
Jarvis.java:33: error: cannot find symbol 
      cm = new ConfigurationManager(Jarvis.class.getResource("jarvis.config.xml")); 
        ^
    symbol: class ConfigurationManager 
    location: class Jarvis 
Jarvis.java:36: error: cannot find symbol 
     Recognizer recognizer = (Recognizer) cm.lookup("recognizer"); 
     ^
    symbol: class Recognizer 
    location: class Jarvis 
Jarvis.java:36: error: cannot find symbol 
     Recognizer recognizer = (Recognizer) cm.lookup("recognizer"); 
           ^
    symbol: class Recognizer 
    location: class Jarvis 
Jarvis.java:40: error: cannot find symbol 
     Microphone microphone = (Microphone) cm.lookup("microphone"); 
     ^
    symbol: class Microphone 
    location: class Jarvis 
Jarvis.java:40: error: cannot find symbol 
     Microphone microphone = (Microphone) cm.lookup("microphone"); 
           ^
    symbol: class Microphone 
    location: class Jarvis 
Jarvis.java:53: error: cannot find symbol 
      Result result = recognizer.recognize(); 
      ^
    symbol: class Result 
    location: class Jarvis 
12 errors 

所以我期待包括那些缺少的軟件包。我理解它與代碼中路徑的定義有關,但我對Java還不夠了解,不知道如何定義這些路徑。我想在代碼中更改一些東西嗎?我應該以不同的方式執行編譯嗎?推動正確的方向將是有益的。

下面我已經包含了最初來自HelloWorld演示的4個文件,我對它進行了輕微的命名修改。

謝謝你的時間!

Jarvis.java:

package jarvis.jarvis; 

import edu.cmu.sphinx.frontend.util.Microphone; 
import edu.cmu.sphinx.recognizer.Recognizer; 
import edu.cmu.sphinx.result.Result; 
import edu.cmu.sphinx.util.props.ConfigurationManager; 


/** 
* A simple HelloWorld demo showing a simple speech application built using Sphinx-4. This application uses the Sphinx-4 
* endpointer, which automatically segments incoming audio into utterances and silences. 
*/ 
public class Jarvis { 

    public static void main(String[] args) { 
      ConfigurationManager cm; 

     if (args.length > 0) { 
      cm = new ConfigurationManager(args[0]); 
     } else { 
      cm = new ConfigurationManager(Jarvis.class.getResource("jarvis.config.xml")); 
     } 

     Recognizer recognizer = (Recognizer) cm.lookup("recognizer"); 
     recognizer.allocate(); 

     // start the microphone or exit if the programm if this is not possible 
     Microphone microphone = (Microphone) cm.lookup("microphone"); 
     if (!microphone.startRecording()) { 
      System.out.println("Cannot start microphone."); 
      recognizer.deallocate(); 
      System.exit(1); 
     } 

     System.out.println("Say: (Good morning | Hello) (Bhiksha | Evandro | Paul | Philip | Rita | Will)"); 

     // loop the recognition until the programm exits. 
     while (true) { 
      System.out.println("Start speaking. Press Ctrl-C to quit.\n"); 

      Result result = recognizer.recognize(); 

      if (result != null) { 
       String resultText = result.getBestFinalResultNoFiller(); 
       System.out.println("You said: " + resultText + '\n'); 
      } else { 
       System.out.println("I can't hear what you said.\n"); 
      } 
     } 
    } 
} 

jarvis.config.xml:

<?xml version="1.0" encoding="UTF-8"?> 

<!-- 
    Sphinx-4 Configuration file 
--> 

<!-- ******************************************************** --> 
<!-- an4 configuration file        --> 
<!-- ******************************************************** --> 

<config> 

    <!-- ******************************************************** --> 
    <!-- frequently tuned properties        --> 
    <!-- ******************************************************** --> 

    <property name="logLevel" value="WARNING"/> 

    <property name="absoluteBeamWidth" value="-1"/> 
    <property name="relativeBeamWidth" value="1E-80"/> 
    <property name="wordInsertionProbability" value="1E-36"/> 
    <property name="languageWeight"  value="8"/> 

    <property name="frontend" value="epFrontEnd"/> 
    <property name="recognizer" value="recognizer"/> 
    <property name="showCreations" value="false"/> 


    <!-- ******************************************************** --> 
    <!-- word recognizer configuration       --> 
    <!-- ******************************************************** --> 

    <component name="recognizer" type="edu.cmu.sphinx.recognizer.Recognizer"> 
     <property name="decoder" value="decoder"/> 
     <propertylist name="monitors"> 
      <item>accuracyTracker </item> 
      <item>speedTracker </item> 
      <item>memoryTracker </item> 
     </propertylist> 
    </component> 

    <!-- ******************************************************** --> 
    <!-- The Decoder configuration        --> 
    <!-- ******************************************************** --> 

    <component name="decoder" type="edu.cmu.sphinx.decoder.Decoder"> 
     <property name="searchManager" value="searchManager"/> 
    </component> 

    <component name="searchManager" 
     type="edu.cmu.sphinx.decoder.search.SimpleBreadthFirstSearchManager"> 
     <property name="logMath" value="logMath"/> 
     <property name="linguist" value="flatLinguist"/> 
     <property name="pruner" value="trivialPruner"/> 
     <property name="scorer" value="threadedScorer"/> 
     <property name="activeListFactory" value="activeList"/> 
    </component> 


    <component name="activeList" 
      type="edu.cmu.sphinx.decoder.search.PartitionActiveListFactory"> 
     <property name="logMath" value="logMath"/> 
     <property name="absoluteBeamWidth" value="${absoluteBeamWidth}"/> 
     <property name="relativeBeamWidth" value="${relativeBeamWidth}"/> 
    </component> 

    <component name="trivialPruner" 
       type="edu.cmu.sphinx.decoder.pruner.SimplePruner"/> 

    <component name="threadedScorer" 
       type="edu.cmu.sphinx.decoder.scorer.ThreadedAcousticScorer"> 
     <property name="frontend" value="${frontend}"/> 
    </component> 

    <!-- ******************************************************** --> 
    <!-- The linguist configuration        --> 
    <!-- ******************************************************** --> 

    <component name="flatLinguist" 
       type="edu.cmu.sphinx.linguist.flat.FlatLinguist"> 
     <property name="logMath" value="logMath"/> 
     <property name="grammar" value="jsgfGrammar"/> 
     <property name="acousticModel" value="wsj"/> 
     <property name="wordInsertionProbability" 
       value="${wordInsertionProbability}"/> 
     <property name="languageWeight" value="${languageWeight}"/> 
     <property name="unitManager" value="unitManager"/> 
    </component> 


    <!-- ******************************************************** --> 
    <!-- The Grammar configuration        --> 
    <!-- ******************************************************** --> 

    <component name="jsgfGrammar" type="edu.cmu.sphinx.jsgf.JSGFGrammar"> 
     <property name="dictionary" value="dictionary"/> 
     <property name="grammarLocation" 
      value="resource:/edu/cmu/sphinx/demo/jarvis/"/> 
     <property name="grammarName" value="jarvis"/> 
    <property name="logMath" value="logMath"/> 
    </component> 


    <!-- ******************************************************** --> 
    <!-- The Dictionary configuration       --> 
    <!-- ******************************************************** --> 

    <component name="dictionary" 
     type="edu.cmu.sphinx.linguist.dictionary.FastDictionary"> 
     <property name="dictionaryPath" 
    value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz/dict/cmudict.0.6d"/> 
     <property name="fillerPath" 
    value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz/noisedict"/> 
     <property name="addSilEndingPronunciation" value="false"/> 
     <property name="allowMissingWords" value="false"/> 
     <property name="unitManager" value="unitManager"/> 
    </component> 

    <!-- ******************************************************** --> 
    <!-- The acoustic model configuration       --> 
    <!-- ******************************************************** --> 
    <component name="wsj" 
       type="edu.cmu.sphinx.linguist.acoustic.tiedstate.TiedStateAcousticModel"> 
     <property name="loader" value="wsjLoader"/> 
     <property name="unitManager" value="unitManager"/> 
    </component> 

    <component name="wsjLoader" type="edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader"> 
     <property name="logMath" value="logMath"/> 
     <property name="unitManager" value="unitManager"/> 
     <property name="location" value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz"/> 
    </component> 


    <!-- ******************************************************** --> 
    <!-- The unit manager configuration       --> 
    <!-- ******************************************************** --> 

    <component name="unitManager" 
     type="edu.cmu.sphinx.linguist.acoustic.UnitManager"/> 

    <!-- ******************************************************** --> 
    <!-- The frontend configuration        --> 
    <!-- ******************************************************** --> 

    <component name="frontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> 
     <propertylist name="pipeline"> 
      <item>microphone </item> 
      <item>preemphasizer </item> 
      <item>windower </item> 
      <item>fft </item> 
      <item>melFilterBank </item> 
      <item>dct </item> 
      <item>liveCMN </item> 
      <item>featureExtraction </item> 
     </propertylist> 
    </component> 

    <!-- ******************************************************** --> 
    <!-- The live frontend configuration       --> 
    <!-- ******************************************************** --> 
    <component name="epFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> 
     <propertylist name="pipeline"> 
      <item>microphone </item> 
      <item>dataBlocker </item> 
      <item>speechClassifier </item> 
      <item>speechMarker </item> 
      <item>nonSpeechDataFilter </item> 
      <item>preemphasizer </item> 
      <item>windower </item> 
      <item>fft </item> 
      <item>melFilterBank </item> 
      <item>dct </item> 
      <item>liveCMN </item> 
      <item>featureExtraction </item> 
     </propertylist> 
    </component> 

    <!-- ******************************************************** --> 
    <!-- The frontend pipelines         --> 
    <!-- ******************************************************** --> 

    <component name="dataBlocker" type="edu.cmu.sphinx.frontend.DataBlocker"> 
     <!--<property name="blockSizeMs" value="10"/>--> 
    </component> 

    <component name="speechClassifier" 
       type="edu.cmu.sphinx.frontend.endpoint.SpeechClassifier"> 
     <property name="threshold" value="13"/> 
    </component> 

    <component name="nonSpeechDataFilter" 
       type="edu.cmu.sphinx.frontend.endpoint.NonSpeechDataFilter"/> 

    <component name="speechMarker" 
       type="edu.cmu.sphinx.frontend.endpoint.SpeechMarker" > 
     <property name="speechTrailer" value="50"/> 
    </component> 


    <component name="preemphasizer" 
       type="edu.cmu.sphinx.frontend.filter.Preemphasizer"/> 

    <component name="windower" 
       type="edu.cmu.sphinx.frontend.window.RaisedCosineWindower"> 
    </component> 

    <component name="fft" 
      type="edu.cmu.sphinx.frontend.transform.DiscreteFourierTransform"> 
    </component> 

    <component name="melFilterBank" 
     type="edu.cmu.sphinx.frontend.frequencywarp.MelFrequencyFilterBank"> 
    </component> 

    <component name="dct" 
      type="edu.cmu.sphinx.frontend.transform.DiscreteCosineTransform"/> 

    <component name="liveCMN" 
       type="edu.cmu.sphinx.frontend.feature.LiveCMN"/> 

    <component name="featureExtraction" 
       type="edu.cmu.sphinx.frontend.feature.DeltasFeatureExtractor"/> 

    <component name="microphone" 
       type="edu.cmu.sphinx.frontend.util.Microphone"> 
     <property name="closeBetweenUtterances" value="false"/> 
    </component> 


    <!-- ******************************************************* --> 
    <!-- monitors            --> 
    <!-- ******************************************************* --> 

    <component name="accuracyTracker" 
       type="edu.cmu.sphinx.instrumentation.BestPathAccuracyTracker"> 
     <property name="recognizer" value="${recognizer}"/> 
     <property name="showAlignedResults" value="false"/> 
     <property name="showRawResults" value="false"/> 
    </component> 

    <component name="memoryTracker" 
       type="edu.cmu.sphinx.instrumentation.MemoryTracker"> 
     <property name="recognizer" value="${recognizer}"/> 
    <property name="showSummary" value="false"/> 
    <property name="showDetails" value="false"/> 
    </component> 

    <component name="speedTracker" 
       type="edu.cmu.sphinx.instrumentation.SpeedTracker"> 
     <property name="recognizer" value="${recognizer}"/> 
     <property name="frontend" value="${frontend}"/> 
    <property name="showSummary" value="true"/> 
    <property name="showDetails" value="false"/> 
    </component> 


    <!-- ******************************************************* --> 
    <!-- Miscellaneous components        --> 
    <!-- ******************************************************* --> 

    <component name="logMath" type="edu.cmu.sphinx.util.LogMath"> 
     <property name="logBase" value="1.0001"/> 
     <property name="useAddTable" value="true"/> 
    </component> 

</config> 

jarvis.gram:

#JSGF V1.0; 

/** 
* JSGF Grammar for Hello World example 
*/ 

grammar jarvis; 

public <greet> = (Good morning | Hello) (Bhiksha | Evandro | Paul | Philip | Rita | Will); 

jarvis.Manifest

Main-Class: jarvis.Jarvis 
Class-Path: ../sphinx4-1.0beta6/lib/sphinx4.jar ../sphinx4-1.0beta6/lib/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz.jar 

回答

3

編譯器使用「類路徑」來查找所需的庫。有許多方法可以設置類路徑:一個使用CLASSPATH環境變量,另一個使用-classpath命令行開關。總之,你可以編譯:

javac -classpath path/to/sphinx.jar jarvis/Jarvis.java 

你會發現在http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

另一件事完整的文檔:你賈維斯類聲明,它是在一個名爲jarvis.jarvis包,所以類的完全限定名將是jarvis.jarvis.Jarvis ...不知道這是你的意圖。

+0

完美。是的,這可能不是我的意思。謝謝。 – golmschenk 2012-02-05 22:11:29

0

使用「-classpath」選項告知javac在哪裏可以找到所需的所有類。

javac -classpath lib/blablabla.jar;lib/foobar.jar 

Setting the class path

+0

太好了。非常感謝! – golmschenk 2012-02-05 22:11:03