2015-08-07 8 views
6

मैं एक विश्लेषक नोड का उपयोग करके दो ध्वनि के बीच अंतर को मापने और ByteFrequencyData() प्राप्त करने का प्रयास कर रहा हूं। मैंने सोचा कि प्रत्येक आवृत्ति बिन में अंतर को जोड़कर मैं एक ही संख्या के साथ आ सकता हूं कि यह दर्शाता है कि दो आवाज़ें कितनी अलग थीं। फिर मैं आवाजों को बदलने और संख्याओं को फिर से मापने में सक्षम होगा ताकि यह देखने के लिए कि नई आवाज पहले से कम या कम थी।वेब ऑडियो एपीआई का उपयोग करके दो ध्वनियों के बीच अंतर को कैसे मापते हैं?

क्या GetFyteFrequencyData() पूरी तरह से ध्वनि के प्रतिनिधित्व को शामिल करता है या मुझे ध्वनि को अर्हता प्राप्त करने के लिए डेटा के अन्य टुकड़ों को शामिल करने की आवश्यकता है?

var Spectrogram = (function(){ 
    function Spectrogram(ctx) { 
     this.analyser = ctx.createAnalyser(); 
     this.analyser.fftSize = 2048; 
     this.sampleRate = 512; 

     this.scriptNode = ctx.createScriptProcessor(this.sampleRate, 1, 1); 
     this.scriptNode.onaudioprocess = this.process.bind(this); 

     this.analyser.connect(this.scriptNode); 

     this.startNode = this.analyser; 
     this.endNode = this.scriptNode; 

     this.data = []; 
    } 

    Spectrogram.prototype.process = function(e) { 
     var d = new Uint8Array(this.analyser.frequencyBinCount); 
     this.analyser.getByteFrequencyData(d); 
     this.data.push(d); 

     var inputBuffer = e.inputBuffer; 
     var outputBuffer = e.outputBuffer; 
     for(var channel = 0; channel < outputBuffer.numberOfChannels; channel++) { 
      var inputData = inputBuffer.getChannelData(channel); 
      var outputData = outputBuffer.getChannelData(channel); 
      for(var sample = 0; sample < inputBuffer.length; sample++) { 
       outputData[sample] = inputData[sample]; 
      } 
     } 
    }; 

    Spectrogram.prototype.compare = function(other) { 
     var fitness = 0; 
     for(var i=0; i<this.data.length; i++) { 
      if(other.data[i]) { 
       for(var k=0; k<this.data[i].length; k++) { 
        fitness += Math.abs(this.data[i][k] - other.data[i][k]); 
       } 
      } 
     } 
     return fitness; 
    } 

    return Spectrogram; 
})(); 
+1

आपको विचार करना होगा कि ध्वनि के लिए अलग-अलग होने का क्या अर्थ है। निश्चित रूप से 'getByteFrequencyData' किसी भी तरह से ध्वनि का प्रतिनिधित्व करता है, लेकिन मुझे नहीं पता कि यह कैप्चर करता है कि आप क्या चाहते हैं। विचार करें कि आपके पास आवाज है या नहीं। अब 2 के कारक द्वारा आयाम को कम करें। क्या आवाज़ें समान हैं? क्या उन्हें एक ही आवाज माना जाना चाहिए? इससे पहले कि आप आपको बताने के लिए एल्गोरिदम के साथ आ सकें, आपको "समान" होने का अर्थ परिभाषित करने की आवश्यकता है। –

+0

मुझे लगता है कि ध्वनि के समान होने के लिए वे एक मानव कान के समान ध्वनि करेंगे। तो आयाम समीकरण का एक हिस्सा होगा। विश्लेषक नोड्स पर भी ByteTimeDomainData() प्राप्त होता है जो वर्णन "वर्तमान समय-डोमेन या तरंग" है जो आयाम को शामिल करेगा? – zorqy

+0

हां, इसमें आयाम जानकारी शामिल होगी। लेकिन आप शायद 'getByteTimeDomainData'' के बजाय 'getFloatTimeDomainData' का उपयोग करना चाहते हैं। –

उत्तर

1

आप दो संकेतों की तुलना करने के Meyda पैकेज द्वारा प्रदान की spectralFlux समारोह इस्तेमाल कर सकते हैं:

यहाँ कोड मैं का उपयोग कर रहा है। स्पेक्ट्रल प्रवाह, विकिपीडिया के मुताबिक, "आमतौर पर दो सामान्यीकृत स्पेक्ट्रा के बीच 2-मानक (जिसे यूक्लिडियन दूरी के रूप में भी जाना जाता है) के रूप में गणना की जाती है।"

const spectralFlux = require('meyda/src/extractors/spectralFlux'); 

const difference = spectralFlux({ 
    signal: [your first signal], 
    previousSignal: [your second signal] 
}); 

सिर्फ here ताकि आप निर्भरता को संभालने के लिए की जरूरत नहीं है कि, codebase उचित रूप से लाइसेंस प्राप्त है से कोड कॉपी करने के लिए स्वतंत्र महसूस:

npm install --save meyda runninng के बाद, आप की तरह कुछ करना होगा।

यह दो सिग्नल ध्वनि "अलग" कैसे एक गुणांक वापस करेगा। आप इसे समय डोमेन, या आवृत्ति डोमेन में कर सकते हैं। आपको अलग-अलग संख्याएं मिलेंगी, लेकिन दोनों एक-दूसरे से आवाजों को "अलग" कैसे करेंगे इसके साथ सहसंबंध करेंगे।

लेकिन "अंतर" आपके उपयोग के मामले के लिए सटीक रूप से पर्याप्त अंतर का वर्णन नहीं कर सकता है। उदाहरण के लिए, आप वॉल्यूम मतभेदों के बारे में बहुत कुछ परवाह कर सकते हैं, और टाइमरब्रल मतभेदों के बारे में बहुत कुछ नहीं, लेकिन वर्णक्रमीय प्रवाह मीट्रिक इसे ध्यान में रखता नहीं है। आप पहले फीचर एक्स्ट्रेक्टर्स के माध्यम से प्रत्येक सिग्नल को चलाने की इच्छा कर सकते हैं, उनके गुणों के बारे में अन्य आंकड़े जैसे कि उनकी अवधारणात्मक मात्रा, उनकी चमक, आदि, और फिर उन डेटा के बीच भारित यूक्लिडियन दूरी ले सकते हैं, जो एक अधिक अनुरूप "अंतर" मीट्रिक प्रदान करेगा आपको अपने उद्देश्य के लिए क्या चाहिए।

आगे विस्तृत करने के लिए खुश है, लेकिन यह एसओ उत्तर के लिए पहले से ही काफी लंबा है।

+0

गीथूब पर अपनी परियोजना को इंगित करने के लिए धन्यवाद! वास्तव में उपयोगी लग रहा है। क्या आप अधिक ध्वनि तुलना टूलिंग जोड़ने की योजना बना रहे हैं? –

+0

@JustusRomijn मुझे जो कुछ भी उपयोगी होगा जोड़ने में खुशी होगी :) –

संबंधित मुद्दे