@webex/internal-plugin-voicea 3.8.0 → 3.8.1-next.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/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.DEFAULT_SPOKEN_LANGUAGE = 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',
@@ -26,7 +26,8 @@ var AIBRIDGE_RELAY_TYPES = exports.AIBRIDGE_RELAY_TYPES = {
26
26
  TRANSCRIPTION: 'voicea.transcription'
27
27
  },
28
28
  MANUAL: {
29
- TRANSCRIPTION: 'aibridge.manual_transcription'
29
+ TRANSCRIPTION: 'aibridge.manual_transcription',
30
+ CAPTIONER: 'client.manual_transcription'
30
31
  }
31
32
  };
32
33
  var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
@@ -38,9 +39,11 @@ var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
38
39
  TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
39
40
  TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',
40
41
  MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',
42
+ MANUAL_CAPTION_INTERIM_RESULT: 'manual_caption_interim_result',
41
43
  MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result'
42
44
  };
43
45
  var VOICEA = exports.VOICEA = 'voicea';
46
+ var DEFAULT_SPOKEN_LANGUAGE = exports.DEFAULT_SPOKEN_LANGUAGE = 'en';
44
47
  var ANNOUNCE_STATUS = exports.ANNOUNCE_STATUS = {
45
48
  IDLE: 'idle',
46
49
  JOINED: 'joined',
@@ -51,4 +54,8 @@ var TURN_ON_CAPTION_STATUS = exports.TURN_ON_CAPTION_STATUS = {
51
54
  ENABLED: 'enabled',
52
55
  SENDING: 'sending'
53
56
  };
57
+ var TOGGLE_MANUAL_CAPTION_STATUS = exports.TOGGLE_MANUAL_CAPTION_STATUS = {
58
+ IDLE: 'idle',
59
+ SENDING: 'sending'
60
+ };
54
61
  //# sourceMappingURL=constants.js.map
@@ -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","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULTS","MANUAL_CAPTION_FINAL_RESULT","ANNOUNCE_STATUS","IDLE","JOINED","JOINING","TURN_ON_CAPTION_STATUS","ENABLED","SENDING"],"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 },\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_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"],"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;EACjB;AACF,CAAC;AAEM,IAAME,kBAAkB,GAAAnB,OAAA,CAAAmB,kBAAA,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE,YAAY;EACxBd,iBAAiB,EAAE,mBAAmB;EACtCe,0BAA0B,EAAE,4BAA4B;EACxDC,uBAAuB,EAAE,yBAAyB;EAClDC,8BAA8B,EAAE,gCAAgC;EAChEC,2BAA2B,EAAE;AAC/B,CAAC;AAEM,IAAMf,MAAM,GAAAZ,OAAA,CAAAY,MAAA,GAAG,QAAQ;AAEvB,IAAMgB,eAAe,GAAA5B,OAAA,CAAA4B,eAAA,GAAG;EAC7BC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,sBAAsB,GAAAhC,OAAA,CAAAgC,sBAAA,GAAG;EACpCH,IAAI,EAAE,MAAM;EACZI,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAAC"}
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","DEFAULT_SPOKEN_LANGUAGE","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';\nexport const DEFAULT_SPOKEN_LANGUAGE = 'en';\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;AACvB,IAAMkB,uBAAuB,GAAA9B,OAAA,CAAA8B,uBAAA,GAAG,IAAI;AAEpC,IAAMC,eAAe,GAAA/B,OAAA,CAAA+B,eAAA,GAAG;EAC7BC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,sBAAsB,GAAAnC,OAAA,CAAAmC,sBAAA,GAAG;EACpCH,IAAI,EAAE,MAAM;EACZI,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,4BAA4B,GAAAtC,OAAA,CAAAsC,4BAAA,GAAG;EAC1CN,IAAI,EAAE,MAAM;EACZK,OAAO,EAAE;AACX,CAAC"}
@@ -20,6 +20,7 @@ export declare const AIBRIDGE_RELAY_TYPES: {
20
20
  };
21
21
  MANUAL: {
22
22
  TRANSCRIPTION: string;
23
+ CAPTIONER: string;
23
24
  };
24
25
  };
