speechstate 2.0.0-beta.1 → 2.0.0-beta.11

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.org CHANGED
@@ -1,3 +1,4 @@
1
+ #+STARTUP: inlineimages
1
2
  #+TITLE: SpeechState
2
3
 
3
4
  * SDK
@@ -19,16 +20,20 @@
19
20
  #+end_src
20
21
 
21
22
  #+begin_src typescript
22
- interface AzureCredentials {
23
- endpoint: string;
24
- key: string;
25
- }
26
-
27
- interface Settings {
28
- locale: string;
29
- azureCredentials: string | AzureCredentials; // you can use proxy URL or full credentials
30
- asrDefaultCompleteTimeout: number;
31
- }
23
+ interface AzureCredentials {
24
+ endpoint: string;
25
+ key: string;
26
+ }
27
+
28
+ interface Settings {
29
+ locale?: string;
30
+ azureCredentials: string | AzureCredentials;
31
+ azureLanguageCredentials?: AzureLanguageCredentials;
32
+ asrDefaultCompleteTimeout?: number;
33
+ asrDefaultNoInputTimeout?: number;
34
+ ttsDefaultVoice?: string;
35
+ speechRecognitionEndpointId?: string;
36
+ }
32
37
  #+end_src
33
38
 
34
39
 
@@ -45,7 +50,7 @@ Example action:
45
50
  *** DM to SpeechState
46
51
  - ~{ type: "PREPARE" }~
47
52
  - ~{ type: "SPEAK"; value: Agenda }~
48
- - ~{ type: "LISTEN" }~
53
+ - ~{ type: "LISTEN"; value?: RecogniseParameters }~
49
54
  - ~{ type: "CONTROL" }~
50
55
  - ~{ type: "STOP" }~
51
56
 
@@ -53,22 +58,38 @@ Example action:
53
58
  *** SpeechState to DM
54
59
  - ~{ type: "ASRTTS_READY" }~
55
60
  - ~{ type: "ASR_NOINPUT" }~
56
- - ~{ type: "RECOGNISED"; value: Hypothesis[] }~
61
+ - ~{ type: "RECOGNISED"; value: Hypothesis[]; nluValue?: any }~
57
62
  - ~{ type: "SPEAK_COMPLETE" }~
58
63
  - ~{ type: "ASR_STARTED" }~
59
64
  - ~{ type: "TTS_STARTED" }~
60
65
  ** Types:
61
66
  #+begin_src typescript
62
- interface Hypothesis {
67
+ interface Hypothesis {
68
+ utterance: string;
69
+ confidence: number;
70
+ }
71
+
72
+ interface Agenda {
63
73
  utterance: string;
64
- confidence: number;
65
- }
66
-
67
- interface Agenda {
68
- utterance: string;
69
- voice?: string; // defaults to "en-US-DavisNeural"
70
- streamURL?: string;
71
- }
74
+ voice?: string; // defaults to "en-US-DavisNeural"
75
+ streamURL?: string;
76
+ }
77
+
78
+ interface RecogniseParameters {
79
+ noInputTimeout?: number;
80
+ completeTimeout?: number;
81
+ locale?: string;
82
+ hints?: string[];
83
+ nlu?: boolean | AzureLanguageCredentials;
84
+ }
85
+
86
+ interface AzureLanguageCredentials {
87
+ endpoint: string;
88
+ key: string;
89
+ projectName: string;
90
+ deploymentName: string;
91
+ }
92
+
72
93
  #+end_src
73
94
 
74
95
 
