@webex/internal-plugin-voicea 3.0.0-beta.391 → 3.0.0-beta.392
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/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/voicea.js +55 -50
- package/dist/voicea.js.map +1 -1
- package/dist/voicea.types.js.map +1 -1
- package/package.json +8 -9
- package/src/index.ts +1 -0
- package/src/voicea.ts +32 -11
- package/src/voicea.types.ts +1 -1
- package/test/unit/spec/voicea.js +11 -1
package/dist/index.js
CHANGED
|
@@ -8,6 +8,18 @@ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequ
|
|
|
8
8
|
_Object$defineProperty(exports, "__esModule", {
|
|
9
9
|
value: true
|
|
10
10
|
});
|
|
11
|
+
_Object$defineProperty(exports, "EVENT_TRIGGERS", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function get() {
|
|
14
|
+
return _constants.EVENT_TRIGGERS;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
_Object$defineProperty(exports, "TURN_ON_CAPTION_STATUS", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function get() {
|
|
20
|
+
return _constants.TURN_ON_CAPTION_STATUS;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
11
23
|
_Object$defineProperty(exports, "default", {
|
|
12
24
|
enumerable: true,
|
|
13
25
|
get: function get() {
|
|
@@ -16,6 +28,7 @@ _Object$defineProperty(exports, "default", {
|
|
|
16
28
|
});
|
|
17
29
|
var WebexCore = _interopRequireWildcard(require("@webex/webex-core"));
|
|
18
30
|
var _voicea = _interopRequireDefault(require("./voicea"));
|
|
31
|
+
var _constants = require("./constants");
|
|
19
32
|
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
20
33
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
21
34
|
WebexCore.registerInternalPlugin('voicea', _voicea.default, {});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebexCore","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["WebexCore","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\nexport {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAEA;AAKA;AAAmE;AAAA;AAHnEA,SAAS,CAACC,sBAAsB,CAAC,QAAQ,EAAEC,eAAa,EAAE,CAAC,CAAC,CAAC"}
|
package/dist/voicea.js
CHANGED
|
@@ -86,6 +86,7 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
86
86
|
}, _constants.EVENT_TRIGGERS.NEW_CAPTION, {
|
|
87
87
|
isFinal: true,
|
|
88
88
|
transcriptId: voiceaPayload.transcript_id,
|
|
89
|
+
translations: voiceaPayload.translations,
|
|
89
90
|
transcript: {
|
|
90
91
|
csis: voiceaPayload.csis,
|
|
91
92
|
text: voiceaPayload.transcript.text,
|
|
@@ -190,7 +191,9 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
190
191
|
// @ts-ignore
|
|
191
192
|
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
192
193
|
body: {
|
|
193
|
-
|
|
194
|
+
transcribe: {
|
|
195
|
+
spokenLanguage: languageCode
|
|
196
|
+
}
|
|
194
197
|
}
|
|
195
198
|
}).then(function () {
|
|
196
199
|
_pluginMeetings.TriggerProxy.trigger((0, _assertThisInitialized2.default)(_this), {
|
|
@@ -228,19 +231,24 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
228
231
|
});
|
|
229
232
|
_this.seqNum += 1;
|
|
230
233
|
});
|
|
231
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "requestTurnOnCaptions", function () {
|
|
234
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "requestTurnOnCaptions", function (languageCode) {
|
|
232
235
|
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.SENDING;
|
|
236
|
+
|
|
237
|
+
// only set the spoken language if it is provided
|
|
238
|
+
var body = {
|
|
239
|
+
transcribe: {
|
|
240
|
+
caption: true
|
|
241
|
+
},
|
|
242
|
+
languageCode: languageCode
|
|
243
|
+
};
|
|
244
|
+
|
|
233
245
|
// @ts-ignore
|
|
234
246
|
// eslint-disable-next-line newline-before-return
|
|
235
247
|
return _this.request({
|
|
236
248
|
method: 'PUT',
|
|
237
249
|
// @ts-ignore
|
|
238
250
|
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
239
|
-
body:
|
|
240
|
-
transcribe: {
|
|
241
|
-
caption: true
|
|
242
|
-
}
|
|
243
|
-
}
|
|
251
|
+
body: body
|
|
244
252
|
}).then(function () {
|
|
245
253
|
_pluginMeetings.TriggerProxy.trigger((0, _assertThisInitialized2.default)(_this), {
|
|
246
254
|
file: 'voicea',
|
|
@@ -268,56 +276,53 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
268
276
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isCaptionProcessing", function () {
|
|
269
277
|
return [_constants.TURN_ON_CAPTION_STATUS.SENDING, _constants.TURN_ON_CAPTION_STATUS.ENABLED].includes(_this.captionStatus);
|
|
270
278
|
});
|
|
271
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "turnOnCaptions", /*#__PURE__*/
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
if (!_this.isCaptionProcessing()) {
|
|
276
|
-
_context.next = 2;
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
return _context.abrupt("return", undefined);
|
|
280
|
-
case 2:
|
|
281
|
-
if (_this.webex.internal.llm.isConnected()) {
|
|
282
|
-
_context.next = 4;
|
|
283
|
-
break;
|
|
284
|
-
}
|
|
285
|
-
throw new Error('can not turn on captions before llm connected');
|
|
286
|
-
case 4:
|
|
287
|
-
return _context.abrupt("return", _this.requestTurnOnCaptions());
|
|
288
|
-
case 5:
|
|
289
|
-
case "end":
|
|
290
|
-
return _context.stop();
|
|
291
|
-
}
|
|
292
|
-
}, _callee);
|
|
293
|
-
})));
|
|
294
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleTranscribing", /*#__PURE__*/function () {
|
|
295
|
-
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(activate) {
|
|
296
|
-
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
297
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
279
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "turnOnCaptions", /*#__PURE__*/function () {
|
|
280
|
+
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(spokenLanguage) {
|
|
281
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
282
|
+
while (1) switch (_context.prev = _context.next) {
|
|
298
283
|
case 0:
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
284
|
+
if (!_this.isCaptionProcessing()) {
|
|
285
|
+
_context.next = 2;
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
return _context.abrupt("return", undefined);
|
|
289
|
+
case 2:
|
|
290
|
+
if (_this.webex.internal.llm.isConnected()) {
|
|
291
|
+
_context.next = 4;
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
throw new Error('can not turn on captions before llm connected');
|
|
295
|
+
case 4:
|
|
296
|
+
return _context.abrupt("return", _this.requestTurnOnCaptions(spokenLanguage));
|
|
297
|
+
case 5:
|
|
312
298
|
case "end":
|
|
313
|
-
return
|
|
299
|
+
return _context.stop();
|
|
314
300
|
}
|
|
315
|
-
},
|
|
301
|
+
}, _callee);
|
|
316
302
|
}));
|
|
317
303
|
return function (_x) {
|
|
318
|
-
return
|
|
304
|
+
return _ref.apply(this, arguments);
|
|
319
305
|
};
|
|
320
306
|
}());
|
|
307
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleTranscribing", function (activate, spokenLanguage) {
|
|
308
|
+
// @ts-ignore
|
|
309
|
+
return _this.request({
|
|
310
|
+
method: 'PUT',
|
|
311
|
+
// @ts-ignore
|
|
312
|
+
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
313
|
+
body: {
|
|
314
|
+
transcribe: {
|
|
315
|
+
transcribing: activate
|
|
316
|
+
},
|
|
317
|
+
spokenLanguage: spokenLanguage
|
|
318
|
+
}
|
|
319
|
+
}).then(function () {
|
|
320
|
+
if (activate && !_this.areCaptionsEnabled) {
|
|
321
|
+
return _this.turnOnCaptions(spokenLanguage);
|
|
322
|
+
}
|
|
323
|
+
return undefined;
|
|
324
|
+
});
|
|
325
|
+
});
|
|
321
326
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getCaptionStatus", function () {
|
|
322
327
|
return _this.captionStatus;
|
|
323
328
|
});
|
package/dist/voicea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VoiceaChannel","args","VOICEA","e","seqNum","sequenceNumber","data","relayType","VOICEA_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","type","TRANSCRIPTION_TYPE","TRANSCRIPT_INTERIM_RESULTS","Trigger","trigger","file","function","EVENT_TRIGGERS","NEW_CAPTION","isFinal","transcriptId","transcript_id","transcripts","TRANSCRIPT_FINAL_RESULT","transcript","csis","text","transcriptLanguageCode","transcript_language_code","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","highlight","highlightId","highlight_id","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","JOINING","listenToEvents","webex","internal","llm","socket","send","id","recipients","route","getBinding","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","then","SPOKEN_LANGUAGE_UPDATE","isConnected","to","translationLanguage","TRANSLATION_REQUEST","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","transcribe","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","catch","IDLE","Error","includes","isAnnounceProcessing","sendAnnouncement","isCaptionProcessing","undefined","requestTurnOnCaptions","activate","transcribing","turnOnCaptions","hasSubscribedToEvents","on","eventProcessor","off","WebexPlugin"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {TriggerProxy as Trigger} from '@webex/plugin-meetings';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n VOICEA_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private vmcDeviceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case VOICEA_RELAY_TYPES.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n default:\n break;\n }\n };\n\n /**\n * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcript: {\n csis: voiceaPayload.csis,\n text: voiceaPayload.transcript.text,\n transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code,\n },\n timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.HIGHLIGHT_CREATED,\n {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: false,\n text: voiceaPayload.command_response,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n }\n );\n break;\n\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: 200}\n );\n } else {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: voiceaPayload.errorCode, errorMessage: voiceaPayload.message}\n );\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n };\n\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processAnnouncementMessage',\n },\n EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT,\n voiceaLanguageOptions\n );\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n this.announceStatus = ANNOUNCE_STATUS.JOINING;\n this.listenToEvents();\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @returns {Promise}\n */\n public setSpokenLanguage = (languageCode: string): Promise<void> =>\n // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n languageCode,\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'setSpokenLanguage',\n },\n EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE,\n {languageCode}\n );\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) return;\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {\n to: this.vmcDeviceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * request turn on Captions\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {caption: true},\n },\n })\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'turnOnCaptions',\n },\n EVENT_TRIGGERS.CAPTIONS_TURNED_ON\n );\n this.areCaptionsEnabled = true;\n this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;\n this.announce();\n })\n .catch(() => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n throw new Error('turn on captions fail');\n });\n };\n\n /**\n * is announce processing\n * @returns {boolean}\n */\n private isAnnounceProcessing = () =>\n [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessing()) return;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('voicea can not announce before llm connected');\n }\n this.sendAnnouncement();\n };\n\n /**\n * is turn on caption processing\n * @returns {boolean}\n */\n private isCaptionProcessing = () =>\n [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);\n\n /**\n * Turn on Captions\n * @returns {Promise}\n */\n public turnOnCaptions = async (): undefined | Promise<void> => {\n if (this.isCaptionProcessing()) return undefined;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('can not turn on captions before llm connected');\n }\n\n return this.requestTurnOnCaptions();\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {bool} activate if true transcribing is turned on\n * @returns {Promise}\n */\n public toggleTranscribing = async (activate: boolean): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {transcribing: activate},\n },\n }).then(() => {\n if (activate && !this.areCaptionsEnabled) this.turnOnCaptions();\n });\n };\n\n /**\n * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["VoiceaChannel","args","VOICEA","e","seqNum","sequenceNumber","data","relayType","VOICEA_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","type","TRANSCRIPTION_TYPE","TRANSCRIPT_INTERIM_RESULTS","Trigger","trigger","file","function","EVENT_TRIGGERS","NEW_CAPTION","isFinal","transcriptId","transcript_id","transcripts","TRANSCRIPT_FINAL_RESULT","translations","transcript","csis","text","transcriptLanguageCode","transcript_language_code","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","highlight","highlightId","highlight_id","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","JOINING","listenToEvents","webex","internal","llm","socket","send","id","recipients","route","getBinding","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isConnected","to","translationLanguage","TRANSLATION_REQUEST","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","catch","IDLE","Error","includes","isAnnounceProcessing","sendAnnouncement","isCaptionProcessing","undefined","requestTurnOnCaptions","activate","transcribing","turnOnCaptions","hasSubscribedToEvents","on","eventProcessor","off","WebexPlugin"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {TriggerProxy as Trigger} from '@webex/plugin-meetings';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n VOICEA_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private vmcDeviceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case VOICEA_RELAY_TYPES.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n default:\n break;\n }\n };\n\n /**\n * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n translations: voiceaPayload.translations,\n transcript: {\n csis: voiceaPayload.csis,\n text: voiceaPayload.transcript.text,\n transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code,\n },\n timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.HIGHLIGHT_CREATED,\n {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: false,\n text: voiceaPayload.command_response,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n }\n );\n break;\n\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: 200}\n );\n } else {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: voiceaPayload.errorCode, errorMessage: voiceaPayload.message}\n );\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n };\n\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processAnnouncementMessage',\n },\n EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT,\n voiceaLanguageOptions\n );\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n this.announceStatus = ANNOUNCE_STATUS.JOINING;\n this.listenToEvents();\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @returns {Promise}\n */\n public setSpokenLanguage = (languageCode: string): Promise<void> =>\n // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n spokenLanguage: languageCode,\n },\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'setSpokenLanguage',\n },\n EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE,\n {languageCode}\n );\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) return;\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {\n to: this.vmcDeviceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * request turn on Captions\n * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n\n // only set the spoken language if it is provided\n const body = {\n transcribe: {caption: true},\n languageCode,\n };\n\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body,\n })\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'turnOnCaptions',\n },\n EVENT_TRIGGERS.CAPTIONS_TURNED_ON\n );\n this.areCaptionsEnabled = true;\n this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;\n this.announce();\n })\n .catch(() => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n throw new Error('turn on captions fail');\n });\n };\n\n /**\n * is announce processing\n * @returns {boolean}\n */\n private isAnnounceProcessing = () =>\n [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessing()) return;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('voicea can not announce before llm connected');\n }\n this.sendAnnouncement();\n };\n\n /**\n * is turn on caption processing\n * @returns {boolean}\n */\n private isCaptionProcessing = () =>\n [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);\n\n /**\n * Turn on Captions\n * @param {string} [spokenLanguage] - Optional Spoken language code\n * @returns {Promise}\n */\n public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {\n if (this.isCaptionProcessing()) return undefined;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('can not turn on captions before llm connected');\n }\n\n return this.requestTurnOnCaptions(spokenLanguage);\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {bool} activate if true transcribing is turned on\n * @param {string} spokenLanguage language code for spoken language\n * @returns {Promise}\n */\n public toggleTranscribing = (\n activate: boolean,\n spokenLanguage?: string\n ): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n transcribing: activate,\n },\n spokenLanguage,\n },\n }).then((): undefined | Promise<void> => {\n if (activate && !this.areCaptionsEnabled) {\n return this.turnOnCaptions(spokenLanguage);\n }\n\n return undefined;\n });\n };\n\n /**\n * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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"}
|
package/dist/voicea.types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["voicea.types.ts"],"sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable no-undef */\n\n/**\n * Type for payload\n */\ninterface AnnouncementPayload {\n translation: {\n max_languages: number;\n allowed_languages: string[];\n };\n\n ASR: {\n spoken_languages: string[];\n };\n}\n\n// eslint-disable-next-line no-undef\ntype TRANSCRIPTION_TYPES =\n | 'unknown'\n | 'eva_wake'\n | 'eva_thanks'\n | 'eva_cancel'\n | 'highlight_created'\n | 'transcript_interim_results'\n | 'transcript_final_result';\n\n/**\n * Class for an Transcription Object\n */\ninterface Transcription {\n start_millis: number;\n end_millis: number;\n text: string;\n transcript_language_code: string;\n translations: {[x: string]: string};\n csis: number[];\n last_packet_timestamp_ms: number;\n}\n\n/**\n * Highlights\n */\ninterface Highlight {\n highlight_id: string;\n transcript: string;\n highlight_label: string;\n highlight_source: string;\n start_millis: number;\n end_millis: number;\n csis: number[];\n}\n/**\n * Type for Transcription message\n */\ninterface TranscriptionResponse {\n type: TRANSCRIPTION_TYPES;\n transcript_id: string;\n translations?: {[x: string]: string};\n transcripts?: Transcription[];\n transcript?: Transcription;\n highlight?: Highlight;\n csis: number[];\n data: string;\n command_response: string;\n}\n/**\n * Type for CaptionLanguageResponse\n */\ninterface CaptionLanguageResponse {\n requestId: string;\n statusCode: number;\n errorCode: number;\n message: string;\n}\n\ninterface IVoiceaChannel {\n setSpokenLanguage: (languageCode: string) => Promise<void>;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean) => undefined | Promise<void>;\n deregisterEvents: () => void;\n}\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["voicea.types.ts"],"sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable no-undef */\n\n/**\n * Type for payload\n */\ninterface AnnouncementPayload {\n translation: {\n max_languages: number;\n allowed_languages: string[];\n };\n\n ASR: {\n spoken_languages: string[];\n };\n}\n\n// eslint-disable-next-line no-undef\ntype TRANSCRIPTION_TYPES =\n | 'unknown'\n | 'eva_wake'\n | 'eva_thanks'\n | 'eva_cancel'\n | 'highlight_created'\n | 'transcript_interim_results'\n | 'transcript_final_result';\n\n/**\n * Class for an Transcription Object\n */\ninterface Transcription {\n start_millis: number;\n end_millis: number;\n text: string;\n transcript_language_code: string;\n translations: {[x: string]: string};\n csis: number[];\n last_packet_timestamp_ms: number;\n}\n\n/**\n * Highlights\n */\ninterface Highlight {\n highlight_id: string;\n transcript: string;\n highlight_label: string;\n highlight_source: string;\n start_millis: number;\n end_millis: number;\n csis: number[];\n}\n/**\n * Type for Transcription message\n */\ninterface TranscriptionResponse {\n type: TRANSCRIPTION_TYPES;\n transcript_id: string;\n translations?: {[x: string]: string};\n transcripts?: Transcription[];\n transcript?: Transcription;\n highlight?: Highlight;\n csis: number[];\n data: string;\n command_response: string;\n}\n/**\n * Type for CaptionLanguageResponse\n */\ninterface CaptionLanguageResponse {\n requestId: string;\n statusCode: number;\n errorCode: number;\n message: string;\n}\n\ninterface IVoiceaChannel {\n setSpokenLanguage: (languageCode: string) => Promise<void>;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;\n deregisterEvents: () => void;\n}\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\n"],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-plugin-voicea",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.392",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,11 +14,10 @@
|
|
|
14
14
|
"node": ">=16"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
18
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
19
|
-
"@webex/
|
|
20
|
-
"@webex/
|
|
21
|
-
"@webex/webex-core": "3.0.0-beta.391",
|
|
17
|
+
"@webex/internal-plugin-llm": "3.0.0-beta.392",
|
|
18
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.392",
|
|
19
|
+
"@webex/plugin-meetings": "3.0.0-beta.392",
|
|
20
|
+
"@webex/webex-core": "3.0.0-beta.392",
|
|
22
21
|
"uuid": "^3.3.2"
|
|
23
22
|
},
|
|
24
23
|
"browserify": {
|
|
@@ -28,9 +27,9 @@
|
|
|
28
27
|
]
|
|
29
28
|
},
|
|
30
29
|
"devDependencies": {
|
|
31
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
32
|
-
"@webex/test-helper-mock-web-socket": "3.0.0-beta.
|
|
33
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
30
|
+
"@webex/test-helper-chai": "3.0.0-beta.392",
|
|
31
|
+
"@webex/test-helper-mock-web-socket": "3.0.0-beta.392",
|
|
32
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.392",
|
|
34
33
|
"sinon": "^9.2.4"
|
|
35
34
|
}
|
|
36
35
|
}
|
package/src/index.ts
CHANGED
package/src/voicea.ts
CHANGED
|
@@ -136,6 +136,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
136
136
|
{
|
|
137
137
|
isFinal: true,
|
|
138
138
|
transcriptId: voiceaPayload.transcript_id,
|
|
139
|
+
translations: voiceaPayload.translations,
|
|
139
140
|
transcript: {
|
|
140
141
|
csis: voiceaPayload.csis,
|
|
141
142
|
text: voiceaPayload.transcript.text,
|
|
@@ -292,7 +293,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
292
293
|
// @ts-ignore
|
|
293
294
|
url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
|
|
294
295
|
body: {
|
|
295
|
-
|
|
296
|
+
transcribe: {
|
|
297
|
+
spokenLanguage: languageCode,
|
|
298
|
+
},
|
|
296
299
|
},
|
|
297
300
|
}).then(() => {
|
|
298
301
|
Trigger.trigger(
|
|
@@ -340,19 +343,25 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
340
343
|
|
|
341
344
|
/**
|
|
342
345
|
* request turn on Captions
|
|
346
|
+
* @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
|
|
343
347
|
* @returns {Promise}
|
|
344
348
|
*/
|
|
345
|
-
private requestTurnOnCaptions = (): undefined | Promise<void> => {
|
|
349
|
+
private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {
|
|
346
350
|
this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;
|
|
351
|
+
|
|
352
|
+
// only set the spoken language if it is provided
|
|
353
|
+
const body = {
|
|
354
|
+
transcribe: {caption: true},
|
|
355
|
+
languageCode,
|
|
356
|
+
};
|
|
357
|
+
|
|
347
358
|
// @ts-ignore
|
|
348
359
|
// eslint-disable-next-line newline-before-return
|
|
349
360
|
return this.request({
|
|
350
361
|
method: 'PUT',
|
|
351
362
|
// @ts-ignore
|
|
352
363
|
url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
|
|
353
|
-
body
|
|
354
|
-
transcribe: {caption: true},
|
|
355
|
-
},
|
|
364
|
+
body,
|
|
356
365
|
})
|
|
357
366
|
.then(() => {
|
|
358
367
|
Trigger.trigger(
|
|
@@ -402,34 +411,46 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
402
411
|
|
|
403
412
|
/**
|
|
404
413
|
* Turn on Captions
|
|
414
|
+
* @param {string} [spokenLanguage] - Optional Spoken language code
|
|
405
415
|
* @returns {Promise}
|
|
406
416
|
*/
|
|
407
|
-
public turnOnCaptions = async (): undefined | Promise<void> => {
|
|
417
|
+
public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {
|
|
408
418
|
if (this.isCaptionProcessing()) return undefined;
|
|
409
419
|
// @ts-ignore
|
|
410
420
|
if (!this.webex.internal.llm.isConnected()) {
|
|
411
421
|
throw new Error('can not turn on captions before llm connected');
|
|
412
422
|
}
|
|
413
423
|
|
|
414
|
-
return this.requestTurnOnCaptions();
|
|
424
|
+
return this.requestTurnOnCaptions(spokenLanguage);
|
|
415
425
|
};
|
|
416
426
|
|
|
417
427
|
/**
|
|
418
428
|
* Toggle transcribing for highlights
|
|
419
429
|
* @param {bool} activate if true transcribing is turned on
|
|
430
|
+
* @param {string} spokenLanguage language code for spoken language
|
|
420
431
|
* @returns {Promise}
|
|
421
432
|
*/
|
|
422
|
-
public toggleTranscribing =
|
|
433
|
+
public toggleTranscribing = (
|
|
434
|
+
activate: boolean,
|
|
435
|
+
spokenLanguage?: string
|
|
436
|
+
): undefined | Promise<void> => {
|
|
423
437
|
// @ts-ignore
|
|
424
438
|
return this.request({
|
|
425
439
|
method: 'PUT',
|
|
426
440
|
// @ts-ignore
|
|
427
441
|
url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
|
|
428
442
|
body: {
|
|
429
|
-
transcribe: {
|
|
443
|
+
transcribe: {
|
|
444
|
+
transcribing: activate,
|
|
445
|
+
},
|
|
446
|
+
spokenLanguage,
|
|
430
447
|
},
|
|
431
|
-
}).then(() => {
|
|
432
|
-
if (activate && !this.areCaptionsEnabled)
|
|
448
|
+
}).then((): undefined | Promise<void> => {
|
|
449
|
+
if (activate && !this.areCaptionsEnabled) {
|
|
450
|
+
return this.turnOnCaptions(spokenLanguage);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
return undefined;
|
|
433
454
|
});
|
|
434
455
|
};
|
|
435
456
|
|
package/src/voicea.types.ts
CHANGED
|
@@ -78,7 +78,7 @@ interface IVoiceaChannel {
|
|
|
78
78
|
setSpokenLanguage: (languageCode: string) => Promise<void>;
|
|
79
79
|
requestLanguage: (languageCode: string) => void;
|
|
80
80
|
turnOnCaptions: () => undefined | Promise<void>;
|
|
81
|
-
toggleTranscribing: (activate: boolean) => undefined | Promise<void>;
|
|
81
|
+
toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
|
|
82
82
|
deregisterEvents: () => void;
|
|
83
83
|
}
|
|
84
84
|
|
package/test/unit/spec/voicea.js
CHANGED
|
@@ -202,7 +202,11 @@ describe('plugin-voicea', () => {
|
|
|
202
202
|
sinon.match({
|
|
203
203
|
method: 'PUT',
|
|
204
204
|
url: `${locusUrl}/controls/`,
|
|
205
|
-
body: {
|
|
205
|
+
body: {
|
|
206
|
+
transcribe: {
|
|
207
|
+
spokenLanguage: languageCode
|
|
208
|
+
}
|
|
209
|
+
},
|
|
206
210
|
})
|
|
207
211
|
);
|
|
208
212
|
});
|
|
@@ -547,6 +551,9 @@ describe('plugin-voicea', () => {
|
|
|
547
551
|
transcript_id: '3ec73890-bffb-f28b-e77f-99dc13caea7e',
|
|
548
552
|
ts: 1611653204.3147924,
|
|
549
553
|
type: 'transcript_final_result',
|
|
554
|
+
translations: {
|
|
555
|
+
en: "Hello?",
|
|
556
|
+
},
|
|
550
557
|
transcript: {
|
|
551
558
|
alignments: [
|
|
552
559
|
{
|
|
@@ -596,6 +603,9 @@ describe('plugin-voicea', () => {
|
|
|
596
603
|
assert.calledOnceWithExactly(triggerSpy, {
|
|
597
604
|
isFinal: true,
|
|
598
605
|
transcriptId: '3ec73890-bffb-f28b-e77f-99dc13caea7e',
|
|
606
|
+
translations: {
|
|
607
|
+
en: "Hello?"
|
|
608
|
+
},
|
|
599
609
|
transcript: {
|
|
600
610
|
csis: [3556942592],
|
|
601
611
|
text: 'Hello?',
|