25
26
  export declare const TRANSCRIPTION_TYPE: {
@@ -31,9 +32,11 @@ export declare const TRANSCRIPTION_TYPE: {
31
32
  TRANSCRIPT_INTERIM_RESULTS: string;
32
33
  TRANSCRIPT_FINAL_RESULT: string;
33
34
  MANUAL_CAPTION_INTERIM_RESULTS: string;
35
+ MANUAL_CAPTION_INTERIM_RESULT: string;
34
36
  MANUAL_CAPTION_FINAL_RESULT: string;
35
37
  };
36
38
  export declare const VOICEA = "voicea";
39
+ export declare const DEFAULT_SPOKEN_LANGUAGE = "en";
37
40
  export declare const ANNOUNCE_STATUS: {
38
41
  IDLE: string;
39
42
  JOINED: string;
@@ -44,3 +47,7 @@ export declare const TURN_ON_CAPTION_STATUS: {
44
47
  ENABLED: string;
45
48
  SENDING: string;
46
49
  };
50
+ export declare const TOGGLE_MANUAL_CAPTION_STATUS: {
51
+ IDLE: string;
52
+ SENDING: string;
53
+ };
@@ -13,6 +13,8 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
13
13
  private vmcDeviceId?;
14
14
  private announceStatus;
15
15
  private captionStatus;
16
+ private toggleManualCaptionStatus;
17
+ private currentSpokenLanguage?;
16
18
  /**
17
19
  * @param {Object} e
18
20
  * @returns {undefined}
@@ -74,6 +76,15 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
74
76
  * @returns {void}
75
77
  */
76
78
  requestLanguage: (languageCode: string) => void;
79
+ /**
80
+ * Send manual closed captions to voicea service
81
+ * @param {string} text
82
+ * @param {number} timeStamp
83
+ * @param {number[]} csis
84
+ * @param {boolean} isFinal
85
+ * @returns {void}
86
+ */
87
+ sendManualClosedCaption: (text: string, timeStamp: number, csis: number[], isFinal: boolean) => void;
77
88
  /**
78
89
  * request turn on Captions
79
90
  * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
@@ -103,17 +114,23 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
103
114
  turnOnCaptions: (spokenLanguage?: any) => undefined | Promise<void>;
104
115
  /**
105
116
  * Toggle transcribing for highlights
106
- * @param {bool} activate if true transcribing is turned on
117
+ * @param {boolean} activate true means to turn on transcribing and false means to turn off
107
118
  * @param {string} spokenLanguage language code for spoken language
108
119
  * @returns {Promise}
109
120
  */
110
121
  toggleTranscribing: (activate: boolean, spokenLanguage?: string) => undefined | Promise<void>;
111
122
  /**
112
123
  * Toggle turn on manual caption
113
- * @param {bool} enable if true manual caption is turned on
124
+ * @param {boolean} enable true means to turn on manual caption, false means to turn off
114
125
  * @returns {Promise}
115
126
  */
116
127
  toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
128
+ /**
129
+ * In meeting Spoken Language changed event
130
+ * @param {string} languageCode
131
+ * @returns {void}
132
+ */
133
+ onSpokenLanguageUpdate: (languageCode: string) => void;
117
134
  /**
118
135
  * get caption status
119
136
  * @returns {string}
@@ -10,7 +10,7 @@ interface AnnouncementPayload {
10
10
  spoken_languages: string[];
11
11
  };
12
12
  }
13
- type TRANSCRIPTION_TYPES = 'unknown' | 'eva_wake' | 'eva_thanks' | 'eva_cancel' | 'highlight_created' | 'transcript_interim_results' | 'transcript_final_result';
13
+ type TRANSCRIPTION_TYPES = 'unknown' | 'eva_wake' | 'eva_thanks' | 'eva_cancel' | 'highlight_created' | 'transcript_interim_results' | 'transcript_final_result' | 'manual_caption_interim_results' | 'manual_caption_interim_result' | 'manual_caption_final_result';
14
14
  /**
15
15
  * Class for an Transcription Object
16
16
  */
@@ -44,6 +44,8 @@ interface Highlight {
44
44
  interface TranscriptionResponse {
45
45
  type: TRANSCRIPTION_TYPES;
46
46
  id: string;
47
+ sender: string;
48
+ data_source: string;
47
49
  transcript_id: string;
48
50
  translations?: {
49
51
  [x: string]: string;
@@ -66,10 +68,13 @@ interface CaptionLanguageResponse {
66
68
  }
67
69
  interface IVoiceaChannel {
68
70
  setSpokenLanguage: (languageCode: string) => Promise<void>;
71
+ onSpokenLanguageUpdate: (languageCode: string) => void;
69
72
  requestLanguage: (languageCode: string) => void;
70
73
  turnOnCaptions: () => undefined | Promise<void>;
71
74
  toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
72
75
  deregisterEvents: () => void;
76
+ toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
77
+ sendManualClosedCaption: (text: string, timeStamp: number, csis: number[], isFinal: boolean) => void;
73
78
  }
74
79
  type MeetingTranscripts = {
75
80
  start_mills?: number;
package/dist/voicea.js CHANGED
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Object$keys = require("@babel/runtime-corejs2/core-js/object/keys");
5
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
7
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
8
+ var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
4
9
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
10
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
11
  _Object$defineProperty(exports, "__esModule", {
@@ -20,6 +25,8 @@ var _uuid = _interopRequireDefault(require("uuid"));
20
25
  var _webexCore = require("@webex/webex-core");
21
26
  var _constants = require("./constants");
22
27
  var _utils = require("./utils");
28
+ function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
29
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
23
30
  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); }; }
24
31
  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; } } // eslint-disable-next-line no-unused-vars
25
32
  /**
@@ -48,11 +55,14 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
48
55
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "vmcDeviceId", void 0);
49
56
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "announceStatus", void 0);
50
57
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "captionStatus", void 0);
58
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleManualCaptionStatus", void 0);
59
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "currentSpokenLanguage", void 0);
51
60
  /**
52
61
  * @param {Object} e
53
62
  * @returns {undefined}
54
63
  */
55
64
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "eventProcessor", function (e) {
65
+ var _e$headers;
56
66
  _this.seqNum = e.sequenceNumber + 1;
57
67
  switch (e.data.relayType) {
58
68
  case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:
@@ -67,7 +77,11 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
67
77
  _this.processTranscription(e.data.voiceaPayload);
68
78
  break;
69
79
  case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
70
- _this.processManualTranscription(e.data.transcriptPayload);
80
+ case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:
81
+ _this.processManualTranscription(_objectSpread(_objectSpread({}, e.data.transcriptPayload), {}, {
82
+ sender: (_e$headers = e.headers) === null || _e$headers === void 0 ? void 0 : _e$headers.from,
83
+ data_source: e.data.relayType
84
+ }));
71
85
  break;
72
86
  default:
73
87
  break;
@@ -79,18 +93,15 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
79
93
  * @returns {void}
80
94
  */
81
95
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "processManualTranscription", function (transcriptPayload) {
82
- switch (transcriptPayload.type) {
83
- case _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT:
84
- case _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULTS:
85
- // @ts-ignore
86
- _this.trigger(_constants.EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {
87
- isFinal: transcriptPayload.type === _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,
88
- transcriptId: transcriptPayload.id,
89
- transcripts: transcriptPayload.transcripts
90
- });
91
- break;
92
- default:
93
- break;
96
+ if (transcriptPayload.type === _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT || transcriptPayload.type === _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT) {
97
+ // @ts-ignore
98
+ _this.trigger(_constants.EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {
99
+ isFinal: transcriptPayload.type === _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,
100
+ transcriptId: transcriptPayload.id,
101
+ transcripts: transcriptPayload.transcripts,
102
+ sender: transcriptPayload.sender,
103
+ source: transcriptPayload.data_source
104
+ });
94
105
  }
95
106
  });
96
107
  /**
@@ -177,7 +188,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
177
188
  var voiceaLanguageOptions = {
178
189
  captionLanguages: (_voiceaPayload$transl = voiceaPayload === null || voiceaPayload === void 0 ? void 0 : (_voiceaPayload$transl2 = voiceaPayload.translation) === null || _voiceaPayload$transl2 === void 0 ? void 0 : _voiceaPayload$transl2.allowed_languages) !== null && _voiceaPayload$transl !== void 0 ? _voiceaPayload$transl : [],
179
190
  maxLanguages: (_voiceaPayload$transl3 = voiceaPayload === null || voiceaPayload === void 0 ? void 0 : (_voiceaPayload$transl4 = voiceaPayload.translation) === null || _voiceaPayload$transl4 === void 0 ? void 0 : _voiceaPayload$transl4.max_languages) !== null && _voiceaPayload$transl3 !== void 0 ? _voiceaPayload$transl3 : 0,
180
- spokenLanguages: (_voiceaPayload$ASR$sp = voiceaPayload === null || voiceaPayload === void 0 ? void 0 : (_voiceaPayload$ASR = voiceaPayload.ASR) === null || _voiceaPayload$ASR === void 0 ? void 0 : _voiceaPayload$ASR.spoken_languages) !== null && _voiceaPayload$ASR$sp !== void 0 ? _voiceaPayload$ASR$sp : []
191
+ spokenLanguages: (_voiceaPayload$ASR$sp = voiceaPayload === null || voiceaPayload === void 0 ? void 0 : (_voiceaPayload$ASR = voiceaPayload.ASR) === null || _voiceaPayload$ASR === void 0 ? void 0 : _voiceaPayload$ASR.spoken_languages) !== null && _voiceaPayload$ASR$sp !== void 0 ? _voiceaPayload$ASR$sp : [],
192
+ currentSpokenLanguage: _this.currentSpokenLanguage
181
193
  };
182
194
 
183
195
  // @ts-ignore
@@ -266,6 +278,45 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
266
278
  });
267
279
  _this.seqNum += 1;
268
280
  });
281
+ /**
282
+ * Send manual closed captions to voicea service
283
+ * @param {string} text
284
+ * @param {number} timeStamp
285
+ * @param {number[]} csis
286
+ * @param {boolean} isFinal
287
+ * @returns {void}
288
+ */
289
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sendManualClosedCaption", function (text, timeStamp, csis, isFinal) {
290
+ // @ts-ignore
291
+ if (!_this.webex.internal.llm.isConnected()) return;
292
+
293
+ // @ts-ignore
294
+ _this.webex.internal.llm.socket.send({
295
+ id: "".concat(_this.seqNum),
296
+ type: 'publishRequest',
297
+ recipients: {
298
+ // @ts-ignore
299
+ route: _this.webex.internal.llm.getBinding()
300
+ },
301
+ headers: {},
302
+ data: {
303
+ eventType: 'relay.event',
304
+ relayType: _constants.AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,
305
+ transcriptPayload: {
306
+ type: isFinal ? _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT : _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,
307
+ id: _uuid.default.v4(),
308
+ transcripts: [{
309
+ text: text,
310
+ start_millis: timeStamp,
311
+ end_millis: timeStamp,
312
+ csis: csis
313
+ }]
314
+ }
315
+ },
316
+ trackingId: "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString())
317
+ });
318
+ _this.seqNum += 1;
319
+ });
269
320
  /**
270
321
  * request turn on Captions
271
322
  * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
@@ -361,7 +412,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
361
412
  }());
362
413
  /**
363
414
  * Toggle transcribing for highlights
364
- * @param {bool} activate if true transcribing is turned on
415
+ * @param {boolean} activate true means to turn on transcribing and false means to turn off
365
416
  * @param {string} spokenLanguage language code for spoken language
366
417
  * @returns {Promise}
367
418
  */
@@ -386,10 +437,13 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
386
437
  });
387
438
  /**
388
439
  * Toggle turn on manual caption
389
- * @param {bool} enable if true manual caption is turned on
440
+ * @param {boolean} enable true means to turn on manual caption, false means to turn off
390
441
  * @returns {Promise}
391
442
  */
392
443
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleManualCaption", function (enable) {
444
+ if (_this.toggleManualCaptionStatus === _constants.TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;
445
+ _this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.SENDING;
446
+
393
447
  // @ts-ignore
394
448
  return _this.request({
395
449
  method: 'PUT',
@@ -401,8 +455,24 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
401
455
  }
402
456
  }
403
457
  }).then(function () {
458
+ _this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
404
459
  return undefined;
460
+ }).catch(function () {
461
+ _this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
462
+ throw new Error('toggle manual captions fail');
463
+ });
464
+ });
465
+ /**
466
+ * In meeting Spoken Language changed event
467
+ * @param {string} languageCode
468
+ * @returns {void}
469
+ */
470
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSpokenLanguageUpdate", function (languageCode) {
471
+ // @ts-ignore
472
+ _this.trigger(_constants.EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {
473
+ languageCode: languageCode
405
474
  });
