@webex/internal-plugin-voicea 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.js +17 -9
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/constants.d.ts +46 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/utils.d.ts +1 -0
- package/dist/types/voicea.d.ts +128 -0
- package/dist/types/voicea.types.d.ts +91 -0
- package/dist/voicea.js +52 -12
- package/dist/voicea.js.map +1 -1
- package/dist/voicea.types.js.map +1 -1
- package/package.json +13 -12
- package/src/constants.ts +14 -6
- package/src/index.ts +2 -0
- package/src/voicea.ts +57 -13
- package/src/voicea.types.ts +22 -0
- package/test/unit/spec/voicea.js +120 -10
- package/tsconfig.json +6 -0
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.
|
|
7
|
+
exports.VOICEA = exports.TURN_ON_CAPTION_STATUS = exports.TRANSCRIPTION_TYPE = exports.EVENT_TRIGGERS = exports.ANNOUNCE_STATUS = exports.AIBRIDGE_RELAY_TYPES = void 0;
|
|
8
8
|
var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
9
9
|
VOICEA_ANNOUNCEMENT: 'voicea:announcement',
|
|
10
10
|
CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',
|
|
@@ -14,14 +14,20 @@ var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
|
14
14
|
TRANSCRIBING_OFF: 'voicea:transcribingOff',
|
|
15
15
|
NEW_CAPTION: 'voicea:newCaption',
|
|
16
16
|
EVA_COMMAND: 'voicea:wxa',
|
|
17
|
-
HIGHLIGHT_CREATED: 'voicea:highlightCreated'
|
|
17
|
+
HIGHLIGHT_CREATED: 'voicea:highlightCreated',
|
|
18
|
+
NEW_MANUAL_CAPTION: 'aibridge:newManualCaption'
|
|
18
19
|
};
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
var AIBRIDGE_RELAY_TYPES = exports.AIBRIDGE_RELAY_TYPES = {
|
|
21
|
+
VOICEA: {
|
|
22
|
+
ANNOUNCEMENT: 'voicea.annc',
|
|
23
|
+
CLIENT_ANNOUNCEMENT: 'client.annc',
|
|
24
|
+
TRANSLATION_REQUEST: 'voicea.transl.req',
|
|
25
|
+
TRANSLATION_RESPONSE: 'voicea.transl.rsp',
|
|
26
|
+
TRANSCRIPTION: 'voicea.transcription'
|
|
27
|
+
},
|
|
28
|
+
MANUAL: {
|
|
29
|
+
TRANSCRIPTION: 'aibridge.manual_transcription'
|
|
30
|
+
}
|
|
25
31
|
};
|
|
26
32
|
var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
|
|
27
33
|
UNKNOWN: 'unknown',
|
|
@@ -30,7 +36,9 @@ var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
|
|
|
30
36
|
EVA_CANCEL: 'eva_cancel',
|
|
31
37
|
HIGHLIGHT_CREATED: 'highlight_created',
|
|
32
38
|
TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
|
|
33
|
-
TRANSCRIPT_FINAL_RESULT: 'transcript_final_result'
|
|
39
|
+
TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',
|
|
40
|
+
MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',
|
|
41
|
+
MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result'
|
|
34
42
|
};
|
|
35
43
|
var VOICEA = exports.VOICEA = 'voicea';
|
|
36
44
|
var ANNOUNCE_STATUS = exports.ANNOUNCE_STATUS = {
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EVENT_TRIGGERS","exports","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","
|
|
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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_constants","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\nexport {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;
|
|
1
|
+
{"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_constants","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\nimport type {MeetingTranscriptPayload} from './voicea.types';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\nexport {type MeetingTranscriptPayload};\nexport {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAOA,IAAAG,UAAA,GAAAH,OAAA;AAAmE,SAAAI,yBAAAC,CAAA,6BAAAC,QAAA,mBAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAF,wBAAA,YAAAA,yBAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAN,wBAAAM,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,gBAAAK,OAAA,CAAAL,CAAA,0BAAAA,CAAA,WAAAM,OAAA,EAAAN,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAI,GAAA,CAAAP,CAAA,UAAAG,CAAA,CAAAK,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,sBAAA,IAAAC,gCAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAlB,CAAA,EAAAc,CAAA,SAAAK,CAAA,GAAAR,CAAA,GAAAE,gCAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAK,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,sBAAA,CAAAH,CAAA,EAAAK,CAAA,EAAAK,CAAA,IAAAV,CAAA,CAAAK,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAL,CAAA,CAAAH,OAAA,GAAAN,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAiB,GAAA,CAAApB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AAJnEhB,SAAS,CAAC4B,sBAAsB,CAAC,QAAQ,EAAEC,eAAa,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const EVENT_TRIGGERS: {
|
|
2
|
+
VOICEA_ANNOUNCEMENT: string;
|
|
3
|
+
CAPTION_LANGUAGE_UPDATE: string;
|
|
4
|
+
SPOKEN_LANGUAGE_UPDATE: string;
|
|
5
|
+
CAPTIONS_TURNED_ON: string;
|
|
6
|
+
TRANSCRIBING_ON: string;
|
|
7
|
+
TRANSCRIBING_OFF: string;
|
|
8
|
+
NEW_CAPTION: string;
|
|
9
|
+
EVA_COMMAND: string;
|
|
10
|
+
HIGHLIGHT_CREATED: string;
|
|
11
|
+
NEW_MANUAL_CAPTION: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const AIBRIDGE_RELAY_TYPES: {
|
|
14
|
+
VOICEA: {
|
|
15
|
+
ANNOUNCEMENT: string;
|
|
16
|
+
CLIENT_ANNOUNCEMENT: string;
|
|
17
|
+
TRANSLATION_REQUEST: string;
|
|
18
|
+
TRANSLATION_RESPONSE: string;
|
|
19
|
+
TRANSCRIPTION: string;
|
|
20
|
+
};
|
|
21
|
+
MANUAL: {
|
|
22
|
+
TRANSCRIPTION: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export declare const TRANSCRIPTION_TYPE: {
|
|
26
|
+
UNKNOWN: string;
|
|
27
|
+
EVA_WAKE: string;
|
|
28
|
+
EVA_THANKS: string;
|
|
29
|
+
EVA_CANCEL: string;
|
|
30
|
+
HIGHLIGHT_CREATED: string;
|
|
31
|
+
TRANSCRIPT_INTERIM_RESULTS: string;
|
|
32
|
+
TRANSCRIPT_FINAL_RESULT: string;
|
|
33
|
+
MANUAL_CAPTION_INTERIM_RESULTS: string;
|
|
34
|
+
MANUAL_CAPTION_FINAL_RESULT: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const VOICEA = "voicea";
|
|
37
|
+
export declare const ANNOUNCE_STATUS: {
|
|
38
|
+
IDLE: string;
|
|
39
|
+
JOINED: string;
|
|
40
|
+
JOINING: string;
|
|
41
|
+
};
|
|
42
|
+
export declare const TURN_ON_CAPTION_STATUS: {
|
|
43
|
+
IDLE: string;
|
|
44
|
+
ENABLED: string;
|
|
45
|
+
SENDING: string;
|
|
46
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const millisToMinutesAndSeconds: (millis: number) => string;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { WebexPlugin } from '@webex/webex-core';
|
|
2
|
+
import { IVoiceaChannel } from './voicea.types';
|
|
3
|
+
/**
|
|
4
|
+
* @description VoiceaChannel to hold single instance of LLM
|
|
5
|
+
* @export
|
|
6
|
+
* @class VoiceaChannel
|
|
7
|
+
*/
|
|
8
|
+
export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
9
|
+
namespace: string;
|
|
10
|
+
private seqNum;
|
|
11
|
+
private areCaptionsEnabled;
|
|
12
|
+
private hasSubscribedToEvents;
|
|
13
|
+
private vmcDeviceId?;
|
|
14
|
+
private announceStatus;
|
|
15
|
+
private captionStatus;
|
|
16
|
+
/**
|
|
17
|
+
* @param {Object} e
|
|
18
|
+
* @returns {undefined}
|
|
19
|
+
*/
|
|
20
|
+
private eventProcessor;
|
|
21
|
+
/**
|
|
22
|
+
* Listen to websocket messages
|
|
23
|
+
* @returns {undefined}
|
|
24
|
+
*/
|
|
25
|
+
private listenToEvents;
|
|
26
|
+
/**
|
|
27
|
+
* Listen to websocket messages
|
|
28
|
+
* @returns {void}
|
|
29
|
+
*/
|
|
30
|
+
deregisterEvents(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Initializes Voicea plugin
|
|
33
|
+
* @param {any} args
|
|
34
|
+
*/
|
|
35
|
+
constructor(...args: any[]);
|
|
36
|
+
/**
|
|
37
|
+
* Process manual Transcript and send alert
|
|
38
|
+
* @param {TranscriptionResponse} transcriptPayload
|
|
39
|
+
* @returns {void}
|
|
40
|
+
*/
|
|
41
|
+
private processManualTranscription;
|
|
42
|
+
/**
|
|
43
|
+
* Process Transcript and send alert
|
|
44
|
+
* @param {TranscriptionResponse} voiceaPayload
|
|
45
|
+
* @returns {void}
|
|
46
|
+
*/
|
|
47
|
+
private processTranscription;
|
|
48
|
+
/**
|
|
49
|
+
* Processes Caption Language Response
|
|
50
|
+
* @param {CaptionLanguageResponse} voiceaPayload
|
|
51
|
+
* @returns {void}
|
|
52
|
+
*/
|
|
53
|
+
private processCaptionLanguageResponse;
|
|
54
|
+
/**
|
|
55
|
+
* processes voicea announcement response and triggers event
|
|
56
|
+
* @param {Object} voiceaPayload
|
|
57
|
+
* @returns {void}
|
|
58
|
+
*/
|
|
59
|
+
private processAnnouncementMessage;
|
|
60
|
+
/**
|
|
61
|
+
* Sends Announcement to add voicea to the meeting
|
|
62
|
+
* @returns {void}
|
|
63
|
+
*/
|
|
64
|
+
private sendAnnouncement;
|
|
65
|
+
/**
|
|
66
|
+
* Set Spoken Language for the meeting
|
|
67
|
+
* @param {string} languageCode
|
|
68
|
+
* @returns {Promise}
|
|
69
|
+
*/
|
|
70
|
+
setSpokenLanguage: (languageCode: string) => Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Request Language translation
|
|
73
|
+
* @param {string} languageCode
|
|
74
|
+
* @returns {void}
|
|
75
|
+
*/
|
|
76
|
+
requestLanguage: (languageCode: string) => void;
|
|
77
|
+
/**
|
|
78
|
+
* request turn on Captions
|
|
79
|
+
* @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
|
|
80
|
+
* @returns {Promise}
|
|
81
|
+
*/
|
|
82
|
+
private requestTurnOnCaptions;
|
|
83
|
+
/**
|
|
84
|
+
* is announce processing
|
|
85
|
+
* @returns {boolean}
|
|
86
|
+
*/
|
|
87
|
+
private isAnnounceProcessing;
|
|
88
|
+
/**
|
|
89
|
+
* announce to voicea data chanel
|
|
90
|
+
* @returns {void}
|
|
91
|
+
*/
|
|
92
|
+
announce: () => void;
|
|
93
|
+
/**
|
|
94
|
+
* is turn on caption processing
|
|
95
|
+
* @returns {boolean}
|
|
96
|
+
*/
|
|
97
|
+
private isCaptionProcessing;
|
|
98
|
+
/**
|
|
99
|
+
* Turn on Captions
|
|
100
|
+
* @param {string} [spokenLanguage] - Optional Spoken language code
|
|
101
|
+
* @returns {Promise}
|
|
102
|
+
*/
|
|
103
|
+
turnOnCaptions: (spokenLanguage?: any) => undefined | Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Toggle transcribing for highlights
|
|
106
|
+
* @param {bool} activate if true transcribing is turned on
|
|
107
|
+
* @param {string} spokenLanguage language code for spoken language
|
|
108
|
+
* @returns {Promise}
|
|
109
|
+
*/
|
|
110
|
+
toggleTranscribing: (activate: boolean, spokenLanguage?: string) => undefined | Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Toggle turn on manual caption
|
|
113
|
+
* @param {bool} enable if true manual caption is turned on
|
|
114
|
+
* @returns {Promise}
|
|
115
|
+
*/
|
|
116
|
+
toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* get caption status
|
|
119
|
+
* @returns {string}
|
|
120
|
+
*/
|
|
121
|
+
getCaptionStatus: () => string;
|
|
122
|
+
/**
|
|
123
|
+
* get announce status
|
|
124
|
+
* @returns {string}
|
|
125
|
+
*/
|
|
126
|
+
getAnnounceStatus: () => string;
|
|
127
|
+
}
|
|
128
|
+
export default VoiceaChannel;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type for payload
|
|
3
|
+
*/
|
|
4
|
+
interface AnnouncementPayload {
|
|
5
|
+
translation: {
|
|
6
|
+
max_languages: number;
|
|
7
|
+
allowed_languages: string[];
|
|
8
|
+
};
|
|
9
|
+
ASR: {
|
|
10
|
+
spoken_languages: string[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
type TRANSCRIPTION_TYPES = 'unknown' | 'eva_wake' | 'eva_thanks' | 'eva_cancel' | 'highlight_created' | 'transcript_interim_results' | 'transcript_final_result';
|
|
14
|
+
/**
|
|
15
|
+
* Class for an Transcription Object
|
|
16
|
+
*/
|
|
17
|
+
interface Transcription {
|
|
18
|
+
start_millis: number;
|
|
19
|
+
end_millis: number;
|
|
20
|
+
text: string;
|
|
21
|
+
transcript_language_code: string;
|
|
22
|
+
translations: {
|
|
23
|
+
[x: string]: string;
|
|
24
|
+
};
|
|
25
|
+
csis: number[];
|
|
26
|
+
last_packet_timestamp_ms: number;
|
|
27
|
+
timestamp: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Highlights
|
|
31
|
+
*/
|
|
32
|
+
interface Highlight {
|
|
33
|
+
highlight_id: string;
|
|
34
|
+
transcript: string;
|
|
35
|
+
highlight_label: string;
|
|
36
|
+
highlight_source: string;
|
|
37
|
+
start_millis: number;
|
|
38
|
+
end_millis: number;
|
|
39
|
+
csis: number[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Type for Transcription message
|
|
43
|
+
*/
|
|
44
|
+
interface TranscriptionResponse {
|
|
45
|
+
type: TRANSCRIPTION_TYPES;
|
|
46
|
+
id: string;
|
|
47
|
+
transcript_id: string;
|
|
48
|
+
translations?: {
|
|
49
|
+
[x: string]: string;
|
|
50
|
+
};
|
|
51
|
+
transcripts?: Transcription[];
|
|
52
|
+
transcript?: Transcription;
|
|
53
|
+
highlight?: Highlight;
|
|
54
|
+
csis: number[];
|
|
55
|
+
data: string;
|
|
56
|
+
command_response: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Type for CaptionLanguageResponse
|
|
60
|
+
*/
|
|
61
|
+
interface CaptionLanguageResponse {
|
|
62
|
+
requestId: string;
|
|
63
|
+
statusCode: number;
|
|
64
|
+
errorCode: number;
|
|
65
|
+
message: string;
|
|
66
|
+
}
|
|
67
|
+
interface IVoiceaChannel {
|
|
68
|
+
setSpokenLanguage: (languageCode: string) => Promise<void>;
|
|
69
|
+
requestLanguage: (languageCode: string) => void;
|
|
70
|
+
turnOnCaptions: () => undefined | Promise<void>;
|
|
71
|
+
toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
|
|
72
|
+
deregisterEvents: () => void;
|
|
73
|
+
}
|
|
74
|
+
type MeetingTranscripts = {
|
|
75
|
+
start_mills?: number;
|
|
76
|
+
end_mills?: number;
|
|
77
|
+
text: string;
|
|
78
|
+
last_packet_timestamp_ms?: number;
|
|
79
|
+
csis: Array<number>;
|
|
80
|
+
transcript_language_code: string;
|
|
81
|
+
translations?: {
|
|
82
|
+
[key: string]: string;
|
|
83
|
+
};
|
|
84
|
+
timestamp?: string;
|
|
85
|
+
};
|
|
86
|
+
type MeetingTranscriptPayload = {
|
|
87
|
+
isFinal: boolean;
|
|
88
|
+
transcriptId: string;
|
|
89
|
+
transcripts: Array<MeetingTranscripts>;
|
|
90
|
+
};
|
|
91
|
+
export type { AnnouncementPayload, CaptionLanguageResponse, TranscriptionResponse, Transcription, Highlight, IVoiceaChannel, MeetingTranscriptPayload, };
|
package/dist/voicea.js
CHANGED
|
@@ -55,17 +55,40 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
55
55
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "eventProcessor", function (e) {
|
|
56
56
|
_this.seqNum = e.sequenceNumber + 1;
|
|
57
57
|
switch (e.data.relayType) {
|
|
58
|
-
case _constants.
|
|
58
|
+
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:
|
|
59
59
|
_this.vmcDeviceId = e.headers.from;
|
|
60
60
|
_this.announceStatus = _constants.ANNOUNCE_STATUS.JOINED;
|
|
61
61
|
_this.processAnnouncementMessage(e.data.voiceaPayload);
|
|
62
62
|
break;
|
|
63
|
-
case _constants.
|
|
63
|
+
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:
|
|
64
64
|
_this.processCaptionLanguageResponse(e.data.voiceaPayload);
|
|
65
65
|
break;
|
|
66
|
-
case _constants.
|
|
66
|
+
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:
|
|
67
67
|
_this.processTranscription(e.data.voiceaPayload);
|
|
68
68
|
break;
|
|
69
|
+
case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
70
|
+
_this.processManualTranscription(e.data.transcriptPayload);
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Process manual Transcript and send alert
|
|
78
|
+
* @param {TranscriptionResponse} transcriptPayload
|
|
79
|
+
* @returns {void}
|
|
80
|
+
*/
|
|
81
|
+
(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;
|
|
69
92
|
default:
|
|
70
93
|
break;
|
|
71
94
|
}
|
|
@@ -90,13 +113,10 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
90
113
|
_this.trigger(_constants.EVENT_TRIGGERS.NEW_CAPTION, {
|
|
91
114
|
isFinal: true,
|
|
92
115
|
transcriptId: voiceaPayload.transcript_id,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code
|
|
98
|
-
},
|
|
99
|
-
timestamp: (0, _utils.millisToMinutesAndSeconds)(voiceaPayload.transcript.end_millis)
|
|
116
|
+
transcripts: voiceaPayload.transcripts.map(function (transcript) {
|
|
117
|
+
transcript.timestamp = (0, _utils.millisToMinutesAndSeconds)(transcript.end_millis);
|
|
118
|
+
return transcript;
|
|
119
|
+
})
|
|
100
120
|
});
|
|
101
121
|
break;
|
|
102
122
|
case _constants.TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:
|
|
@@ -184,7 +204,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
184
204
|
version: 'v2'
|
|
185
205
|
},
|
|
186
206
|
eventType: 'relay.event',
|
|
187
|
-
relayType: _constants.
|
|
207
|
+
relayType: _constants.AIBRIDGE_RELAY_TYPES.VOICEA.CLIENT_ANNOUNCEMENT
|
|
188
208
|
},
|
|
189
209
|
trackingId: "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString())
|
|
190
210
|
});
|
|
@@ -240,7 +260,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
240
260
|
id: _uuid.default.v4()
|
|
241
261
|
},
|
|
242
262
|
eventType: 'relay.event',
|
|
243
|
-
relayType: _constants.
|
|
263
|
+
relayType: _constants.AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST
|
|
244
264
|
},
|
|
245
265
|
trackingId: "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString())
|
|
246
266
|
});
|
|
@@ -364,6 +384,26 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
364
384
|
return undefined;
|
|
365
385
|
});
|
|
366
386
|
});
|
|
387
|
+
/**
|
|
388
|
+
* Toggle turn on manual caption
|
|
389
|
+
* @param {bool} enable if true manual caption is turned on
|
|
390
|
+
* @returns {Promise}
|
|
391
|
+
*/
|
|
392
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleManualCaption", function (enable) {
|
|
393
|
+
// @ts-ignore
|
|
394
|
+
return _this.request({
|
|
395
|
+
method: 'PUT',
|
|
396
|
+
// @ts-ignore
|
|
397
|
+
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
398
|
+
body: {
|
|
399
|
+
manualCaption: {
|
|
400
|
+
enable: enable
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}).then(function () {
|
|
404
|
+
return undefined;
|
|
405
|
+
});
|
|
406
|
+
});
|
|
367
407
|
/**
|
|
368
408
|
* get caption status
|
|
369
409
|
* @returns {string}
|
package/dist/voicea.js.map
CHANGED
|
@@ -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","VOICEA_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","type","TRANSCRIPTION_TYPE","TRANSCRIPT_INTERIM_RESULTS","trigger","EVENT_TRIGGERS","NEW_CAPTION","isFinal","transcriptId","transcript_id","transcripts","TRANSCRIPT_FINAL_RESULT","translations","transcript","csis","text","transcriptLanguageCode","transcript_language_code","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","highlight","highlightId","highlight_id","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","JOINING","listenToEvents","webex","internal","llm","socket","send","id","recipients","route","getBinding","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","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","_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 VOICEA_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private vmcDeviceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case VOICEA_RELAY_TYPES.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n default:\n break;\n }\n };\n\n /**\n * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n // @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 translations: voiceaPayload.translations,\n transcript: {\n csis: voiceaPayload.csis,\n text: voiceaPayload.transcript.text,\n transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code,\n },\n timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),\n });\n 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: VOICEA_RELAY_TYPES.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @returns {Promise}\n */\n public setSpokenLanguage = (languageCode: string): Promise<void> =>\n // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n spokenLanguage: languageCode,\n },\n },\n }).then(() => {\n // @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: VOICEA_RELAY_TYPES.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * request turn on Captions\n * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n\n // only set the spoken language if it is provided\n const body = {\n transcribe: {caption: true},\n languageCode,\n };\n\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body,\n })\n .then(() => {\n // @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 * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","_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":"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"}
|
package/dist/voicea.types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["voicea.types.ts"],"sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable no-undef */\n\n/**\n * Type for payload\n */\ninterface AnnouncementPayload {\n translation: {\n max_languages: number;\n allowed_languages: string[];\n };\n\n ASR: {\n spoken_languages: string[];\n };\n}\n\n// eslint-disable-next-line no-undef\ntype TRANSCRIPTION_TYPES =\n | 'unknown'\n | 'eva_wake'\n | 'eva_thanks'\n | 'eva_cancel'\n | 'highlight_created'\n | 'transcript_interim_results'\n | 'transcript_final_result';\n\n/**\n * Class for an Transcription Object\n */\ninterface Transcription {\n start_millis: number;\n end_millis: number;\n text: string;\n transcript_language_code: string;\n translations: {[x: string]: string};\n csis: number[];\n last_packet_timestamp_ms: number;\n}\n\n/**\n * Highlights\n */\ninterface Highlight {\n highlight_id: string;\n transcript: string;\n highlight_label: string;\n highlight_source: string;\n start_millis: number;\n end_millis: number;\n csis: number[];\n}\n/**\n * Type for Transcription message\n */\ninterface TranscriptionResponse {\n type: TRANSCRIPTION_TYPES;\n transcript_id: string;\n translations?: {[x: string]: string};\n transcripts?: Transcription[];\n transcript?: Transcription;\n highlight?: Highlight;\n csis: number[];\n data: string;\n command_response: string;\n}\n/**\n * Type for CaptionLanguageResponse\n */\ninterface CaptionLanguageResponse {\n requestId: string;\n statusCode: number;\n errorCode: number;\n message: string;\n}\n\ninterface IVoiceaChannel {\n setSpokenLanguage: (languageCode: string) => Promise<void>;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;\n deregisterEvents: () => void;\n}\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\n"],"mappings":""}
|
|
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":""}
|
package/package.json
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
"description": "",
|
|
4
4
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/types/index.d.ts",
|
|
6
7
|
"devMain": "src/index.js",
|
|
7
8
|
"repository": {
|
|
8
9
|
"type": "git",
|
|
@@ -13,10 +14,10 @@
|
|
|
13
14
|
"node": ">=16"
|
|
14
15
|
},
|
|
15
16
|
"dependencies": {
|
|
16
|
-
"@webex/internal-plugin-llm": "3.
|
|
17
|
-
"@webex/internal-plugin-mercury": "3.
|
|
18
|
-
"@webex/plugin-meetings": "3.
|
|
19
|
-
"@webex/webex-core": "3.
|
|
17
|
+
"@webex/internal-plugin-llm": "3.2.0",
|
|
18
|
+
"@webex/internal-plugin-mercury": "3.2.0",
|
|
19
|
+
"@webex/plugin-meetings": "3.2.0",
|
|
20
|
+
"@webex/webex-core": "3.2.0",
|
|
20
21
|
"uuid": "^3.3.2"
|
|
21
22
|
},
|
|
22
23
|
"browserify": {
|
|
@@ -31,23 +32,23 @@
|
|
|
31
32
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
32
33
|
"@webex/jest-config-legacy": "0.0.0",
|
|
33
34
|
"@webex/legacy-tools": "0.0.0",
|
|
34
|
-
"@webex/test-helper-chai": "3.
|
|
35
|
-
"@webex/test-helper-mocha": "3.
|
|
36
|
-
"@webex/test-helper-mock-web-socket": "3.
|
|
37
|
-
"@webex/test-helper-mock-webex": "3.
|
|
38
|
-
"@webex/test-helper-test-users": "3.
|
|
35
|
+
"@webex/test-helper-chai": "3.2.0",
|
|
36
|
+
"@webex/test-helper-mocha": "3.2.0",
|
|
37
|
+
"@webex/test-helper-mock-web-socket": "3.2.0",
|
|
38
|
+
"@webex/test-helper-mock-webex": "3.2.0",
|
|
39
|
+
"@webex/test-helper-test-users": "3.2.0",
|
|
39
40
|
"eslint": "^8.24.0",
|
|
40
41
|
"prettier": "^2.7.1",
|
|
41
42
|
"sinon": "^9.2.4"
|
|
42
43
|
},
|
|
43
44
|
"scripts": {
|
|
44
|
-
"build": "yarn
|
|
45
|
-
"build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps",
|
|
45
|
+
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types",
|
|
46
|
+
"build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps && yarn build",
|
|
46
47
|
"deploy:npm": "yarn npm publish",
|
|
47
48
|
"test": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
|
|
48
49
|
"test:browser": "webex-legacy-tools test --integration --runner karma",
|
|
49
50
|
"test:style": "eslint ./src/**/*.*",
|
|
50
51
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
51
52
|
},
|
|
52
|
-
"version": "3.
|
|
53
|
+
"version": "3.2.0"
|
|
53
54
|
}
|
package/src/constants.ts
CHANGED
|
@@ -9,14 +9,20 @@ export const EVENT_TRIGGERS = {
|
|
|
9
9
|
NEW_CAPTION: 'voicea:newCaption',
|
|
10
10
|
EVA_COMMAND: 'voicea:wxa',
|
|
11
11
|
HIGHLIGHT_CREATED: 'voicea:highlightCreated',
|
|
12
|
+
NEW_MANUAL_CAPTION: 'aibridge:newManualCaption',
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
export const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
export const AIBRIDGE_RELAY_TYPES = {
|
|
16
|
+
VOICEA: {
|
|
17
|
+
ANNOUNCEMENT: 'voicea.annc',
|
|
18
|
+
CLIENT_ANNOUNCEMENT: 'client.annc',
|
|
19
|
+
TRANSLATION_REQUEST: 'voicea.transl.req',
|
|
20
|
+
TRANSLATION_RESPONSE: 'voicea.transl.rsp',
|
|
21
|
+
TRANSCRIPTION: 'voicea.transcription',
|
|
22
|
+
},
|
|
23
|
+
MANUAL: {
|
|
24
|
+
TRANSCRIPTION: 'aibridge.manual_transcription',
|
|
25
|
+
},
|
|
20
26
|
};
|
|
21
27
|
|
|
22
28
|
export const TRANSCRIPTION_TYPE = {
|
|
@@ -27,6 +33,8 @@ export const TRANSCRIPTION_TYPE = {
|
|
|
27
33
|
HIGHLIGHT_CREATED: 'highlight_created',
|
|
28
34
|
TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
|
|
29
35
|
TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',
|
|
36
|
+
MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',
|
|
37
|
+
MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result',
|
|
30
38
|
};
|
|
31
39
|
|
|
32
40
|
export const VOICEA = 'voicea';
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as WebexCore from '@webex/webex-core';
|
|
2
2
|
|
|
3
3
|
import VoiceaChannel from './voicea';
|
|
4
|
+
import type {MeetingTranscriptPayload} from './voicea.types';
|
|
4
5
|
|
|
5
6
|
WebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});
|
|
6
7
|
|
|
7
8
|
export {default} from './voicea';
|
|
9
|
+
export {type MeetingTranscriptPayload};
|
|
8
10
|
export {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';
|
package/src/voicea.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {WebexPlugin, config} from '@webex/webex-core';
|
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
EVENT_TRIGGERS,
|
|
6
|
-
|
|
6
|
+
AIBRIDGE_RELAY_TYPES,
|
|
7
7
|
TRANSCRIPTION_TYPE,
|
|
8
8
|
VOICEA,
|
|
9
9
|
ANNOUNCE_STATUS,
|
|
@@ -46,17 +46,20 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
46
46
|
private eventProcessor = (e) => {
|
|
47
47
|
this.seqNum = e.sequenceNumber + 1;
|
|
48
48
|
switch (e.data.relayType) {
|
|
49
|
-
case
|
|
49
|
+
case AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:
|
|
50
50
|
this.vmcDeviceId = e.headers.from;
|
|
51
51
|
this.announceStatus = ANNOUNCE_STATUS.JOINED;
|
|
52
52
|
this.processAnnouncementMessage(e.data.voiceaPayload);
|
|
53
53
|
break;
|
|
54
|
-
case
|
|
54
|
+
case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:
|
|
55
55
|
this.processCaptionLanguageResponse(e.data.voiceaPayload);
|
|
56
56
|
break;
|
|
57
|
-
case
|
|
57
|
+
case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:
|
|
58
58
|
this.processTranscription(e.data.voiceaPayload);
|
|
59
59
|
break;
|
|
60
|
+
case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
61
|
+
this.processManualTranscription(e.data.transcriptPayload);
|
|
62
|
+
break;
|
|
60
63
|
default:
|
|
61
64
|
break;
|
|
62
65
|
}
|
|
@@ -101,6 +104,28 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
101
104
|
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
102
105
|
}
|
|
103
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Process manual Transcript and send alert
|
|
109
|
+
* @param {TranscriptionResponse} transcriptPayload
|
|
110
|
+
* @returns {void}
|
|
111
|
+
*/
|
|
112
|
+
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;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
104
129
|
/**
|
|
105
130
|
* Process Transcript and send alert
|
|
106
131
|
* @param {TranscriptionResponse} voiceaPayload
|
|
@@ -122,13 +147,11 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
122
147
|
this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {
|
|
123
148
|
isFinal: true,
|
|
124
149
|
transcriptId: voiceaPayload.transcript_id,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
},
|
|
131
|
-
timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),
|
|
150
|
+
transcripts: voiceaPayload.transcripts.map((transcript) => {
|
|
151
|
+
transcript.timestamp = millisToMinutesAndSeconds(transcript.end_millis);
|
|
152
|
+
|
|
153
|
+
return transcript;
|
|
154
|
+
}),
|
|
132
155
|
});
|
|
133
156
|
break;
|
|
134
157
|
|
|
@@ -220,7 +243,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
220
243
|
version: 'v2',
|
|
221
244
|
},
|
|
222
245
|
eventType: 'relay.event',
|
|
223
|
-
relayType:
|
|
246
|
+
relayType: AIBRIDGE_RELAY_TYPES.VOICEA.CLIENT_ANNOUNCEMENT,
|
|
224
247
|
},
|
|
225
248
|
trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
|
|
226
249
|
});
|
|
@@ -273,7 +296,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
273
296
|
id: uuid.v4(),
|
|
274
297
|
},
|
|
275
298
|
eventType: 'relay.event',
|
|
276
|
-
relayType:
|
|
299
|
+
relayType: AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST,
|
|
277
300
|
},
|
|
278
301
|
trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
|
|
279
302
|
});
|
|
@@ -388,6 +411,27 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
388
411
|
});
|
|
389
412
|
};
|
|
390
413
|
|
|
414
|
+
/**
|
|
415
|
+
* Toggle turn on manual caption
|
|
416
|
+
* @param {bool} enable if true manual caption is turned on
|
|
417
|
+
* @returns {Promise}
|
|
418
|
+
*/
|
|
419
|
+
public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {
|
|
420
|
+
// @ts-ignore
|
|
421
|
+
return this.request({
|
|
422
|
+
method: 'PUT',
|
|
423
|
+
// @ts-ignore
|
|
424
|
+
url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
|
|
425
|
+
body: {
|
|
426
|
+
manualCaption: {
|
|
427
|
+
enable,
|
|
428
|
+
},
|
|
429
|
+
},
|
|
430
|
+
}).then((): undefined | Promise<void> => {
|
|
431
|
+
return undefined;
|
|
432
|
+
});
|
|
433
|
+
};
|
|
434
|
+
|
|
391
435
|
/**
|
|
392
436
|
* get caption status
|
|
393
437
|
* @returns {string}
|
package/src/voicea.types.ts
CHANGED
|
@@ -36,6 +36,7 @@ interface Transcription {
|
|
|
36
36
|
translations: {[x: string]: string};
|
|
37
37
|
csis: number[];
|
|
38
38
|
last_packet_timestamp_ms: number;
|
|
39
|
+
timestamp: string;
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
/**
|
|
@@ -55,6 +56,7 @@ interface Highlight {
|
|
|
55
56
|
*/
|
|
56
57
|
interface TranscriptionResponse {
|
|
57
58
|
type: TRANSCRIPTION_TYPES;
|
|
59
|
+
id: string;
|
|
58
60
|
transcript_id: string;
|
|
59
61
|
translations?: {[x: string]: string};
|
|
60
62
|
transcripts?: Transcription[];
|
|
@@ -82,6 +84,25 @@ interface IVoiceaChannel {
|
|
|
82
84
|
deregisterEvents: () => void;
|
|
83
85
|
}
|
|
84
86
|
|
|
87
|
+
type MeetingTranscripts = {
|
|
88
|
+
start_mills?: number;
|
|
89
|
+
end_mills?: number;
|
|
90
|
+
text: string;
|
|
91
|
+
last_packet_timestamp_ms?: number;
|
|
92
|
+
csis: Array<number>;
|
|
93
|
+
transcript_language_code: string;
|
|
94
|
+
translations?: {
|
|
95
|
+
[key: string]: string;
|
|
96
|
+
};
|
|
97
|
+
timestamp?: string;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
type MeetingTranscriptPayload = {
|
|
101
|
+
isFinal: boolean;
|
|
102
|
+
transcriptId: string;
|
|
103
|
+
transcripts: Array<MeetingTranscripts>;
|
|
104
|
+
};
|
|
105
|
+
|
|
85
106
|
export type {
|
|
86
107
|
AnnouncementPayload,
|
|
87
108
|
CaptionLanguageResponse,
|
|
@@ -89,4 +110,5 @@ export type {
|
|
|
89
110
|
Transcription,
|
|
90
111
|
Highlight,
|
|
91
112
|
IVoiceaChannel,
|
|
113
|
+
MeetingTranscriptPayload,
|
|
92
114
|
};
|
package/test/unit/spec/voicea.js
CHANGED
|
@@ -251,7 +251,7 @@ describe('plugin-voicea', () => {
|
|
|
251
251
|
it("should handle request fail", async () => {
|
|
252
252
|
voiceaService.captionStatus = 'sending';
|
|
253
253
|
voiceaService.request = sinon.stub().rejects();
|
|
254
|
-
|
|
254
|
+
|
|
255
255
|
try {
|
|
256
256
|
await voiceaService.requestTurnOnCaptions();
|
|
257
257
|
} catch (error) {
|
|
@@ -436,6 +436,56 @@ describe('plugin-voicea', () => {
|
|
|
436
436
|
});
|
|
437
437
|
});
|
|
438
438
|
|
|
439
|
+
describe('#toggleManualCaption', () => {
|
|
440
|
+
beforeEach(async () => {
|
|
441
|
+
const mockWebSocket = new MockWebSocket();
|
|
442
|
+
|
|
443
|
+
voiceaService.webex.internal.llm.socket = mockWebSocket;
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
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
|
+
await voiceaService.toggleManualCaption(true);
|
|
459
|
+
sinon.assert.calledWith(
|
|
460
|
+
voiceaService.request,
|
|
461
|
+
sinon.match({
|
|
462
|
+
method: 'PUT',
|
|
463
|
+
url: `${locusUrl}/controls/`,
|
|
464
|
+
body: {manualCaption: {enable: true}},
|
|
465
|
+
})
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
it('turns off manual caption', async () => {
|
|
472
|
+
await voiceaService.toggleManualCaption(true);
|
|
473
|
+
|
|
474
|
+
voiceaService.listenToEvents();
|
|
475
|
+
|
|
476
|
+
await voiceaService.toggleManualCaption(false);
|
|
477
|
+
sinon.assert.calledWith(
|
|
478
|
+
voiceaService.request,
|
|
479
|
+
sinon.match({
|
|
480
|
+
method: 'PUT',
|
|
481
|
+
url: `${locusUrl}/controls/`,
|
|
482
|
+
body: {manualCaption: {enable: false}},
|
|
483
|
+
})
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
|
|
439
489
|
describe('#processCaptionLanguageResponse', () => {
|
|
440
490
|
it('responds to process caption language', async () => {
|
|
441
491
|
const triggerSpy = sinon.spy();
|
|
@@ -568,6 +618,7 @@ describe('plugin-voicea', () => {
|
|
|
568
618
|
start_millis: 12204,
|
|
569
619
|
text: 'Hello?',
|
|
570
620
|
transcript_language_code: 'en',
|
|
621
|
+
timestamp: '0:13'
|
|
571
622
|
},
|
|
572
623
|
transcripts: [
|
|
573
624
|
{
|
|
@@ -579,6 +630,7 @@ describe('plugin-voicea', () => {
|
|
|
579
630
|
translations: {
|
|
580
631
|
fr: 'Bonjour.',
|
|
581
632
|
},
|
|
633
|
+
timestamp: '0:13'
|
|
582
634
|
},
|
|
583
635
|
{
|
|
584
636
|
start_millis: 12204,
|
|
@@ -589,6 +641,7 @@ describe('plugin-voicea', () => {
|
|
|
589
641
|
translations: {
|
|
590
642
|
fr: "C'est Webex",
|
|
591
643
|
},
|
|
644
|
+
timestamp: '0:13'
|
|
592
645
|
},
|
|
593
646
|
],
|
|
594
647
|
};
|
|
@@ -603,15 +656,7 @@ describe('plugin-voicea', () => {
|
|
|
603
656
|
assert.calledOnceWithExactly(triggerSpy, {
|
|
604
657
|
isFinal: true,
|
|
605
658
|
transcriptId: '3ec73890-bffb-f28b-e77f-99dc13caea7e',
|
|
606
|
-
|
|
607
|
-
en: "Hello?"
|
|
608
|
-
},
|
|
609
|
-
transcript: {
|
|
610
|
-
csis: [3556942592],
|
|
611
|
-
text: 'Hello?',
|
|
612
|
-
transcriptLanguageCode: 'en',
|
|
613
|
-
},
|
|
614
|
-
timestamp: '0:13',
|
|
659
|
+
transcripts: voiceaPayload.transcripts,
|
|
615
660
|
});
|
|
616
661
|
});
|
|
617
662
|
|
|
@@ -741,6 +786,71 @@ describe('plugin-voicea', () => {
|
|
|
741
786
|
});
|
|
742
787
|
});
|
|
743
788
|
|
|
789
|
+
describe('#processManualTranscription', () => {
|
|
790
|
+
let triggerSpy, functionSpy;
|
|
791
|
+
|
|
792
|
+
beforeEach(() => {
|
|
793
|
+
triggerSpy = sinon.spy();
|
|
794
|
+
functionSpy = sinon.spy(voiceaService, 'processManualTranscription');
|
|
795
|
+
voiceaService.listenToEvents();
|
|
796
|
+
});
|
|
797
|
+
|
|
798
|
+
it('processes interim manual transcription', async () => {
|
|
799
|
+
voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
|
|
800
|
+
const transcriptPayload = {
|
|
801
|
+
id: "747d711d-3414-fd69-7081-e842649f2d28",
|
|
802
|
+
transcripts: [
|
|
803
|
+
{
|
|
804
|
+
"text": "Good",
|
|
805
|
+
}
|
|
806
|
+
],
|
|
807
|
+
type: "manual_caption_interim_results",
|
|
808
|
+
};
|
|
809
|
+
|
|
810
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
811
|
+
await voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
812
|
+
headers: {from: 'ws'},
|
|
813
|
+
data: {relayType: 'aibridge.manual_transcription', transcriptPayload},
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
assert.calledOnceWithExactly(functionSpy, transcriptPayload);
|
|
817
|
+
assert.calledOnceWithExactly(triggerSpy, {
|
|
818
|
+
isFinal: false,
|
|
819
|
+
transcriptId: '747d711d-3414-fd69-7081-e842649f2d28',
|
|
820
|
+
transcripts: transcriptPayload.transcripts,
|
|
821
|
+
});
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
it('processes final manual transcription', async () => {
|
|
825
|
+
voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
|
|
826
|
+
|
|
827
|
+
const transcriptPayload = {
|
|
828
|
+
id: "8d226d31-044a-8d11-cc39-cedbde183154",
|
|
829
|
+
transcripts: [
|
|
830
|
+
{
|
|
831
|
+
text: "Good Morning",
|
|
832
|
+
start_millis: 10420,
|
|
833
|
+
end_millis: 11380,
|
|
834
|
+
}
|
|
835
|
+
],
|
|
836
|
+
type: "manual_caption_final_result",
|
|
837
|
+
};
|
|
838
|
+
|
|
839
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
840
|
+
await voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
841
|
+
headers: {from: 'ws'},
|
|
842
|
+
data: {relayType: 'aibridge.manual_transcription', transcriptPayload},
|
|
843
|
+
});
|
|
844
|
+
|
|
845
|
+
assert.calledOnceWithExactly(functionSpy, transcriptPayload);
|
|
846
|
+
assert.calledOnceWithExactly(triggerSpy, {
|
|
847
|
+
isFinal: true,
|
|
848
|
+
transcriptId: '8d226d31-044a-8d11-cc39-cedbde183154',
|
|
849
|
+
transcripts: transcriptPayload.transcripts,
|
|
850
|
+
});
|
|
851
|
+
});
|
|
852
|
+
});
|
|
853
|
+
|
|
744
854
|
describe("#getCaptionStatus", () => {
|
|
745
855
|
it('works correctly', () => {
|
|
746
856
|
voiceaService.captionStatus = "enabled"
|