2014-01-08 27 views
2

我的项目是创建一个可以执行特征提取和音频文件分类的Android应用程序。首先,我将创建一个Java应用程序作为测试运行。jAudio特征提取:空例外

我正在尝试使用jAudio的功能提取程序包从音频文件中提取音频功能。

作为初学者,我想输入.wav文件并对该文件运行特征提取操作,然后将结果存储为.ARFF文件。

不过,我在项目中得到下面的空指针异常错误从包:

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) 

起初,我以为是文件权限问题(即程序没有被允许写一个文件,因为缺乏权限),但即使在授予Eclipse 4.2.2的各种权限(我正在运行Windows 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文件,并刚刚从保存jar的目录中复制了features.xml文件。

希望这会有所帮助