475
+ _this.currentSpokenLanguage = languageCode;
406
476
  });
407
477
  /**
408
478
  * get caption status
@@ -423,6 +493,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
423
493
  _this.vmcDeviceId = undefined;
424
494
  _this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
425
495
  _this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
496
+ _this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
497
+ _this.currentSpokenLanguage = _constants.DEFAULT_SPOKEN_LANGUAGE;
426
498
  return _this;
427
499
  }
428
500
  (0, _createClass2.default)(VoiceaChannel, [{
@@ -454,6 +526,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
454
526
  this.hasSubscribedToEvents = false;
455
527
  this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
456
528
  this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
529
+ this.toggleManualCaptionStatus = _constants.TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
530
+ this.currentSpokenLanguage = undefined;
457
531
  }
458
532
  }]);
459
533
  return VoiceaChannel;
@@ -1 +1 @@
1
- {"version":3,"names":["_uuid","_interopRequireDefault","require","_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","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","MANUAL","processManualTranscription","transcriptPayload","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULTS","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","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 this.processManualTranscription(e.data.transcriptPayload);\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 switch (transcriptPayload.type) {\n case TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT:\n case TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULTS:\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 });\n break;\n\n default:\n break;\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":";;;;;;;;;;;;;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAeA,IAAAG,MAAA,GAAAH,OAAA;AAAkD,SAAAI,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAC,OAAA,EAAAN,OAAA,GAAAO,MAAA,MAAAN,yBAAA,QAAAO,SAAA,OAAAH,gBAAA,CAAAC,OAAA,QAAAG,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAN,KAAA,EAAAO,SAAA,EAAAH,SAAA,YAAAD,MAAA,GAAAH,KAAA,CAAAQ,KAAA,OAAAD,SAAA,gBAAAE,2BAAA,CAAAP,OAAA,QAAAC,MAAA;AAAA,SAAAL,0BAAA,eAAAY,OAAA,qBAAAJ,kBAAA,oBAAAA,kBAAA,CAAAK,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAV,kBAAA,CAAAO,OAAA,8CAAAI,CAAA,sBAPlD;AASA;AACA;AACA;AACA;AACA;AAJA,IAKaC,aAAa,GAAAC,OAAA,CAAAD,aAAA,0BAAAE,YAAA;EAAA,IAAAC,UAAA,CAAAnB,OAAA,EAAAgB,aAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAA3B,YAAA,CAAAuB,aAAA;EAoExB;AACF;AACA;AACA;EACE,SAAAA,cAAA,EAAqB;IAAA,IAAAK,KAAA;IAAA,IAAAC,gBAAA,CAAAtB,OAAA,QAAAgB,aAAA;IAAA,SAAAO,IAAA,GAAAlB,SAAA,CAAAmB,MAAA,EAANC,IAAI,OAAAC,KAAA,CAAAH,IAAA,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAAtB,SAAA,CAAAsB,IAAA;IAAA;IACjBN,KAAA,GAAAD,MAAA,CAAAN,IAAA,CAAAR,KAAA,CAAAc,MAAA,SAAAQ,MAAA,CAASH,IAAI;IAAE,IAAAI,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,gBAxELU,iBAAM;IAAA,IAAAF,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,4BAMc,KAAK;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAQrC;AACF;AACA;AACA;IAHE,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,qBAKyB,UAACN,CAAC,EAAK;MAC9BM,KAAA,CAAKW,MAAM,GAAGjB,CAAC,CAACkB,cAAc,GAAG,CAAC;MAClC,QAAQlB,CAAC,CAACmB,IAAI,CAACC,SAAS;QACtB,KAAKC,+BAAoB,CAACL,MAAM,CAACM,YAAY;UAC3ChB,KAAA,CAAKiB,WAAW,GAAGvB,CAAC,CAACwB,OAAO,CAACC,IAAI;UACjCnB,KAAA,CAAKoB,cAAc,GAAGC,0BAAe,CAACC,MAAM;UAC5CtB,KAAA,CAAKuB,0BAA0B,CAAC7B,CAAC,CAACmB,IAAI,CAACW,aAAa,CAAC;UACrD;QACF,KAAKT,+BAAoB,CAACL,MAAM,CAACe,oBAAoB;UACnDzB,KAAA,CAAK0B,8BAA8B,CAAChC,CAAC,CAACmB,IAAI,CAACW,aAAa,CAAC;UACzD;QACF,KAAKT,+BAAoB,CAACL,MAAM,CAACiB,aAAa;UAC5C3B,KAAA,CAAK4B,oBAAoB,CAAClC,CAAC,CAACmB,IAAI,CAACW,aAAa,CAAC;UAC/C;QACF,KAAKT,+BAAoB,CAACc,MAAM,CAACF,aAAa;UAC5C3B,KAAA,CAAK8B,0BAA0B,CAACpC,CAAC,CAACmB,IAAI,CAACkB,iBAAiB,CAAC;UACzD;QACF;UACE;MACJ;IACF,CAAC;IAyCD;AACF;AACA;AACA;AACA;IAJE,IAAAvB,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,iCAKqC,UAAC+B,iBAAwC,EAAW;MACvF,QAAQA,iBAAiB,CAACC,IAAI;QAC5B,KAAKC,6BAAkB,CAACC,2BAA2B;QACnD,KAAKD,6BAAkB,CAACE,8BAA8B;UACpD;UACAnC,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACC,kBAAkB,EAAE;YAC9CC,OAAO,EAAER,iBAAiB,CAACC,IAAI,KAAKC,6BAAkB,CAACC,2BAA2B;YAClFM,YAAY,EAAET,iBAAiB,CAACU,EAAE;YAClCC,WAAW,EAAEX,iBAAiB,CAACW;UACjC,CAAC,CAAC;UACF;QAEF;UACE;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAlC,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,2BAK+B,UAACwB,aAAoC,EAAW;MAC7E,QAAQA,aAAa,CAACQ,IAAI;QACxB,KAAKC,6BAAkB,CAACU,0BAA0B;UAChD;UACA3C,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACO,WAAW,EAAE;YACvCL,OAAO,EAAE,KAAK;YACdC,YAAY,EAAEhB,aAAa,CAACqB,aAAa;YACzCH,WAAW,EAAElB,aAAa,CAACkB;UAC7B,CAAC,CAAC;UACF;QAEF,KAAKT,6BAAkB,CAACa,uBAAuB;UAC7C;UACA9C,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACO,WAAW,EAAE;YACvCL,OAAO,EAAE,IAAI;YACbC,YAAY,EAAEhB,aAAa,CAACqB,aAAa;YACzCH,WAAW,EAAElB,aAAa,CAACkB,WAAW,CAACK,GAAG,CAAC,UAACC,UAAU,EAAK;cACzDA,UAAU,CAACC,SAAS,GAAG,IAAAC,gCAAyB,EAACF,UAAU,CAACG,UAAU,CAAC;cAEvE,OAAOH,UAAU;YACnB,CAAC;UACH,CAAC,CAAC;UACF;QAEF,KAAKf,6BAAkB,CAACmB,iBAAiB;UACvC;UACApD,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACe,iBAAiB,EAAE;YAC7CC,IAAI,EAAE7B,aAAa,CAAC8B,SAAS,CAACD,IAAI;YAClCE,WAAW,EAAE/B,aAAa,CAAC8B,SAAS,CAACE,YAAY;YACjDC,IAAI,EAAEjC,aAAa,CAAC8B,SAAS,CAACN,UAAU;YACxCU,cAAc,EAAElC,aAAa,CAAC8B,SAAS,CAACK,eAAe;YACvDC,eAAe,EAAEpC,aAAa,CAAC8B,SAAS,CAACO,gBAAgB;YACzDZ,SAAS,EAAE,IAAAC,gCAAyB,EAAC1B,aAAa,CAAC8B,SAAS,CAACH,UAAU;UACzE,CAAC,CAAC;UACF;QAEF,KAAKlB,6BAAkB,CAAC6B,UAAU;UAChC;UACA9D,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAAC0B,WAAW,EAAE;YACvCC,WAAW,EAAE,KAAK;YAClBP,IAAI,EAAEjC,aAAa,CAACyC;UACtB,CAAC,CAAC;UACF;QAEF,KAAKhC,6BAAkB,CAACiC,QAAQ;QAChC,KAAKjC,6BAAkB,CAACkC,UAAU;UAChC;UACAnE,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAAC0B,WAAW,EAAE;YACvCC,WAAW,EAAExC,aAAa,CAACQ,IAAI,KAAKC,6BAAkB,CAACiC;UACzD,CAAC,CAAC;UACF;QAEF;UACE;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA1D,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,qCAKyC,UAACwB,aAAsC,EAAW;MACzF,IAAIA,aAAa,CAAC4C,UAAU,KAAK,GAAG,EAAE;QACpC;QACApE,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACgC,uBAAuB,EAAE;UAACD,UAAU,EAAE;QAAG,CAAC,CAAC;MACzE,CAAC,MAAM;QACL;QACApE,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACgC,uBAAuB,EAAE;UACnDD,UAAU,EAAE5C,aAAa,CAAC8C,SAAS;UACnCC,YAAY,EAAE/C,aAAa,CAACgD;QAC9B,CAAC,CAAC;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAhE,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,iCAKqC,UAACwB,aAAkC,EAAW;MAAA,IAAAiD,qBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,kBAAA;MACjF,IAAMC,qBAAqB,GAAG;QAC5BC,gBAAgB,GAAAP,qBAAA,GAAEjD,aAAa,aAAbA,aAAa,wBAAAkD,sBAAA,GAAblD,aAAa,CAAEyD,WAAW,cAAAP,sBAAA,uBAA1BA,sBAAA,CAA4BQ,iBAAiB,cAAAT,qBAAA,cAAAA,qBAAA,GAAI,EAAE;QACrEU,YAAY,GAAAR,sBAAA,GAAEnD,aAAa,aAAbA,aAAa,wBAAAoD,sBAAA,GAAbpD,aAAa,CAAEyD,WAAW,cAAAL,sBAAA,uBAA1BA,sBAAA,CAA4BQ,aAAa,cAAAT,sBAAA,cAAAA,sBAAA,GAAI,CAAC;QAC5DU,eAAe,GAAAR,qBAAA,GAAErD,aAAa,aAAbA,aAAa,wBAAAsD,kBAAA,GAAbtD,aAAa,CAAE8D,GAAG,cAAAR,kBAAA,uBAAlBA,kBAAA,CAAoBS,gBAAgB,cAAAV,qBAAA,cAAAA,qBAAA,GAAI;MAC3D,CAAC;;MAED;MACA7E,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACmD,mBAAmB,EAAET,qBAAqB,CAAC;IACzE,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAAvE,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,uBAI2B,YAAY;MACrCA,KAAA,CAAKoB,cAAc,GAAGC,0BAAe,CAACoE,OAAO;MAC7CzF,KAAA,CAAK0F,cAAc,CAAC,CAAC;MACrB;MACA1F,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACC,MAAM,CAACC,IAAI,CAAC;QAClCtD,EAAE,KAAAlC,MAAA,CAAKP,KAAA,CAAKW,MAAM,CAAE;QACpBqB,IAAI,EAAE,gBAAgB;QACtBgE,UAAU,EAAE;UACV;UACAC,KAAK,EAAEjG,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACK,UAAU,CAAC;QAC5C,CAAC;QACDhF,OAAO,EAAE,CAAC,CAAC;QACXL,IAAI,EAAE;UACJsF,aAAa,EAAE;YACbC,OAAO,EAAE;UACX,CAAC;UACDC,SAAS,EAAE,aAAa;UACxBvF,SAAS,EAAEC,+BAAoB,CAACL,MAAM,CAAC4F;QACzC,CAAC;QACDC,UAAU,KAAAhG,MAAA,CAAKiG,iBAAM,CAACC,gBAAgB,OAAAlG,MAAA,CAAImG,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;MAChE,CAAC,CAAC;MACF5G,KAAA,CAAKW,MAAM,IAAI,CAAC;IAClB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,wBAK2B,UAAC6G,YAAoB;MAAA;QAC9C;QACA7G,KAAA,CAAK8G,OAAO,CAAC;UACXC,MAAM,EAAE,KAAK;UACb;UACAC,GAAG,KAAAzG,MAAA,CAAKP,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;UACzDC,IAAI,EAAE;YACJC,UAAU,EAAE;cACVC,cAAc,EAAEP;YAClB;UACF;QACF,CAAC,CAAC,CAACQ,IAAI,CAAC,YAAM;UACZ;UACArH,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACiF,sBAAsB,EAAE;YAACT,YAAY,EAAZA;UAAY,CAAC,CAAC;QACrE,CAAC;MAAC;IAAA;IAEJ;AACF;AACA;AACA;AACA;IAJE,IAAArG,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,sBAKyB,UAAC6G,YAAoB,EAAW;MACvD;MACA,IAAI,CAAC7G,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0B,WAAW,CAAC,CAAC,EAAE;MAC5C;MACAvH,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACC,MAAM,CAACC,IAAI,CAAC;QAClCtD,EAAE,KAAAlC,MAAA,CAAKP,KAAA,CAAKW,MAAM,CAAE;QACpBqB,IAAI,EAAE,gBAAgB;QACtBgE,UAAU,EAAE;UACV;UACAC,KAAK,EAAEjG,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACK,UAAU,CAAC;QAC5C,CAAC;QACDhF,OAAO,EAAE;UACPsG,EAAE,EAAExH,KAAA,CAAKiB;QACX,CAAC;QACDJ,IAAI,EAAE;UACJsF,aAAa,EAAE;YACbsB,mBAAmB,EAAEZ,YAAY;YACjCpE,EAAE,EAAEiE,aAAI,CAACC,EAAE,CAAC;UACd,CAAC;UACDN,SAAS,EAAE,aAAa;UACxBvF,SAAS,EAAEC,+BAAoB,CAACL,MAAM,CAACgH;QACzC,CAAC;QACDnB,UAAU,KAAAhG,MAAA,CAAKiG,iBAAM,CAACC,gBAAgB,OAAAlG,MAAA,CAAImG,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;MAChE,CAAC,CAAC;MACF5G,KAAA,CAAKW,MAAM,IAAI,CAAC;IAClB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,4BAKgC,UAAC6G,YAAa,EAAgC;MAC5E7G,KAAA,CAAK2H,aAAa,GAAGC,iCAAsB,CAACC,OAAO;;MAEnD;MACA,IAAMX,IAAI,GAAG;QACXC,UAAU,EAAE;UAACW,OAAO,EAAE;QAAI,CAAC;QAC3BjB,YAAY,EAAZA;MACF,CAAC;;MAED;MACA;MACA,OAAO7G,KAAA,CAAK8G,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAzG,MAAA,CAAKP,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAJA;MACF,CAAC,CAAC,CACCG,IAAI,CAAC,YAAM;QACV;QACArH,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAAC0F,kBAAkB,CAAC;QAE/C/H,KAAA,CAAKgI,kBAAkB,GAAG,IAAI;QAC9BhI,KAAA,CAAK2H,aAAa,GAAGC,iCAAsB,CAACK,OAAO;QACnDjI,KAAA,CAAKkI,QAAQ,CAAC,CAAC;MACjB,CAAC,CAAC,CACDC,KAAK,CAAC,YAAM;QACXnI,KAAA,CAAK2H,aAAa,GAAGC,iCAAsB,CAACQ,IAAI;QAChD,MAAM,IAAIC,KAAK,CAAC,uBAAuB,CAAC;MAC1C,CAAC,CAAC;IACN,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAA7H,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,2BAI+B;MAAA,OAC7B,CAACqB,0BAAe,CAACoE,OAAO,EAAEpE,0BAAe,CAACC,MAAM,CAAC,CAACgH,QAAQ,CAACtI,KAAA,CAAKoB,cAAc,CAAC;IAAA;IAEjF;AACF;AACA;AACA;IAHE,IAAAZ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,eAIkB,YAAM;MACtB,IAAIA,KAAA,CAAKuI,oBAAoB,CAAC,CAAC,EAAE;MACjC;MACA,IAAI,CAACvI,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0B,WAAW,CAAC,CAAC,EAAE;QAC1C,MAAM,IAAIc,KAAK,CAAC,8CAA8C,CAAC;MACjE;MACArI,KAAA,CAAKwI,gBAAgB,CAAC,CAAC;IACzB,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAAhI,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,0BAI8B;MAAA,OAC5B,CAAC4H,iCAAsB,CAACC,OAAO,EAAED,iCAAsB,CAACK,OAAO,CAAC,CAACK,QAAQ,CAACtI,KAAA,CAAK2H,aAAa,CAAC;IAAA;IAE/F;AACF;AACA;AACA;AACA;IAJE,IAAAnH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;MAAA,IAAAyI,IAAA,OAAAC,kBAAA,CAAA/J,OAAA,gBAAAgK,YAAA,CAAAhK,OAAA,CAAAiK,IAAA,CAKwB,SAAAC,QAAOzB,cAAe;QAAA,OAAAuB,YAAA,CAAAhK,OAAA,CAAAmK,IAAA,UAAAC,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cAAA,KACxClJ,KAAA,CAAKmJ,mBAAmB,CAAC,CAAC;gBAAAH,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,OAAAF,QAAA,CAAAI,MAAA,WAASC,SAAS;YAAA;cAAA,IAE3CrJ,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0B,WAAW,CAAC,CAAC;gBAAAyB,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,MAClC,IAAIb,KAAK,CAAC,+CAA+C,CAAC;YAAA;cAAA,OAAAW,QAAA,CAAAI,MAAA,WAG3DpJ,KAAA,CAAKsJ,qBAAqB,CAAClC,cAAc,CAAC;YAAA;YAAA;cAAA,OAAA4B,QAAA,CAAAO,IAAA;UAAA;QAAA,GAAAV,OAAA;MAAA,CAClD;MAAA,iBAAAW,EAAA;QAAA,OAAAf,IAAA,CAAAxJ,KAAA,OAAAD,SAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE,IAAAwB,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,yBAM4B,UAC1ByJ,QAAiB,EACjBrC,cAAuB,EACO;MAC9B;MACA,OAAOpH,KAAA,CAAK8G,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAzG,MAAA,CAAKP,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAE;UACJC,UAAU,EAAE;YACVuC,YAAY,EAAED;UAChB,CAAC;UACDrC,cAAc,EAAdA;QACF;MACF,CAAC,CAAC,CAACC,IAAI,CAAC,YAAiC;QACvC,IAAIoC,QAAQ,IAAI,CAACzJ,KAAA,CAAKgI,kBAAkB,EAAE;UACxC,OAAOhI,KAAA,CAAK2J,cAAc,CAACvC,cAAc,CAAC;QAC5C;QAEA,OAAOiC,SAAS;MAClB,CAAC,CAAC;IACJ,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA7I,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,0BAK6B,UAAC4J,MAAe,EAAgC;MAC3E;MACA,OAAO5J,KAAA,CAAK8G,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAzG,MAAA,CAAKP,KAAA,CAAK2F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAE;UACJ2C,aAAa,EAAE;YACbD,MAAM,EAANA;UACF;QACF;MACF,CAAC,CAAC,CAACvC,IAAI,CAAC,YAAiC;QACvC,OAAOgC,SAAS;MAClB,CAAC,CAAC;IACJ,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAA7I,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,uBAI0B;MAAA,OAAMA,KAAA,CAAK2H,aAAa;IAAA;IAElD;AACF;AACA;AACA;IAHE,IAAAnH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,wBAI2B;MAAA,OAAMA,KAAA,CAAKoB,cAAc;IAAA;IAzVlDpB,KAAA,CAAKW,MAAM,GAAG,CAAC;IACfX,KAAA,CAAKgI,kBAAkB,GAAG,KAAK;IAC/BhI,KAAA,CAAKiB,WAAW,GAAGoI,SAAS;IAC5BrJ,KAAA,CAAKoB,cAAc,GAAGC,0BAAe,CAAC+G,IAAI;IAC1CpI,KAAA,CAAK2H,aAAa,GAAGC,iCAAsB,CAACQ,IAAI;IAAC,OAAApI,KAAA;EACnD;EAAC,IAAA8J,aAAA,CAAAnL,OAAA,EAAAgB,aAAA;IAAAoK,GAAA;IAAAC,KAAA;IArCD;AACF;AACA;AACA;IACE,SAAAtE,eAAA,EAAyB;MACvB,IAAI,CAAC,IAAI,CAACuE,qBAAqB,EAAE;QAC/B;QACA,IAAI,CAACtE,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACqE,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAACC,cAAc,CAAC;QACpE,IAAI,CAACF,qBAAqB,GAAG,IAAI;MACnC;IACF;;IAEA;AACF;AACA;AACA;EAHE;IAAAF,GAAA;IAAAC,KAAA,EAIA,SAAAI,iBAAA,EAA0B;MACxB,IAAI,CAACpC,kBAAkB,GAAG,KAAK;MAC/B,IAAI,CAAC/G,WAAW,GAAGoI,SAAS;MAC5B;MACA,IAAI,CAAC1D,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACwE,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAACF,cAAc,CAAC;MACrE,IAAI,CAACF,qBAAqB,GAAG,KAAK;MAClC,IAAI,CAAC7I,cAAc,GAAGC,0BAAe,CAAC+G,IAAI;MAC1C,IAAI,CAACT,aAAa,GAAGC,iCAAsB,CAACQ,IAAI;IAClD;EAAC;EAAA,OAAAzI,aAAA;AAAA,EAlEgC2K,sBAAW;AAAA,IAAAC,QAAA,GAAA3K,OAAA,CAAAjB,OAAA,GAsa/BgB,aAAa"}
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","currentSpokenLanguage","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","DEFAULT_SPOKEN_LANGUAGE","_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 DEFAULT_SPOKEN_LANGUAGE,\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 private currentSpokenLanguage?: 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 this.currentSpokenLanguage = undefined;\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 this.currentSpokenLanguage = DEFAULT_SPOKEN_LANGUAGE;\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 currentSpokenLanguage: this.currentSpokenLanguage,\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 * In meeting Spoken Language changed event\n * @param {string} languageCode\n * @returns {void}\n */\n public onSpokenLanguageUpdate = (languageCode: string): void => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});\n this.currentSpokenLanguage = languageCode;\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 +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 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 | 'manual_caption_interim_results'\n | 'manual_caption_interim_result'\n | 'manual_caption_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 onSpokenLanguageUpdate: (languageCode: string) => 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
@@ -14,10 +14,10 @@
14
14
  "node": ">=16"
