If you just want to get some audio data from your microphone, this is what you're looking for!
Converts a MediaStream (from getUserMedia) into a standard Node.js-style stream for easy pipe()
ing.
Note: This only works in a limited set of browsers (typically with with webpack or browserify), and then only for https or localhost in Chrome. It does not work in Node.js.
var getUserMedia = require('get-user-media-promise');
var MicrophoneStream = require('microphone-stream');
document.getElementById('my-start-button').onclick = function() {
// note: for iOS Safari, the constructor must be called in response to a tap, or else the AudioContext will remain
// suspended and will not provide any audio data.
var micStream = new MicrophoneStream();
getUserMedia({ video: false, audio: true })
.then(function(stream) {
micStream.setStream(stream);
}).catch(function(error) {
console.log(error);
});
// get Buffers (Essentially a Uint8Array DataView of the same Float32 values)
micStream.on('data', function(chunk) {
// Optionally convert the Buffer back into a Float32Array
// (This actually just creates a new DataView - the underlying audio data is not copied or modified.)
var raw = MicrophoneStream.toRaw(chunk)
//...
// note: if you set options.objectMode=true, the `data` event will output AudioBuffers instead of Buffers
});
// or pipe it to another stream
micStream.pipe(/*...*/);
// It also emits a format event with various details (frequency, channels, etc)
micStream.on('format', function(format) {
console.log(format);
});
// Stop when ready
document.getElementById('my-stop-button').onclick = function() {
micStream.stop();
};
}
new MicrophoneStream(opts)
-> Readable Stream
Where opts
is an option object, with defaults:
{
stream: null,
objectMode: false,
bufferSize: null,
context: null
}
-
stream: MediaStream instance. For iOS compatibility, it is recommended that you create the MicrophoneStream instance in response to the tap - before you have a MediaStream, and then later call setStream() with the MediaStream.
-
bufferSize: Possible values: null, 256, 512, 1024, 2048, 4096, 8192, 16384. From Mozilla's Docs:
It is recommended for authors to not specify this buffer size and allow the implementation to pick a good buffer size to balance between latency and audio quality.
-
objectMode: if true, stream enters objectMode and emits AudioBuffers instead of Buffers. This has implications for
pipe()
'ing to other streams. -
context is the AudioContext instance. If omitted, one will be created automatically.
Set the mediaStream, necessary for iOS 11 support where the underlying AudioContext must be resumed in response to a user tap, but the the mediaStream won't be available until later. Note: Some versions of Firefox leave the recording icon in place after recording has stopped.
Stops the recording. Note: Some versions of Firefox leave the recording icon in place after recording has stopped.
Emits either a Buffer with raw 32-bit Floating point audio data, or if objectMode is set, an AudioBuffer containing the data + some metadata.
One-time event with details of the audio format. Example:
{
channels: 1,
bitDepth: 32,
sampleRate: 48000,
signed: true,
float: true
}
Converts a Buffer
(from a data
event or from calling .read()
) back to the original Float32Array DataView format. (The underlying audio data is not copied or modified.)