LinguaRecorder

Description

LinguaRecorder is a fast cross-browser voice recording JS library.

Features

Browser Compatibility

Tested in the following browsers/versions:

  master branch legacy branch
Firefox 76+ 25+
Chrome 66+ 22+
Firefox for android 79+ 57+ *
Chrome for android 66+ 63+ *
Microsoft Edge 79+ 12+
Safari 14.1+ 11+
Opera 53+ 18+

It may work on older versions of the browsers marked with *, but it has not been tested.

The master branch uses internally the new AudioWorklet API, whereas the legacy branch uses the old and now deprecated BaseAudioContext:createScriptProcessor method.

Live demos

The LinguaRecorder sandbox allows you to get familiar with (hardly) all features of the library, and to play with it’s configuration possibilities.

The demo folder contain several other implementation examples.

Documentation

Contents

Quick Start

Get the code:

Use it in browser

Then include the three files stored in the src folder in your HTML page:

<script src="/path/to/RecordingProcessor.js"></script>
<script src="/path/to/AudioRecord.js"></script>
<script src="/path/to/LinguaRecorder.js"></script>
<script>
    var recorder = new LinguaRecorder();
    ...
</script>

Imported this way, the LinguaRecorder and AudioRecord classes will be present in the document’s script namespace.

There will also be a window.LinguaRecorder object created, with properties .AudioRecord, .LinguaRecorder, .recordingProcessorEncapsulation.

If you use a bundler like webpack, none of this will be present in the namespace because of the encapsulation, so you need to handle the imported functions/classes yourself.

Use it with nodeJS

{ LinguaRecorder } = require('lingua-recorder')
var recorder = new LinguaRecorder();
...

Examples

to do

LinguaRecorder

Configurations

autoStart boolean false

Set to true to wait for voice detection before effectively starting the record when calling the start() method.

autoStop boolean false

Set to true to stop the record when there is a silence.

timeLimit number 0

Maximum time (in seconds) after which it is necessary to stop recording. Set to 0 (default) for no time limit.

onSaturate string 'none'

Tell what to do when a record is saturated. Accepted values are ‘none’ (default), ‘cancel’ and ‘discard’.

saturationThreshold number 0.99

Amplitude value between 0 and 1 included. Only used if onSaturate is different from ‘none’. Threshold above which a record should be flagged as saturated.

startThreshold number 0.1

Amplitude value between 0 and 1 included. Only used if autoStart is set to true. Amplitude to reach to auto-start the recording.

stopThreshold number 0.05

Amplitude value between 0 and 1 included. Only used if autoStop is set to true. Amplitude not to exceed in a stopDuration interval to auto-stop recording.

stopDuration number 0.3

Duration value in seconds. Only used if autoStop is set to true. Duration during which not to exceed the stopThreshold in order to auto-stop recording.

marginBefore number 0.25

Duration value in seconds. Only used if autoStart is set to true.

marginAfter number 0.25

Duration value in seconds. Only used if autoStop is set to true.

minDuration number 0.15

Duration value in seconds. Discard the record if it last less than minDuration. Default value to 0.15, use 0 to disable.

Methods

constructor([config])

Creates a new LinguaRecorder instance.

start()

Start to record.

If autoStart is set to true, enter in listening state and postpone the start of the recording when a voice will be detected.

pause()

Switch the record to the pause state.

While in pause, all the inputs coming from the microphone will be ignored. To resume to the recording state, just call the start() method again. It is also still possible to stop() or cancel() a record, and you have to do so upstream if you wish to start a new one.

stop([cancelRecord])

Stop the recording process and fire the record to the user.

Depending of the configuration, this method could discard the record if it fails some quality controls (duration and saturation).

To start a new record afterwards, just call the start() method again.

cancel()

Stop a recording, but without saving the record. This is an alias for stop( true ).

toggle()

Toggle between the recording and stopped state.

on(event, handler)

Attach a handler function to a given event.

off(event)

Remove all the handler function from an event.

connectAudioNode(node)

Add an extra AudioNode

This can be used to draw a live visualization of the sound, or to perform some live editing tasks on the stream before it is recorded. See https://developer.mozilla.org/fr/docs/Web/API/AudioNode

Note that it can produce a little interrupt in the record if you are in listening or recording state.

disconnectAudioNode(node)

Remove an extra AudioNode previously added with connectAudioNode.

Note that it can produce a little interrupt in the record if you are in listening or recording state.

getRecordingTime()

Return the current duration of the record.

getState()

Return the current state of the recorder.

getAudioContext()

Return the audioContext initialized and used by the recorder.

see https://developer.mozilla.org/fr/docs/Web/API/AudioContext

close()

Cleanly stop the threaded execution of the audio recorder in preparation for the destruction of the current LinguaRecorder instance. This method has to be called, otherwise memory leak will happened.

Events

States

AudioRecord

Methods

constructor(samples, sampleRate)

Creates a new AudioRecord instance.

setSampleRate(value)

Change the declared sample rate.

getSampleRate()

Get the sample rate in use.

getLength()

Get the total number of samples in the record.

getDuration()

Get the duration of the record. This is based on the number of samples and the declared sample rate.

getSamples()

Get all the raw samples that make up the record.

lTrim(duration)

Trim the record, starting with the beginning of the record (the left side).

rTrim(duration)

Trim the record, starting with the end of the record (the right side).

clear()

Clear the record.

play()

Play the record to the audio output (aka the user’s loudspeaker).

getBlob()

Get a WAV-encoded Blob version of the record.

getWAVE()

Alias of getBlob()

getObjectURL()

Generate an object URL representing the WAV-encoded record. For performance reasons, you should unload the objectURL once you’re done with it, see https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL

download(fileName)

Start the download process of the record as if it where a normal file.

getAudioElement()

Generate an HTML5 <audio> element containing the WAV-encoded record.

Version 2 migration

As the BaseAudioContext:createScriptProcessor is now deprecated, it became important to migrate to the new AudioWorklet API. This change needed a deep rewrite of the library, but we wanted to keep the API as unchanged as possible. However, there are a few minor breaking changes to note:

Note also that using AudioWorklet breaks the compatibility with old browsers.

Typescript

The type declarations for this library are provided in index.d.ts. You can copy this into your codebase to provide your project with the necessary interfaces.

License

The LinguaRecorder was originally a part of LinguaLibre, developed by Nicolas Vion (@zmoostik), but has then been split out and completely rewritten by Antoine Lamielle (@0x010C).

Released under the MIT License.