15
15
  },
16
16
  "dependencies": {
17
- "@webex/internal-plugin-llm": "3.8.0",
18
- "@webex/internal-plugin-mercury": "3.8.0",
19
- "@webex/plugin-meetings": "3.8.0",
20
- "@webex/webex-core": "3.8.0",
17
+ "@webex/internal-plugin-llm": "3.8.0-next.27",
18
+ "@webex/internal-plugin-mercury": "3.8.0-next.26",
19
+ "@webex/plugin-meetings": "3.8.1-next.1",
20
+ "@webex/webex-core": "3.8.0-next.24",
21
21
  "uuid": "^3.3.2"
22
22
  },
23
23
  "browserify": {
@@ -32,11 +32,11 @@
32
32
  "@webex/eslint-config-legacy": "0.0.0",
33
33
  "@webex/jest-config-legacy": "0.0.0",
34
34
  "@webex/legacy-tools": "0.0.0",
35
- "@webex/test-helper-chai": "3.8.0",
36
- "@webex/test-helper-mocha": "3.8.0",
37
- "@webex/test-helper-mock-web-socket": "3.8.0",
38
- "@webex/test-helper-mock-webex": "3.8.0",
39
- "@webex/test-helper-test-users": "3.8.0",
35
+ "@webex/test-helper-chai": "3.8.0-next.24",
36
+ "@webex/test-helper-mocha": "3.8.0-next.24",
37
+ "@webex/test-helper-mock-web-socket": "3.8.0-next.24",
38
+ "@webex/test-helper-mock-webex": "3.8.0-next.24",
39
+ "@webex/test-helper-test-users": "3.8.0-next.24",
40
40
  "eslint": "^8.24.0",
41
41
  "prettier": "^2.7.1",
42
42
  "sinon": "^9.2.4"
@@ -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"
53
+ "version": "3.8.1-next.1"
54
54
  }
