@webex/internal-plugin-voicea 2.60.0-next.9 → 2.60.1
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/constants.js +9 -15
- package/dist/constants.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/utils.js +2 -1
- package/dist/utils.js.map +1 -1
- package/dist/voicea.js +32 -95
- package/dist/voicea.js.map +1 -1
- package/dist/voicea.types.js.map +1 -1
- package/package.json +17 -18
- package/src/constants.ts +0 -12
- package/src/voicea.ts +26 -97
- package/src/voicea.types.ts +1 -1
- package/test/unit/spec/voicea.js +14 -145
package/dist/constants.js
CHANGED
|
@@ -4,8 +4,8 @@ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/defi
|
|
|
4
4
|
_Object$defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.VOICEA_RELAY_TYPES = exports.VOICEA = exports.
|
|
8
|
-
var EVENT_TRIGGERS =
|
|
7
|
+
exports.VOICEA_RELAY_TYPES = exports.VOICEA = exports.TRANSCRIPTION_TYPE = exports.EVENT_TRIGGERS = void 0;
|
|
8
|
+
var EVENT_TRIGGERS = {
|
|
9
9
|
VOICEA_ANNOUNCEMENT: 'voicea:announcement',
|
|
10
10
|
CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',
|
|
11
11
|
SPOKEN_LANGUAGE_UPDATE: 'voicea:spokenLanguageUpdate',
|
|
@@ -16,14 +16,16 @@ var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
|
16
16
|
EVA_COMMAND: 'voicea:wxa',
|
|
17
17
|
HIGHLIGHT_CREATED: 'voicea:highlightCreated'
|
|
18
18
|
};
|
|
19
|
-
|
|
19
|
+
exports.EVENT_TRIGGERS = EVENT_TRIGGERS;
|
|
20
|
+
var VOICEA_RELAY_TYPES = {
|
|
20
21
|
ANNOUNCEMENT: 'voicea.annc',
|
|
21
22
|
CLIENT_ANNOUNCEMENT: 'client.annc',
|
|
22
23
|
TRANSLATION_REQUEST: 'voicea.transl.req',
|
|
23
24
|
TRANSLATION_RESPONSE: 'voicea.transl.rsp',
|
|
24
25
|
TRANSCRIPTION: 'voicea.transcription'
|
|
25
26
|
};
|
|
26
|
-
|
|
27
|
+
exports.VOICEA_RELAY_TYPES = VOICEA_RELAY_TYPES;
|
|
28
|
+
var TRANSCRIPTION_TYPE = {
|
|
27
29
|
UNKNOWN: 'unknown',
|
|
28
30
|
EVA_WAKE: 'eva_wake',
|
|
29
31
|
EVA_THANKS: 'eva_thanks',
|
|
@@ -32,15 +34,7 @@ var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
|
|
|
32
34
|
TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
|
|
33
35
|
TRANSCRIPT_FINAL_RESULT: 'transcript_final_result'
|
|
34
36
|
};
|
|
35
|
-
|
|
36
|
-
var
|
|
37
|
-
|
|
38
|
-
JOINED: 'joined',
|
|
39
|
-
JOINING: 'joining'
|
|
40
|
-
};
|
|
41
|
-
var TURN_ON_CAPTION_STATUS = exports.TURN_ON_CAPTION_STATUS = {
|
|
42
|
-
IDLE: 'idle',
|
|
43
|
-
ENABLED: 'enabled',
|
|
44
|
-
SENDING: 'sending'
|
|
45
|
-
};
|
|
37
|
+
exports.TRANSCRIPTION_TYPE = TRANSCRIPTION_TYPE;
|
|
38
|
+
var VOICEA = 'voicea';
|
|
39
|
+
exports.VOICEA = VOICEA;
|
|
46
40
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EVENT_TRIGGERS","
|
|
1
|
+
{"version":3,"names":["EVENT_TRIGGERS","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","exports","VOICEA_RELAY_TYPES","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","VOICEA"],"sources":["constants.ts"],"sourcesContent":["export const EVENT_TRIGGERS = {\n VOICEA_ANNOUNCEMENT: 'voicea:announcement',\n CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',\n SPOKEN_LANGUAGE_UPDATE: 'voicea:spokenLanguageUpdate',\n CAPTIONS_TURNED_ON: 'voicea:captionOn',\n TRANSCRIBING_ON: 'voicea:transcribingOn',\n TRANSCRIBING_OFF: 'voicea:transcribingOff',\n\n NEW_CAPTION: 'voicea:newCaption',\n EVA_COMMAND: 'voicea:wxa',\n HIGHLIGHT_CREATED: 'voicea:highlightCreated',\n};\n\nexport const VOICEA_RELAY_TYPES = {\n ANNOUNCEMENT: 'voicea.annc',\n CLIENT_ANNOUNCEMENT: 'client.annc',\n TRANSLATION_REQUEST: 'voicea.transl.req',\n TRANSLATION_RESPONSE: 'voicea.transl.rsp',\n TRANSCRIPTION: 'voicea.transcription',\n};\n\nexport const TRANSCRIPTION_TYPE = {\n UNKNOWN: 'unknown',\n EVA_WAKE: 'eva_wake',\n EVA_THANKS: 'eva_thanks',\n EVA_CANCEL: 'eva_cancel',\n HIGHLIGHT_CREATED: 'highlight_created',\n TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',\n TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',\n};\n\nexport const VOICEA = 'voicea';\n"],"mappings":";;;;;;;AAAO,IAAMA,cAAc,GAAG;EAC5BC,mBAAmB,EAAE,qBAAqB;EAC1CC,uBAAuB,EAAE,8BAA8B;EACvDC,sBAAsB,EAAE,6BAA6B;EACrDC,kBAAkB,EAAE,kBAAkB;EACtCC,eAAe,EAAE,uBAAuB;EACxCC,gBAAgB,EAAE,wBAAwB;EAE1CC,WAAW,EAAE,mBAAmB;EAChCC,WAAW,EAAE,YAAY;EACzBC,iBAAiB,EAAE;AACrB,CAAC;AAACC,OAAA,CAAAV,cAAA,GAAAA,cAAA;AAEK,IAAMW,kBAAkB,GAAG;EAChCC,YAAY,EAAE,aAAa;EAC3BC,mBAAmB,EAAE,aAAa;EAClCC,mBAAmB,EAAE,mBAAmB;EACxCC,oBAAoB,EAAE,mBAAmB;EACzCC,aAAa,EAAE;AACjB,CAAC;AAACN,OAAA,CAAAC,kBAAA,GAAAA,kBAAA;AAEK,IAAMM,kBAAkB,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE,YAAY;EACxBZ,iBAAiB,EAAE,mBAAmB;EACtCa,0BAA0B,EAAE,4BAA4B;EACxDC,uBAAuB,EAAE;AAC3B,CAAC;AAACb,OAAA,CAAAO,kBAAA,GAAAA,kBAAA;AAEK,IAAMO,MAAM,GAAG,QAAQ;AAACd,OAAA,CAAAc,MAAA,GAAAA,MAAA"}
|
package/dist/index.js
CHANGED
|
@@ -16,7 +16,7 @@ _Object$defineProperty(exports, "default", {
|
|
|
16
16
|
});
|
|
17
17
|
var WebexCore = _interopRequireWildcard(require("@webex/webex-core"));
|
|
18
18
|
var _voicea = _interopRequireDefault(require("./voicea"));
|
|
19
|
-
function _getRequireWildcardCache(
|
|
20
|
-
function _interopRequireWildcard(
|
|
19
|
+
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
|
+
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
21
|
WebexCore.registerInternalPlugin('voicea', _voicea.default, {});
|
|
22
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_getRequireWildcardCache","
|
|
1
|
+
{"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_getRequireWildcardCache","nodeInterop","_WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","default","cache","has","get","newObj","hasPropertyDescriptor","_Object$defineProperty","_Object$getOwnPropertyDescriptor","key","Object","prototype","hasOwnProperty","call","desc","set","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":";;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAqC,SAAAG,yBAAAC,WAAA,eAAAC,QAAA,kCAAAC,iBAAA,OAAAD,QAAA,QAAAE,gBAAA,OAAAF,QAAA,YAAAF,wBAAA,YAAAA,yBAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAL,wBAAAS,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,aAAAE,OAAA,CAAAF,GAAA,yBAAAA,GAAA,4BAAAG,OAAA,EAAAH,GAAA,UAAAI,KAAA,GAAAT,wBAAA,CAAAC,WAAA,OAAAQ,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAL,GAAA,YAAAI,KAAA,CAAAE,GAAA,CAAAN,GAAA,SAAAO,MAAA,WAAAC,qBAAA,GAAAC,sBAAA,IAAAC,gCAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAf,GAAA,EAAAW,GAAA,SAAAK,IAAA,GAAAR,qBAAA,GAAAE,gCAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAK,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,sBAAA,CAAAF,MAAA,EAAAI,GAAA,EAAAK,IAAA,YAAAT,MAAA,CAAAI,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAJ,MAAA,CAAAJ,OAAA,GAAAH,GAAA,MAAAI,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAjB,GAAA,EAAAO,MAAA,YAAAA,MAAA;AAErCjB,SAAS,CAAC4B,sBAAsB,CAAC,QAAQ,EAAEC,eAAa,EAAE,CAAC,CAAC,CAAC"}
|
package/dist/utils.js
CHANGED
|
@@ -6,9 +6,10 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.millisToMinutesAndSeconds = void 0;
|
|
8
8
|
// eslint-disable-next-line import/prefer-default-export
|
|
9
|
-
var millisToMinutesAndSeconds =
|
|
9
|
+
var millisToMinutesAndSeconds = function millisToMinutesAndSeconds(millis) {
|
|
10
10
|
var minutes = Math.floor(millis / 60000);
|
|
11
11
|
var seconds = (millis % 60000 / 1000).toFixed(0);
|
|
12
12
|
return "".concat(minutes, ":").concat(+seconds < 10 ? '0' : '').concat(seconds);
|
|
13
13
|
};
|
|
14
|
+
exports.millisToMinutesAndSeconds = millisToMinutesAndSeconds;
|
|
14
15
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["millisToMinutesAndSeconds","
|
|
1
|
+
{"version":3,"names":["millisToMinutesAndSeconds","millis","minutes","Math","floor","seconds","toFixed","concat","exports"],"sources":["utils.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const millisToMinutesAndSeconds = (millis: number) => {\n const minutes = Math.floor(millis / 60000);\n const seconds = ((millis % 60000) / 1000).toFixed(0);\n\n return `${minutes}:${+seconds < 10 ? '0' : ''}${seconds}`;\n};\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,yBAAyB,GAAG,SAA5BA,yBAAyBA,CAAIC,MAAc,EAAK;EAC3D,IAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,MAAM,GAAG,KAAK,CAAC;EAC1C,IAAMI,OAAO,GAAG,CAAEJ,MAAM,GAAG,KAAK,GAAI,IAAI,EAAEK,OAAO,CAAC,CAAC,CAAC;EAEpD,UAAAC,MAAA,CAAUL,OAAO,OAAAK,MAAA,CAAI,CAACF,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAAE,MAAA,CAAGF,OAAO;AACzD,CAAC;AAACG,OAAA,CAAAR,yBAAA,GAAAA,yBAAA"}
|
package/dist/voicea.js
CHANGED
|
@@ -22,13 +22,13 @@ var _webexCore = require("@webex/webex-core");
|
|
|
22
22
|
var _constants = require("./constants");
|
|
23
23
|
var _utils = require("./utils");
|
|
24
24
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
25
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
25
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
26
26
|
/**
|
|
27
27
|
* @description VoiceaChannel to hold single instance of LLM
|
|
28
28
|
* @export
|
|
29
29
|
* @class VoiceaChannel
|
|
30
30
|
*/
|
|
31
|
-
var VoiceaChannel =
|
|
31
|
+
var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
|
|
32
32
|
(0, _inherits2.default)(VoiceaChannel, _WebexPlugin);
|
|
33
33
|
var _super = _createSuper(VoiceaChannel);
|
|
34
34
|
/**
|
|
@@ -44,11 +44,10 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
44
44
|
_this = _super.call.apply(_super, [this].concat(args));
|
|
45
45
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "namespace", _constants.VOICEA);
|
|
46
46
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "seqNum", void 0);
|
|
47
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "hasVoiceaJoined", void 0);
|
|
47
48
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "areCaptionsEnabled", void 0);
|
|
48
49
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "hasSubscribedToEvents", false);
|
|
49
50
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "vmcDeviceId", void 0);
|
|
50
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "announceStatus", void 0);
|
|
51
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "captionStatus", void 0);
|
|
52
51
|
/**
|
|
53
52
|
* @param {Object} e
|
|
54
53
|
* @returns {undefined}
|
|
@@ -58,7 +57,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
58
57
|
switch (e.data.relayType) {
|
|
59
58
|
case _constants.VOICEA_RELAY_TYPES.ANNOUNCEMENT:
|
|
60
59
|
_this.vmcDeviceId = e.headers.from;
|
|
61
|
-
_this.
|
|
60
|
+
_this.hasVoiceaJoined = true;
|
|
62
61
|
_this.processAnnouncementMessage(e.data.voiceaPayload);
|
|
63
62
|
break;
|
|
64
63
|
case _constants.VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
|
|
@@ -183,7 +182,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
183
182
|
* @returns {void}
|
|
184
183
|
*/
|
|
185
184
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sendAnnouncement", function () {
|
|
186
|
-
|
|
185
|
+
// @ts-ignore
|
|
186
|
+
if (_this.hasVoiceaJoined || !_this.webex.internal.llm.isConnected()) return;
|
|
187
187
|
_this.listenToEvents();
|
|
188
188
|
// @ts-ignore
|
|
189
189
|
_this.webex.internal.llm.socket.send({
|
|
@@ -261,62 +261,6 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
261
261
|
});
|
|
262
262
|
_this.seqNum += 1;
|
|
263
263
|
});
|
|
264
|
-
/**
|
|
265
|
-
* request turn on Captions
|
|
266
|
-
* @returns {Promise}
|
|
267
|
-
*/
|
|
268
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "requestTurnOnCaptions", function () {
|
|
269
|
-
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.SENDING;
|
|
270
|
-
// @ts-ignore
|
|
271
|
-
// eslint-disable-next-line newline-before-return
|
|
272
|
-
return _this.request({
|
|
273
|
-
method: 'PUT',
|
|
274
|
-
// @ts-ignore
|
|
275
|
-
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
276
|
-
body: {
|
|
277
|
-
transcribe: {
|
|
278
|
-
caption: true
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}).then(function () {
|
|
282
|
-
_pluginMeetings.TriggerProxy.trigger((0, _assertThisInitialized2.default)(_this), {
|
|
283
|
-
file: 'voicea',
|
|
284
|
-
function: 'turnOnCaptions'
|
|
285
|
-
}, _constants.EVENT_TRIGGERS.CAPTIONS_TURNED_ON);
|
|
286
|
-
_this.areCaptionsEnabled = true;
|
|
287
|
-
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.ENABLED;
|
|
288
|
-
_this.announce();
|
|
289
|
-
}).catch(function () {
|
|
290
|
-
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
|
|
291
|
-
throw new Error('turn on captions fail');
|
|
292
|
-
});
|
|
293
|
-
});
|
|
294
|
-
/**
|
|
295
|
-
* is announce processing
|
|
296
|
-
* @returns {boolean}
|
|
297
|
-
*/
|
|
298
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isAnnounceProcessing", function () {
|
|
299
|
-
return [_constants.ANNOUNCE_STATUS.JOINING, _constants.ANNOUNCE_STATUS.JOINED].includes(_this.announceStatus);
|
|
300
|
-
});
|
|
301
|
-
/**
|
|
302
|
-
* announce to voicea data chanel
|
|
303
|
-
* @returns {void}
|
|
304
|
-
*/
|
|
305
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "announce", function () {
|
|
306
|
-
if (_this.isAnnounceProcessing()) return;
|
|
307
|
-
// @ts-ignore
|
|
308
|
-
if (!_this.webex.internal.llm.isConnected()) {
|
|
309
|
-
throw new Error('voicea can not announce before llm connected');
|
|
310
|
-
}
|
|
311
|
-
_this.sendAnnouncement();
|
|
312
|
-
});
|
|
313
|
-
/**
|
|
314
|
-
* is turn on caption processing
|
|
315
|
-
* @returns {boolean}
|
|
316
|
-
*/
|
|
317
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isCaptionProcessing", function () {
|
|
318
|
-
return [_constants.TURN_ON_CAPTION_STATUS.SENDING, _constants.TURN_ON_CAPTION_STATUS.ENABLED].includes(_this.captionStatus);
|
|
319
|
-
});
|
|
320
264
|
/**
|
|
321
265
|
* Turn on Captions
|
|
322
266
|
* @returns {Promise}
|
|
@@ -325,20 +269,30 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
325
269
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
326
270
|
while (1) switch (_context.prev = _context.next) {
|
|
327
271
|
case 0:
|
|
328
|
-
if (!_this.
|
|
272
|
+
if (!(_this.hasVoiceaJoined && _this.areCaptionsEnabled)) {
|
|
329
273
|
_context.next = 2;
|
|
330
274
|
break;
|
|
331
275
|
}
|
|
332
276
|
return _context.abrupt("return", undefined);
|
|
333
277
|
case 2:
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
278
|
+
return _context.abrupt("return", _this.request({
|
|
279
|
+
method: 'PUT',
|
|
280
|
+
// @ts-ignore
|
|
281
|
+
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
282
|
+
body: {
|
|
283
|
+
transcribe: {
|
|
284
|
+
caption: true
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}).then(function () {
|
|
288
|
+
_pluginMeetings.TriggerProxy.trigger((0, _assertThisInitialized2.default)(_this), {
|
|
289
|
+
file: 'voicea',
|
|
290
|
+
function: 'turnOnCaptions'
|
|
291
|
+
}, _constants.EVENT_TRIGGERS.CAPTIONS_TURNED_ON);
|
|
292
|
+
_this.areCaptionsEnabled = true;
|
|
293
|
+
_this.sendAnnouncement();
|
|
294
|
+
}));
|
|
295
|
+
case 3:
|
|
342
296
|
case "end":
|
|
343
297
|
return _context.stop();
|
|
344
298
|
}
|
|
@@ -364,7 +318,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
364
318
|
}
|
|
365
319
|
}
|
|
366
320
|
}).then(function () {
|
|
367
|
-
if (activate && !_this.areCaptionsEnabled) _this.turnOnCaptions();
|
|
321
|
+
if (activate && !_this.areCaptionsEnabled && !_this.hasVoiceaJoined) _this.turnOnCaptions();
|
|
368
322
|
}));
|
|
369
323
|
case 1:
|
|
370
324
|
case "end":
|
|
@@ -376,25 +330,10 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
376
330
|
return _ref2.apply(this, arguments);
|
|
377
331
|
};
|
|
378
332
|
}());
|
|
379
|
-
/**
|
|
380
|
-
* get caption status
|
|
381
|
-
* @returns {string}
|
|
382
|
-
*/
|
|
383
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getCaptionStatus", function () {
|
|
384
|
-
return _this.captionStatus;
|
|
385
|
-
});
|
|
386
|
-
/**
|
|
387
|
-
* get announce status
|
|
388
|
-
* @returns {string}
|
|
389
|
-
*/
|
|
390
|
-
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getAnnounceStatus", function () {
|
|
391
|
-
return _this.announceStatus;
|
|
392
|
-
});
|
|
393
333
|
_this.seqNum = 1;
|
|
334
|
+
_this.hasVoiceaJoined = false;
|
|
394
335
|
_this.areCaptionsEnabled = false;
|
|
395
336
|
_this.vmcDeviceId = undefined;
|
|
396
|
-
_this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
|
|
397
|
-
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
|
|
398
337
|
return _this;
|
|
399
338
|
}
|
|
400
339
|
(0, _createClass2.default)(VoiceaChannel, [{
|
|
@@ -412,23 +351,21 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
412
351
|
}
|
|
413
352
|
}
|
|
414
353
|
|
|
415
|
-
|
|
416
|
-
* Listen to websocket messages
|
|
417
|
-
* @returns {void}
|
|
418
|
-
*/
|
|
354
|
+
// @ts-ignore
|
|
419
355
|
}, {
|
|
420
356
|
key: "deregisterEvents",
|
|
421
357
|
value: function deregisterEvents() {
|
|
358
|
+
this.hasVoiceaJoined = false;
|
|
422
359
|
this.areCaptionsEnabled = false;
|
|
423
360
|
this.vmcDeviceId = undefined;
|
|
424
361
|
// @ts-ignore
|
|
425
362
|
this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
|
|
426
363
|
this.hasSubscribedToEvents = false;
|
|
427
|
-
this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
|
|
428
|
-
this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
|
|
429
364
|
}
|
|
430
365
|
}]);
|
|
431
366
|
return VoiceaChannel;
|
|
432
367
|
}(_webexCore.WebexPlugin);
|
|
433
|
-
|
|
368
|
+
exports.VoiceaChannel = VoiceaChannel;
|
|
369
|
+
var _default = VoiceaChannel;
|
|
370
|
+
exports.default = _default;
|
|
434
371
|
//# sourceMappingURL=voicea.js.map
|
package/dist/voicea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uuid","_interopRequireDefault","require","_pluginMeetings","_webexCore","_constants","_utils","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","VoiceaChannel","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","VOICEA","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","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","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","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","isCaptionProcessing","abrupt","undefined","requestTurnOnCaptions","stop","_ref2","_callee2","activate","_callee2$","_context2","transcribing","turnOnCaptions","_x","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"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":["_uuid","_interopRequireDefault","require","_pluginMeetings","_webexCore","_constants","_utils","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","VoiceaChannel","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","VOICEA","seqNum","sequenceNumber","data","relayType","VOICEA_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","hasVoiceaJoined","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","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","webex","internal","llm","isConnected","listenToEvents","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","to","translationLanguage","TRANSLATION_REQUEST","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","areCaptionsEnabled","abrupt","undefined","transcribe","caption","CAPTIONS_TURNED_ON","sendAnnouncement","stop","_ref2","_callee2","activate","_callee2$","_context2","transcribing","turnOnCaptions","_x","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","exports","_default"],"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 {EVENT_TRIGGERS, VOICEA_RELAY_TYPES, TRANSCRIPTION_TYPE, VOICEA} 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 hasVoiceaJoined: boolean;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private vmcDeviceId?: 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.hasVoiceaJoined = true;\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 // @ts-ignore\n public deregisterEvents() {\n this.hasVoiceaJoined = false;\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 }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.hasVoiceaJoined = false;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\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 // @ts-ignore\n if (this.hasVoiceaJoined || !this.webex.internal.llm.isConnected()) return;\n\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 * Turn on Captions\n * @returns {Promise}\n */\n public turnOnCaptions = async (): undefined | Promise<void> => {\n if (this.hasVoiceaJoined && this.areCaptionsEnabled) return undefined;\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 }).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.sendAnnouncement();\n });\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.hasVoiceaJoined) this.turnOnCaptions();\n });\n };\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
|
|
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: () => undefined | Promise<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,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-plugin-voicea",
|
|
3
|
+
"version": "2.60.1",
|
|
3
4
|
"description": "",
|
|
4
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
5
6
|
"main": "dist/index.js",
|
|
@@ -10,13 +11,13 @@
|
|
|
10
11
|
"directory": "packages/@webex/internal-plugin-voicea"
|
|
11
12
|
},
|
|
12
13
|
"engines": {
|
|
13
|
-
"node": ">=
|
|
14
|
+
"node": ">=14"
|
|
14
15
|
},
|
|
15
16
|
"dependencies": {
|
|
16
|
-
"@webex/internal-plugin-llm": "2.60.
|
|
17
|
-
"@webex/internal-plugin-mercury": "2.60.
|
|
18
|
-
"@webex/plugin-meetings": "2.60.
|
|
19
|
-
"@webex/webex-core": "2.60.
|
|
17
|
+
"@webex/internal-plugin-llm": "2.60.1",
|
|
18
|
+
"@webex/internal-plugin-mercury": "2.60.1",
|
|
19
|
+
"@webex/plugin-meetings": "2.60.1",
|
|
20
|
+
"@webex/webex-core": "2.60.1",
|
|
20
21
|
"uuid": "^3.3.2"
|
|
21
22
|
},
|
|
22
23
|
"browserify": {
|
|
@@ -27,15 +28,15 @@
|
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
29
30
|
"@babel/core": "^7.17.10",
|
|
30
|
-
"@webex/babel-config-legacy": "
|
|
31
|
-
"@webex/eslint-config-legacy": "
|
|
32
|
-
"@webex/jest-config-legacy": "
|
|
33
|
-
"@webex/legacy-tools": "
|
|
34
|
-
"@webex/test-helper-chai": "2.60.
|
|
35
|
-
"@webex/test-helper-mocha": "2.60.
|
|
36
|
-
"@webex/test-helper-mock-web-socket": "2.60.
|
|
37
|
-
"@webex/test-helper-mock-webex": "2.60.
|
|
38
|
-
"@webex/test-helper-test-users": "2.60.
|
|
31
|
+
"@webex/babel-config-legacy": "2.60.1",
|
|
32
|
+
"@webex/eslint-config-legacy": "2.60.1",
|
|
33
|
+
"@webex/jest-config-legacy": "2.60.1",
|
|
34
|
+
"@webex/legacy-tools": "2.60.1",
|
|
35
|
+
"@webex/test-helper-chai": "2.60.1",
|
|
36
|
+
"@webex/test-helper-mocha": "2.60.1",
|
|
37
|
+
"@webex/test-helper-mock-web-socket": "2.60.1",
|
|
38
|
+
"@webex/test-helper-mock-webex": "2.60.1",
|
|
39
|
+
"@webex/test-helper-test-users": "2.60.1",
|
|
39
40
|
"eslint": "^8.24.0",
|
|
40
41
|
"prettier": "^2.7.1",
|
|
41
42
|
"sinon": "^9.2.4"
|
|
@@ -43,12 +44,10 @@
|
|
|
43
44
|
"scripts": {
|
|
44
45
|
"build": "yarn build:src",
|
|
45
46
|
"build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps",
|
|
46
|
-
"deploy:npm": "yarn npm publish",
|
|
47
47
|
"test": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
|
|
48
48
|
"test:browser:broken": "webex-legacy-tools test --integration --unit --runner karma",
|
|
49
49
|
"test:integration": "webex-legacy-tools test --integration --runner mocha",
|
|
50
50
|
"test:style": "eslint ./src/**/*.*",
|
|
51
51
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
}
|
|
52
|
+
}
|
|
53
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -30,15 +30,3 @@ export const TRANSCRIPTION_TYPE = {
|
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
export const VOICEA = 'voicea';
|
|
33
|
-
|
|
34
|
-
export const ANNOUNCE_STATUS = {
|
|
35
|
-
IDLE: 'idle',
|
|
36
|
-
JOINED: 'joined',
|
|
37
|
-
JOINING: 'joining',
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
export const TURN_ON_CAPTION_STATUS = {
|
|
41
|
-
IDLE: 'idle',
|
|
42
|
-
ENABLED: 'enabled',
|
|
43
|
-
SENDING: 'sending',
|
|
44
|
-
};
|
package/src/voicea.ts
CHANGED
|
@@ -2,14 +2,7 @@ import uuid from 'uuid';
|
|
|
2
2
|
import {TriggerProxy as Trigger} from '@webex/plugin-meetings';
|
|
3
3
|
import {WebexPlugin, config} from '@webex/webex-core';
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
EVENT_TRIGGERS,
|
|
7
|
-
VOICEA_RELAY_TYPES,
|
|
8
|
-
TRANSCRIPTION_TYPE,
|
|
9
|
-
VOICEA,
|
|
10
|
-
ANNOUNCE_STATUS,
|
|
11
|
-
TURN_ON_CAPTION_STATUS,
|
|
12
|
-
} from './constants';
|
|
5
|
+
import {EVENT_TRIGGERS, VOICEA_RELAY_TYPES, TRANSCRIPTION_TYPE, VOICEA} from './constants';
|
|
13
6
|
// eslint-disable-next-line no-unused-vars
|
|
14
7
|
import {
|
|
15
8
|
AnnouncementPayload,
|
|
@@ -29,16 +22,14 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
29
22
|
|
|
30
23
|
private seqNum: number;
|
|
31
24
|
|
|
25
|
+
private hasVoiceaJoined: boolean;
|
|
26
|
+
|
|
32
27
|
private areCaptionsEnabled: boolean;
|
|
33
28
|
|
|
34
29
|
private hasSubscribedToEvents = false;
|
|
35
30
|
|
|
36
31
|
private vmcDeviceId?: string;
|
|
37
32
|
|
|
38
|
-
private announceStatus: string;
|
|
39
|
-
|
|
40
|
-
private captionStatus: string;
|
|
41
|
-
|
|
42
33
|
/**
|
|
43
34
|
* @param {Object} e
|
|
44
35
|
* @returns {undefined}
|
|
@@ -49,7 +40,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
49
40
|
switch (e.data.relayType) {
|
|
50
41
|
case VOICEA_RELAY_TYPES.ANNOUNCEMENT:
|
|
51
42
|
this.vmcDeviceId = e.headers.from;
|
|
52
|
-
this.
|
|
43
|
+
this.hasVoiceaJoined = true;
|
|
53
44
|
this.processAnnouncementMessage(e.data.voiceaPayload);
|
|
54
45
|
break;
|
|
55
46
|
case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
|
|
@@ -75,18 +66,14 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
75
66
|
}
|
|
76
67
|
}
|
|
77
68
|
|
|
78
|
-
|
|
79
|
-
* Listen to websocket messages
|
|
80
|
-
* @returns {void}
|
|
81
|
-
*/
|
|
69
|
+
// @ts-ignore
|
|
82
70
|
public deregisterEvents() {
|
|
71
|
+
this.hasVoiceaJoined = false;
|
|
83
72
|
this.areCaptionsEnabled = false;
|
|
84
73
|
this.vmcDeviceId = undefined;
|
|
85
74
|
// @ts-ignore
|
|
86
75
|
this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
|
|
87
76
|
this.hasSubscribedToEvents = false;
|
|
88
|
-
this.announceStatus = ANNOUNCE_STATUS.IDLE;
|
|
89
|
-
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
90
77
|
}
|
|
91
78
|
|
|
92
79
|
/**
|
|
@@ -96,10 +83,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
96
83
|
constructor(...args) {
|
|
97
84
|
super(...args);
|
|
98
85
|
this.seqNum = 1;
|
|
86
|
+
this.hasVoiceaJoined = false;
|
|
99
87
|
this.areCaptionsEnabled = false;
|
|
100
88
|
this.vmcDeviceId = undefined;
|
|
101
|
-
this.announceStatus = ANNOUNCE_STATUS.IDLE;
|
|
102
|
-
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
103
89
|
}
|
|
104
90
|
|
|
105
91
|
/**
|
|
@@ -257,7 +243,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
257
243
|
* @returns {void}
|
|
258
244
|
*/
|
|
259
245
|
private sendAnnouncement = (): void => {
|
|
260
|
-
|
|
246
|
+
// @ts-ignore
|
|
247
|
+
if (this.hasVoiceaJoined || !this.webex.internal.llm.isConnected()) return;
|
|
248
|
+
|
|
261
249
|
this.listenToEvents();
|
|
262
250
|
// @ts-ignore
|
|
263
251
|
this.webex.internal.llm.socket.send({
|
|
@@ -339,11 +327,11 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
339
327
|
};
|
|
340
328
|
|
|
341
329
|
/**
|
|
342
|
-
*
|
|
330
|
+
* Turn on Captions
|
|
343
331
|
* @returns {Promise}
|
|
344
332
|
*/
|
|
345
|
-
|
|
346
|
-
this.
|
|
333
|
+
public turnOnCaptions = async (): undefined | Promise<void> => {
|
|
334
|
+
if (this.hasVoiceaJoined && this.areCaptionsEnabled) return undefined;
|
|
347
335
|
// @ts-ignore
|
|
348
336
|
// eslint-disable-next-line newline-before-return
|
|
349
337
|
return this.request({
|
|
@@ -353,65 +341,18 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
353
341
|
body: {
|
|
354
342
|
transcribe: {caption: true},
|
|
355
343
|
},
|
|
356
|
-
})
|
|
357
|
-
.
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
this.announce();
|
|
369
|
-
})
|
|
370
|
-
.catch(() => {
|
|
371
|
-
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
372
|
-
throw new Error('turn on captions fail');
|
|
373
|
-
});
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* is announce processing
|
|
378
|
-
* @returns {boolean}
|
|
379
|
-
*/
|
|
380
|
-
private isAnnounceProcessing = () =>
|
|
381
|
-
[ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);
|
|
382
|
-
|
|
383
|
-
/**
|
|
384
|
-
* announce to voicea data chanel
|
|
385
|
-
* @returns {void}
|
|
386
|
-
*/
|
|
387
|
-
public announce = () => {
|
|
388
|
-
if (this.isAnnounceProcessing()) return;
|
|
389
|
-
// @ts-ignore
|
|
390
|
-
if (!this.webex.internal.llm.isConnected()) {
|
|
391
|
-
throw new Error('voicea can not announce before llm connected');
|
|
392
|
-
}
|
|
393
|
-
this.sendAnnouncement();
|
|
394
|
-
};
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* is turn on caption processing
|
|
398
|
-
* @returns {boolean}
|
|
399
|
-
*/
|
|
400
|
-
private isCaptionProcessing = () =>
|
|
401
|
-
[TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Turn on Captions
|
|
405
|
-
* @returns {Promise}
|
|
406
|
-
*/
|
|
407
|
-
public turnOnCaptions = async (): undefined | Promise<void> => {
|
|
408
|
-
if (this.isCaptionProcessing()) return undefined;
|
|
409
|
-
// @ts-ignore
|
|
410
|
-
if (!this.webex.internal.llm.isConnected()) {
|
|
411
|
-
throw new Error('can not turn on captions before llm connected');
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
return this.requestTurnOnCaptions();
|
|
344
|
+
}).then(() => {
|
|
345
|
+
Trigger.trigger(
|
|
346
|
+
this,
|
|
347
|
+
{
|
|
348
|
+
file: 'voicea',
|
|
349
|
+
function: 'turnOnCaptions',
|
|
350
|
+
},
|
|
351
|
+
EVENT_TRIGGERS.CAPTIONS_TURNED_ON
|
|
352
|
+
);
|
|
353
|
+
this.areCaptionsEnabled = true;
|
|
354
|
+
this.sendAnnouncement();
|
|
355
|
+
});
|
|
415
356
|
};
|
|
416
357
|
|
|
417
358
|
/**
|
|
@@ -429,21 +370,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
429
370
|
transcribe: {transcribing: activate},
|
|
430
371
|
},
|
|
431
372
|
}).then(() => {
|
|
432
|
-
if (activate && !this.areCaptionsEnabled) this.turnOnCaptions();
|
|
373
|
+
if (activate && !this.areCaptionsEnabled && !this.hasVoiceaJoined) this.turnOnCaptions();
|
|
433
374
|
});
|
|
434
375
|
};
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* get caption status
|
|
438
|
-
* @returns {string}
|
|
439
|
-
*/
|
|
440
|
-
public getCaptionStatus = () => this.captionStatus;
|
|
441
|
-
|
|
442
|
-
/**
|
|
443
|
-
* get announce status
|
|
444
|
-
* @returns {string}
|
|
445
|
-
*/
|
|
446
|
-
public getAnnounceStatus = () => this.announceStatus;
|
|
447
376
|
}
|
|
448
377
|
|
|
449
378
|
export default VoiceaChannel;
|
package/src/voicea.types.ts
CHANGED
|
@@ -79,7 +79,7 @@ interface IVoiceaChannel {
|
|
|
79
79
|
requestLanguage: (languageCode: string) => void;
|
|
80
80
|
turnOnCaptions: () => undefined | Promise<void>;
|
|
81
81
|
toggleTranscribing: (activate: boolean) => undefined | Promise<void>;
|
|
82
|
-
deregisterEvents: () => void
|
|
82
|
+
deregisterEvents: () => undefined | Promise<void>;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
export type {
|
package/test/unit/spec/voicea.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import 'jsdom-global/register';
|
|
2
1
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
3
2
|
import MockWebSocket from '@webex/test-helper-mock-web-socket';
|
|
4
|
-
import {assert
|
|
3
|
+
import {assert} from '@webex/test-helper-chai';
|
|
5
4
|
import sinon from 'sinon';
|
|
6
5
|
import Mercury from '@webex/internal-plugin-mercury';
|
|
7
6
|
import LLMChannel from '@webex/internal-plugin-llm';
|
|
@@ -42,26 +41,17 @@ describe('plugin-voicea', () => {
|
|
|
42
41
|
});
|
|
43
42
|
});
|
|
44
43
|
|
|
45
|
-
describe("#constructor", () => {
|
|
46
|
-
it('should init status', () => {
|
|
47
|
-
assert.equal(voiceaService.announceStatus, 'idle');
|
|
48
|
-
assert.equal(voiceaService.captionStatus, 'idle');
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
44
|
describe('#sendAnnouncement', () => {
|
|
53
45
|
beforeEach(async () => {
|
|
54
46
|
const mockWebSocket = new MockWebSocket();
|
|
55
47
|
|
|
56
48
|
voiceaService.webex.internal.llm.socket = mockWebSocket;
|
|
57
|
-
voiceaService.announceStatus = "idle";
|
|
58
49
|
});
|
|
59
50
|
|
|
60
51
|
it("sends announcement if voicea hasn't joined", () => {
|
|
61
52
|
const spy = sinon.spy(voiceaService, 'listenToEvents');
|
|
62
53
|
|
|
63
54
|
voiceaService.sendAnnouncement();
|
|
64
|
-
assert.equal(voiceaService.announceStatus, 'joining');
|
|
65
55
|
assert.calledOnce(spy);
|
|
66
56
|
|
|
67
57
|
assert.calledOnceWithExactly(voiceaService.webex.internal.llm.socket.send, {
|
|
@@ -108,14 +98,14 @@ describe('plugin-voicea', () => {
|
|
|
108
98
|
data: {relayType: 'voicea.annc', voiceaPayload: {}},
|
|
109
99
|
});
|
|
110
100
|
|
|
101
|
+
assert.equal(voiceaService.hasVoiceaJoined, true);
|
|
111
102
|
assert.equal(voiceaService.areCaptionsEnabled, true);
|
|
112
103
|
assert.equal(voiceaService.vmcDeviceId, 'ws');
|
|
113
104
|
|
|
114
105
|
voiceaService.deregisterEvents();
|
|
106
|
+
assert.equal(voiceaService.hasVoiceaJoined, false);
|
|
115
107
|
assert.equal(voiceaService.areCaptionsEnabled, false);
|
|
116
108
|
assert.equal(voiceaService.vmcDeviceId, undefined);
|
|
117
|
-
assert.equal(voiceaService.announceStatus, 'idle');
|
|
118
|
-
assert.equal(voiceaService.captionStatus, 'idle');
|
|
119
109
|
});
|
|
120
110
|
});
|
|
121
111
|
describe('#processAnnouncementMessage', () => {
|
|
@@ -208,28 +198,22 @@ describe('plugin-voicea', () => {
|
|
|
208
198
|
});
|
|
209
199
|
});
|
|
210
200
|
|
|
211
|
-
describe('#
|
|
201
|
+
describe('#turnOnCaptions', () => {
|
|
212
202
|
beforeEach(async () => {
|
|
213
203
|
const mockWebSocket = new MockWebSocket();
|
|
214
204
|
|
|
215
205
|
voiceaService.webex.internal.llm.socket = mockWebSocket;
|
|
216
|
-
voiceaService.captionStatus = 'idle';
|
|
217
206
|
});
|
|
218
207
|
|
|
219
|
-
afterEach( () => {
|
|
220
|
-
voiceaService.captionStatus = 'idle';
|
|
221
|
-
})
|
|
222
|
-
|
|
223
208
|
it('turns on captions', async () => {
|
|
224
|
-
const announcementSpy = sinon.spy(voiceaService, '
|
|
209
|
+
const announcementSpy = sinon.spy(voiceaService, 'sendAnnouncement');
|
|
225
210
|
|
|
226
211
|
const triggerSpy = sinon.spy();
|
|
227
212
|
|
|
228
213
|
voiceaService.on(EVENT_TRIGGERS.CAPTIONS_TURNED_ON, triggerSpy);
|
|
229
214
|
voiceaService.listenToEvents();
|
|
230
215
|
|
|
231
|
-
await voiceaService.
|
|
232
|
-
assert.equal(voiceaService.captionStatus, 'enabled');
|
|
216
|
+
await voiceaService.turnOnCaptions();
|
|
233
217
|
sinon.assert.calledWith(
|
|
234
218
|
voiceaService.request,
|
|
235
219
|
sinon.match({
|
|
@@ -244,119 +228,18 @@ describe('plugin-voicea', () => {
|
|
|
244
228
|
assert.calledOnce(announcementSpy);
|
|
245
229
|
});
|
|
246
230
|
|
|
247
|
-
it("
|
|
248
|
-
voiceaService.
|
|
249
|
-
voiceaService.request = sinon.stub().rejects();
|
|
250
|
-
|
|
251
|
-
try {
|
|
252
|
-
await voiceaService.requestTurnOnCaptions();
|
|
253
|
-
} catch (error) {
|
|
254
|
-
expect(error.message).to.include('turn on captions fail');
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
assert.equal(voiceaService.captionStatus, 'idle');
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
describe("#isAnnounceProcessing", () => {
|
|
262
|
-
afterEach(() => {
|
|
263
|
-
voiceaService.announceStatus = 'idle';
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
['joining', 'joined'].forEach((status) => {
|
|
267
|
-
it(`should return true when status is ${status}`, () => {
|
|
268
|
-
voiceaService.announceStatus = status;
|
|
269
|
-
assert.equal(voiceaService.isAnnounceProcessing(), true);
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
it('should return false when status is not processing status', () => {
|
|
274
|
-
voiceaService.announceStatus = 'idle';
|
|
275
|
-
assert.equal(voiceaService.isAnnounceProcessing(), false);
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
describe("#announce", () => {
|
|
280
|
-
let isAnnounceProcessing, sendAnnouncement;
|
|
281
|
-
beforeEach(() => {
|
|
282
|
-
voiceaService.webex.internal.llm.isConnected.returns(true);
|
|
283
|
-
sendAnnouncement = sinon.stub(voiceaService, 'sendAnnouncement');
|
|
284
|
-
isAnnounceProcessing = sinon.stub(voiceaService, 'isAnnounceProcessing').returns(false)
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
afterEach(() => {
|
|
288
|
-
voiceaService.webex.internal.llm.isConnected.returns(true);
|
|
289
|
-
isAnnounceProcessing.restore();
|
|
290
|
-
sendAnnouncement.restore();
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
it('announce to llm data channel', ()=> {
|
|
294
|
-
voiceaService.announce();
|
|
295
|
-
assert.calledOnce(sendAnnouncement);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
it('announce to llm data channel before llm connected', ()=> {
|
|
299
|
-
voiceaService.webex.internal.llm.isConnected.returns(false);
|
|
300
|
-
assert.throws(() => voiceaService.announce(), "voicea can not announce before llm connected");
|
|
301
|
-
assert.notCalled(sendAnnouncement);
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
it('should not announce duplicate', () => {
|
|
305
|
-
isAnnounceProcessing.returns(true);
|
|
306
|
-
voiceaService.announce();
|
|
307
|
-
assert.notCalled(sendAnnouncement);
|
|
308
|
-
})
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
describe("#isCaptionProcessing", () => {
|
|
312
|
-
afterEach(() => {
|
|
313
|
-
voiceaService.captionStatus = 'idle';
|
|
314
|
-
});
|
|
231
|
+
it("doesn't call API on captions", async () => {
|
|
232
|
+
await voiceaService.turnOnCaptions();
|
|
315
233
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
234
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
235
|
+
voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
236
|
+
headers: {from: 'ws'},
|
|
237
|
+
data: {relayType: 'voicea.annc', voiceaPayload: {}},
|
|
320
238
|
});
|
|
321
|
-
});
|
|
322
239
|
|
|
323
|
-
|
|
324
|
-
voiceaService.captionStatus = 'idle';
|
|
325
|
-
assert.equal(voiceaService.isCaptionProcessing(), false);
|
|
326
|
-
});
|
|
327
|
-
});
|
|
240
|
+
const response = await voiceaService.turnOnCaptions();
|
|
328
241
|
|
|
329
|
-
|
|
330
|
-
let requestTurnOnCaptions, isCaptionProcessing;
|
|
331
|
-
beforeEach(() => {
|
|
332
|
-
requestTurnOnCaptions = sinon.stub(voiceaService, 'requestTurnOnCaptions');
|
|
333
|
-
isCaptionProcessing = sinon.stub(voiceaService, 'isCaptionProcessing').returns(false);
|
|
334
|
-
voiceaService.webex.internal.llm.isConnected.returns(true);
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
afterEach(() => {
|
|
338
|
-
requestTurnOnCaptions.restore();
|
|
339
|
-
isCaptionProcessing.restore();
|
|
340
|
-
voiceaService.webex.internal.llm.isConnected.returns(true);
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
it('call request turn on captions', () => {
|
|
344
|
-
isCaptionProcessing.returns(false);
|
|
345
|
-
voiceaService.turnOnCaptions();
|
|
346
|
-
assert.calledOnce(requestTurnOnCaptions);
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
it("turns on captions before llm connected", () => {
|
|
350
|
-
isCaptionProcessing.returns(false);
|
|
351
|
-
voiceaService.webex.internal.llm.isConnected.returns(true);
|
|
352
|
-
// assert.throws(() => voiceaService.turnOnCaptions(), "can not turn on captions before llm connected");
|
|
353
|
-
assert.notCalled(requestTurnOnCaptions);
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
it('should not turn on duplicate when processing', () => {
|
|
357
|
-
isCaptionProcessing.returns(true);
|
|
358
|
-
voiceaService.turnOnCaptions();
|
|
359
|
-
assert.notCalled(voiceaService.requestTurnOnCaptions);
|
|
242
|
+
assert.equal(response, undefined);
|
|
360
243
|
});
|
|
361
244
|
});
|
|
362
245
|
|
|
@@ -730,19 +613,5 @@ describe('plugin-voicea', () => {
|
|
|
730
613
|
});
|
|
731
614
|
});
|
|
732
615
|
});
|
|
733
|
-
|
|
734
|
-
describe("#getCaptionStatus", () => {
|
|
735
|
-
it('works correctly', () => {
|
|
736
|
-
voiceaService.captionStatus = "enabled"
|
|
737
|
-
assert.equal(voiceaService.getCaptionStatus(), "enabled");
|
|
738
|
-
});
|
|
739
|
-
});
|
|
740
|
-
|
|
741
|
-
describe("#getAnnounceStatus", () => {
|
|
742
|
-
it('works correctly', () => {
|
|
743
|
-
voiceaService.announceStatus = "joined"
|
|
744
|
-
assert.equal(voiceaService.getAnnounceStatus(), "joined");
|
|
745
|
-
});
|
|
746
|
-
});
|
|
747
616
|
});
|
|
748
617
|
});
|