2015-03-31 96 views
0

我正在使用musicg庫來比較兩個音頻聲音。其中一個被保存,另一個被記錄檢測到。 musicg庫有whistle演示;我編輯它是工作,因爲我想要的。問題是當我想要檢測到的聲音[這是一個緩衝]轉換爲wav,並得到它的fingurprint,它返回nullpointerexption。比較Android中的兩個聲音

這是MainAcivity.java

公共靜態波W1;

InputStream sw1 = getBaseContext()。getResources()。openRawResource(R.raw.top_of_the_world_rec);

w1 = new Wave(sw1);

並且這在DetectorThread.java

   InputStream obj = new ByteArrayInputStream(buffer); 
       Wave woo = new Wave(obj); 
       if (woo.toString() == null) 
        Log.i("", "recoded sound is null"); 
       if (MainActivity.w1.toString() == null) 
        Log.i("", "the detected sound is null"); 
       try { 
        similarity = woo.getFingerprintSimilarity(MainActivity.w1);/// this couse null pointer exption 
        Log.i("", "1-" + similarity); // not appear 
        if (similarity == null) { // not enter this if at all ~! 
         Log.i("", "lolol" + similarity); 
         TheSemilarityISnull = true; 
        } 
       } 
       catch (NullPointerException n) { 
        Log.i("", "first error"); 
        TheSemilarityISnull = true; 
       } 
       // EnD of addition 

       Log.i("", "2-" + similarity); //appear 2-null 
       // byte[] io = MainActivity.w1.getFingerprint(); // good no problem 
       // Log.i("", "00-"+io); // apear bk09823 like this 
       try { 

        Log.i("", "0-"); 
        byte[] po = woo.getFingerprint(); // ~> this couse null pointer exption 
        Log.i("", "0-" + po); 
        if (po == null) 
         Log.i("", "fingurprint for detected sound is null ");//not appear 
        byte[] io = MainActivity.w1.getFingerprint(); 
        Log.i("", "00-" + io); 
        if (io == null) 
         Log.i("", "fingurprint for recorded sound is null");//not appear 
        double scoure = new FingerprintSimilarityComputer(po, io).getFingerprintsSimilarity().getSimilarity(); 

       } catch (Exception e) { 
        Log.i("", "second error "); 
       } 

左右;

1-how to byte [] to wav?

2,我可以調用class或Mothed內部線程嗎? Becouse我不知道,每次我打電話給他們其中一個都沒有發現任何東西!

3-我根本不編輯記錄線程>是否會引起問題? 請幫助我。

+0

對於你的第一個問題。 [見這裏](http://stackoverflow.com/questions/731120/convert-byte-array-to-wav-java)。 – yiabiten 2015-03-31 08:46:05

+0

我沒有得到我的答案...問題是當我想要轉換緩衝區 - 類中的變量檢測到線程 - 浪潮它couse nullpointerexption! – user3495695 2015-03-31 17:14:48

回答

0

讀緩衝區不包含任何波頭。這些只是音頻字節。 我已經開始實施可能有效的課程。但它還沒有最終確定

public class WavApi extends DetectionApi { 
    Wave waveToMatch; 

    public WavApi(Wave wave) { 
    super(wave.getWaveHeader()); 
    this.waveToMatch = wave; 
    } 

    public boolean matches(byte[] audioBytes) { 
    Wave wave = new Wave(waveToMatch.getWaveHeader(), audioBytes); 

    FingerprintSimilarityComputer fpc = new FingerprintSimilarityComputer(waveToMatch.getFingerprint(), wave.getFingerprint()); 
    FingerprintSimilarity similarity = fpc.getFingerprintsSimilarity(); 

    //--- TODO: find optimal condition to decide whether {audioBytes} matches {waveToMatch} or not 
    float sim = similarity.getScore() * 100f; 
    int pos = similarity.getMostSimilarFramePosition(); 

    if (pos >= 0 && sim > 0) 
     return true; 
    //---- 

    return false; 
    } 
}