@@ -90,3 +111,33 @@ interface Agenda {
90
111
  - Resource group: group name from the previous step
91
112
  5. Within your Speech Service go to: *Resourse management → Keys and
92
113
  Endpoint* and copy your KEY 1.
114
+ * Sequence diagrams
115
+ #+begin_src plantuml :results output replace :file docs/diagrams/dm-speechstate.svg :exports results
116
+ skinparam defaultFontName Helvetica
117
+ participant SpeechState as SS
118
+ hnote across: Initialization
119
+ create SS
120
+ DM -> SS : **spawn**
121
+ DM -> SS : PREPARE
122
+ SS -> DM : ASRTTS_READY
123
+ hnote across: Speech Synthesis
124
+ DM -> SS : SPEAK
125
+ activate SS
126
+ SS --> DM : TTS_STARTED
127
+ return SPEAK_COMPLETE
128
+ hnote across: Speech Recognition
129
+ DM -> SS : LISTEN
130
+ activate SS
131
+ SS --> DM : ASR_STARTED
132
+ return RECOGNISED
133
+ DM -> SS : LISTEN
134
+ activate SS
135
+ SS --> DM : ASR_STARTED
136
+ ... > noInputTimeout ...
137
+ return ASR_NOINPUT
138
+ #+end_src
139
+
140
+ #+RESULTS:
141
+ [[file:docs/diagrams/dm-speechstate.svg]]
142
+
143
+
@@ -0,0 +1,3 @@
1
+ @startuml
2
+ Bob -> Alice : Hello World!
3
+ @enduml
package/README.png ADDED
Binary file
package/dist/asr.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /// <reference types="webspeechapi" />
2
- import { RecogniseParameters, Hypothesis, AzureCredentials } from "./types";
2
+ import { RecogniseParameters, Hypothesis, AzureSpeechCredentials, AzureLanguageCredentials } from "./types";
3
3
  interface MySpeechRecognition extends SpeechRecognition {
4
4
  new (): any;
5
5
  }
@@ -40,6 +40,7 @@ interface ASRContext extends ASRInit {
40
40
  wsaASRinstance?: MySpeechRecognition;
41
41
  wsaGrammarList?: MySpeechGrammarList;
42
42
  result?: Hypothesis[];
43
+ nluResult?: any;
43
44
  params?: RecogniseParameters;
44
45
  }
45
46
  interface ASRInit {
@@ -47,8 +48,70 @@ interface ASRInit {
47
48
  asrDefaultNoInputTimeout: number;
48
49
  locale: string;
49
50
  audioContext: AudioContext;
50
- azureCredentials: string | AzureCredentials;
51
+ azureCredentials: string | AzureSpeechCredentials;
52
+ speechRecognitionEndpointId?: string;
53
+ azureLanguageCredentials?: AzureLanguageCredentials;
51
54
  }
52
- export declare const asrMachine: import("xstate").StateMachine<ASRContext, ASREvent, Record<string, import("xstate").AnyActorRef>, import("xstate").ProvidedActor, import("xstate").ParameterizedObject, import("xstate").ParameterizedObject, string, import("xstate").StateValue, string, ASRInit, {}, import("xstate").ResolveTypegenMeta<import("xstate").TypegenDisabled, ASREvent, import("xstate").ProvidedActor, import("xstate").ParameterizedObject, import("xstate").ParameterizedObject, string, string>>;
55
+ export declare const asrMachine: import("xstate").StateMachine<ASRContext, ASREvent, {
56
+ [x: string]: import("xstate").ActorRef<import("xstate").CallbackSnapshot<{}>, import("xstate").EventObject> | import("xstate").ActorRef<import("xstate").PromiseSnapshot<string, any>, {
57
+ [k: string]: unknown;
58
+ type: string;
59
+ }> | import("xstate").ActorRef<import("xstate").CallbackSnapshot<any>, import("xstate").EventObject> | import("xstate").ActorRef<import("xstate").PromiseSnapshot<any, AzureLanguageCredentials & {
60
+ query: string;
61
+ }>, {
62
+ [k: string]: unknown;
63
+ type: string;
64
+ }>;
65
+ }, {
66
+ src: "getToken";
67
+ logic: import("xstate").PromiseActorLogic<string, any>;
68
+ id: string;
69
+ } | {
70
+ src: "ponyfill";
71
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, {}>;
72
+ id: string;
73
+ } | {
74
+ src: "recStart";
75
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, any>;
76
+ id: string;
77
+ } | {
78
+ src: "nluPromise";
79
+ logic: import("xstate").PromiseActorLogic<any, AzureLanguageCredentials & {
80
+ query: string;
81
+ }>;
82
+ id: string;
83
+ }, {
84
+ type: "recStop";
85
+ params: unknown;
86
+ }, {
87
+ type: string;
88
+ params: {};
89
+ }, string, "GetToken" | "Ready" | "Fail" | "Ponyfill" | "Pause" | {
90
+ Recognising?: "WaitForRecogniser" | "NoInput" | "InProgress" | "Match" | "NLURequest";
91
+ }, string, ASRInit, {}, import("xstate").ResolveTypegenMeta<import("xstate").TypegenDisabled, ASREvent, {
92
+ src: "getToken";
93
+ logic: import("xstate").PromiseActorLogic<string, any>;
94
+ id: string;
95
+ } | {
96
+ src: "ponyfill";
97
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, {}>;
98
+ id: string;
99
+ } | {
100
+ src: "recStart";
101
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, any>;
102
+ id: string;
103
+ } | {
104
+ src: "nluPromise";
105
+ logic: import("xstate").PromiseActorLogic<any, AzureLanguageCredentials & {
106
+ query: string;
107
+ }>;
108
+ id: string;
109
+ }, {
110
+ type: "recStop";
111
+ params: unknown;
112
+ }, {
113
+ type: string;
114
+ params: {};
115
+ }, string, string>>;
53
116
  export {};
54
117
  //# sourceMappingURL=asr.d.ts.map
package/dist/asr.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"asr.d.ts","sourceRoot":"","sources":["../src/asr.ts"],"names":[],"mappings":";AAaA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC5E,UAAU,mBAAoB,SAAQ,iBAAiB;IACrD,YAAO;CACR;AAED,UAAU,mBAAoB,SAAQ,iBAAiB;IACrD,YAAO;CACR;AAED,KAAK,QAAQ,GACT;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QACL,MAAM,EAAE,mBAAmB,CAAC;QAC5B,cAAc,EAAE,mBAAmB,CAAC;KACrC,CAAC;CACH,GACD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE;QAAE,cAAc,EAAE,mBAAmB,CAAA;KAAE,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAE5C,UAAU,UAAW,SAAQ,OAAO;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,UAAU,OAAO;IACf,yBAAyB,EAAE,MAAM,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,gBAAgB,CAAC;CAC7C;AAED,eAAO,MAAM,UAAU,sdAyQtB,CAAC"}
1
+ {"version":3,"file":"asr.d.ts","sourceRoot":"","sources":["../src/asr.ts"],"names":[],"mappings":";AAcA,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,UAAU,mBAAoB,SAAQ,iBAAiB;IACrD,YAAO;CACR;AACD,UAAU,mBAAoB,SAAQ,iBAAiB;IACrD,YAAO;CACR;AAED,KAAK,QAAQ,GACT;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QACL,MAAM,EAAE,mBAAmB,CAAC;QAC5B,cAAc,EAAE,mBAAmB,CAAC;KACrC,CAAC;CACH,GACD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE;QAAE,cAAc,EAAE,mBAAmB,CAAA;KAAE,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAE5C,UAAU,UAAW,SAAQ,OAAO;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,UAAU,OAAO;IACf,yBAAyB,EAAE,MAAM,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,sBAAsB,CAAC;IAClD,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;CACrD;AAED,eAAO,MAAM,UAAU;;;;;eAiF8C,MAAM;;;;;;;;;;;;;;;;;;;;eAAN,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;eAAN,MAAM;;;;;;;;;mBA6RzE,CAAC"}
package/dist/asr.js CHANGED
@@ -1,19 +1,133 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.asrMachine = void 0;
4
13
  const xstate_1 = require("xstate");
5
14
  const getToken_1 = require("./getToken");
6
15
  const SpeechToText_1 = require("web-speech-cognitive-services/lib/SpeechServices/SpeechToText");
7
16
  const REGION = "northeurope";
8
- exports.asrMachine = (0, xstate_1.createMachine)({
17
+ exports.asrMachine = (0, xstate_1.setup)({
18
+ types: {
19
+ context: {},
20
+ events: {},
21
+ input: {},
22
+ },
23
+ actions: {
24
+ recStop: ({ context }) => {
25
+ context.wsaASRinstance.abort();
26
+ console.debug("[ASR] stopped");
27
+ },
28
+ },
29
+ actors: {
30
+ getToken: getToken_1.getToken,
31
+ ponyfill: (0, xstate_1.fromCallback)(({ sendBack, input }) => {
32
+ const { SpeechGrammarList, SpeechRecognition } = (0, SpeechToText_1.default)({
33
+ audioContext: input.audioContext,
34
+ speechRecognitionEndpointId: input
35
+ .speechRecognitionEndpointId,
36
+ credentials: {
37
+ region: REGION, // TODO
38
+ authorizationToken: input.azureAuthorizationToken,
39
+ },
40
+ });
41
+ sendBack({
42
+ type: "READY",
43
+ value: {
44
+ wsaASR: SpeechRecognition,
45
+ wsaGrammarList: SpeechGrammarList,
46
+ },
47
+ });
48
+ console.debug("[ASR] READY", input);
49
+ }),
50
+ recStart: (0, xstate_1.fromCallback)(({ sendBack, input }) => {
51
+ let asr = new input.wsaASR();
52
+ asr.grammars = new input.wsaGrammarList();
53
+ asr.grammars.phrases = input.phrases || [];
54
+ asr.lang = input.locale;
55
+ asr.continuous = true;
56
+ asr.interimResults = true;
57
+ asr.onresult = function (event) {
58
+ if (event.results[event.results.length - 1].isFinal) {
59
+ const transcript = event.results
60
+ .map((x) => x[0].transcript.replace(/\.$/, ""))
61
+ .join(" ");
62
+ const confidence = event.results
63
+ .map((x) => x[0].confidence)
64
+ .reduce((a, b) => a + b) / event.results.length;
65
+ const res = [
66
+ {
67
+ utterance: transcript,
68
+ confidence: confidence,
69
+ },
70
+ ];
71
+ sendBack({
72
+ type: "RESULT",
73
+ value: res,
74
+ });
75
+ console.debug("[ASR] RESULT (pre-final)", res);
76
+ }
77
+ else {
78
+ sendBack({ type: "STARTSPEECH" });
79
+ }
80
+ };
81
+ asr.addEventListener("start", () => {
82
+ sendBack({ type: "STARTED", value: { wsaASRinstance: asr } });
83
+ });
84
+ // receive((event) => {
85
+ // console.debug("bla");
86
+ // if (event.type === "STOP") {
87
+ // asr.abort();
88
+ // }
89
+ // });
90
+ asr.start();
91
+ }),
92
+ nluPromise: (0, xstate_1.fromPromise)(({ input }) => __awaiter(void 0, void 0, void 0, function* () {
93
+ const response = yield fetch(new Request(input.endpoint, {
94
+ method: "POST",
95
+ headers: {
96
+ "Ocp-Apim-Subscription-Key": input.key,
97
+ "Content-Type": "application/json",
98
+ },
99
+ body: JSON.stringify({
100
+ kind: "Conversation",
101
+ analysisInput: {
102
+ conversationItem: {
103
+ id: "PARTICIPANT_ID_HERE",
104
+ text: input.query,
105
+ modality: "text",
106
+ language: "en-US", // TODO
107
+ participantId: "PARTICIPANT_ID_HERE",
108
+ },
109
+ },
110
+ parameters: {
111
+ projectName: input.projectName,
112
+ verbose: true,
113
+ deploymentName: input.deploymentName,
114
+ stringIndexType: "TextElement_V8",
115
+ },
116
+ }),
117
+ }));
118
+ return response.json();
119
+ })),
120
+ },
121
+ }).createMachine({
9
122
  id: "asr",
10
- types: {},
11
123
  context: ({ input }) => ({
12
124
  asrDefaultCompleteTimeout: input.asrDefaultCompleteTimeout || 0,
13
125
  asrDefaultNoInputTimeout: input.asrDefaultNoInputTimeout || 5000,
14
126
  locale: input.locale || "en-US",
15
127
  audioContext: input.audioContext,
16
128
  azureCredentials: input.azureCredentials,
129
+ azureLanguageCredentials: input.azureLanguageCredentials,
130
+ speechRecognitionEndpointId: input.speechRecognitionEndpointId,
17
131
  }),
18
132
  initial: "GetToken",
19
133
  on: {
@@ -34,7 +148,7 @@ exports.asrMachine = (0, xstate_1.createMachine)({
34
148
  on: {
35
149
  START: {
36
150
  target: "Recognising",
37
- actions: (0, xstate_1.assign)({ params: ({ event }) => event.value }),
151
+ actions: (0, xstate_1.assign)({ params: ({ event }) => event.value || {} }),
38
152
  },
39
153
  },
40
154
  },
@@ -61,18 +175,27 @@ exports.asrMachine = (0, xstate_1.createMachine)({
61
175
  ],
62
176
  target: ".Match",
63
177
  },
64
- RECOGNISED: {
65
- target: "Ready",
66
- actions: [
67
- (0, xstate_1.sendParent)(({ context }) => ({
68
- type: "RECOGNISED",
69
- value: context.result,
70
- })),
71
- ],
72
- },
178
+ RECOGNISED: [
179
+ {
180
+ target: ".NLURequest",
181
+ guard: ({ context }) => !!(context.params.nlu && context.azureLanguageCredentials),
182
+ },
183
+ {
184
+ target: "Ready",
185
+ actions: [
186
+ (0, xstate_1.sendParent)(({ context }) => ({
187
+ type: "RECOGNISED",
188
+ value: context.result,
189
+ })),
190
+ ],
191
+ },
192
+ ],
73
193
  CONTROL: {
74
194
  target: "Pause",
75
195
  },
196
+ STOP: {
197
+ target: "Ready",
198
+ },
76
199
  NOINPUT: {
77
200
  actions: (0, xstate_1.sendParent)({ type: "ASR_NOINPUT" }),
78
201
  target: "Ready",
@@ -122,6 +245,58 @@ exports.asrMachine = (0, xstate_1.createMachine)({
122
245
  }),
123
246
  ],
124
247
  },
248
+ NLURequest: {
249
+ invoke: {
250
+ src: "nluPromise",
251
+ input: ({ context }) => {
252
+ let c;
253
+ typeof context.params.nlu === "boolean"
254
+ ? (c = context.azureLanguageCredentials)
255
+ : (c = context.params.nlu);
256
+ return {
257
+ endpoint: c.endpoint,
258
+ key: c.key,
259
+ projectName: c.projectName,
260
+ deploymentName: c.deploymentName,
261
+ query: context.result[0].utterance,
262
+ };
263
+ },
264
+ onDone: [
265
+ {
266
+ actions: [
267
+ ({ event }) => console.error("[ASR] no NLU prediction", event.output),
268
+ (0, xstate_1.sendParent)(({ context }) => ({
269
+ type: "RECOGNISED",
270
+ value: context.result,
271
+ })),
272
+ ],
273
+ target: "#asr.Ready",
274
+ guard: ({ event }) => !(event.output.result || {}).prediction,
275
+ },
276
+ {
277
+ actions: [
278
+ ({ event }) => console.debug("[ASR] NLU result", event.output.result.prediction),
279
+ (0, xstate_1.sendParent)(({ context, event }) => ({
280
+ type: "RECOGNISED",
281
+ value: context.result,
282
+ nluValue: event.output.result.prediction,
283
+ })),
284
+ ],
285
+ target: "#asr.Ready",
286
+ },
287
+ ],
288
+ onError: {
289
+ actions: [
290
+ ({ event }) => console.error("[ASR]", event.error),
291
+ (0, xstate_1.sendParent)(({ context }) => ({
292
+ type: "RECOGNISED",
293
+ value: context.result,
294
+ })),
295
+ ],
296
+ target: "#asr.Ready",
297
+ },
298
+ },
299
+ },
125
300
  },
126
301
  },
127
302
  Pause: {
@@ -158,6 +333,7 @@ exports.asrMachine = (0, xstate_1.createMachine)({
158
333
  ],
159
334
  },
160
335
  onError: {
336
+ actions: ({ event }) => console.error("[ASR]", event.error),
161
337
  target: "Fail",
162
338
  },
163
339
  },
@@ -170,78 +346,9 @@ exports.asrMachine = (0, xstate_1.createMachine)({
170
346
  audioContext: context.audioContext,
171
347
  azureAuthorizationToken: context.azureAuthorizationToken,
172
348
  locale: context.locale,
349
+ speechRecognitionEndpointId: context.speechRecognitionEndpointId,
173
350
  }),
174
351
  },
175
352
  },
176
353
  },
177
- }, {
178
- actions: {
179
- recStop: ({ context }) => {
180
- context.wsaASRinstance.abort();
181
- console.debug("[ASR] stopped");
182
- },
183
- },
184
- actors: {
185
- getToken: getToken_1.getToken,
186
- ponyfill: (0, xstate_1.fromCallback)(({ sendBack, input }) => {
187
- const { SpeechGrammarList, SpeechRecognition } = (0, SpeechToText_1.default)({
188
- audioContext: input.audioContext,
189
- credentials: {
190
- region: REGION,
191
- authorizationToken: input.azureAuthorizationToken,
192
- },
193
- });
194
- sendBack({
195
- type: "READY",
196
- value: {
197
- wsaASR: SpeechRecognition,
198
- wsaGrammarList: SpeechGrammarList,
199
- },
200
- });
201
- console.debug("[ASR] READY");
202
- }),
203
- recStart: (0, xstate_1.fromCallback)(({ sendBack, input }) => {
204
- let asr = new input.wsaASR();
205
- asr.grammars = new input.wsaGrammarList();
206
- asr.grammars.phrases = input.phrases || [];
207
- asr.lang = input.locale;
208
- asr.continuous = true;
209
- asr.interimResults = true;
210
- asr.onresult = function (event) {
211
- if (event.results[event.results.length - 1].isFinal) {
212
- const transcript = event.results
213
- .map((x) => x[0].transcript.replace(/\.$/, ""))
214
- .join(" ");
215
- const confidence = event.results
216
- .map((x) => x[0].confidence)
217
- .reduce((a, b) => a + b) /
218
- event.results.length;
219
- const res = [
220
- {
221
- utterance: transcript,
222
- confidence: confidence,
223
- },
224
- ];
225
- sendBack({
226
- type: "RESULT",
227
- value: res,
228
- });
229
- console.debug("[ASR] RESULT (pre-final)", res);
230
- }
231
- else {
232
- sendBack({ type: "STARTSPEECH" });
233
- }
234
- };
235
- asr.addEventListener("start", () => {
236
- sendBack({ type: "STARTED", value: { wsaASRinstance: asr } });
237
- });
238
- // receive((event) => {
239
- // console.debug("bla");
240
- // if (event.type === "STOP") {
241
- // asr.abort();
242
- // }
243
- // });
244
- asr.start();
245
- }),
246
- },
247
354
  });
