sofya.transcription
Version:
a JavaScript library that provides a robust and flexible solution for real-time audio transcription. It is designed to transcribe audio streams and can be easily integrated into web applications.
268 lines • 12.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AIServiceSpeechRealtimeApi = exports.RealtimeWebSocketState = void 0;
//@ts-nocheck
var speech_audio_streamer_1 = __importDefault(require("./speech-audio-streamer"));
var ai_speech_api_client_1 = require("./ai-speech-api-client");
var RealtimeWebSocketState;
(function (RealtimeWebSocketState) {
RealtimeWebSocketState[RealtimeWebSocketState["STOPPED"] = 0] = "STOPPED";
RealtimeWebSocketState[RealtimeWebSocketState["RUNNING"] = 1] = "RUNNING";
RealtimeWebSocketState[RealtimeWebSocketState["OPENING"] = 2] = "OPENING";
RealtimeWebSocketState[RealtimeWebSocketState["AUTHENTICATING"] = 3] = "AUTHENTICATING";
RealtimeWebSocketState[RealtimeWebSocketState["ERROR"] = 4] = "ERROR";
})(RealtimeWebSocketState || (exports.RealtimeWebSocketState = RealtimeWebSocketState = {}));
var AIServiceSpeechRealtimeApi = /** @class */ (function () {
function AIServiceSpeechRealtimeApi(realtimeClientListener, token, compartmentId, mediaStream, realtimeEndpoint, realtimeParameters) {
var _this = this;
this.realtimeParameters = {
isAckEnabled: false,
shortPauseInMs: 0,
longPauseInMs: 1000,
stabilizePartialResults: ai_speech_api_client_1.RealtimeParametersStabilizePartialResultsEnum.MEDIUM,
shouldIgnoreInvalidCustomizations: false,
languageCode: "en-US",
modelDomain: ai_speech_api_client_1.RealtimeParametersModelDomainEnum.GENERIC,
};
this.onWebsocketOpen = function (event) {
_this.realtimeClientListener.onConnect(event);
_this.setWebSocketState(RealtimeWebSocketState.AUTHENTICATING);
try {
if (_this.realtimeAuthPayload !== null)
_this.realtimeWebSocketClient.send(JSON.stringify(_this.realtimeAuthPayload));
else {
_this.realtimeWebSocketClient.close();
_this.setWebSocketState(RealtimeWebSocketState.STOPPED);
}
}
catch (error) {
try {
_this.realtimeWebSocketClient.close();
}
catch (err) {
_this.onWebsocketError(err);
}
_this.setWebSocketState(RealtimeWebSocketState.STOPPED);
}
};
this.onWebsocketClose = function (close) {
_this.close();
_this.setWebSocketState(RealtimeWebSocketState.STOPPED);
_this.realtimeClientListener.onClose(close);
};
this.onWebsocketMessage = function (message) {
if (message.data) {
var data = JSON.parse(message.data.toString());
var realtimeMessageEvent = data.event;
if (realtimeMessageEvent === "ACKAUDIO") {
_this.realtimeClientListener.onAckAudio(data);
}
else if (realtimeMessageEvent === "CONNECT") {
//this.setWebSocketState(RealtimeWebSocketState.RUNNING);
_this.initAudio(_this.mediaStream);
// this.realtimeClientListener.onConnectMessage(data as any as RealtimeMessageConnect);
}
else if (realtimeMessageEvent === "RESULT") {
_this.realtimeClientListener.onResult(data);
}
else if (realtimeMessageEvent === "ERROR") {
var errorMessage = data.code + ": " + data.message;
_this.onWebsocketError(new Error(errorMessage));
}
}
};
this.onWebsocketError = function (error) {
console.error(error);
_this.setWebSocketState(RealtimeWebSocketState.ERROR);
_this.realtimeClientListener.onError(error);
};
// private onWebsocketMessage = (message: MessageEvent) => {
// if (message.data) {
// this.onMessageCallback("MESSAGE", message);
// }
// };
// private initAudio = () => {
// try {
// if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
// navigator.mediaDevices
// .getUserMedia({ audio: true })
// .then((stream) => {
// this.mediaStream = stream;
// this.audioStreamer = new AudioStreamer(this.mediaStream, {
// mimeType: "audio/wav",
// bitRate: 256000,
// sampleRate: 16000,
// bufferSize: 1024,
// callBack: (data: Blob) => {
// data.arrayBuffer().then((arrayBuffer) => {
// if (this.realtimeWebSocketClient.readyState !== WebSocket.CLOSED && this.realtimeWebSocketClient.readyState !== WebSocket.CLOSING) {
// setTimeout(() => this.realtimeWebSocketClient.send(arrayBuffer), 1);
// }
// });
// },
// });
// if (this.audioStreamer.startRecording()) this.setWebSocketState(RealtimeWebSocketState.RUNNING);
// else this.setWebSocketState(RealtimeWebSocketState.ERROR);
// })
// .catch((err) => {
// this.onWebsocketError(err);
// });
// } else {
// throw new Error("getUserMedia not supported on your browser.");
// }
// } catch (err) {
// this.onWebsocketError(err);
// try {
// this.close();
// } catch (error) {
// this.onWebsocketError(error);
// this.close();
// }
// this.setWebSocketState(RealtimeWebSocketState.ERROR);
// }
// };
this.initAudio = function (stream) {
try {
_this.mediaStream = stream;
_this.audioStreamer = new speech_audio_streamer_1.default(_this.mediaStream, {
mimeType: "audio/wav",
bitRate: 256000,
sampleRate: 16000,
bufferSize: 1024,
callBack: function (data) {
data.arrayBuffer().then(function (arrayBuffer) {
if (_this.realtimeWebSocketClient.readyState !== WebSocket.CLOSED && _this.realtimeWebSocketClient.readyState !== WebSocket.CLOSING) {
setTimeout(function () { return _this.realtimeWebSocketClient.send(arrayBuffer); }, 1);
}
});
},
});
if (_this.audioStreamer.startRecording())
_this.setWebSocketState(RealtimeWebSocketState.RUNNING);
else
_this.setWebSocketState(RealtimeWebSocketState.ERROR);
}
catch (err) {
_this.onWebsocketError(err);
try {
_this.close();
}
catch (error) {
_this.onWebsocketError(error);
_this.close();
}
_this.setWebSocketState(RealtimeWebSocketState.ERROR);
}
};
this.parseParameters = function (params) {
var parameterString = "?";
if (params.isAckEnabled !== undefined)
parameterString += "isAckEnabled=" + params.isAckEnabled + "&";
if (params.partialSilenceThresholdInMs !== undefined)
parameterString += "partialSilenceThresholdInMs=" + params.partialSilenceThresholdInMs + "&";
if (params.finalSilenceThresholdInMs !== undefined)
parameterString += "finalSilenceThresholdInMs=" + params.finalSilenceThresholdInMs + "&";
if (params.languageCode !== undefined)
parameterString += "languageCode=" + params.languageCode + "&";
if (params.modelDomain !== undefined)
parameterString += "modelDomain=" + params.modelDomain + "&";
if (params.stabilizePartialResults !== undefined)
parameterString += "stabilizePartialResults=" + params.stabilizePartialResults + "&";
if (params.shouldIgnoreInvalidCustomizations !== undefined)
parameterString += "shouldIgnoreInvalidCustomizations=" + params.shouldIgnoreInvalidCustomizations + "&";
if (params.customizations !== undefined && params.customizations.length > 0) {
parameterString += "customizations=" + encodeURIComponent(JSON.stringify(params.customizations));
}
return parameterString;
};
this.createAuthenticationPayload = function (authType) {
var payload = {
authenticationType: authType,
compartmentId: _this.compartmentId,
token: _this.token,
};
_this.realtimeAuthPayload = payload;
};
this.connect = function () {
try {
_this.realtimeWebSocketClient = new WebSocket(_this.realtimeEndpoint + _this.parseParameters(_this.realtimeParameters));
_this.realtimeWebSocketClient.onopen = function (open) { return _this.onWebsocketOpen(open); };
_this.realtimeWebSocketClient.onmessage = function (message) { return _this.onWebsocketMessage(message); };
_this.realtimeWebSocketClient.onclose = function (close) { return _this.onWebsocketClose(close); };
_this.realtimeWebSocketClient.onerror = function (event) { return _this.onWebsocketError(new Error("".concat(event.type, ": ").concat(event.message))); };
_this.setWebSocketState(RealtimeWebSocketState.OPENING);
_this.createAuthenticationPayload("TOKEN");
}
catch (err) {
_this.onWebsocketError(err);
_this.close();
}
};
this.close = function () {
try {
if (_this.audioStreamer) {
_this.audioStreamer.stopRecording(function () {
if (_this.mediaStream) {
_this.mediaStream.getTracks().forEach(function (track) { return track.stop(); });
}
});
}
}
catch (err) {
_this.onWebsocketError(err);
}
try {
_this.realtimeWebSocketClient.close();
}
catch (err) {
_this.onWebsocketError(err);
}
};
this.pause = function () {
try {
if (_this.audioStreamer) {
_this.audioStreamer.pauseRecording();
}
}
catch (err) {
console.error("Unable to pause transcription", err);
}
};
this.resume = function () {
try {
if (_this.audioStreamer) {
_this.audioStreamer.resumeRecording();
}
}
catch (err) {
console.error("Unable to resume transcription", err);
}
};
this.getWebSocketState = function () {
return _this.realtimeWebSocketState;
};
this.setWebSocketState = function (state) {
_this.realtimeWebSocketState = state;
};
this.requestFinalResult = function () {
var requestMessage = {
event: ai_speech_api_client_1.RealtimeMessageOutEventEnum.SEND_FINAL_RESULT,
};
_this.realtimeWebSocketClient.send(JSON.stringify(requestMessage));
};
this.realtimeClientListener = realtimeClientListener;
this.token = token;
this.compartmentId = compartmentId;
this.mediaStream = mediaStream;
if (realtimeParameters)
this.realtimeParameters = realtimeParameters;
if (realtimeEndpoint)
this.realtimeEndpoint = realtimeEndpoint;
}
return AIServiceSpeechRealtimeApi;
}());
exports.AIServiceSpeechRealtimeApi = AIServiceSpeechRealtimeApi;
//# sourceMappingURL=ai-speech-realtime-web-client.js.map