Skip to content
This repository was archived by the owner on Oct 1, 2020. It is now read-only.

Commit 3ae9198

Browse files
committed
add inputSampleRate param for variable input sample rate greater than 44100
1 parent acc1870 commit 3ae9198

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

lib/audioUtils.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
const inputSampleRate = 44100;
2-
31
export function pcmEncode(input) {
42
var offset = 0;
53
var buffer = new ArrayBuffer(input.length * 2);
@@ -11,7 +9,8 @@ export function pcmEncode(input) {
119
return buffer;
1210
}
1311

14-
export function downsampleBuffer(buffer, outputSampleRate = 16000) {
12+
export function downsampleBuffer(buffer, inputSampleRate = 44100, outputSampleRate = 16000) {
13+
1514
if (outputSampleRate === inputSampleRate) {
1615
return buffer;
1716
}
@@ -21,17 +20,25 @@ export function downsampleBuffer(buffer, outputSampleRate = 16000) {
2120
var result = new Float32Array(newLength);
2221
var offsetResult = 0;
2322
var offsetBuffer = 0;
23+
2424
while (offsetResult < result.length) {
25+
2526
var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
27+
2628
var accum = 0,
2729
count = 0;
28-
for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
30+
31+
for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++ ) {
2932
accum += buffer[i];
3033
count++;
3134
}
35+
3236
result[offsetResult] = accum / count;
3337
offsetResult++;
3438
offsetBuffer = nextOffsetBuffer;
35-
}
36-
return result;
39+
40+
}
41+
42+
return result;
43+
3744
}

lib/main.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const eventStreamMarshaller = new marshaller.EventStreamMarshaller(util_utf8_nod
1212
let languageCode;
1313
let region;
1414
let sampleRate;
15+
let inputSampleRate;
1516
let transcription = "";
1617
let socket;
1718
let micStream;
@@ -51,6 +52,11 @@ $('#start-button').click(function () {
5152
let streamAudioToWebSocket = function (userMediaStream) {
5253
//let's get the mic input from the browser, via the microphone-stream module
5354
micStream = new mic();
55+
56+
micStream.on("format", function(data) {
57+
inputSampleRate = data.sampleRate;
58+
});
59+
5460
micStream.setStream(userMediaStream);
5561

5662
// Pre-signed URLs are a way to authenticate a request (or WebSocket connection, in this case)
@@ -61,6 +67,8 @@ let streamAudioToWebSocket = function (userMediaStream) {
6167
socket = new WebSocket(url);
6268
socket.binaryType = "arraybuffer";
6369

70+
let sampleRate = 0;
71+
6472
// when we get audio data from the mic, send it to the WebSocket if possible
6573
socket.onopen = function() {
6674
micStream.on('data', function(rawAudioChunk) {
@@ -185,7 +193,7 @@ function convertAudioToBinaryMessage(audioChunk) {
185193
return;
186194

187195
// downsample and convert the raw audio bytes to PCM
188-
let downsampledBuffer = audioUtils.downsampleBuffer(raw, sampleRate);
196+
let downsampledBuffer = audioUtils.downsampleBuffer(raw, inputSampleRate, sampleRate);
189197
let pcmEncodedBuffer = audioUtils.pcmEncode(downsampledBuffer);
190198

191199
// add the right JSON headers and structure to the message

0 commit comments

Comments
 (0)