2

내 프로젝트는 기능 추출 및 오디오 파일 분류를 수행 할 수있는 Android 앱을 만드는 것입니다. 그래서 먼저 테스트 실행으로 Java 애플리케이션을 작성합니다.jAudio Feature Extractor : Null 예외

jAudio의 기능 추출기 패키지를 사용하여 오디오 파일에서 오디오 기능을 추출하려고합니다.

초보자로서 .wav 파일을 입력하고 해당 파일에 기능 추출 작업을 실행 한 다음 그 결과를 .ARFF 파일로 저장하려고합니다.

그러나, 나는이 프로젝트 내에서 패키지에서 NullPointer 예외 오류가 아래를 받고 있어요 :

Exception in thread "main" java.lang.NullPointerException 
    at java.io.DataOutputStream.writeBytes(Unknown Source) 
    at jAudioFeatureExtractor.jAudioTools.FeatureProcessor.writeValuesARFFHeader(FeatureProcessor.java:853) 
    at jAudioFeatureExtractor.jAudioTools.FeatureProcessor.<init>(FeatureProcessor.java:258) 
    at jAudioFeatureExtractor.DataModel.extract(DataModel.java:308) 
    at Mfccarffwriter.main(Mfccarffwriter.java:70) 

처음에 나는 그것이 즉, 프로그램이 쓰기에 허용되지 않은 파일 권한 문제 (라고 생각 왜냐하면 이클립스 4.2.2 (나는 윈도우 7, 64 비트 버전을 돌리고있다)에 모든 종류의 권한을 부여한 후에도 여전히 NullException 버그가 발생한다.

위반 예외가 아래와 같습니다에서 유래 패키지 코드 :

/** 
    * Write headers for an ARFF file. If saving for overall features, this must 
    * be postponed until the overall features have been calculated. If this a 
    * perWindow arff file, then all the feature headers can be extracted now 
    * and no hacks are needed. 
    * <p> 
    * <b>NOTE</b>: This procedure breaks if a feature to be saved has a 
    * variable number of dimensions 
    * 
    * @throws Exception 
    */ 
    private void writeValuesARFFHeader() throws Exception { 
     String sep = System.getProperty("line.separator"); 
     String feature_value_header = "@relation jAudio" + sep; 
     values_writer.writeBytes(feature_value_header); // exception here 
     if (save_features_for_each_window && !save_overall_recording_features) { 
      for (int i = 0; i < feature_extractors.length; ++i) { 
       if (features_to_save[i]) { 
        String name = feature_extractors[i].getFeatureDefinition().name; 
        int dimension = feature_extractors[i] 
          .getFeatureDefinition().dimensions; 
        for (int j = 0; j < dimension; ++j) { 
         values_writer.writeBytes("@ATTRIBUTE \"" + name + j 
           + "\" NUMERIC" + sep); 
        } 
       } 
      } 
      values_writer.writeBytes(sep); 
      values_writer.writeBytes("@DATA" + sep); 
     } 
    } 

는 다음 주 응용 프로그램 코드입니다 :

import java.io.*; 
import java.util.Arrays; 

import com.sun.xml.internal.bind.v2.runtime.RuntimeUtil.ToStringAdapter; 

import jAudioFeatureExtractor.Cancel; 
import jAudioFeatureExtractor.DataModel; 
import jAudioFeatureExtractor.Updater; 
import jAudioFeatureExtractor.Aggregators.AggregatorContainer; 
import jAudioFeatureExtractor.AudioFeatures.FeatureExtractor; 
import jAudioFeatureExtractor.AudioFeatures.MFCC; 
import jAudioFeatureExtractor.DataTypes.RecordingInfo; 
import jAudioFeatureExtractor.jAudioTools.*; 


    public static void main(String[] args) throws Exception { 

     // Display information about the wav file 
     File extractedFiletoTest = new File("./microwave1.wav"); 

     String randomID = Integer.toString((int) Math.random()); 

     String file_path = "E:/Weka-3-6/tmp/microwave1.wav"; 
     AudioSamples sampledExampleFile = new AudioSamples(extractedFiletoTest,randomID,false); 

     RecordingInfo[] samplefileInfo = new RecordingInfo[5]; 
     samplefileInfo[1] = new RecordingInfo(randomID, file_path, sampledExampleFile, true); 

     double samplingrate= sampledExampleFile.getSamplingRateAsDouble(); 
     int windowsize= 4096; 
     boolean normalize = false; 

     OutputStream valsavepath = new FileOutputStream(".\\values"); 
     OutputStream defsavepath = new FileOutputStream(".\\definitions"); 

     boolean[] featurestosaveamongall = new boolean[10]; 
     Arrays.fill(featurestosaveamongall, Boolean.TRUE); 

     double windowoverlap = 0.0; 

     DataModel mfccDM = new DataModel("features.xml",null); 

     mfccDM.extract(windowsize, 0.5, samplingrate, true, true, false, samplefileInfo, 1); /// invokes the writeValuesARFFHeader function. 

     } 
    } 

당신은 (지금까지 완료) 전체 프로젝트 here을 다운로드 할 수 있습니다.

+0

NPE는 구체적으로 어떤 라인을 얻고 있습니까? 귀하의 질문에 명확하게 표시해야합니다. – Makoto

답변

0

이것은 약간 늦을 수 있지만 동일한 문제가 있으며 featureKey 및 featureValue가 DataModel에 설정되지 않았 음을 추적했습니다. 이것들에 대한 설정 방법은 없지만 공개 필드입니다. 여기 내 코드는 다음과 같습니다

package Sound; 

import jAudioFeatureExtractor.ACE.DataTypes.Batch; 
import jAudioFeatureExtractor.DataModel; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

public class Analysis { 

    private static String musicFile = "/home/chris/IdeaProjects/AnotherProj/res/SheMovesInHerOwnWay15s.wav"; 
    private static String featureFile = "/home/chris/IdeaProjects/AnotherProj/res/features.xml"; 
    private static String settingsFile = "/home/chris/IdeaProjects/AnotherProj/res/settings.xml"; 
    private static String FKOuputFile = "/home/chris/IdeaProjects/AnotherProj/res/fk.xml"; 
    private static String FVOuputFile = "/home/chris/IdeaProjects/AnotherProj/res/fv.xml"; 

    public static void main(String[] args){ 
     Batch batch = new Batch(featureFile, null); 
     try{ 
      batch.setRecordings(new File[]{new File(musicFile)}); 
      batch.getAggregator(); 
      batch.setSettings(settingsFile); 

      DataModel dm = batch.getDataModel(); 
      OutputStream valsavepath = new FileOutputStream(FVOuputFile); 
      OutputStream defsavepath = new FileOutputStream(FKOuputFile); 
      dm.featureKey = defsavepath; 
      dm.featureValue = valsavepath; 
      batch.setDataModel(dm); 

      batch.execute(); 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

} 

나는 GUI를 사용하여 Settings.XML의 파일을 생성하고 당신이 병을 저장 한 디렉토리에서 features.xml 파일을 복사.

희망 하시겠습니까?