package/src/constants.ts CHANGED
@@ -22,6 +22,7 @@ export const AIBRIDGE_RELAY_TYPES = {
22
22
  },
23
23
  MANUAL: {
24
24
  TRANSCRIPTION: 'aibridge.manual_transcription',
25
+ CAPTIONER: 'client.manual_transcription',
25
26
  },
26
27
  };
27
28
 
@@ -34,10 +35,12 @@ export const TRANSCRIPTION_TYPE = {
34
35
  TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
35
36
  TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',
36
37
  MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',
38
+ MANUAL_CAPTION_INTERIM_RESULT: 'manual_caption_interim_result',
37
39
  MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result',
38
40
  };
39
41
 
40
42
  export const VOICEA = 'voicea';
43
+ export const DEFAULT_SPOKEN_LANGUAGE = 'en';
41
44
 
42
45
  export const ANNOUNCE_STATUS = {
43
46
  IDLE: 'idle',
@@ -50,3 +53,8 @@ export const TURN_ON_CAPTION_STATUS = {
50
53
  ENABLED: 'enabled',
51
54
  SENDING: 'sending',
52
55
  };
56
+
57
+ export const TOGGLE_MANUAL_CAPTION_STATUS = {
58
+ IDLE: 'idle',
59
+ SENDING: 'sending',
60
+ };
package/src/voicea.ts CHANGED
@@ -8,6 +8,8 @@ import {
8
8
  VOICEA,
9
9
  ANNOUNCE_STATUS,
10
10
  TURN_ON_CAPTION_STATUS,
11
+ TOGGLE_MANUAL_CAPTION_STATUS,
12
+ DEFAULT_SPOKEN_LANGUAGE,
11
13
  } from './constants';
12
14
  // eslint-disable-next-line no-unused-vars
13
15
  import {
@@ -38,6 +40,10 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
38
40
 
39
41
  private captionStatus: string;
40
42
 
43
+ private toggleManualCaptionStatus: string;
44
+
45
+ private currentSpokenLanguage?: string;
46
+
41
47
  /**
42
48
  * @param {Object} e
43
49
  * @returns {undefined}
@@ -58,7 +64,12 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
58
64
  this.processTranscription(e.data.voiceaPayload);
59
65
  break;
60
66
  case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
61
- this.processManualTranscription(e.data.transcriptPayload);
67
+ case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:
68
+ this.processManualTranscription({
69
+ ...e.data.transcriptPayload,
70
+ sender: e.headers?.from,
71
+ data_source: e.data.relayType,
72
+ });
62
73
  break;
63
74
  default:
64
75
  break;
@@ -89,6 +100,8 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
89
100
  this.hasSubscribedToEvents = false;
90
101
  this.announceStatus = ANNOUNCE_STATUS.IDLE;
91
102
  this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
103
+ this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
104
+ this.currentSpokenLanguage = undefined;
92
105
  }
93
106
 
94
107
  /**
@@ -102,6 +115,8 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
102
115
  this.vmcDeviceId = undefined;
103
116
  this.announceStatus = ANNOUNCE_STATUS.IDLE;
104
117
  this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
118
+ this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
119
+ this.currentSpokenLanguage = DEFAULT_SPOKEN_LANGUAGE;
105
120
  }
106
121
 
107
122
  /**
@@ -110,19 +125,18 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
110
125
  * @returns {void}
111
126
  */
112
127
  private processManualTranscription = (transcriptPayload: TranscriptionResponse): void => {
113
- switch (transcriptPayload.type) {
114
- case TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT:
115
- case TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULTS:
116
- // @ts-ignore
117
- this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {
118
- isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,
119
- transcriptId: transcriptPayload.id,
120
- transcripts: transcriptPayload.transcripts,
121
- });
122
- break;
123
-
124
- default:
125
- break;
128
+ if (
129
+ transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT ||
130
+ transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT
131
+ ) {
132
+ // @ts-ignore
133
+ this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {
134
+ isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,
135
+ transcriptId: transcriptPayload.id,
136
+ transcripts: transcriptPayload.transcripts,
137
+ sender: transcriptPayload.sender,
138
+ source: transcriptPayload.data_source,
139
+ });
126
140
  }
127
141
  };
128
142
 
@@ -216,6 +230,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
216
230
  captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],
