-
Notifications
You must be signed in to change notification settings - Fork 0
/
ins8ai_mobile.js
121 lines (100 loc) · 3.94 KB
/
ins8ai_mobile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// define ins8.ai api token and websocket endpoint
var api_token = ""
var webSocketUri = "wss://stt.ins8.ai/api/v1/stt/websocket/recognize?api_token=" + api_token;
// update transcription display
var transcribed_text = document.getElementById('transcription');
function on_transcription(text) {
if (text.trim().length > 3){
transcribed_text.textContent += text + "\n";
transcribed_text.scrollTop = transcribed_text.scrollHeight;
}
}
// initialise microphone
function capturemicrophone(callback) {
navigator.mediaDevices.getUserMedia({ audio: true }).then(function(microphone) {
callback(microphone);
}).catch(function(error) {
alert('Unable to capture your microphone. Please check console logs.');
console.error(error);
});
}
// stop recording
function stopRecordingCallback() {
recorder.microphone.stop();
recorder = null;
}
var recorder;
var ws;
function startWebsocket(){
if (ws == null){
ws = new WebSocket(webSocketUri);
// log websocket connection errors
ws.addEventListener('error', function (event) {
console.log('WebSocket error: ', event);
});
// log connection opening of connection
// send ins8.ai required parameters for the live connection
ws.addEventListener('open', function (event) {
console.log('WebSocket connection opened');
ws.send(JSON.stringify({encoding: 'raw', sample_rate_hertz: 16000, stop_string: 'EOS'}));
});
// process transcriptions sent by ins8.ai
ws.addEventListener('message', function (event) {
console.log('Websocket message rec.: ', event.data);
on_transcription(event.data);
});
}
}
// start recording
document.getElementById('btn-start-recording').onclick = function() {
this.disabled = true;
capturemicrophone(function(microphone) {
recorder = RecordRTC(microphone.clone(), {
recorderType: StereoAudioRecorder,
mimeType: 'audio/wave',
numberOfAudioChannels: 1,
desiredSampRate: 16000,
type: 'audio',
timeSlice: 0, // real time
ondataavailable: function(blob) {
// start the websocket connection only after mic setup is done and we are ready to send data
startWebsocket();
// reader to transform blob wav data bytes to int16 pcm audio bytes
// send data via websocket
var reader = new FileReader();
reader.onloadend = function() {
// Create a Int16Array view on the ArrayBuffer
// .slice(44) to remove first 44 bytes which are wav format related headers
var arrayBuffer = reader.result.slice(44);
var view = new DataView(arrayBuffer);
var int16Array = new Int16Array(arrayBuffer);
if (ws && ws.readyState === WebSocket.OPEN) { ws.send(int16Array); } else {
console.log("websocket is not ready to send data");
}
};
reader.readAsArrayBuffer(blob);
}
});
// start recording
recorder.startRecording();
// release microphone on stopRecording
recorder.microphone = microphone;
// enable the stop recording button
document.getElementById('btn-stop-recording').disabled = false;
});
};
document.getElementById('btn-stop-recording').onclick = function() {
this.disabled = true;
recorder.stopRecording(stopRecordingCallback);
var stop_string = "EOS"
var str_bytes = new Uint8Array(stop_string.length);
for (var i = 0; i < stop_string.length; i++) {
str_bytes[i] = stop_string.charCodeAt(i);
}
// close websocket connection
if(ws) {
ws.send(str_bytes);
ws.close();
ws = null;
}
};