speechstate 2.0.1 → 2.0.3

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.
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.speechstate = void 0;
4
+ const xstate_1 = require("xstate");
5
+ const tts_1 = require("./tts");
6
+ const asr_1 = require("./asr");
7
+ const speechstate = (0, xstate_1.createMachine)({
8
+ types: {},
9
+ context: ({ input }) => ({
10
+ settings: input,
11
+ }),
12
+ id: "speechstate",
13
+ type: "parallel",
14
+ states: {
15
+ AsrTtsSpawner: {
16
+ initial: "Idle",
17
+ on: {
18
+ STOP: { target: ".Stopped", actions: (0, xstate_1.assign)({ audioContext: null }) },
19
+ },
20
+ states: {
21
+ Idle: { on: { PREPARE: "CreateAudioContext" } },
22
+ CreateAudioContext: {
23
+ invoke: {
24
+ id: "createAudioContext",
25
+ src: "audioContext",
26
+ onDone: {
27
+ target: "Spawn",
28
+ actions: (0, xstate_1.assign)({ audioContext: ({ event }) => event.output }),
29
+ },
30
+ },
31
+ },
32
+ Spawn: {
33
+ entry: [
34
+ (0, xstate_1.assign)({
35
+ ttsRef: ({ context, spawn }) => {
36
+ return spawn(tts_1.ttsMachine, {
37
+ id: "ttsRef",
38
+ input: {
39
+ ttsDefaultVoice: context.settings.ttsDefaultVoice,
40
+ audioContext: context.audioContext,
41
+ azureCredentials: context.settings.azureCredentials,
42
+ },
43
+ });
44
+ },
45
+ }),
46
+ (0, xstate_1.assign)({
47
+ asrRef: ({ context, spawn }) => {
48
+ return spawn(asr_1.asrMachine, {
49
+ id: "asrRef",
50
+ input: {
51
+ asrDefaultCompleteTimeout: context.settings.asrDefaultCompleteTimeout,
52
+ asrDefaultNoInputTimeout: context.settings.asrDefaultNoInputTimeout,
53
+ locale: context.settings.locale,
54
+ audioContext: context.audioContext,
55
+ azureCredentials: context.settings.azureCredentials,
56
+ azureLanguageCredentials: context.settings.azureLanguageCredentials,
57
+ speechRecognitionEndpointId: context.settings.speechRecognitionEndpointId,
58
+ },
59
+ });
60
+ },
61
+ }),
62
+ ],
63
+ exit: [
64
+ (0, xstate_1.stopChild)("ttsRef"),
65
+ (0, xstate_1.stopChild)("asrRef"),
66
+ (0, xstate_1.assign)({ ttsRef: undefined, asrRef: undefined }),
67
+ ],
68
+ after: {
69
+ 300000: {
70
+ target: "Spawn",
71
+ reenter: true,
72
+ },
73
+ },
74
+ },
75
+ Stopped: {},
76
+ },
77
+ },
78
+ AsrTtsManager: {
79
+ initial: "Initialize",
80
+ on: {
81
+ TTS_READY: {
82
+ actions: () => console.debug("[TTS→SpSt] TTS_READY"),
83
+ target: ".PreReady",
84
+ },
85
+ ASR_READY: {
86
+ actions: () => console.debug("[ASR→SpSt] ASR_READY"),
87
+ target: ".PreReady",
88
+ },
89
+ // ASR_ERROR not implemented
90
+ TTS_ERROR: {
91
+ actions: () => console.error("[TTS→SpSt] TTS_ERROR"),
92
+ target: ".Fail",
93
+ },
94
+ ASR_NOINPUT: {
95
+ actions: [
96
+ () => console.debug("[ASR→SpSt] NOINPUT"),
97
+ (0, xstate_1.sendParent)({ type: "ASR_NOINPUT" }),
98
+ ],
99
+ target: ".Ready",
100
+ },
101
+ STOP: ".Stopped",
102
+ },
103
+ states: {
104
+ Initialize: {
105
+ meta: { view: "not-ready" },
106
+ },
107
+ PreReady: {
108
+ meta: { view: "not-ready" },
109
+ on: {
110
+ TTS_READY: {
111
+ actions: () => console.debug("[TTS→SpSt] TTS_READY"),
112
+ target: "Ready",
113
+ },
114
+ ASR_READY: {
115
+ actions: () => console.debug("[ASR→SpSt] ASR_READY"),
116
+ target: "Ready",
117
+ },
118
+ },
119
+ },
120
+ Ready: {
121
+ initial: "Idle",
122
+ entry: [
123
+ () => console.debug("[SpSt] All ready"),
124
+ (0, xstate_1.sendParent)({ type: "ASRTTS_READY" }),
125
+ ],
126
+ states: {
127
+ Idle: {
128
+ meta: { view: "idle" },
129
+ on: {
130
+ LISTEN: { target: "WaitForRecogniser" },
131
+ SPEAK: [
132
+ {
133
+ target: "Speaking",
134
+ },
135
+ ],
136
+ },
137
+ },
138
+ Speaking: {
139
+ initial: "Proceed",
140
+ entry: [
141
+ ({ event }) => console.debug("[SpSt→TTS] SPEAK", event.value),
142
+ ({ context, event }) => context.ttsRef.send({
143
+ type: "SPEAK",
144
+ value: event.value,
145
+ }),
146
+ ],
147
+ on: {
148
+ STOP: {
149
+ target: "#speechstate.AsrTtsManager.Stopped",
150
+ actions: [
151
+ () => console.debug("[SpSt→TTS] STOP"),
152
+ ({ context }) => context.ttsRef.send({
153
+ type: "STOP",
154
+ }),
155
+ ],
156
+ },
157
+ TTS_STARTED: {
158
+ actions: [
159
+ () => console.debug("[TTS→SpSt] TTS_STARTED"),
160
+ (0, xstate_1.sendParent)({ type: "TTS_STARTED" }),
161
+ ],
162
+ },
163
+ SPEAK_COMPLETE: {
164
+ target: "Idle",
165
+ actions: [
166
+ () => console.debug("[TTS→SpSt] SPEAK_COMPLETE"),
167
+ (0, xstate_1.sendParent)({ type: "SPEAK_COMPLETE" }),
168
+ ],
169
+ },
170
+ },
171
+ states: {
172
+ Proceed: {
173
+ meta: { view: "speaking" },
174
+ on: {
175
+ CONTROL: {
176
+ target: "Paused",
177
+ actions: [
178
+ () => console.debug("[SpSt→TTS] CONTROL"),
179
+ ({ context }) => context.ttsRef.send({
180
+ type: "CONTROL",
181
+ }),
182
+ ],
183
+ },
184
+ },
185
+ },
186
+ Paused: {
187
+ meta: { view: "speaking-paused" },
188
+ on: {
189
+ CONTROL: {
190
+ target: "Proceed",
191
+ actions: [
192
+ () => console.debug("[SpSt→TTS] CONTROL"),
193
+ ({ context }) => context.ttsRef.send({
194
+ type: "CONTROL",
195
+ }),
196
+ ],
197
+ },
198
+ },
199
+ },
200
+ },
201
+ },
202
+ WaitForRecogniser: {
203
+ meta: { view: "idle" },
204
+ entry: [
205
+ ({ event }) => console.debug("[SpSt→ASR] START", event.value),
206
+ ({ context, event }) => context.asrRef.send({
207
+ type: "START",
208
+ value: event.value,
209
+ }),
210
+ ],
211
+ on: {
212
+ ASR_STARTED: {
213
+ target: "Recognising",
214
+ actions: [
215
+ () => console.debug("[ASR→SpSt] ASR_STARTED"),
216
+ (0, xstate_1.sendParent)({ type: "ASR_STARTED" }),
217
+ ],
218
+ },
219
+ },
220
+ },
221
+ Recognising: {
222
+ meta: { view: "recognising" },
223
+ on: {
224
+ CONTROL: {
225
+ /** TODO go to paused state? */
226
+ actions: [
227
+ () => console.debug("[SpSt→ASR] CONTROL"),
228
+ ({ context }) => context.asrRef.send({
229
+ type: "CONTROL",
230
+ }),
231
+ ],
232
+ },
233
+ STOP: {
234
+ target: "#speechstate.AsrTtsManager.Stopped",
235
+ actions: [
236
+ () => console.debug("[SpSt→ASR] STOP"),
237
+ ({ context }) => context.asrRef.send({
238
+ type: "STOP",
239
+ }),
240
+ ],
241
+ },
242
+ RECOGNISED: {
243
+ actions: [
244
+ ({ event }) => console.debug("[ASR→SpSt] RECOGNISED", event.value, event.nluValue),
245
+ (0, xstate_1.sendParent)(({ event }) => ({
246
+ type: "RECOGNISED",
247
+ value: event.value,
248
+ nluValue: event.nluValue,
249
+ })),
250
+ ],
251
+ target: "Idle",
252
+ },
253
+ },
254
+ },
255
+ },
256
+ },
257
+ Fail: { meta: { view: "error" } },
258
+ Stopped: { meta: { view: "stopped" } },
259
+ },
260
+ },
261
+ },
262
+ }, {
263
+ actors: {
264
+ audioContext: (0, xstate_1.fromPromise)(() => {
265
+ const audioContext = new (window.AudioContext ||
266
+ window.webkitAudioContext)();
267
+ navigator.mediaDevices
268
+ .getUserMedia({ audio: true })
269
+ .then(function (stream) {
270
+ audioContext.createMediaStreamSource(stream);
271
+ });
272
+ return audioContext;
273
+ }),
274
+ },
275
+ actions: {
276
+ // logRecResult: ({ event }) => {
277
+ // console.log("U>", (event as any).value[0]["utterance"], {
278
+ // confidence: (event as any).value[0]["confidence"],
279
+ // });
280
+ // },
281
+ // logAgenda: ({ context, event }) => {
282
+ // console.log("S>", (event as any).value, {
283
+ // passivity: `${context.tdmPassivity ?? "∞"} ms`,
284
+ // speechCompleteTimeout: `${
285
+ // context.tdmSpeechCompleteTimeout ||
286
+ // context.settings.completeTimeout
287
+ // } ms`,
288
+ // });
289
+ // },
290
+ },
291
+ });
292
+ exports.speechstate = speechstate;
package/dist/tts.d.ts ADDED
@@ -0,0 +1,142 @@
1
+ import { AzureSpeechCredentials, Agenda } from "./types";
2
+ interface MySpeechSynthesisUtterance extends SpeechSynthesisUtterance {
3
+ new (s: string): any;
4
+ }
5
+ interface TTSInit {
6
+ audioContext: AudioContext;
7
+ azureCredentials: string | AzureSpeechCredentials;
8
+ ttsDefaultVoice: string;
9
+ }
10
+ interface TTSContext extends TTSInit {
11
+ azureAuthorizationToken?: string;
12
+ ttsLexicon?: string;
13
+ wsaTTS?: SpeechSynthesis;
14
+ wsaVoice?: SpeechSynthesisVoice;
15
+ wsaUtt?: MySpeechSynthesisUtterance;
16
+ agenda?: Agenda;
17
+ buffer?: string;
18
+ utteranceFromStream?: string;
19
+ }
20
+ type TTSEvent = {
21
+ type: "PREPARE";
22
+ } | {
23
+ type: "CONTROL";
24
+ } | {
25
+ type: "STOP";
26
+ } | {
27
+ type: "READY";
28
+ value: {
29
+ wsaTTS: SpeechSynthesis;
30
+ wsaUtt: MySpeechSynthesisUtterance;
31
+ };
32
+ } | {
33
+ type: "ERROR";
34
+ } | {
35
+ type: "SPEAK";
36
+ value: Agenda;
37
+ } | {
38
+ type: "TTS_STARTED";
39
+ } | {
40
+ type: "STREAMING_CHUNK";
41
+ value: string;
42
+ } | {
43
+ type: "STREAMING_DONE";
44
+ } | {
45
+ type: "SPEAK_COMPLETE";
46
+ };
47
+ export declare const ttsMachine: import("xstate").StateMachine<TTSContext, TTSEvent, {
48
+ [x: string]: import("xstate").ActorRef<import("xstate").CallbackSnapshot<{}>, import("xstate").EventObject, import("xstate").EventObject> | import("xstate").ActorRef<import("xstate").PromiseSnapshot<string, any>, {
49
+ [k: string]: unknown;
50
+ type: string;
51
+ }, import("xstate").EventObject> | import("xstate").ActorRef<import("xstate").CallbackSnapshot<Agenda>, import("xstate").EventObject, import("xstate").EventObject>;
52
+ }, import("xstate").Values<{
53
+ getToken: {
54
+ src: "getToken";
55
+ logic: import("xstate").PromiseActorLogic<string, any>;
56
+ id: string;
57
+ };
58
+ createEventsFromStream: {
59
+ src: "createEventsFromStream";
60
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, Agenda>;
61
+ id: string;
62
+ };
63
+ ponyfill: {
64
+ src: "ponyfill";
65
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, {}>;
66
+ id: string;
67
+ };
68
+ start: {
69
+ src: "start";
70
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, {}>;
71
+ id: string;
72
+ };
73
+ }>, import("xstate").Values<{
74
+ ttsStop: {
75
+ type: "ttsStop";
76
+ params: unknown;
77
+ };
78
+ addFiller: {
79
+ type: "addFiller";
80
+ params: {};
81
+ };
82
+ }>, import("xstate").Values<{
83
+ bufferContainsUtterancePartReadyToBeSpoken: {
84
+ type: "bufferContainsUtterancePartReadyToBeSpoken";
85
+ params: unknown;
86
+ };
87
+ bufferIsNonEmpty: {
88
+ type: "bufferIsNonEmpty";
89
+ params: unknown;
90
+ };
91
+ }>, "FILLER_DELAY", "GetToken" | "Fail" | "Ponyfill" | {
92
+ Ready?: "Idle" | {
93
+ BufferedSpeaker?: Required<{
94
+ Buffer?: "BufferIdle" | "Buffering" | "BufferingDone";
95
+ Speaker?: "SpeakingIdle" | "PrepareSpeech" | {
96
+ Speak?: "Go" | "Paused";
97
+ };
98
+ }>;
99
+ Speaking?: "Go" | "Paused";
100
+ };
101
+ }, string, TTSInit, {}, import("xstate").EventObject, import("xstate").ResolveTypegenMeta<import("xstate").TypegenDisabled, TTSEvent, import("xstate").Values<{
102
+ getToken: {
103
+ src: "getToken";
104
+ logic: import("xstate").PromiseActorLogic<string, any>;
105
+ id: string;
106
+ };
107
+ createEventsFromStream: {
108
+ src: "createEventsFromStream";
109
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, Agenda>;
110
+ id: string;
111
+ };
112
+ ponyfill: {
113
+ src: "ponyfill";
114
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, {}>;
115
+ id: string;
116
+ };
117
+ start: {
118
+ src: "start";
119
+ logic: import("xstate").CallbackActorLogic<import("xstate").EventObject, {}>;
120
+ id: string;
121
+ };
122
+ }>, import("xstate").Values<{
123
+ ttsStop: {
124
+ type: "ttsStop";
125
+ params: unknown;
126
+ };
127
+ addFiller: {
128
+ type: "addFiller";
129
+ params: {};
130
+ };
131
+ }>, import("xstate").Values<{
132
+ bufferContainsUtterancePartReadyToBeSpoken: {
133
+ type: "bufferContainsUtterancePartReadyToBeSpoken";
134
+ params: unknown;
135
+ };
136
+ bufferIsNonEmpty: {
137
+ type: "bufferIsNonEmpty";
138
+ params: unknown;
139
+ };
140
+ }>, "FILLER_DELAY", string, import("xstate").EventObject>>;
141
+ export {};
142
+ //# sourceMappingURL=tts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../src/tts.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEzD,UAAU,0BAA2B,SAAQ,wBAAwB;IACnE,KAAK,CAAC,EAAE,MAAM,OAAE;CACjB;AAED,UAAU,OAAO;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,sBAAsB,CAAC;IAClD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,UAAW,SAAQ,OAAO;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,KAAK,QAAQ,GACT;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QACL,MAAM,EAAE,eAAe,CAAC;QACxB,MAAM,EAAE,0BAA0B,CAAC;KACpC,CAAC;CACH,GACD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAI/B,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DA6arB,CAAC"}