217
231
  maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,
218
232
  spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],
233
+ currentSpokenLanguage: this.currentSpokenLanguage,
219
234
  };
220
235
 
221
236
  // @ts-ignore
@@ -303,6 +318,55 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
303
318
  this.seqNum += 1;
304
319
  };
305
320
 
321
+ /**
322
+ * Send manual closed captions to voicea service
323
+ * @param {string} text
324
+ * @param {number} timeStamp
325
+ * @param {number[]} csis
326
+ * @param {boolean} isFinal
327
+ * @returns {void}
328
+ */
329
+ public sendManualClosedCaption = (
330
+ text: string,
331
+ timeStamp: number,
332
+ csis: number[],
333
+ isFinal: boolean
334
+ ): void => {
335
+ // @ts-ignore
336
+ if (!this.webex.internal.llm.isConnected()) return;
337
+
338
+ // @ts-ignore
339
+ this.webex.internal.llm.socket.send({
340
+ id: `${this.seqNum}`,
341
+ type: 'publishRequest',
342
+ recipients: {
343
+ // @ts-ignore
344
+ route: this.webex.internal.llm.getBinding(),
345
+ },
346
+ headers: {},
347
+ data: {
348
+ eventType: 'relay.event',
349
+ relayType: AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,
350
+ transcriptPayload: {
351
+ type: isFinal
352
+ ? TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT
353
+ : TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,
354
+ id: uuid.v4(),
355
+ transcripts: [
356
+ {
357
+ text,
358
+ start_millis: timeStamp,
359
+ end_millis: timeStamp,
360
+ csis,
361
+ },
362
+ ],
363
+ },
364
+ },
365
+ trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
366
+ });
367
+ this.seqNum += 1;
368
+ };
369
+
306
370
  /**
307
371
  * request turn on Captions
308
372
  * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
@@ -383,7 +447,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
383
447
 
384
448
  /**
385
449
  * Toggle transcribing for highlights
386
- * @param {bool} activate if true transcribing is turned on
450
+ * @param {boolean} activate true means to turn on transcribing and false means to turn off
387
451
  * @param {string} spokenLanguage language code for spoken language
388
452
  * @returns {Promise}
389
453
  */
