@lls/lls-audio 0.0.59 → 0.0.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +27 -25
- package/player/Play.js +13 -7
- package/player/styles/styles.js +31 -14
- package/recorder/AudioWorker.js +134 -0
- package/recorder/Visualizer.js +33 -0
- package/recorder/index.js +202 -15
- package/stories/index.js +12 -6
- package/{recorder/AsyncLoader.js → stories/visualizer.js} +43 -50
- package/stories/wordDetector.js +97 -0
- package/utils/audio.js +26 -141
- package/utils/mediaDevices.js +33 -0
- package/wordDetector/index.js +139 -0
- package/recorder/DesktopAudioRecorder.js +0 -190
- package/recorder/DesktopRecorder.js +0 -143
- package/stories/recorder.js +0 -30
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
8
|
-
|
|
9
|
-
var _react = require('react');
|
|
10
|
-
|
|
11
|
-
var _react2 = _interopRequireDefault(_react);
|
|
12
|
-
|
|
13
|
-
var _CustomWave = require('../player/CustomWave');
|
|
14
|
-
|
|
15
|
-
var _CustomWave2 = _interopRequireDefault(_CustomWave);
|
|
16
|
-
|
|
17
|
-
var _audioContext = require('../utils/audioContext');
|
|
18
|
-
|
|
19
|
-
var _audioContext2 = _interopRequireDefault(_audioContext);
|
|
20
|
-
|
|
21
|
-
var _audio = require('../utils/audio');
|
|
22
|
-
|
|
23
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
24
|
-
|
|
25
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
26
|
-
|
|
27
|
-
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
28
|
-
|
|
29
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
30
|
-
|
|
31
|
-
var audioContext = new _audioContext2.default();
|
|
32
|
-
|
|
33
|
-
var DesktopAudioRecorder = function (_Component) {
|
|
34
|
-
_inherits(DesktopAudioRecorder, _Component);
|
|
35
|
-
|
|
36
|
-
function DesktopAudioRecorder(props) {
|
|
37
|
-
_classCallCheck(this, DesktopAudioRecorder);
|
|
38
|
-
|
|
39
|
-
var _this = _possibleConstructorReturn(this, (DesktopAudioRecorder.__proto__ || Object.getPrototypeOf(DesktopAudioRecorder)).call(this, props));
|
|
40
|
-
|
|
41
|
-
_this.state = {
|
|
42
|
-
isRecording: false,
|
|
43
|
-
recordedData: null,
|
|
44
|
-
waveform: null
|
|
45
|
-
//this.audioRecorder = null
|
|
46
|
-
};_this.buffers = [];
|
|
47
|
-
return _this;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
_createClass(DesktopAudioRecorder, [{
|
|
51
|
-
key: 'componentDidMount',
|
|
52
|
-
value: function componentDidMount() {
|
|
53
|
-
var _this2 = this;
|
|
54
|
-
|
|
55
|
-
window.navigator.getUserMedia({
|
|
56
|
-
"audio": {
|
|
57
|
-
"mandatory": {
|
|
58
|
-
"googEchoCancellation": "false",
|
|
59
|
-
"googAutoGainControl": "false",
|
|
60
|
-
"googNoiseSuppression": "false",
|
|
61
|
-
"googHighpassFilter": "false"
|
|
62
|
-
},
|
|
63
|
-
"optional": []
|
|
64
|
-
}
|
|
65
|
-
}, function (stream) {
|
|
66
|
-
return _this2.onMediaSuccess(stream);
|
|
67
|
-
}, function (stream) {
|
|
68
|
-
return _this2.onMediaError(stream);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}, {
|
|
72
|
-
key: 'render',
|
|
73
|
-
value: function render() {
|
|
74
|
-
var _this3 = this;
|
|
75
|
-
|
|
76
|
-
var _state = this.state,
|
|
77
|
-
isRecording = _state.isRecording,
|
|
78
|
-
waveform = _state.waveform;
|
|
79
|
-
|
|
80
|
-
return _react2.default.createElement(
|
|
81
|
-
'div',
|
|
82
|
-
null,
|
|
83
|
-
'Desktop audio recorder',
|
|
84
|
-
isRecording ? _react2.default.createElement(
|
|
85
|
-
'button',
|
|
86
|
-
{ onClick: function onClick() {
|
|
87
|
-
return _this3.stopRecording();
|
|
88
|
-
} },
|
|
89
|
-
' stop recording '
|
|
90
|
-
) : _react2.default.createElement(
|
|
91
|
-
'button',
|
|
92
|
-
{ onClick: function onClick() {
|
|
93
|
-
return _this3.record();
|
|
94
|
-
} },
|
|
95
|
-
' record '
|
|
96
|
-
),
|
|
97
|
-
waveform ? _react2.default.createElement(_CustomWave2.default, {
|
|
98
|
-
width: 500,
|
|
99
|
-
currentTime: 0,
|
|
100
|
-
totalTime: 200,
|
|
101
|
-
height: 40,
|
|
102
|
-
isLoading: false,
|
|
103
|
-
waveform: waveform
|
|
104
|
-
}) : null
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
}, {
|
|
108
|
-
key: 'record',
|
|
109
|
-
value: function record() {
|
|
110
|
-
this.setState({
|
|
111
|
-
recordedData: null,
|
|
112
|
-
isRecording: true
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}, {
|
|
116
|
-
key: 'onMediaSuccess',
|
|
117
|
-
value: function onMediaSuccess(stream) {
|
|
118
|
-
var _this4 = this;
|
|
119
|
-
|
|
120
|
-
var bufferSize = 4096;
|
|
121
|
-
var numberOfInputChannels = 2;
|
|
122
|
-
var numberOfOutputChannels = 2;
|
|
123
|
-
|
|
124
|
-
// creates an audio node from the microphone incoming stream
|
|
125
|
-
var mediaStream = audioContext.createMediaStreamSource(stream);
|
|
126
|
-
// https://developer.mozilla.org/en-US/docs/Web/API/AudioaudioContext/createScriptProcessor
|
|
127
|
-
var recorder = audioContext.createScriptProcessor ? audioContext.createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels) : audioContext.createJavaScriptNode(bufferSize, numberOfInputChannels, numberOfOutputChannels);
|
|
128
|
-
|
|
129
|
-
recorder.onaudioprocess = function (e) {
|
|
130
|
-
var _state2 = _this4.state,
|
|
131
|
-
recordedData = _state2.recordedData,
|
|
132
|
-
isRecording = _state2.isRecording;
|
|
133
|
-
|
|
134
|
-
if (!isRecording) return;
|
|
135
|
-
var audioBuffer = (0, _audio.appendBuffer)(recordedData, e.inputBuffer);
|
|
136
|
-
var waveform = (0, _audio.convertAudioBufferToWaveform)(audioBuffer);
|
|
137
|
-
|
|
138
|
-
_this4.setState({
|
|
139
|
-
recordedData: audioBuffer,
|
|
140
|
-
waveform: waveform
|
|
141
|
-
});
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
// we connect the recorder with the input stream
|
|
145
|
-
mediaStream.connect(recorder);
|
|
146
|
-
recorder.connect(audioContext.destination);
|
|
147
|
-
}
|
|
148
|
-
}, {
|
|
149
|
-
key: 'onMediaError',
|
|
150
|
-
value: function onMediaError(e) {
|
|
151
|
-
console.error('media error', e);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// This is just for demo purposes: in real life we'll upload the file somewhere
|
|
155
|
-
|
|
156
|
-
}, {
|
|
157
|
-
key: 'updateAudioDom',
|
|
158
|
-
value: function updateAudioDom() {
|
|
159
|
-
var recordedData = this.state.recordedData;
|
|
160
|
-
|
|
161
|
-
var audioEl = document.querySelector('audio');
|
|
162
|
-
|
|
163
|
-
if (audioEl) {
|
|
164
|
-
var wav = (0, _audio.audioBufferToWav)(recordedData);
|
|
165
|
-
var audioBlob = new Blob([wav], { type: 'audio/wav' });
|
|
166
|
-
var reader = new FileReader();
|
|
167
|
-
reader.onload = function (e) {
|
|
168
|
-
// e.target.result will hold the base64 data.
|
|
169
|
-
// Note: It includes the pre-text "data:audio/<format>;base64,<base64 data>"
|
|
170
|
-
audioEl.src = e.target.result;
|
|
171
|
-
};
|
|
172
|
-
reader.readAsDataURL(audioBlob);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}, {
|
|
176
|
-
key: 'stopRecording',
|
|
177
|
-
value: function stopRecording() {
|
|
178
|
-
this.setState({
|
|
179
|
-
isRecording: false
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
// Update audio element with new file
|
|
183
|
-
this.updateAudioDom();
|
|
184
|
-
}
|
|
185
|
-
}]);
|
|
186
|
-
|
|
187
|
-
return DesktopAudioRecorder;
|
|
188
|
-
}(_react.Component);
|
|
189
|
-
|
|
190
|
-
exports.default = DesktopAudioRecorder;
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
8
|
-
|
|
9
|
-
var _react = require('react');
|
|
10
|
-
|
|
11
|
-
var _react2 = _interopRequireDefault(_react);
|
|
12
|
-
|
|
13
|
-
var _msr = require('msr');
|
|
14
|
-
|
|
15
|
-
var _msr2 = _interopRequireDefault(_msr);
|
|
16
|
-
|
|
17
|
-
var _Wave = require('../player/Wave');
|
|
18
|
-
|
|
19
|
-
var _Wave2 = _interopRequireDefault(_Wave);
|
|
20
|
-
|
|
21
|
-
var _audioContext = require('../utils/audioContext');
|
|
22
|
-
|
|
23
|
-
var _audioContext2 = _interopRequireDefault(_audioContext);
|
|
24
|
-
|
|
25
|
-
var _audio = require('../utils/audio');
|
|
26
|
-
|
|
27
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
28
|
-
|
|
29
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
30
|
-
|
|
31
|
-
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
32
|
-
|
|
33
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
34
|
-
|
|
35
|
-
var audioContext = new _audioContext2.default();
|
|
36
|
-
|
|
37
|
-
var DesktopRecorder = function (_Component) {
|
|
38
|
-
_inherits(DesktopRecorder, _Component);
|
|
39
|
-
|
|
40
|
-
function DesktopRecorder(props) {
|
|
41
|
-
_classCallCheck(this, DesktopRecorder);
|
|
42
|
-
|
|
43
|
-
var _this = _possibleConstructorReturn(this, (DesktopRecorder.__proto__ || Object.getPrototypeOf(DesktopRecorder)).call(this, props));
|
|
44
|
-
|
|
45
|
-
_this.state = {
|
|
46
|
-
isRecording: false,
|
|
47
|
-
recordedData: null
|
|
48
|
-
};
|
|
49
|
-
_this.mediaRecorder = null;
|
|
50
|
-
_this.buffers = [];
|
|
51
|
-
return _this;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
_createClass(DesktopRecorder, [{
|
|
55
|
-
key: 'render',
|
|
56
|
-
value: function render() {
|
|
57
|
-
var _this2 = this;
|
|
58
|
-
|
|
59
|
-
var _state = this.state,
|
|
60
|
-
isRecording = _state.isRecording,
|
|
61
|
-
recordedData = _state.recordedData;
|
|
62
|
-
|
|
63
|
-
return _react2.default.createElement(
|
|
64
|
-
'div',
|
|
65
|
-
null,
|
|
66
|
-
'Desktop recorder',
|
|
67
|
-
isRecording ? _react2.default.createElement(
|
|
68
|
-
'button',
|
|
69
|
-
{ onClick: function onClick() {
|
|
70
|
-
return _this2.stopRecording();
|
|
71
|
-
} },
|
|
72
|
-
' stop recording '
|
|
73
|
-
) : _react2.default.createElement(
|
|
74
|
-
'button',
|
|
75
|
-
{ onClick: function onClick() {
|
|
76
|
-
return _this2.record();
|
|
77
|
-
} },
|
|
78
|
-
' record '
|
|
79
|
-
),
|
|
80
|
-
recordedData ? _react2.default.createElement(_Wave2.default, {
|
|
81
|
-
width: 500,
|
|
82
|
-
currentTime: 0,
|
|
83
|
-
height: 40,
|
|
84
|
-
isLoading: false,
|
|
85
|
-
buffer: recordedData }) : null
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
}, {
|
|
89
|
-
key: 'record',
|
|
90
|
-
value: function record() {
|
|
91
|
-
var _this3 = this;
|
|
92
|
-
|
|
93
|
-
window.navigator.getUserMedia({ audio: true }, function (stream) {
|
|
94
|
-
return _this3.onMediaSuccess(stream);
|
|
95
|
-
}, function (stream) {
|
|
96
|
-
return _this3.onMediaError(stream);
|
|
97
|
-
});
|
|
98
|
-
this.setState({
|
|
99
|
-
isRecording: true
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}, {
|
|
103
|
-
key: 'onMediaSuccess',
|
|
104
|
-
value: function onMediaSuccess(stream) {
|
|
105
|
-
var _this4 = this;
|
|
106
|
-
|
|
107
|
-
this.mediaRecorder = new _msr2.default(stream);
|
|
108
|
-
this.mediaRecorder.mimeType = 'audio/wav'; // check this line for audio/wav
|
|
109
|
-
this.mediaRecorder.bufferSize = 256; // check this line for audio/wav
|
|
110
|
-
this.mediaRecorder.ondataavailable = function (blob) {
|
|
111
|
-
(0, _audio.convertBlobToAudioBuffer)(blob, _this4.onRecordingConverted.bind(_this4));
|
|
112
|
-
};
|
|
113
|
-
this.mediaRecorder.start();
|
|
114
|
-
}
|
|
115
|
-
}, {
|
|
116
|
-
key: 'onRecordingConverted',
|
|
117
|
-
value: function onRecordingConverted(audioBuffer) {
|
|
118
|
-
var recordedData = this.state.recordedData;
|
|
119
|
-
|
|
120
|
-
var mergedBuffer = (0, _audio.appendBuffer)(recordedData, audioBuffer);
|
|
121
|
-
this.setState({
|
|
122
|
-
recordedData: mergedBuffer
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}, {
|
|
126
|
-
key: 'onMediaError',
|
|
127
|
-
value: function onMediaError(e) {
|
|
128
|
-
console.error('media error', e);
|
|
129
|
-
}
|
|
130
|
-
}, {
|
|
131
|
-
key: 'stopRecording',
|
|
132
|
-
value: function stopRecording() {
|
|
133
|
-
this.mediaRecorder.stop();
|
|
134
|
-
this.setState({
|
|
135
|
-
isRecording: false
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
}]);
|
|
139
|
-
|
|
140
|
-
return DesktopRecorder;
|
|
141
|
-
}(_react.Component);
|
|
142
|
-
|
|
143
|
-
exports.default = DesktopRecorder;
|
package/stories/recorder.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
var _react = require('react');
|
|
8
|
-
|
|
9
|
-
var _react2 = _interopRequireDefault(_react);
|
|
10
|
-
|
|
11
|
-
var _player = require('../player');
|
|
12
|
-
|
|
13
|
-
var _player2 = _interopRequireDefault(_player);
|
|
14
|
-
|
|
15
|
-
var _recorder = require('../recorder');
|
|
16
|
-
|
|
17
|
-
var _recorder2 = _interopRequireDefault(_recorder);
|
|
18
|
-
|
|
19
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
|
-
|
|
21
|
-
var RecorderExample = function RecorderExample() {
|
|
22
|
-
return _react2.default.createElement(
|
|
23
|
-
'div',
|
|
24
|
-
null,
|
|
25
|
-
_react2.default.createElement(_recorder2.default, null),
|
|
26
|
-
_react2.default.createElement('audio', { controls: true })
|
|
27
|
-
);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
exports.default = RecorderExample;
|