@webex/internal-plugin-voicea 3.8.0-next.60 → 3.8.0-next.61
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/README.md +17 -0
- package/dist/constants.js +6 -2
- package/dist/constants.js.map +1 -1
- package/dist/types/constants.d.ts +5 -1
- package/dist/types/voicea.d.ts +12 -2
- package/dist/types/voicea.types.d.ts +2 -0
- package/dist/voicea.js +52 -3
- package/dist/voicea.js.map +1 -1
- package/dist/voicea.types.js.map +1 -1
- package/package.json +2 -2
- package/src/constants.ts +6 -1
- package/src/voicea.ts +71 -6
- package/src/voicea.types.ts +7 -0
- package/test/unit/spec/voicea.js +108 -16
package/README.md
CHANGED
|
@@ -54,6 +54,15 @@ await webex.internal.voicea.toggleTranscribing(true);
|
|
|
54
54
|
await webex.internal.voicea.toggleTranscribing(false);
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
Toggle Manual Captions
|
|
58
|
+
|
|
59
|
+
- Enable/Disable Manual Captioning in a meeting
|
|
60
|
+
|
|
61
|
+
```js
|
|
62
|
+
await webex.internal.voicea.toggleManualCaption(true);
|
|
63
|
+
await webex.internal.voicea.toggleManualCaption(false);
|
|
64
|
+
```
|
|
65
|
+
|
|
57
66
|
Set Spoken Language
|
|
58
67
|
|
|
59
68
|
- Host can set the spoken language of the meeting
|
|
@@ -71,6 +80,14 @@ Set Caption Language
|
|
|
71
80
|
webex.internal.voicea.requestLanguage('en');
|
|
72
81
|
```
|
|
73
82
|
|
|
83
|
+
Send Manual Closed Caption Messages
|
|
84
|
+
|
|
85
|
+
- Only captioner can send manual closed captions messages
|
|
86
|
+
|
|
87
|
+
```js
|
|
88
|
+
webex.internal.voicea.sendManualClosedCaption('Hello World', 9876543210, [654321, 123456, 789034, 893628], true);
|
|
89
|
+
```
|
|
90
|
+
|
|
74
91
|
Other Triggers:
|
|
75
92
|
|
|
76
93
|
- voicea:announcement - Triggered when voicea has
|
package/dist/constants.js
CHANGED
|
@@ -4,7 +4,7 @@ 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 = exports.TURN_ON_CAPTION_STATUS = exports.TRANSCRIPTION_TYPE = exports.EVENT_TRIGGERS = exports.ANNOUNCE_STATUS = exports.AIBRIDGE_RELAY_TYPES = void 0;
|
|
7
|
+
exports.VOICEA = exports.TURN_ON_CAPTION_STATUS = exports.TRANSCRIPTION_TYPE = exports.TOGGLE_MANUAL_CAPTION_STATUS = exports.EVENT_TRIGGERS = exports.ANNOUNCE_STATUS = exports.AIBRIDGE_RELAY_TYPES = void 0;
|
|
8
8
|
var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
9
9
|
VOICEA_ANNOUNCEMENT: 'voicea:announcement',
|
|
10
10
|
CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',
|
|
@@ -27,7 +27,7 @@ var AIBRIDGE_RELAY_TYPES = exports.AIBRIDGE_RELAY_TYPES = {
|
|
|
27
27
|
},
|
|
28
28
|
MANUAL: {
|
|
29
29
|
TRANSCRIPTION: 'aibridge.manual_transcription',
|
|
30
|
-
|
|
30
|
+
CAPTIONER: 'client.manual_transcription'
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
33
|
var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
|
|
@@ -53,4 +53,8 @@ var TURN_ON_CAPTION_STATUS = exports.TURN_ON_CAPTION_STATUS = {
|
|
|
53
53
|
ENABLED: 'enabled',
|
|
54
54
|
SENDING: 'sending'
|
|
55
55
|
};
|
|
56
|
+
var TOGGLE_MANUAL_CAPTION_STATUS = exports.TOGGLE_MANUAL_CAPTION_STATUS = {
|
|
57
|
+
IDLE: 'idle',
|
|
58
|
+
SENDING: 'sending'
|
|
59
|
+
};
|
|
56
60
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EVENT_TRIGGERS","exports","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","NEW_MANUAL_CAPTION","AIBRIDGE_RELAY_TYPES","VOICEA","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","MANUAL","
|
|
1
|
+
{"version":3,"names":["EVENT_TRIGGERS","exports","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","NEW_MANUAL_CAPTION","AIBRIDGE_RELAY_TYPES","VOICEA","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","MANUAL","CAPTIONER","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULTS","MANUAL_CAPTION_INTERIM_RESULT","MANUAL_CAPTION_FINAL_RESULT","ANNOUNCE_STATUS","IDLE","JOINED","JOINING","TURN_ON_CAPTION_STATUS","ENABLED","SENDING","TOGGLE_MANUAL_CAPTION_STATUS"],"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 NEW_MANUAL_CAPTION: 'aibridge:newManualCaption',\n};\n\nexport const AIBRIDGE_RELAY_TYPES = {\n VOICEA: {\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 MANUAL: {\n TRANSCRIPTION: 'aibridge.manual_transcription',\n CAPTIONER: 'client.manual_transcription',\n },\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 MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',\n MANUAL_CAPTION_INTERIM_RESULT: 'manual_caption_interim_result',\n MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result',\n};\n\nexport const VOICEA = 'voicea';\n\nexport const ANNOUNCE_STATUS = {\n IDLE: 'idle',\n JOINED: 'joined',\n JOINING: 'joining',\n};\n\nexport const TURN_ON_CAPTION_STATUS = {\n IDLE: 'idle',\n ENABLED: 'enabled',\n SENDING: 'sending',\n};\n\nexport const TOGGLE_MANUAL_CAPTION_STATUS = {\n IDLE: 'idle',\n SENDING: 'sending',\n};\n"],"mappings":";;;;;;;AAAO,IAAMA,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG;EAC5BE,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,yBAAyB;EAC5CC,kBAAkB,EAAE;AACtB,CAAC;AAEM,IAAMC,oBAAoB,GAAAX,OAAA,CAAAW,oBAAA,GAAG;EAClCC,MAAM,EAAE;IACNC,YAAY,EAAE,aAAa;IAC3BC,mBAAmB,EAAE,aAAa;IAClCC,mBAAmB,EAAE,mBAAmB;IACxCC,oBAAoB,EAAE,mBAAmB;IACzCC,aAAa,EAAE;EACjB,CAAC;EACDC,MAAM,EAAE;IACND,aAAa,EAAE,+BAA+B;IAC9CE,SAAS,EAAE;EACb;AACF,CAAC;AAEM,IAAMC,kBAAkB,GAAApB,OAAA,CAAAoB,kBAAA,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE,YAAY;EACxBf,iBAAiB,EAAE,mBAAmB;EACtCgB,0BAA0B,EAAE,4BAA4B;EACxDC,uBAAuB,EAAE,yBAAyB;EAClDC,8BAA8B,EAAE,gCAAgC;EAChEC,6BAA6B,EAAE,+BAA+B;EAC9DC,2BAA2B,EAAE;AAC/B,CAAC;AAEM,IAAMjB,MAAM,GAAAZ,OAAA,CAAAY,MAAA,GAAG,QAAQ;AAEvB,IAAMkB,eAAe,GAAA9B,OAAA,CAAA8B,eAAA,GAAG;EAC7BC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,sBAAsB,GAAAlC,OAAA,CAAAkC,sBAAA,GAAG;EACpCH,IAAI,EAAE,MAAM;EACZI,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,4BAA4B,GAAArC,OAAA,CAAAqC,4BAAA,GAAG;EAC1CN,IAAI,EAAE,MAAM;EACZK,OAAO,EAAE;AACX,CAAC"}
|
|
@@ -20,7 +20,7 @@ export declare const AIBRIDGE_RELAY_TYPES: {
|
|
|
20
20
|
};
|
|
21
21
|
MANUAL: {
|
|
22
22
|
TRANSCRIPTION: string;
|
|
23
|
-
|
|
23
|
+
CAPTIONER: string;
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
26
|
export declare const TRANSCRIPTION_TYPE: {
|
|
@@ -46,3 +46,7 @@ export declare const TURN_ON_CAPTION_STATUS: {
|
|
|
46
46
|
ENABLED: string;
|
|
47
47
|
SENDING: string;
|
|
48
48
|
};
|
|
49
|
+
export declare const TOGGLE_MANUAL_CAPTION_STATUS: {
|
|
50
|
+
IDLE: string;
|
|
51
|
+
SENDING: string;
|
|
52
|
+
};
|
package/dist/types/voicea.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
|
|
|
13
13
|
private vmcDeviceId?;
|
|
14
14
|
private announceStatus;
|
|
15
15
|
private captionStatus;
|
|
16
|
+
private toggleManualCaptionStatus;
|
|
16
17
|
/**
|
|
17
18
|
* @param {Object} e
|
|
18
19
|
* @returns {undefined}
|
|
@@ -74,6 +75,15 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
|
|
|
74
75
|
* @returns {void}
|
|
75
76
|
*/
|
|
76
77
|
requestLanguage: (languageCode: string) => void;
|
|
78
|
+
/**
|
|
79
|
+
* Send manual closed captions to voicea service
|
|
80
|
+
* @param {string} text
|
|
81
|
+
* @param {number} timeStamp
|
|
82
|
+
* @param {number[]} csis
|
|
83
|
+
* @param {boolean} isFinal
|
|
84
|
+
* @returns {void}
|
|
85
|
+
*/
|
|
86
|
+
sendManualClosedCaption: (text: string, timeStamp: number, csis: number[], isFinal: boolean) => void;
|
|
77
87
|
/**
|
|
78
88
|
* request turn on Captions
|
|
79
89
|
* @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
|
|
@@ -103,14 +113,14 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
|
|
|
103
113
|
turnOnCaptions: (spokenLanguage?: any) => undefined | Promise<void>;
|
|
104
114
|
/**
|
|
105
115
|
* Toggle transcribing for highlights
|
|
106
|
-
* @param {
|
|
116
|
+
* @param {boolean} activate true means to turn on transcribing and false means to turn off
|
|
107
117
|
* @param {string} spokenLanguage language code for spoken language
|
|
108
118
|
* @returns {Promise}
|
|
109
119
|
*/
|
|
110
120
|
toggleTranscribing: (activate: boolean, spokenLanguage?: string) => undefined | Promise<void>;
|
|
111
121
|
/**
|
|
112
122
|
* Toggle turn on manual caption
|
|
113
|
-
* @param {
|
|
123
|
+
* @param {boolean} enable true means to turn on manual caption, false means to turn off
|
|
114
124
|
* @returns {Promise}
|
|
115
125
|
*/
|
|
116
126
|
toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
|
|
@@ -72,6 +72,8 @@ interface IVoiceaChannel {
|
|
|
72
72
|
turnOnCaptions: () => undefined | Promise<void>;
|
|
73
73
|
toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
|
|
74
74
|
deregisterEvents: () => void;
|
|
75
|
+
toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
|
|
76
|
+
sendManualClosedCaption: (text: string, timeStamp: number, csis: number[], isFinal: boolean) => void;
|
|
75
77
|
}
|
|
76
78
|
type MeetingTranscripts = {
|
|
77
79
|
start_mills?: number;
|
package/dist/voicea.js
CHANGED
|
@@ -55,6 +55,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
55
55
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "vmcDeviceId", void 0);
|
|
56
56
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "announceStatus", void 0);
|
|
57
57
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "captionStatus", void 0);
|
|
58
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleManualCaptionStatus", void 0);
|
|
58
59
|
/**
|
|
59
60
|
* @param {Object} e
|
|
60
61
|
* @returns {undefined}
|
|
@@ -75,7 +76,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
75
76
|
_this.processTranscription(e.data.voiceaPayload);
|
|
76
77
|
break;
|
|
77
78
|
case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
78
|
-
case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.
|
|
79
|
+
case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:
|
|
79
80
|
_this.processManualTranscription(_objectSpread(_objectSpread({}, e.data.transcriptPayload), {}, {
|
|
80
81
|
sender: (_e$headers = e.headers) === null || _e$headers === void 0 ? void 0 : _e$headers.from,
|
|
81
82
|
data_source: e.data.relayType
|
|
@@ -275,6 +276,45 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
275
276
|
});
|
|
276
277
|
_this.seqNum += 1;
|
|
277
278
|
});
|
|
279
|
+
/**
|
|
280
|
+
* Send manual closed captions to voicea service
|
|
281
|
+
* @param {string} text
|
|
282
|
+
* @param {number} timeStamp
|
|
283
|
+
* @param {number[]} csis
|
|
284
|
+
* @param {boolean} isFinal
|
|
285
|
+
* @returns {void}
|
|
286
|
+
*/
|
|
287
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sendManualClosedCaption", function (text, timeStamp, csis, isFinal) {
|
|
288
|
+
// @ts-ignore
|
|
289
|
+
if (!_this.webex.internal.llm.isConnected()) return;
|
|
290
|
+
|
|
291
|
+
// @ts-ignore
|
|
292
|
+
_this.webex.internal.llm.socket.send({
|
|
293
|
+
id: "".concat(_this.seqNum),
|
|
294
|
+
type: 'publishRequest',
|
|
295
|
+
recipients: {
|
|
296
|
+
// @ts-ignore
|
|
297
|
+
route: _this.webex.internal.llm.getBinding()
|
|
298
|
+
},
|
|
299
|
+
headers: {},
|
|
300
|
+
data: {
|
|
301
|
+
eventType: 'relay.event',
|
|
302
|
+
relayType: _constants.AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,
|
|
303
|
+
transcriptPayload: {
|
|
304
|
+
type: isFinal ? _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT : _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,
|
|
305
|
+
id: _uuid.default.v4(),
|
|
306
|
+
transcripts: [{
|
|
307
|
+
text: text,
|
|
308
|
+
start_millis: timeStamp,
|
|
309
|
+
end_millis: timeStamp,
|
|
310
|
+
csis: csis
|
|
311
|
+
}]
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
trackingId: "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString())
|
|
315
|
+
});
|
|
316
|
+
_this.seqNum += 1;
|
|
317
|
+
});
|
|
278
318
|
/**
|
|
279
319
|
* request turn on Captions
|
|
280
320
|
* @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
|
|
@@ -370,7 +410,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
370
410
|
}());
|
|
371
411
|
/**
|
|
372
412
|
* Toggle transcribing for highlights
|
|
373
|
-
* @param {
|
|
413
|
+
* @param {boolean} activate true means to turn on transcribing and false means to turn off
|
|
374
414
|
* @param {string} spokenLanguage language code for spoken language
|
|
375
415
|
* @returns {Promise}
|
|
376
416
|
*/
|
|
@@ -395,10 +435,13 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
395
435
|
});
|
|
396
436
|
/**
|
|
397
437
|
* Toggle turn on manual caption
|
|
398
|
-
* @param {
|
|
438
|
+
* @param {boolean} enable true means to turn on manual caption, false means to turn off
|
|
399
439
|
* @returns {Promise}
|
|
400
440
|
*/
|
|
401
441
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleManualCaption", function (enable) {
|
|
442
|
+
if (_this.toggleManualCaptionStatus === _constants.TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;
|
|
443
|
+
_this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.SENDING;
|
|
444
|
+
|
|
402
445
|
// @ts-ignore
|
|
403
446
|
return _this.request({
|
|
404
447
|
method: 'PUT',
|
|
@@ -410,7 +453,11 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
410
453
|
}
|
|
411
454
|
}
|
|
412
455
|
}).then(function () {
|
|
456
|
+
_this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
413
457
|
return undefined;
|
|
458
|
+
}).catch(function () {
|
|
459
|
+
_this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
460
|
+
throw new Error('toggle manual captions fail');
|
|
414
461
|
});
|
|
415
462
|
});
|
|
416
463
|
/**
|
|
@@ -432,6 +479,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
432
479
|
_this.vmcDeviceId = undefined;
|
|
433
480
|
_this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
|
|
434
481
|
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
|
|
482
|
+
_this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
435
483
|
return _this;
|
|
436
484
|
}
|
|
437
485
|
(0, _createClass2.default)(VoiceaChannel, [{
|
|
@@ -463,6 +511,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
463
511
|
this.hasSubscribedToEvents = false;
|
|
464
512
|
this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
|
|
465
513
|
this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
|
|
514
|
+
this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
466
515
|
}
|
|
467
516
|
}]);
|
|
468
517
|
return VoiceaChannel;
|
package/dist/voicea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","VoiceaChannel","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","args","Array","_key","concat","_assertThisInitialized2","VOICEA","_e$headers","seqNum","sequenceNumber","data","relayType","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","MANUAL","CAPIONER","processManualTranscription","transcriptPayload","sender","data_source","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULT","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","source","TRANSCRIPT_INTERIM_RESULTS","NEW_CAPTION","transcript_id","TRANSCRIPT_FINAL_RESULT","map","transcript","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","csis","highlight","highlightId","highlight_id","text","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","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","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","isCaptionProcessing","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","enable","manualCaption","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n AIBRIDGE_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 AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:\n case AIBRIDGE_RELAY_TYPES.MANUAL.CAPIONER:\n this.processManualTranscription({\n ...e.data.transcriptPayload,\n sender: e.headers?.from,\n data_source: e.data.relayType,\n });\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 manual Transcript and send alert\n * @param {TranscriptionResponse} transcriptPayload\n * @returns {void}\n */\n private processManualTranscription = (transcriptPayload: TranscriptionResponse): void => {\n if (\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT ||\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT\n ) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {\n isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,\n transcriptId: transcriptPayload.id,\n transcripts: transcriptPayload.transcripts,\n sender: transcriptPayload.sender,\n source: transcriptPayload.data_source,\n });\n }\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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n });\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts.map((transcript) => {\n transcript.timestamp = millisToMinutesAndSeconds(transcript.end_millis);\n\n return transcript;\n }),\n });\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.HIGHLIGHT_CREATED, {\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 break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: false,\n text: voiceaPayload.command_response,\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {statusCode: 200});\n } else {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {\n statusCode: voiceaPayload.errorCode,\n 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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);\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: AIBRIDGE_RELAY_TYPES.VOICEA.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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});\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: AIBRIDGE_RELAY_TYPES.VOICEA.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 // @ts-ignore\n this.trigger(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 * Toggle turn on manual caption\n * @param {bool} enable if true manual caption is turned on\n * @returns {Promise}\n */\n public toggleManualCaption = (enable: 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 manualCaption: {\n enable,\n },\n },\n }).then((): undefined | Promise<void> => {\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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"}
|
|
1
|
+
{"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","VoiceaChannel","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","args","Array","_key","concat","_assertThisInitialized2","VOICEA","_e$headers","seqNum","sequenceNumber","data","relayType","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","MANUAL","CAPTIONER","processManualTranscription","transcriptPayload","sender","data_source","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULT","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","source","TRANSCRIPT_INTERIM_RESULTS","NEW_CAPTION","transcript_id","TRANSCRIPT_FINAL_RESULT","map","transcript","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","csis","highlight","highlightId","highlight_id","text","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","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","timeStamp","start_millis","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","catch","IDLE","Error","includes","isAnnounceProcessing","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","isCaptionProcessing","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","enable","toggleManualCaptionStatus","TOGGLE_MANUAL_CAPTION_STATUS","manualCaption","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n AIBRIDGE_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n TOGGLE_MANUAL_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 private toggleManualCaptionStatus: 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 AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:\n case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:\n this.processManualTranscription({\n ...e.data.transcriptPayload,\n sender: e.headers?.from,\n data_source: e.data.relayType,\n });\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 this.toggleManualCaptionStatus = TOGGLE_MANUAL_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 this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Process manual Transcript and send alert\n * @param {TranscriptionResponse} transcriptPayload\n * @returns {void}\n */\n private processManualTranscription = (transcriptPayload: TranscriptionResponse): void => {\n if (\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT ||\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT\n ) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {\n isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,\n transcriptId: transcriptPayload.id,\n transcripts: transcriptPayload.transcripts,\n sender: transcriptPayload.sender,\n source: transcriptPayload.data_source,\n });\n }\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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n });\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts.map((transcript) => {\n transcript.timestamp = millisToMinutesAndSeconds(transcript.end_millis);\n\n return transcript;\n }),\n });\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.HIGHLIGHT_CREATED, {\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 break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: false,\n text: voiceaPayload.command_response,\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {statusCode: 200});\n } else {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {\n statusCode: voiceaPayload.errorCode,\n 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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);\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: AIBRIDGE_RELAY_TYPES.VOICEA.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 // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});\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: AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Send manual closed captions to voicea service\n * @param {string} text\n * @param {number} timeStamp\n * @param {number[]} csis\n * @param {boolean} isFinal\n * @returns {void}\n */\n public sendManualClosedCaption = (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ): void => {\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) return;\n\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 eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,\n transcriptPayload: {\n type: isFinal\n ? TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT\n : TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,\n id: uuid.v4(),\n transcripts: [\n {\n text,\n start_millis: timeStamp,\n end_millis: timeStamp,\n csis,\n },\n ],\n },\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 // @ts-ignore\n this.trigger(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 {boolean} activate true means to turn on transcribing and false means to turn off\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 * Toggle turn on manual caption\n * @param {boolean} enable true means to turn on manual caption, false means to turn off\n * @returns {Promise}\n */\n public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {\n if (this.toggleManualCaptionStatus === TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;\n\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;\n\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n manualCaption: {\n enable,\n },\n },\n })\n .then((): undefined | Promise<void> => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n\n return undefined;\n })\n .catch(() => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n throw new Error('toggle manual captions fail');\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 timestamp: string;\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 id: string;\n sender: string;\n data_source: string;\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\ntype MeetingTranscripts = {\n start_mills?: number;\n end_mills?: number;\n text: string;\n last_packet_timestamp_ms?: number;\n csis: Array<number>;\n transcript_language_code: string;\n translations?: {\n [key: string]: string;\n };\n timestamp?: string;\n};\n\ntype MeetingTranscriptPayload = {\n isFinal: boolean;\n transcriptId: string;\n transcripts: Array<MeetingTranscripts>;\n};\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n MeetingTranscriptPayload,\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 timestamp: string;\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 id: string;\n sender: string;\n data_source: string;\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 toggleManualCaption: (enable: boolean) => undefined | Promise<void>;\n sendManualClosedCaption: (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ) => void;\n}\n\ntype MeetingTranscripts = {\n start_mills?: number;\n end_mills?: number;\n text: string;\n last_packet_timestamp_ms?: number;\n csis: Array<number>;\n transcript_language_code: string;\n translations?: {\n [key: string]: string;\n };\n timestamp?: string;\n};\n\ntype MeetingTranscriptPayload = {\n isFinal: boolean;\n transcriptId: string;\n transcripts: Array<MeetingTranscripts>;\n};\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n MeetingTranscriptPayload,\n};\n"],"mappings":""}
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@webex/internal-plugin-llm": "3.8.0-next.20",
|
|
18
18
|
"@webex/internal-plugin-mercury": "3.8.0-next.19",
|
|
19
|
-
"@webex/plugin-meetings": "3.8.0-next.
|
|
19
|
+
"@webex/plugin-meetings": "3.8.0-next.61",
|
|
20
20
|
"@webex/webex-core": "3.8.0-next.17",
|
|
21
21
|
"uuid": "^3.3.2"
|
|
22
22
|
},
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"test:style": "eslint ./src/**/*.*",
|
|
51
51
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
52
52
|
},
|
|
53
|
-
"version": "3.8.0-next.
|
|
53
|
+
"version": "3.8.0-next.61"
|
|
54
54
|
}
|
package/src/constants.ts
CHANGED
|
@@ -22,7 +22,7 @@ export const AIBRIDGE_RELAY_TYPES = {
|
|
|
22
22
|
},
|
|
23
23
|
MANUAL: {
|
|
24
24
|
TRANSCRIPTION: 'aibridge.manual_transcription',
|
|
25
|
-
|
|
25
|
+
CAPTIONER: 'client.manual_transcription',
|
|
26
26
|
},
|
|
27
27
|
};
|
|
28
28
|
|
|
@@ -52,3 +52,8 @@ export const TURN_ON_CAPTION_STATUS = {
|
|
|
52
52
|
ENABLED: 'enabled',
|
|
53
53
|
SENDING: 'sending',
|
|
54
54
|
};
|
|
55
|
+
|
|
56
|
+
export const TOGGLE_MANUAL_CAPTION_STATUS = {
|
|
57
|
+
IDLE: 'idle',
|
|
58
|
+
SENDING: 'sending',
|
|
59
|
+
};
|
package/src/voicea.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
VOICEA,
|
|
9
9
|
ANNOUNCE_STATUS,
|
|
10
10
|
TURN_ON_CAPTION_STATUS,
|
|
11
|
+
TOGGLE_MANUAL_CAPTION_STATUS,
|
|
11
12
|
} from './constants';
|
|
12
13
|
// eslint-disable-next-line no-unused-vars
|
|
13
14
|
import {
|
|
@@ -38,6 +39,8 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
38
39
|
|
|
39
40
|
private captionStatus: string;
|
|
40
41
|
|
|
42
|
+
private toggleManualCaptionStatus: string;
|
|
43
|
+
|
|
41
44
|
/**
|
|
42
45
|
* @param {Object} e
|
|
43
46
|
* @returns {undefined}
|
|
@@ -58,7 +61,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
58
61
|
this.processTranscription(e.data.voiceaPayload);
|
|
59
62
|
break;
|
|
60
63
|
case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
61
|
-
case AIBRIDGE_RELAY_TYPES.MANUAL.
|
|
64
|
+
case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:
|
|
62
65
|
this.processManualTranscription({
|
|
63
66
|
...e.data.transcriptPayload,
|
|
64
67
|
sender: e.headers?.from,
|
|
@@ -94,6 +97,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
94
97
|
this.hasSubscribedToEvents = false;
|
|
95
98
|
this.announceStatus = ANNOUNCE_STATUS.IDLE;
|
|
96
99
|
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
100
|
+
this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
/**
|
|
@@ -107,6 +111,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
107
111
|
this.vmcDeviceId = undefined;
|
|
108
112
|
this.announceStatus = ANNOUNCE_STATUS.IDLE;
|
|
109
113
|
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
114
|
+
this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
110
115
|
}
|
|
111
116
|
|
|
112
117
|
/**
|
|
@@ -307,6 +312,55 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
307
312
|
this.seqNum += 1;
|
|
308
313
|
};
|
|
309
314
|
|
|
315
|
+
/**
|
|
316
|
+
* Send manual closed captions to voicea service
|
|
317
|
+
* @param {string} text
|
|
318
|
+
* @param {number} timeStamp
|
|
319
|
+
* @param {number[]} csis
|
|
320
|
+
* @param {boolean} isFinal
|
|
321
|
+
* @returns {void}
|
|
322
|
+
*/
|
|
323
|
+
public sendManualClosedCaption = (
|
|
324
|
+
text: string,
|
|
325
|
+
timeStamp: number,
|
|
326
|
+
csis: number[],
|
|
327
|
+
isFinal: boolean
|
|
328
|
+
): void => {
|
|
329
|
+
// @ts-ignore
|
|
330
|
+
if (!this.webex.internal.llm.isConnected()) return;
|
|
331
|
+
|
|
332
|
+
// @ts-ignore
|
|
333
|
+
this.webex.internal.llm.socket.send({
|
|
334
|
+
id: `${this.seqNum}`,
|
|
335
|
+
type: 'publishRequest',
|
|
336
|
+
recipients: {
|
|
337
|
+
// @ts-ignore
|
|
338
|
+
route: this.webex.internal.llm.getBinding(),
|
|
339
|
+
},
|
|
340
|
+
headers: {},
|
|
341
|
+
data: {
|
|
342
|
+
eventType: 'relay.event',
|
|
343
|
+
relayType: AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,
|
|
344
|
+
transcriptPayload: {
|
|
345
|
+
type: isFinal
|
|
346
|
+
? TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT
|
|
347
|
+
: TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,
|
|
348
|
+
id: uuid.v4(),
|
|
349
|
+
transcripts: [
|
|
350
|
+
{
|
|
351
|
+
text,
|
|
352
|
+
start_millis: timeStamp,
|
|
353
|
+
end_millis: timeStamp,
|
|
354
|
+
csis,
|
|
355
|
+
},
|
|
356
|
+
],
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
|
|
360
|
+
});
|
|
361
|
+
this.seqNum += 1;
|
|
362
|
+
};
|
|
363
|
+
|
|
310
364
|
/**
|
|
311
365
|
* request turn on Captions
|
|
312
366
|
* @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
|
|
@@ -387,7 +441,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
387
441
|
|
|
388
442
|
/**
|
|
389
443
|
* Toggle transcribing for highlights
|
|
390
|
-
* @param {
|
|
444
|
+
* @param {boolean} activate true means to turn on transcribing and false means to turn off
|
|
391
445
|
* @param {string} spokenLanguage language code for spoken language
|
|
392
446
|
* @returns {Promise}
|
|
393
447
|
*/
|
|
@@ -417,10 +471,14 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
417
471
|
|
|
418
472
|
/**
|
|
419
473
|
* Toggle turn on manual caption
|
|
420
|
-
* @param {
|
|
474
|
+
* @param {boolean} enable true means to turn on manual caption, false means to turn off
|
|
421
475
|
* @returns {Promise}
|
|
422
476
|
*/
|
|
423
477
|
public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {
|
|
478
|
+
if (this.toggleManualCaptionStatus === TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;
|
|
479
|
+
|
|
480
|
+
this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;
|
|
481
|
+
|
|
424
482
|
// @ts-ignore
|
|
425
483
|
return this.request({
|
|
426
484
|
method: 'PUT',
|
|
@@ -431,9 +489,16 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
431
489
|
enable,
|
|
432
490
|
},
|
|
433
491
|
},
|
|
434
|
-
})
|
|
435
|
-
|
|
436
|
-
|
|
492
|
+
})
|
|
493
|
+
.then((): undefined | Promise<void> => {
|
|
494
|
+
this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
495
|
+
|
|
496
|
+
return undefined;
|
|
497
|
+
})
|
|
498
|
+
.catch(() => {
|
|
499
|
+
this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
500
|
+
throw new Error('toggle manual captions fail');
|
|
501
|
+
});
|
|
437
502
|
};
|
|
438
503
|
|
|
439
504
|
/**
|
package/src/voicea.types.ts
CHANGED
|
@@ -84,6 +84,13 @@ interface IVoiceaChannel {
|
|
|
84
84
|
turnOnCaptions: () => undefined | Promise<void>;
|
|
85
85
|
toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
|
|
86
86
|
deregisterEvents: () => void;
|
|
87
|
+
toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
|
|
88
|
+
sendManualClosedCaption: (
|
|
89
|
+
text: string,
|
|
90
|
+
timeStamp: number,
|
|
91
|
+
csis: number[],
|
|
92
|
+
isFinal: boolean
|
|
93
|
+
) => void;
|
|
87
94
|
}
|
|
88
95
|
|
|
89
96
|
type MeetingTranscripts = {
|
package/test/unit/spec/voicea.js
CHANGED
|
@@ -7,7 +7,7 @@ import Mercury from '@webex/internal-plugin-mercury';
|
|
|
7
7
|
import LLMChannel from '@webex/internal-plugin-llm';
|
|
8
8
|
|
|
9
9
|
import VoiceaService from '../../../src/index';
|
|
10
|
-
import {EVENT_TRIGGERS} from '../../../src/constants';
|
|
10
|
+
import {EVENT_TRIGGERS, TOGGLE_MANUAL_CAPTION_STATUS} from '../../../src/constants';
|
|
11
11
|
|
|
12
12
|
describe('plugin-voicea', () => {
|
|
13
13
|
const locusUrl = 'locusUrl';
|
|
@@ -91,6 +91,103 @@ describe('plugin-voicea', () => {
|
|
|
91
91
|
});
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
+
describe('#sendManualClosedCaption', () => {
|
|
95
|
+
beforeEach(async () => {
|
|
96
|
+
const mockWebSocket = new MockWebSocket();
|
|
97
|
+
voiceaService.webex.internal.llm.socket = mockWebSocket;
|
|
98
|
+
voiceaService.seqNum = 1;
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('sends interim manual closed caption when connected', () => {
|
|
102
|
+
const text = 'Test interim caption';
|
|
103
|
+
const timeStamp = 1234567890;
|
|
104
|
+
const csis = [123456];
|
|
105
|
+
const isFinal = false;
|
|
106
|
+
|
|
107
|
+
voiceaService.sendManualClosedCaption(text, timeStamp, csis, isFinal);
|
|
108
|
+
|
|
109
|
+
assert.calledOnceWithExactly(
|
|
110
|
+
voiceaService.webex.internal.llm.socket.send,
|
|
111
|
+
{
|
|
112
|
+
id: '1',
|
|
113
|
+
type: 'publishRequest',
|
|
114
|
+
recipients: {route: undefined},
|
|
115
|
+
headers: {},
|
|
116
|
+
data: {
|
|
117
|
+
eventType: 'relay.event',
|
|
118
|
+
relayType: 'client.manual_transcription',
|
|
119
|
+
transcriptPayload: {
|
|
120
|
+
type: 'manual_caption_interim_result',
|
|
121
|
+
id: sinon.match.string,
|
|
122
|
+
transcripts: [
|
|
123
|
+
{
|
|
124
|
+
text: 'Test interim caption',
|
|
125
|
+
start_millis: 1234567890,
|
|
126
|
+
end_millis: 1234567890,
|
|
127
|
+
csis: [123456],
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
trackingId: sinon.match.string,
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
// seqNum should increment
|
|
136
|
+
assert.equal(voiceaService.seqNum, 2);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('sends final manual closed caption when connected', () => {
|
|
140
|
+
const text = 'Test final caption';
|
|
141
|
+
const timeStamp = 9876543210;
|
|
142
|
+
const csis = [654321];
|
|
143
|
+
const isFinal = true;
|
|
144
|
+
|
|
145
|
+
voiceaService.sendManualClosedCaption(text, timeStamp, csis, isFinal);
|
|
146
|
+
|
|
147
|
+
assert.calledOnceWithExactly(
|
|
148
|
+
voiceaService.webex.internal.llm.socket.send,
|
|
149
|
+
{
|
|
150
|
+
id: '1',
|
|
151
|
+
type: 'publishRequest',
|
|
152
|
+
recipients: {route: undefined},
|
|
153
|
+
headers: {},
|
|
154
|
+
data: {
|
|
155
|
+
eventType: 'relay.event',
|
|
156
|
+
relayType: 'client.manual_transcription',
|
|
157
|
+
transcriptPayload: {
|
|
158
|
+
type: 'manual_caption_final_result',
|
|
159
|
+
id: sinon.match.string,
|
|
160
|
+
transcripts: [
|
|
161
|
+
{
|
|
162
|
+
text: 'Test final caption',
|
|
163
|
+
start_millis: 9876543210,
|
|
164
|
+
end_millis: 9876543210,
|
|
165
|
+
csis: [654321],
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
trackingId: sinon.match.string,
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
// seqNum should increment
|
|
174
|
+
assert.equal(voiceaService.seqNum, 2);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('does not send if not connected', () => {
|
|
178
|
+
voiceaService.webex.internal.llm.isConnected.returns(false);
|
|
179
|
+
|
|
180
|
+
const text = 'Should not send';
|
|
181
|
+
const timeStamp = 111;
|
|
182
|
+
const csis = [1];
|
|
183
|
+
const isFinal = true;
|
|
184
|
+
|
|
185
|
+
voiceaService.sendManualClosedCaption(text, timeStamp, csis, isFinal);
|
|
186
|
+
|
|
187
|
+
assert.notCalled(voiceaService.webex.internal.llm.socket.send);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
94
191
|
describe('#deregisterEvents', () => {
|
|
95
192
|
beforeEach(async () => {
|
|
96
193
|
const mockWebSocket = new MockWebSocket();
|
|
@@ -441,20 +538,10 @@ describe('plugin-voicea', () => {
|
|
|
441
538
|
const mockWebSocket = new MockWebSocket();
|
|
442
539
|
|
|
443
540
|
voiceaService.webex.internal.llm.socket = mockWebSocket;
|
|
541
|
+
voiceaService.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
|
|
444
542
|
});
|
|
445
543
|
|
|
446
544
|
it('turns on manual caption', async () => {
|
|
447
|
-
// Turn on captions
|
|
448
|
-
await voiceaService.turnOnCaptions();
|
|
449
|
-
|
|
450
|
-
// eslint-disable-next-line no-underscore-dangle
|
|
451
|
-
voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
452
|
-
headers: {from: 'ws'},
|
|
453
|
-
data: {relayType: 'voicea.annc', voiceaPayload: {}},
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
voiceaService.listenToEvents();
|
|
457
|
-
|
|
458
545
|
await voiceaService.toggleManualCaption(true);
|
|
459
546
|
sinon.assert.calledWith(
|
|
460
547
|
voiceaService.request,
|
|
@@ -469,10 +556,6 @@ describe('plugin-voicea', () => {
|
|
|
469
556
|
|
|
470
557
|
|
|
471
558
|
it('turns off manual caption', async () => {
|
|
472
|
-
await voiceaService.toggleManualCaption(true);
|
|
473
|
-
|
|
474
|
-
voiceaService.listenToEvents();
|
|
475
|
-
|
|
476
559
|
await voiceaService.toggleManualCaption(false);
|
|
477
560
|
sinon.assert.calledWith(
|
|
478
561
|
voiceaService.request,
|
|
@@ -484,6 +567,14 @@ describe('plugin-voicea', () => {
|
|
|
484
567
|
);
|
|
485
568
|
|
|
486
569
|
});
|
|
570
|
+
|
|
571
|
+
it('ignore toggle manual caption', async () => {
|
|
572
|
+
voiceaService.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;
|
|
573
|
+
await voiceaService.toggleManualCaption(true);
|
|
574
|
+
|
|
575
|
+
sinon.assert.notCalled(voiceaService.request);
|
|
576
|
+
|
|
577
|
+
});
|
|
487
578
|
});
|
|
488
579
|
|
|
489
580
|
describe('#processCaptionLanguageResponse', () => {
|
|
@@ -931,3 +1022,4 @@ describe('plugin-voicea', () => {
|
|
|
931
1022
|
});
|
|
932
1023
|
});
|
|
933
1024
|
});
|
|
1025
|
+
|