@@ -413,10 +477,14 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
413
477
 
414
478
  /**
415
479
  * Toggle turn on manual caption
416
- * @param {bool} enable if true manual caption is turned on
480
+ * @param {boolean} enable true means to turn on manual caption, false means to turn off
417
481
  * @returns {Promise}
418
482
  */
419
483
  public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {
484
+ if (this.toggleManualCaptionStatus === TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;
485
+
486
+ this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;
487
+
420
488
  // @ts-ignore
421
489
  return this.request({
422
490
  method: 'PUT',
@@ -427,9 +495,27 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
427
495
  enable,
428
496
  },
429
497
  },
430
- }).then((): undefined | Promise<void> => {
431
- return undefined;
432
- });
498
+ })
499
+ .then((): undefined | Promise<void> => {
500
+ this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
501
+
502
+ return undefined;
503
+ })
504
+ .catch(() => {
505
+ this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
506
+ throw new Error('toggle manual captions fail');
507
+ });
508
+ };
509
+
510
+ /**
511
+ * In meeting Spoken Language changed event
512
+ * @param {string} languageCode
513
+ * @returns {void}
514
+ */
515
+ public onSpokenLanguageUpdate = (languageCode: string): void => {
516
+ // @ts-ignore
517
+ this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});
518
+ this.currentSpokenLanguage = languageCode;
433
519
  };
434
520
 
