2014-07-01 25 views
9

Bir sessizlik oluşur kadar kayıt tarayıcı tabanlı bir yol arıyorum.HTML Sessiz hale gelene kadar ses kaydı?

mikrofondan

HTML ses kaydı Firefox ve Chrome mümkündür - Recordmp3js kullanarak bkz: http://nusofthq.com/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/ ve github kodu: Bir yol göremiyorum http://github.com/nusofthq/Recordmp3js

kadar kayıt bu kodu değiştirmek için Sessizlik.

Tutanak sessizlik kadar yapılan (ve ayarlı) bir yerel Android App için Java kullanarak edilebilir - bkz: Android audio capture silence detection

Google Voice Search Bir tarayıcı doit olabilir gösteriyor - ama nasıl JavaScript kullanarak yapabilirsiniz? Herhangi bir fikrin var mı?

+0

Sana zift tespitinde kullanılan koddan bunu anlamaya eminim: https://github.com/cwilso/pitchdetect – Ian

+0

Gerçek dijital sessizliği veya ses seviyesini eşiğin altında mı istiyorsunuz? – Brad

+0

basit bir eşik beni yapar. – GavinBrelstaff

cevap

9

Web Audio API'sini kullanırsanız, navigator.getUserMedia öğesine çağrı yaparak canlı bir mikrofon ses yakalaması açın, ardından createPointProcessor'u kullanarak bir düğüm oluşturun, ardından o düğümle o olaya ilişkin bir geri bildirimi atayın: onaudioprocess . Geri arama fonksiyonunuzun içinde (aşağıda script_processor_analysis_node kullanıyorum) canlı gerçek zamanlı ses arabelleğine erişebilirsiniz, daha sonra sessizlik aralığını ayrıştırabilirsiniz (genliğin düşük olduğu bir süre (sıfıra yakın durma süresi)). için

zaman alanı ses eğrisi bkz Normal: Benzer frekans etki alanı için hoparlör hacmi aşağı

açın array_freq_domain bakın veya mikrofon geribildirim önlemek için kulaklık kullanın ... script_processor_analysis_node geri çağırma her çağrı üzerine taze doldurulur array_time_domain -> hoparlör -> mikrofon ...

<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>capture microphone then show time & frequency domain output</title> 

<script type="text/javascript"> 

var webaudio_tooling_obj = function() { 

    var audioContext = new AudioContext(); 

    console.log("audio is starting up ..."); 

    var BUFF_SIZE_RENDERER = 16384; 

    var audioInput = null, 
    microphone_stream = null, 
    gain_node = null, 
    script_processor_node = null, 
    script_processor_analysis_node = null, 
    analyser_node = null; 

    if (!navigator.getUserMedia) 
     navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || 
    navigator.mozGetUserMedia || navigator.msGetUserMedia; 

    if (navigator.getUserMedia){ 

     navigator.getUserMedia({audio:true}, 
      function(stream) { 
       start_microphone(stream); 
      }, 
      function(e) { 
       alert('Error capturing audio.'); 
      } 
      ); 

    } else { alert('getUserMedia not supported in this browser.'); } 

    // --- 

    function show_some_data(given_typed_array, num_row_to_display, label) { 

     var size_buffer = given_typed_array.length; 
     var index = 0; 

     console.log("__________ " + label); 

     if (label === "time") { 

      for (; index < num_row_to_display && index < size_buffer; index += 1) { 

       var curr_value_time = (given_typed_array[index]/128) - 1.0; 

       console.log(curr_value_time); 
      } 

     } else if (label === "frequency") { 

      for (; index < num_row_to_display && index < size_buffer; index += 1) { 

       console.log(given_typed_array[index]); 
      } 

     } else { 

      throw new Error("ERROR - must pass time or frequency"); 
     } 
    } 

    function process_microphone_buffer(event) { 

     var i, N, inp, microphone_output_buffer; 

     microphone_output_buffer = event.inputBuffer.getChannelData(0); // just mono - 1 channel for now 
    } 

    function start_microphone(stream){ 

     gain_node = audioContext.createGain(); 
     gain_node.connect(audioContext.destination); 

     microphone_stream = audioContext.createMediaStreamSource(stream); 
     microphone_stream.connect(gain_node); 

     script_processor_node = audioContext.createScriptProcessor(BUFF_SIZE_RENDERER, 1, 1); 
     script_processor_node.onaudioprocess = process_microphone_buffer; 

     microphone_stream.connect(script_processor_node); 

     // --- enable volume control for output speakers 

     document.getElementById('volume').addEventListener('change', function() { 

      var curr_volume = this.value; 
      gain_node.gain.value = curr_volume; 

      console.log("curr_volume ", curr_volume); 
     }); 

     // --- setup FFT 

     script_processor_analysis_node = audioContext.createScriptProcessor(2048, 1, 1); 
     script_processor_analysis_node.connect(gain_node); 

     analyser_node = audioContext.createAnalyser(); 
     analyser_node.smoothingTimeConstant = 0; 
     analyser_node.fftSize = 2048; 

     microphone_stream.connect(analyser_node); 

     analyser_node.connect(script_processor_analysis_node); 

     var buffer_length = analyser_node.frequencyBinCount; 

     var array_freq_domain = new Uint8Array(buffer_length); 
     var array_time_domain = new Uint8Array(buffer_length); 

     console.log("buffer_length " + buffer_length); 

     script_processor_analysis_node.onaudioprocess = function() { 

      // get the average for the first channel 
      analyser_node.getByteFrequencyData(array_freq_domain); 
      analyser_node.getByteTimeDomainData(array_time_domain); 

      // draw the spectrogram 
      if (microphone_stream.playbackState == microphone_stream.PLAYING_STATE) { 

       show_some_data(array_freq_domain, 5, "frequency"); 
       show_some_data(array_time_domain, 5, "time"); // store this to record to aggregate buffer/file 

// examine array_time_domain for near zero values over some time period 

      } 
     }; 
    } 

}(); // webaudio_tooling_obj = function() 

</script> 

</head> 
<body> 

    <p>Volume</p> 
    <input id="volume" type="range" min="0" max="1" step="0.1" value="0.5"/> 

</body> 
</html> 
+0

ümit vaat eden bir bakacağız - ve en kısa zamanda geri döneceğim – GavinBrelstaff

+1

Hey Scott ve @GavinBrelstaff Bu, sessiz olduğunda bana nasıl söyler? Benzer bir şey elde etmek istiyorum ve sessiz olduğunda ve kullanıcının ses girişini tamamladığında bir işlevi tetiklemek istiyorum. – Adeel

0

Bu eski bir yazı olduğunu ama burada çözüm ilanıyla böylece aynı sorun var emin birçok duyuyorum. kullanın hark.js

Aşağıda

olan örnek demo kod benim elektron uygulama için kullanılamaz

hark = require('./node_modules/hark/hark.bundle.js') 

    navigator.getUserMedia({ audio : true}, onMediaSuccess, function(){}); 

    function onMediaSuccess(blog) { 

    var options = {}; 
    var speechEvents = hark(blog, options); 

    speechEvents.on('speaking', function() { 
     console.log('speaking'); 
    }); 

    speechEvents.on('stopped_speaking', function() { 
     console.log('stopped_speaking'); 
    }); 
    }; 
İlgili konular