UNPKG

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
"use strict"; 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