435
521
  /**
@@ -23,7 +23,10 @@ type TRANSCRIPTION_TYPES =
23
23
  | 'eva_cancel'
24
24
  | 'highlight_created'
25
25
  | 'transcript_interim_results'
26
- | 'transcript_final_result';
26
+ | 'transcript_final_result'
27
+ | 'manual_caption_interim_results'
28
+ | 'manual_caption_interim_result'
29
+ | 'manual_caption_final_result';
27
30
 
28
31
  /**
29
32
  * Class for an Transcription Object
@@ -57,6 +60,8 @@ interface Highlight {
57
60
  interface TranscriptionResponse {
58
61
  type: TRANSCRIPTION_TYPES;
59
62
  id: string;
63
+ sender: string;
64
+ data_source: string;
60
65
  transcript_id: string;
61
66
  translations?: {[x: string]: string};
62
67
  transcripts?: Transcription[];
@@ -78,10 +83,18 @@ interface CaptionLanguageResponse {
78
83
 
79
84
  interface IVoiceaChannel {
80
85
  setSpokenLanguage: (languageCode: string) => Promise<void>;
86
+ onSpokenLanguageUpdate: (languageCode: string) => void;
81
87
  requestLanguage: (languageCode: string) => void;
82
88
  turnOnCaptions: () => undefined | Promise<void>;
83
89
  toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
84
90
  deregisterEvents: () => void;
91
+ toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
92
+ sendManualClosedCaption: (
93
+ text: string,
94
+ timeStamp: number,
95
+ csis: number[],
96
+ isFinal: boolean
97
+ ) => void;
85
98
  }
86
99
 
87
100
  type MeetingTranscripts = {
@@ -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();
@@ -141,6 +238,7 @@ describe('plugin-voicea', () => {
141
238
  captionLanguages: ['af', 'am'],
142
239
  spokenLanguages: ['en'],
143
240
  maxLanguages: 5,
241
+ currentSpokenLanguage: 'en',
144
242
  });
145
243
  });
146
244
 
@@ -149,11 +247,13 @@ describe('plugin-voicea', () => {
149
247
 
150
248
  voiceaService.on(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, spy);
151
249
  voiceaService.listenToEvents();
250
+ voiceaService.onSpokenLanguageUpdate('fr-FR');
152
251
  await voiceaService.processAnnouncementMessage({});
153
252
  assert.calledOnceWithExactly(spy, {
154
253
  captionLanguages: [],
155
254
  spokenLanguages: [],
156
255
  maxLanguages: 0,
256
+ currentSpokenLanguage: 'fr-FR',
157
257
  });
158
258
  });
159
259
  });
@@ -441,20 +541,10 @@ describe('plugin-voicea', () => {
441
541
  const mockWebSocket = new MockWebSocket();
442
542
 
443
543
  voiceaService.webex.internal.llm.socket = mockWebSocket;
544
+ voiceaService.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;
444
545
  });
445
546
 
446
547
  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
548
  await voiceaService.toggleManualCaption(true);
459
549
  sinon.assert.calledWith(
460
550
  voiceaService.request,
@@ -469,10 +559,6 @@ describe('plugin-voicea', () => {
469
559
 
470
560
 
471
561
  it('turns off manual caption', async () => {
472
- await voiceaService.toggleManualCaption(true);
473
-
474
- voiceaService.listenToEvents();
475
-
476
562
  await voiceaService.toggleManualCaption(false);
477
563
  sinon.assert.calledWith(
478
564
  voiceaService.request,
@@ -484,6 +570,14 @@ describe('plugin-voicea', () => {
484
570
  );
485
571
 
486
572
  });
573
+
574
+ it('ignore toggle manual caption', async () => {
575
+ voiceaService.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;
576
+ await voiceaService.toggleManualCaption(true);
577
+
578
+ sinon.assert.notCalled(voiceaService.request);
579
+
580
+ });
487
581
  });
488
582
 
489
583
  describe('#processCaptionLanguageResponse', () => {
@@ -795,16 +889,17 @@ describe('plugin-voicea', () => {
795
889
  voiceaService.listenToEvents();
796
890
  });
797
891
 
798
- it('processes interim manual transcription', async () => {
892
+ it('processes interim manual transcription from aibridge', async () => {
799
893
  voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
894
+
800
895
  const transcriptPayload = {
801
896
  id: "747d711d-3414-fd69-7081-e842649f2d28",
802
897
  transcripts: [
803
898
  {
804
- "text": "Good",
899
+ text: "Good",
805
900
  }
806
901
  ],
807
- type: "manual_caption_interim_results",
902
+ type: "manual_caption_interim_result",
808
903
  };
809
904
 
810
905
  // eslint-disable-next-line no-underscore-dangle
@@ -813,15 +908,17 @@ describe('plugin-voicea', () => {
813
908
  data: {relayType: 'aibridge.manual_transcription', transcriptPayload},
814
909
  });
815
910
 
816
- assert.calledOnceWithExactly(functionSpy, transcriptPayload);
911
+ assert.calledOnceWithExactly(functionSpy, {...transcriptPayload, sender: 'ws', data_source: 'aibridge.manual_transcription'});
817
912
  assert.calledOnceWithExactly(triggerSpy, {
818
913
  isFinal: false,
819
914
  transcriptId: '747d711d-3414-fd69-7081-e842649f2d28',
820
915
  transcripts: transcriptPayload.transcripts,
916
+ sender: 'ws',
917
+ source: 'aibridge.manual_transcription'
821
918
  });
822
919
  });
823
920
 
824
- it('processes final manual transcription', async () => {
921
+ it('processes final manual transcription from aibridge', async () => {
825
922
  voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
826
923
 
827
924
  const transcriptPayload = {
@@ -842,11 +939,73 @@ describe('plugin-voicea', () => {
842
939
  data: {relayType: 'aibridge.manual_transcription', transcriptPayload},
843
940
  });
844
941
 
845
- assert.calledOnceWithExactly(functionSpy, transcriptPayload);
942
+ assert.calledOnceWithExactly(functionSpy, {...transcriptPayload, sender: 'ws', data_source: 'aibridge.manual_transcription'});
943
+ assert.calledOnceWithExactly(triggerSpy, {
944
+ isFinal: true,
945
+ transcriptId: '8d226d31-044a-8d11-cc39-cedbde183154',
946
+ transcripts: transcriptPayload.transcripts,
947
+ sender: 'ws',
948
+ source: 'aibridge.manual_transcription'
949
+ });
950
+ });
951
+
952
+ it('processes interim manual transcription from captioner', async () => {
953
+ voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
954
+
955
+ const transcriptPayload = {
956
+ id: "747d711d-3414-fd69-7081-e842649f2d28",
957
+ transcripts: [
958
+ {
959
+ text: "Good",
960
+ }
961
+ ],
962
+ type: "manual_caption_interim_result",
963
+ };
964
+
965
+ // eslint-disable-next-line no-underscore-dangle
966
+ await voiceaService.webex.internal.llm._emit('event:relay.event', {
967
+ headers: {from: '654321'},
968
+ data: {relayType: 'client.manual_transcription', transcriptPayload},
969
+ });
970
+
971
+ assert.calledOnceWithExactly(functionSpy, {...transcriptPayload, sender: '654321', data_source: 'client.manual_transcription'});
972
+ assert.calledOnceWithExactly(triggerSpy, {
973
+ isFinal: false,
974
+ transcriptId: '747d711d-3414-fd69-7081-e842649f2d28',
975
+ transcripts: transcriptPayload.transcripts,
976
+ sender: '654321',
977
+ source: 'client.manual_transcription'
978
+ });
979
+ });
980
+
981
+ it('processes final manual transcription from captioner', async () => {
982
+ voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
983
+
984
+ const transcriptPayload = {
985
+ id: "8d226d31-044a-8d11-cc39-cedbde183154",
986
+ transcripts: [
987
+ {
988
+ text: "Good Morning",
989
+ start_millis: 10420,
990
+ end_millis: 11380,
991
+ }
992
+ ],
993
+ type: "manual_caption_final_result",
994
+ };
995
+
996
+ // eslint-disable-next-line no-underscore-dangle
997
+ await voiceaService.webex.internal.llm._emit('event:relay.event', {
998
+ headers: {from: '654321'},
999
+ data: {relayType: 'client.manual_transcription', transcriptPayload},
1000
+ });
1001
+
1002
+ assert.calledOnceWithExactly(functionSpy, {...transcriptPayload, sender: '654321', data_source: 'client.manual_transcription'});
846
1003
  assert.calledOnceWithExactly(triggerSpy, {
847
1004
  isFinal: true,
848
1005
  transcriptId: '8d226d31-044a-8d11-cc39-cedbde183154',
849
1006
  transcripts: transcriptPayload.transcripts,
1007
+ sender: '654321',
1008
+ source: 'client.manual_transcription'
850
1009
  });
851
1010
  });
852
1011
  });
@@ -864,5 +1023,17 @@ describe('plugin-voicea', () => {
864
1023
  assert.equal(voiceaService.getAnnounceStatus(), "joined");
865
1024
  });
866
1025
  });
1026
+
1027
+ describe('#onSpokenLanguageUpdate', () => {
1028
+ it('should trigger SPOKEN_LANGUAGE_UPDATE event with correct languageCode', () => {
1029
+ const triggerSpy = sinon.spy();
1030
+ voiceaService.on(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, triggerSpy);
1031
+
1032
+ const languageCode = 'fr-FR';
1033
+ voiceaService.onSpokenLanguageUpdate(languageCode);
1034
+ assert.equal(voiceaService.currentSpokenLanguage, languageCode);
1035
+ assert.calledOnceWithExactly(triggerSpy, {languageCode});
1036
+ });
1037
+ });
867
1038
  });
868
1039
  });