@@ -1,11 +1,12 @@
1
- import { Settings, Agenda, Hypothesis } from "./types";
1
+ import { Settings, Agenda, Hypothesis, RecogniseParameters } from "./types";
2
2
  interface SSContext {
3
3
  settings: Settings;
4
4
  audioContext?: AudioContext;
5
5
  asrRef?: any;
6
6
  ttsRef?: any;
7
7
  }
8
- type SSEvent = {
8
+ /** events sent to the spawned `speechstate` machine **/
9
+ type SSEventExtIn = {
9
10
  type: "PREPARE";
10
11
  } | {
11
12
  type: "CONTROL";
@@ -14,26 +15,34 @@ type SSEvent = {
14
15
  } | {
15
16
  type: "SPEAK";
16
17
  value: Agenda;
17
- } | {
18
- type: "TTS_READY";
19
- } | {
20
- type: "TTS_STARTED";
21
- } | {
22
- type: "TTS_ERROR";
23
- } | {
24
- type: "SPEAK_COMPLETE";
25
- } | {
26
- type: "ASR_READY";
27
18
  } | {
28
19
  type: "LISTEN";
20
+ value: RecogniseParameters;
21
+ };
22
+ /** for sendParent, not type-checked */
23
+ type SSEventExtOut = {
24
+ type: "ASR_NOINPUT";
25
+ } | {
26
+ type: "ASRTTS_READY";
29
27
  } | {
30
28
  type: "ASR_STARTED";
31
29
  } | {
32
- type: "ASR_NOINPUT";
30
+ type: "TTS_STARTED";
31
+ } | {
32
+ type: "SPEAK_COMPLETE";
33
33
  } | {
34
34
  type: "RECOGNISED";
35
35
  value: Hypothesis[];
36
+ nluValue?: any;
37
+ };
38
+ type SSEventIntIn = {
39
+ type: "TTS_READY";
40
+ } | {
41
+ type: "ASR_READY";
42
+ } | {
43
+ type: "TTS_ERROR";
36
44
  };
45
+ type SSEvent = SSEventIntIn | SSEventExtIn | SSEventExtOut;
37
46
  declare const speechstate: import("xstate").StateMachine<SSContext, SSEvent, Record<string, import("xstate").AnyActorRef>, import("xstate").ProvidedActor, import("xstate").ParameterizedObject, import("xstate").ParameterizedObject, string, import("xstate").StateValue, string, Settings, {}, import("xstate").ResolveTypegenMeta<import("xstate").TypegenDisabled, SSEvent, import("xstate").ProvidedActor, import("xstate").ParameterizedObject, import("xstate").ParameterizedObject, string, string>>;
38
47
  export { speechstate };
39
48
  //# sourceMappingURL=speechstate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"speechstate.d.ts","sourceRoot":"","sources":["../src/speechstate.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvD,UAAU,SAAS;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,KAAK,OAAO,GACR;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAEhD,QAAA,MAAM,WAAW,odAuPhB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"speechstate.d.ts","sourceRoot":"","sources":["../src/speechstate.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC5E,UAAU,SAAS;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,wDAAwD;AACxD,KAAK,YAAY,GACb;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEnD,uCAAuC;AACvC,KAAK,aAAa,GACd;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC;AAEhE,KAAK,YAAY,GACb;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,KAAK,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;AAE3D,QAAA,MAAM,WAAW,odAuQhB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}