[Javascript] Web Audio APIでマイクの音をデータ取得して解析する方法
Web Audio APIでマイクの音をデータ取得して解析する方法は、以下の通り
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>音声解析</title> </head> <body> <button onclick="startRecording()">解析開始</button> <button onclick="endRecording()">解析終了</button> <hr> </body> </html> <script> // クロスブラウザ定義 navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; // 変数定義 var localMediaStream = null; var localScriptProcessor = null; var audioContext = new AudioContext(); var bufferSize = 1024; var audioData = []; // 録音データ var recordingFlg = false; // 音声解析 var audioAnalyser = null; // 録音バッファ作成(録音中自動で繰り返し呼び出される) var onAudioProcess = function(e) { if (!recordingFlg) return; // 音声のバッファを作成 var input = e.inputBuffer.getChannelData(0); var bufferData = new Float32Array(bufferSize); for (var i = 0; i < bufferSize; i++) { bufferData[i] = input[i]; } audioData.push(bufferData);//録音データに追加 // オーディオデータ取得 var fsDivN = audioContext.sampleRate / audioAnalyser.fftSize; var spectrums = new Uint8Array(audioAnalyser.frequencyBinCount); audioAnalyser.getByteFrequencyData(spectrums); //...spectrumsというUint8Arrayデータをあとは解析する //例えば、Circular Audio WaveのようなUint8Arrayを扱っているオーディオビジュアライザにわたすとマイクの音声を視覚化できる }; // 解析開始 var startRecording = function() { recordingFlg = true; navigator.getUserMedia({audio: true}, function(stream) { // 録音関連 localMediaStream = stream; var scriptProcessor = audioContext.createScriptProcessor(bufferSize, 1, 1); localScriptProcessor = scriptProcessor; var mediastreamsource = audioContext.createMediaStreamSource(stream); mediastreamsource.connect(scriptProcessor); scriptProcessor.onaudioprocess = onAudioProcess; scriptProcessor.connect(audioContext.destination); // 音声解析関連 audioAnalyser = audioContext.createAnalyser(); audioAnalyser.fftSize = 2048; frequencyData = new Uint8Array(audioAnalyser.frequencyBinCount); timeDomainData = new Uint8Array(audioAnalyser.frequencyBinCount); mediastreamsource.connect(audioAnalyser); }, function(e) { console.log(e); }); }; // 解析終了 var endRecording = function() { recordingFlg = false; //audioDataをサーバに送信するなど終了処理 }; </script>
参考URL:
getUserMediaで音声を拾いリアルタイムで波形を出力するhttps://qiita.com/mhagita/items/6c7d73932d9a207eb94d
HTML5 の Web Audio API を使ってマイクから入力した音声データを再生するhttp://dotnsf.blog.jp/archives/1072473945.html
Circular Audio Wave
https://github.com/kelvinau/circular-audio-wave