speechflow 1.4.2 → 1.4.4

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.
Files changed (115) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/etc/stx.conf +17 -11
  3. package/package.json +7 -4
  4. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.d.ts +13 -0
  5. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js +153 -0
  6. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js.map +1 -0
  7. package/speechflow-cli/dst/speechflow-node-a2a-gender.d.ts +20 -0
  8. package/speechflow-cli/dst/speechflow-node-a2a-gender.js +349 -0
  9. package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -0
  10. package/speechflow-cli/dst/speechflow-node-a2a-meter.d.ts +16 -0
  11. package/speechflow-cli/dst/speechflow-node-a2a-meter.js +232 -0
  12. package/speechflow-cli/dst/speechflow-node-a2a-meter.js.map +1 -0
  13. package/speechflow-cli/dst/speechflow-node-a2a-mute.d.ts +17 -0
  14. package/speechflow-cli/dst/speechflow-node-a2a-mute.js +117 -0
  15. package/speechflow-cli/dst/speechflow-node-a2a-mute.js.map +1 -0
  16. package/speechflow-cli/dst/speechflow-node-a2a-vad.d.ts +19 -0
  17. package/speechflow-cli/dst/speechflow-node-a2a-vad.js +374 -0
  18. package/speechflow-cli/dst/speechflow-node-a2a-vad.js.map +1 -0
  19. package/speechflow-cli/dst/speechflow-node-a2a-wav.d.ts +11 -0
  20. package/speechflow-cli/dst/speechflow-node-a2a-wav.js +211 -0
  21. package/speechflow-cli/dst/speechflow-node-a2a-wav.js.map +1 -0
  22. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.d.ts +19 -0
  23. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +328 -0
  24. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -0
  25. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.d.ts +18 -0
  26. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js +238 -0
  27. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js.map +1 -0
  28. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.d.ts +14 -0
  29. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +155 -0
  30. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -0
  31. package/speechflow-cli/dst/speechflow-node-t2t-deepl.d.ts +15 -0
  32. package/speechflow-cli/dst/speechflow-node-t2t-deepl.js +146 -0
  33. package/speechflow-cli/dst/speechflow-node-t2t-deepl.js.map +1 -0
  34. package/speechflow-cli/dst/speechflow-node-t2t-format.d.ts +11 -0
  35. package/speechflow-cli/dst/speechflow-node-t2t-format.js +82 -0
  36. package/speechflow-cli/dst/speechflow-node-t2t-format.js.map +1 -0
  37. package/speechflow-cli/dst/speechflow-node-t2t-ollama.d.ts +13 -0
  38. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js +247 -0
  39. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js.map +1 -0
  40. package/speechflow-cli/dst/speechflow-node-t2t-openai.d.ts +13 -0
  41. package/speechflow-cli/dst/speechflow-node-t2t-openai.js +227 -0
  42. package/speechflow-cli/dst/speechflow-node-t2t-openai.js.map +1 -0
  43. package/speechflow-cli/dst/speechflow-node-t2t-sentence.d.ts +17 -0
  44. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js +250 -0
  45. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js.map +1 -0
  46. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.d.ts +13 -0
  47. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +278 -0
  48. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -0
  49. package/speechflow-cli/dst/speechflow-node-t2t-transformers.d.ts +14 -0
  50. package/speechflow-cli/dst/speechflow-node-t2t-transformers.js +265 -0
  51. package/speechflow-cli/dst/speechflow-node-t2t-transformers.js.map +1 -0
  52. package/speechflow-cli/dst/speechflow-node-x2x-filter.d.ts +11 -0
  53. package/speechflow-cli/dst/speechflow-node-x2x-filter.js +121 -0
  54. package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -0
  55. package/speechflow-cli/dst/speechflow-node-x2x-trace.d.ts +11 -0
  56. package/speechflow-cli/dst/speechflow-node-x2x-trace.js +111 -0
  57. package/speechflow-cli/dst/speechflow-node-x2x-trace.js.map +1 -0
  58. package/speechflow-cli/dst/speechflow-node-xio-device.d.ts +13 -0
  59. package/speechflow-cli/dst/speechflow-node-xio-device.js +230 -0
  60. package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -0
  61. package/speechflow-cli/dst/speechflow-node-xio-file.d.ts +11 -0
  62. package/speechflow-cli/dst/speechflow-node-xio-file.js +216 -0
  63. package/speechflow-cli/dst/speechflow-node-xio-file.js.map +1 -0
  64. package/speechflow-cli/dst/speechflow-node-xio-mqtt.d.ts +13 -0
  65. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +188 -0
  66. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -0
  67. package/speechflow-cli/dst/speechflow-node-xio-websocket.d.ts +13 -0
  68. package/speechflow-cli/dst/speechflow-node-xio-websocket.js +278 -0
  69. package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -0
  70. package/speechflow-cli/dst/speechflow-node.d.ts +65 -0
  71. package/speechflow-cli/dst/speechflow-node.js +180 -0
  72. package/speechflow-cli/dst/speechflow-node.js.map +1 -0
  73. package/speechflow-cli/dst/speechflow-utils.d.ts +74 -0
  74. package/speechflow-cli/dst/speechflow-utils.js +519 -0
  75. package/speechflow-cli/dst/speechflow-utils.js.map +1 -0
  76. package/speechflow-cli/dst/speechflow.d.ts +7 -0
  77. package/speechflow-cli/dst/speechflow.js +837 -0
  78. package/speechflow-cli/dst/speechflow.js.map +1 -0
  79. package/speechflow-cli/etc/stx.conf +13 -13
  80. package/speechflow-cli/package.json +7 -7
  81. package/speechflow-cli/src/speechflow.ts +5 -5
  82. package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Bold.eot +0 -0
  83. package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Bold.ttf +0 -0
  84. package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Bold.woff +0 -0
  85. package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Regular.eot +0 -0
  86. package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Regular.ttf +0 -0
  87. package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Regular.woff +0 -0
  88. package/speechflow-ui-db/dst/app-font-fa-brands-400.woff2 +0 -0
  89. package/speechflow-ui-db/dst/app-font-fa-regular-400.woff2 +0 -0
  90. package/speechflow-ui-db/dst/app-font-fa-solid-900.woff2 +0 -0
  91. package/speechflow-ui-db/dst/app-font-fa-v4compatibility.woff2 +0 -0
  92. package/speechflow-ui-db/dst/app-icon.svg +26 -0
  93. package/speechflow-ui-db/dst/index.css +5 -0
  94. package/speechflow-ui-db/dst/index.html +24 -0
  95. package/speechflow-ui-db/dst/index.js +616 -0
  96. package/speechflow-ui-db/etc/stx.conf +17 -17
  97. package/speechflow-ui-db/package.json +2 -2
  98. package/speechflow-ui-db/src/app.vue +14 -7
  99. package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Bold.eot +0 -0
  100. package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Bold.ttf +0 -0
  101. package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Bold.woff +0 -0
  102. package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Regular.eot +0 -0
  103. package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Regular.ttf +0 -0
  104. package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Regular.woff +0 -0
  105. package/speechflow-ui-st/dst/app-font-fa-brands-400.woff2 +0 -0
  106. package/speechflow-ui-st/dst/app-font-fa-regular-400.woff2 +0 -0
  107. package/speechflow-ui-st/dst/app-font-fa-solid-900.woff2 +0 -0
  108. package/speechflow-ui-st/dst/app-font-fa-v4compatibility.woff2 +0 -0
  109. package/speechflow-ui-st/dst/app-icon.svg +26 -0
  110. package/speechflow-ui-st/dst/index.css +5 -0
  111. package/speechflow-ui-st/dst/index.html +24 -0
  112. package/speechflow-ui-st/dst/index.js +610 -0
  113. package/speechflow-ui-st/etc/stx.conf +17 -17
  114. package/speechflow-ui-st/package.json +2 -2
  115. /package/{speechflow-cli/etc → etc}/speechflow.yaml +0 -0
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ /*
3
+ ** SpeechFlow - Speech Processing Flow Graph
4
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ /* standard dependencies */
45
+ const node_path_1 = __importDefault(require("node:path"));
46
+ const node_stream_1 = __importDefault(require("node:stream"));
47
+ /* external dependencies */
48
+ const Transformers = __importStar(require("@huggingface/transformers"));
49
+ /* internal dependencies */
50
+ const speechflow_node_1 = __importDefault(require("./speechflow-node"));
51
+ /* SpeechFlow node for Transformers text-to-text translation */
52
+ class SpeechFlowNodeTransformers extends speechflow_node_1.default {
53
+ /* declare official node name */
54
+ static name = "transformers";
55
+ /* internal state */
56
+ translator = null;
57
+ generator = null;
58
+ /* internal LLM setup */
59
+ setup = {
60
+ /* SmolLM3: English (EN) to German (DE) translation */
61
+ "SmolLM3:en-de": {
62
+ systemPrompt: "/no_think\n" +
63
+ "You are a translator.\n" +
64
+ "Output only the requested text.\n" +
65
+ "Do not use markdown.\n" +
66
+ "Do not chat.\n" +
67
+ "Do not show any explanations.\n" +
68
+ "Do not show any introduction.\n" +
69
+ "Do not show any preamble.\n" +
70
+ "Do not show any prolog.\n" +
71
+ "Do not show any epilog.\n" +
72
+ "Get to the point.\n" +
73
+ "Preserve the original meaning, tone, and nuance.\n" +
74
+ "Directly translate text from English (EN) to fluent and natural German (DE) language.\n",
75
+ chat: [
76
+ { role: "user", content: "I love my wife." },
77
+ { role: "assistant", content: "Ich liebe meine Frau." },
78
+ { role: "user", content: "The weather is wonderful." },
79
+ { role: "assistant", content: "Das Wetter ist wunderschön." },
80
+ { role: "user", content: "The live is awesome." },
81
+ { role: "assistant", content: "Das Leben ist einfach großartig." }
82
+ ]
83
+ },
84
+ /* SmolLM3: German (DE) to English (EN) translation */
85
+ "SmolLM3:de-en": {
86
+ systemPrompt: "/no_think\n" +
87
+ "You are a translator.\n" +
88
+ "Output only the requested text.\n" +
89
+ "Do not use markdown.\n" +
90
+ "Do not chat.\n" +
91
+ "Do not show any explanations.\n" +
92
+ "Do not show any introduction.\n" +
93
+ "Do not show any preamble. \n" +
94
+ "Do not show any prolog. \n" +
95
+ "Do not show any epilog. \n" +
96
+ "Get to the point.\n" +
97
+ "Preserve the original meaning, tone, and nuance.\n" +
98
+ "Directly translate text from German (DE) to fluent and natural English (EN) language.\n",
99
+ chat: [
100
+ { role: "user", content: "Ich liebe meine Frau." },
101
+ { role: "assistant", content: "I love my wife." },
102
+ { role: "user", content: "Das Wetter ist wunderschön." },
103
+ { role: "assistant", content: "The weather is wonderful." },
104
+ { role: "user", content: "Das Leben ist einfach großartig." },
105
+ { role: "assistant", content: "The live is awesome." }
106
+ ]
107
+ }
108
+ };
109
+ /* construct node */
110
+ constructor(id, cfg, opts, args) {
111
+ super(id, cfg, opts, args);
112
+ /* declare node configuration parameters */
113
+ this.configure({
114
+ src: { type: "string", pos: 0, val: "de", match: /^(?:de|en)$/ },
115
+ dst: { type: "string", pos: 1, val: "en", match: /^(?:de|en)$/ },
116
+ model: { type: "string", val: "OPUS", match: /^(?:OPUS|SmolLM3)$/ }
117
+ });
118
+ /* sanity check parameters */
119
+ if (this.params.src === this.params.dst)
120
+ throw new Error("source and destination languages cannot be the same");
121
+ /* declare node input/output format */
122
+ this.input = "text";
123
+ this.output = "text";
124
+ }
125
+ /* open node */
126
+ async open() {
127
+ let model = "";
128
+ /* track download progress when instantiating Transformers engine and model */
129
+ const progressState = new Map();
130
+ const progressCallback = (progress) => {
131
+ let artifact = model;
132
+ if (typeof progress.file === "string")
133
+ artifact += `:${progress.file}`;
134
+ let percent = 0;
135
+ if (typeof progress.loaded === "number" && typeof progress.total === "number")
136
+ percent = progress.loaded / progress.total * 100;
137
+ else if (typeof progress.progress === "number")
138
+ percent = progress.progress;
139
+ if (percent > 0)
140
+ progressState.set(artifact, percent);
141
+ };
142
+ const interval = setInterval(() => {
143
+ for (const [artifact, percent] of progressState) {
144
+ this.log("info", `downloaded ${percent.toFixed(2)}% of artifact "${artifact}"`);
145
+ if (percent >= 1.0)
146
+ progressState.delete(artifact);
147
+ }
148
+ }, 1000);
149
+ /* instantiate Transformers engine and model */
150
+ if (this.params.model === "OPUS") {
151
+ model = `onnx-community/opus-mt-${this.params.src}-${this.params.dst}`;
152
+ const pipeline = Transformers.pipeline("translation", model, {
153
+ cache_dir: node_path_1.default.join(this.config.cacheDir, "transformers"),
154
+ dtype: "q4",
155
+ device: "auto",
156
+ progress_callback: progressCallback
157
+ });
158
+ this.translator = await pipeline;
159
+ if (this.translator === null)
160
+ throw new Error("failed to instantiate translator pipeline");
161
+ }
162
+ else if (this.params.model === "SmolLM3") {
163
+ model = "HuggingFaceTB/SmolLM3-3B-ONNX";
164
+ const pipeline = Transformers.pipeline("text-generation", model, {
165
+ cache_dir: node_path_1.default.join(this.config.cacheDir, "transformers"),
166
+ dtype: "q4",
167
+ device: "auto",
168
+ progress_callback: progressCallback
169
+ });
170
+ this.generator = await pipeline;
171
+ if (this.generator === null)
172
+ throw new Error("failed to instantiate generator pipeline");
173
+ }
174
+ else
175
+ throw new Error("invalid model");
176
+ /* clear progress interval again */
177
+ clearInterval(interval);
178
+ /* provide text-to-text translation */
179
+ const translate = async (text) => {
180
+ if (this.params.model === "OPUS") {
181
+ const result = await this.translator(text);
182
+ return Array.isArray(result) ?
183
+ result[0].translation_text :
184
+ result.translation_text;
185
+ }
186
+ else if (this.params.model === "SmolLM3") {
187
+ const key = `SmolLM3:${this.params.src}-${this.params.dst}`;
188
+ const cfg = this.setup[key];
189
+ const messages = [
190
+ { role: "system", content: cfg.systemPrompt },
191
+ ...cfg.chat,
192
+ { role: "user", content: text }
193
+ ];
194
+ const result = await this.generator(messages, {
195
+ max_new_tokens: 100,
196
+ temperature: 0.6,
197
+ top_p: 0.95,
198
+ streamer: new Transformers.TextStreamer(this.generator.tokenizer, {
199
+ skip_prompt: true,
200
+ skip_special_tokens: true
201
+ })
202
+ });
203
+ const generatedText = Array.isArray(result) ?
204
+ result[0].generated_text :
205
+ result.generated_text;
206
+ const response = typeof generatedText === "string" ?
207
+ generatedText :
208
+ generatedText.at(-1).content;
209
+ return response;
210
+ }
211
+ else
212
+ throw new Error("invalid model");
213
+ };
214
+ /* establish a duplex stream and connect it to Transformers */
215
+ this.stream = new node_stream_1.default.Transform({
216
+ readableObjectMode: true,
217
+ writableObjectMode: true,
218
+ decodeStrings: false,
219
+ highWaterMark: 1,
220
+ transform(chunk, encoding, callback) {
221
+ if (Buffer.isBuffer(chunk.payload))
222
+ callback(new Error("invalid chunk payload type"));
223
+ else {
224
+ if (chunk.payload === "") {
225
+ this.push(chunk);
226
+ callback();
227
+ }
228
+ else {
229
+ translate(chunk.payload).then((payload) => {
230
+ chunk = chunk.clone();
231
+ chunk.payload = payload;
232
+ this.push(chunk);
233
+ callback();
234
+ }).catch((err) => {
235
+ callback(err);
236
+ });
237
+ }
238
+ }
239
+ },
240
+ final(callback) {
241
+ this.push(null);
242
+ callback();
243
+ }
244
+ });
245
+ }
246
+ /* close node */
247
+ async close() {
248
+ /* close stream */
249
+ if (this.stream !== null) {
250
+ this.stream.destroy();
251
+ this.stream = null;
252
+ }
253
+ /* shutdown Transformers */
254
+ if (this.translator !== null) {
255
+ this.translator.dispose();
256
+ this.translator = null;
257
+ }
258
+ if (this.generator !== null) {
259
+ this.generator.dispose();
260
+ this.generator = null;
261
+ }
262
+ }
263
+ }
264
+ exports.default = SpeechFlowNodeTransformers;
265
+ //# sourceMappingURL=speechflow-node-t2t-transformers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechflow-node-t2t-transformers.js","sourceRoot":"","sources":["../src/speechflow-node-t2t-transformers.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,6BAA6B;AAC7B,0DAA8B;AAC9B,8DAAgC;AAEhC,6BAA6B;AAC7B,wEAAyD;AAEzD,6BAA6B;AAC7B,wEAAmE;AAMnE,iEAAiE;AACjE,MAAqB,0BAA2B,SAAQ,yBAAc;IAClE,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,cAAc,CAAA;IAEnC,sBAAsB;IACd,UAAU,GAA+C,IAAI,CAAA;IAC7D,SAAS,GAAgD,IAAI,CAAA;IAErE,0BAA0B;IAClB,KAAK,GAAW;QACpB,wDAAwD;QACxD,eAAe,EAAE;YACb,YAAY,EACR,aAAa;gBACb,yBAAyB;gBACzB,mCAAmC;gBACnC,wBAAwB;gBACxB,gBAAgB;gBAChB,iCAAiC;gBACjC,iCAAiC;gBACjC,6BAA6B;gBAC7B,2BAA2B;gBAC3B,2BAA2B;gBAC3B,qBAAqB;gBACrB,oDAAoD;gBACpD,yFAAyF;YAC7F,IAAI,EAAE;gBACF,EAAE,IAAI,EAAE,MAAM,EAAI,OAAO,EAAE,iBAAiB,EAAE;gBAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE;gBACvD,EAAE,IAAI,EAAE,MAAM,EAAI,OAAO,EAAE,2BAA2B,EAAE;gBACxD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,6BAA6B,EAAE;gBAC7D,EAAE,IAAI,EAAE,MAAM,EAAI,OAAO,EAAE,sBAAsB,EAAE;gBACnD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,kCAAkC,EAAE;aACrE;SACJ;QAED,wDAAwD;QACxD,eAAe,EAAE;YACb,YAAY,EACR,aAAa;gBACb,yBAAyB;gBACzB,mCAAmC;gBACnC,wBAAwB;gBACxB,gBAAgB;gBAChB,iCAAiC;gBACjC,iCAAiC;gBACjC,8BAA8B;gBAC9B,4BAA4B;gBAC5B,4BAA4B;gBAC5B,qBAAqB;gBACrB,oDAAoD;gBACpD,yFAAyF;YAC7F,IAAI,EAAE;gBACF,EAAE,IAAI,EAAE,MAAM,EAAI,OAAO,EAAE,uBAAuB,EAAE;gBACpD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE;gBACjD,EAAE,IAAI,EAAE,MAAM,EAAI,OAAO,EAAE,6BAA6B,EAAE;gBAC1D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE;gBAC3D,EAAE,IAAI,EAAE,MAAM,EAAI,OAAO,EAAE,kCAAkC,EAAE;gBAC/D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,EAAE;aACzD;SACJ;KACJ,CAAA;IAED,sBAAsB;IACtB,YAAa,EAAU,EAAE,GAA4B,EAAE,IAA6B,EAAE,IAAW;QAC7F,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAE1B,6CAA6C;QAC7C,IAAI,CAAC,SAAS,CAAC;YACX,GAAG,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;YAClE,GAAG,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;YAClE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE;SACtE,CAAC,CAAA;QAEF,+BAA+B;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG;YACnC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QAE1E,wCAAwC;QACxC,IAAI,CAAC,KAAK,GAAI,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,IAAI;QACN,IAAI,KAAK,GAAG,EAAE,CAAA;QAEd,gFAAgF;QAChF,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC/C,MAAM,gBAAgB,GAAkC,CAAC,QAAa,EAAE,EAAE;YACtE,IAAI,QAAQ,GAAG,KAAK,CAAA;YACpB,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBACjC,QAAQ,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAA;YACnC,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;gBACzE,OAAO,GAAI,QAAQ,CAAC,MAAgB,GAAG,QAAQ,CAAC,KAAgB,GAAG,GAAG,CAAA;iBACrE,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;gBAC1C,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAA;YAC/B,IAAI,OAAO,GAAG,CAAC;gBACX,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC5C,CAAC,CAAA;QACD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAC9B,KAAK,MAAM,CAAE,QAAQ,EAAE,OAAO,CAAE,IAAI,aAAa,EAAE,CAAC;gBAChD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,QAAQ,GAAG,CAAC,CAAA;gBAC/E,IAAI,OAAO,IAAI,GAAG;oBACd,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YACtC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,CAAA;QAER,iDAAiD;QACjD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC/B,KAAK,GAAG,0BAA0B,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;YACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE;gBACzD,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;gBAC1D,KAAK,EAAM,IAAI;gBACf,MAAM,EAAK,MAAM;gBACjB,iBAAiB,EAAE,gBAAgB;aACtC,CAAC,CAAA;YACF,IAAI,CAAC,UAAU,GAAG,MAAM,QAAQ,CAAA;YAChC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;gBACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QACpE,CAAC;aACI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACvC,KAAK,GAAG,+BAA+B,CAAA;YACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,iBAAiB,EAAE,KAAK,EAAE;gBAC7D,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;gBAC1D,KAAK,EAAM,IAAI;gBACf,MAAM,EAAK,MAAM;gBACjB,iBAAiB,EAAE,gBAAgB;aACtC,CAAC,CAAA;YACF,IAAI,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAA;YAC/B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;gBACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QACnE,CAAC;;YAEG,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;QAEpC,qCAAqC;QACrC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAEvB,wCAAwC;QACxC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAW,CAAC,IAAI,CAAC,CAAA;gBAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzB,MAAM,CAAC,CAAC,CAAoC,CAAC,gBAAgB,CAAC,CAAC;oBAC/D,MAAyC,CAAC,gBAAgB,CAAA;YACnE,CAAC;iBACI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;gBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC3B,MAAM,QAAQ,GAAG;oBACb,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE;oBAC7C,GAAG,GAAG,CAAC,IAAI;oBACX,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;iBAClC,CAAA;gBACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAU,CAAC,QAAQ,EAAE;oBAC3C,cAAc,EAAE,GAAG;oBACnB,WAAW,EAAK,GAAG;oBACnB,KAAK,EAAW,IAAI;oBACpB,QAAQ,EAAE,IAAI,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE;wBAC/D,WAAW,EAAU,IAAI;wBACzB,mBAAmB,EAAE,IAAI;qBAC5B,CAAC;iBACL,CAAC,CAAA;gBACF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;oBACxC,MAAM,CAAC,CAAC,CAAuC,CAAC,cAAc,CAAC,CAAC;oBAChE,MAA4C,CAAC,cAAc,CAAA;gBAChE,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;oBAChD,aAAa,CAAC,CAAC;oBACf,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAA;gBACjC,OAAO,QAAQ,CAAA;YACnB,CAAC;;gBAEG,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;QACxC,CAAC,CAAA;QAED,gEAAgE;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAM,CAAC,SAAS,CAAC;YAC/B,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAO,KAAK;YACzB,aAAa,EAAO,CAAC;YACrB,SAAS,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;gBACjD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC9B,QAAQ,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;qBAChD,CAAC;oBACF,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;wBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBAChB,QAAQ,EAAE,CAAA;oBACd,CAAC;yBACI,CAAC;wBACF,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;4BACtC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;4BACrB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;4BACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;4BAChB,QAAQ,EAAE,CAAA;wBACd,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;4BACb,QAAQ,CAAC,GAAG,CAAC,CAAA;wBACjB,CAAC,CAAC,CAAA;oBACN,CAAC;gBACL,CAAC;YACL,CAAC;YACD,KAAK,CAAE,QAAQ;gBACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACf,QAAQ,EAAE,CAAA;YACd,CAAC;SACJ,CAAC,CAAA;IACN,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,KAAK;QACP,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACtB,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAA;YACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;YACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACzB,CAAC;IACL,CAAC;;AAnOL,6CAoOC"}
@@ -0,0 +1,11 @@
1
+ import SpeechFlowNode from "./speechflow-node";
2
+ export default class SpeechFlowNodeFilter extends SpeechFlowNode {
3
+ static name: string;
4
+ constructor(id: string, cfg: {
5
+ [id: string]: any;
6
+ }, opts: {
7
+ [id: string]: any;
8
+ }, args: any[]);
9
+ open(): Promise<void>;
10
+ close(): Promise<void>;
11
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /*
3
+ ** SpeechFlow - Speech Processing Flow Graph
4
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ /* standard dependencies */
12
+ const node_stream_1 = __importDefault(require("node:stream"));
13
+ /* internal dependencies */
14
+ const speechflow_node_1 = __importDefault(require("./speechflow-node"));
15
+ /* SpeechFlow node for data flow filtering (based on meta information) */
16
+ class SpeechFlowNodeFilter extends speechflow_node_1.default {
17
+ /* declare official node name */
18
+ static name = "filter";
19
+ /* construct node */
20
+ constructor(id, cfg, opts, args) {
21
+ super(id, cfg, opts, args);
22
+ /* declare node configuration parameters */
23
+ this.configure({
24
+ type: { type: "string", pos: 0, val: "audio", match: /^(?:audio|text)$/ },
25
+ name: { type: "string", pos: 1, val: "filter", match: /^.+?$/ },
26
+ var: { type: "string", pos: 2, val: "", match: /^(?:meta:.+|payload:(?:length|text)|time:(?:start|end)|kind|type)$/ },
27
+ op: { type: "string", pos: 3, val: "==", match: /^(?:<|<=|==|!=|~~|!~|>=|>)$/ },
28
+ val: { type: "string", pos: 4, val: "", match: /^.*$/ }
29
+ });
30
+ /* declare node input/output format */
31
+ this.input = this.params.type;
32
+ this.output = this.params.type;
33
+ }
34
+ /* open node */
35
+ async open() {
36
+ /* helper function for comparing two values */
37
+ const comparison = (val1, op, val2) => {
38
+ if (op === "==" || op === "!=") {
39
+ /* equal comparison */
40
+ const str1 = (typeof val1 === "string" ? val1 : val1.toString());
41
+ const str2 = (typeof val2 === "string" ? val2 : val2.toString());
42
+ return (op === "==" ? (str1 === str2) : (str1 !== str2));
43
+ }
44
+ else if (op === "~~" || op === "!~") {
45
+ /* regular expression comparison */
46
+ const str = (typeof val1 === "string" ? val1 : val1.toString());
47
+ const regexp = (val2 instanceof RegExp ?
48
+ val2 :
49
+ typeof val2 === "string" ?
50
+ new RegExp(val2) :
51
+ new RegExp(val2.toString()));
52
+ return (op === "~~" ? regexp.test(str) : !regexp.test(str));
53
+ }
54
+ else {
55
+ /* non-equal comparison */
56
+ const coerceNum = (val) => {
57
+ return typeof val === "number" ? val : (typeof val === "string" && val.match(/^[\d+-]+$/) ? parseInt(val) : (typeof val === "string" && val.match(/^[\d.+-]+$/) ?
58
+ parseFloat(val) :
59
+ Number(val)));
60
+ };
61
+ const num1 = coerceNum(val1);
62
+ const num2 = coerceNum(val2);
63
+ return (op === "<" ?
64
+ (num1 < num2) :
65
+ op === "<=" ?
66
+ (num1 <= num2) :
67
+ op === ">=" ?
68
+ (num1 >= num2) :
69
+ op === ">" ?
70
+ (num1 > num2) :
71
+ false);
72
+ }
73
+ };
74
+ /* provide Transform stream */
75
+ const self = this;
76
+ this.stream = new node_stream_1.default.Transform({
77
+ writableObjectMode: true,
78
+ readableObjectMode: true,
79
+ decodeStrings: false,
80
+ highWaterMark: 1,
81
+ transform(chunk, encoding, callback) {
82
+ let val1;
83
+ const val2 = self.params.val;
84
+ const m = self.params.var.match(/^meta:(.+)$/);
85
+ if (m !== null)
86
+ val1 = chunk.meta.get(m[1]) ?? "";
87
+ else if (self.params.var === "kind")
88
+ val1 = chunk.kind;
89
+ else if (self.params.var === "type")
90
+ val1 = chunk.type;
91
+ else if (self.params.var === "payload:length")
92
+ val1 = chunk.payload.length;
93
+ else if (self.params.var === "payload:text")
94
+ val1 = (self.params.type === "text" ? chunk.payload : "");
95
+ else if (self.params.var === "time:start")
96
+ val1 = chunk.timestampStart.toMillis();
97
+ else if (self.params.var === "time:end")
98
+ val1 = chunk.timestampEnd.toMillis();
99
+ if (comparison(val1, self.params.op, val2)) {
100
+ self.log("info", `[${self.params.name}]: passing through ${chunk.type} chunk`);
101
+ this.push(chunk);
102
+ }
103
+ callback();
104
+ },
105
+ final(callback) {
106
+ this.push(null);
107
+ callback();
108
+ }
109
+ });
110
+ }
111
+ /* close node */
112
+ async close() {
113
+ /* close stream */
114
+ if (this.stream !== null) {
115
+ this.stream.destroy();
116
+ this.stream = null;
117
+ }
118
+ }
119
+ }
120
+ exports.default = SpeechFlowNodeFilter;
121
+ //# sourceMappingURL=speechflow-node-x2x-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechflow-node-x2x-filter.js","sourceRoot":"","sources":["../src/speechflow-node-x2x-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import SpeechFlowNode from "./speechflow-node";
2
+ export default class SpeechFlowNodeTrace extends SpeechFlowNode {
3
+ static name: string;
4
+ constructor(id: string, cfg: {
5
+ [id: string]: any;
6
+ }, opts: {
7
+ [id: string]: any;
8
+ }, args: any[]);
9
+ open(): Promise<void>;
10
+ close(): Promise<void>;
11
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /*
3
+ ** SpeechFlow - Speech Processing Flow Graph
4
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ /* standard dependencies */
12
+ const node_stream_1 = __importDefault(require("node:stream"));
13
+ /* internal dependencies */
14
+ const speechflow_node_1 = __importDefault(require("./speechflow-node"));
15
+ /* SpeechFlow node for data flow tracing */
16
+ class SpeechFlowNodeTrace extends speechflow_node_1.default {
17
+ /* declare official node name */
18
+ static name = "trace";
19
+ /* construct node */
20
+ constructor(id, cfg, opts, args) {
21
+ super(id, cfg, opts, args);
22
+ /* declare node configuration parameters */
23
+ this.configure({
24
+ type: { type: "string", pos: 0, val: "audio", match: /^(?:audio|text)$/ },
25
+ name: { type: "string", pos: 1, val: "trace" },
26
+ dashboard: { type: "string", val: "" }
27
+ });
28
+ /* sanity check parameters */
29
+ if (this.params.dashboard !== "" && this.params.type === "audio")
30
+ throw new Error("only trace nodes of type \"text\" can export to dashboard");
31
+ /* declare node input/output format */
32
+ this.input = this.params.type;
33
+ this.output = this.params.type;
34
+ }
35
+ /* open node */
36
+ async open() {
37
+ /* wrapper for local logging */
38
+ const log = (level, msg) => {
39
+ if (this.params.name !== undefined)
40
+ this.log(level, `[${this.params.name}]: ${msg}`);
41
+ else
42
+ this.log(level, msg);
43
+ };
44
+ /* provide Transform stream */
45
+ const self = this;
46
+ this.stream = new node_stream_1.default.Transform({
47
+ writableObjectMode: true,
48
+ readableObjectMode: true,
49
+ decodeStrings: false,
50
+ highWaterMark: 1,
51
+ transform(chunk, encoding, callback) {
52
+ let error;
53
+ const fmtTime = (t) => t.toFormat("hh:mm:ss.SSS");
54
+ const fmtMeta = (meta) => {
55
+ if (meta.size === 0)
56
+ return "none";
57
+ else
58
+ return `{ ${Array.from(meta.entries())
59
+ .map(([k, v]) => `${k}: ${JSON.stringify(v)}`)
60
+ .join(", ")} }`;
61
+ };
62
+ if (Buffer.isBuffer(chunk.payload)) {
63
+ if (self.params.type === "audio")
64
+ log("debug", `chunk: type=${chunk.type} ` +
65
+ `kind=${chunk.kind} ` +
66
+ `start=${fmtTime(chunk.timestampStart)} ` +
67
+ `end=${fmtTime(chunk.timestampEnd)} ` +
68
+ `payload-type=Buffer payload-length=${chunk.payload.byteLength} ` +
69
+ `meta=${fmtMeta(chunk.meta)}`);
70
+ else
71
+ error = new Error(`${self.params.type} chunk: seen Buffer instead of String chunk type`);
72
+ }
73
+ else {
74
+ if (self.params.type === "text") {
75
+ log("debug", `chunk: type=${chunk.type} ` +
76
+ `kind=${chunk.kind} ` +
77
+ `start=${fmtTime(chunk.timestampStart)} ` +
78
+ `end=${fmtTime(chunk.timestampEnd)} ` +
79
+ `payload-type=String payload-length=${chunk.payload.length} ` +
80
+ `payload-content="${chunk.payload.toString()}" ` +
81
+ `meta=${fmtMeta(chunk.meta)}`);
82
+ if (self.params.dashboard !== "")
83
+ self.dashboardInfo("text", self.params.dashboard, chunk.kind, chunk.payload.toString());
84
+ }
85
+ else
86
+ error = new Error(`${self.params.type} chunk: seen String instead of Buffer chunk type`);
87
+ }
88
+ if (error !== undefined)
89
+ callback(error);
90
+ else {
91
+ this.push(chunk, encoding);
92
+ callback();
93
+ }
94
+ },
95
+ final(callback) {
96
+ this.push(null);
97
+ callback();
98
+ }
99
+ });
100
+ }
101
+ /* close node */
102
+ async close() {
103
+ /* close stream */
104
+ if (this.stream !== null) {
105
+ this.stream.destroy();
106
+ this.stream = null;
107
+ }
108
+ }
109
+ }
110
+ exports.default = SpeechFlowNodeTrace;
111
+ //# sourceMappingURL=speechflow-node-x2x-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechflow-node-x2x-trace.js","sourceRoot":"","sources":["../src/speechflow-node-x2x-trace.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;AAEF,6BAA6B;AAC7B,8DAAgC;AAKhC,6BAA6B;AAC7B,wEAAmE;AAEnE,6CAA6C;AAC7C,MAAqB,mBAAoB,SAAQ,yBAAc;IAC3D,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAA;IAE5B,sBAAsB;IACtB,YAAa,EAAU,EAAE,GAA4B,EAAE,IAA6B,EAAE,IAAW;QAC7F,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAE1B,6CAA6C;QAC7C,IAAI,CAAC,SAAS,CAAC;YACX,IAAI,EAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE;YAC9E,IAAI,EAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE;YACnD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAU,GAAG,EAAE,EAAE,EAAE;SACjD,CAAC,CAAA;QAEF,+BAA+B;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;YAC5D,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAEhF,wCAAwC;QACxC,IAAI,CAAC,KAAK,GAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;IAClC,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,IAAI;QACN,iCAAiC;QACjC,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;YACvC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;gBAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAA;;gBAEhD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC5B,CAAC,CAAA;QAED,gCAAgC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAM,CAAC,SAAS,CAAC;YAC/B,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAO,KAAK;YACzB,aAAa,EAAO,CAAC;YACrB,SAAS,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;gBACjD,IAAI,KAAwB,CAAA;gBAC5B,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;gBAC3D,MAAM,OAAO,GAAG,CAAC,IAAsB,EAAE,EAAE;oBACvC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;wBACf,OAAO,MAAM,CAAA;;wBAEb,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;6BACjC,GAAG,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAE,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;6BAC/C,IAAI,CAAC,IAAI,CACd,IAAI,CAAA;gBACZ,CAAC,CAAA;gBACD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;wBAC5B,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,CAAC,IAAI,GAAG;4BACrC,QAAQ,KAAK,CAAC,IAAI,GAAG;4BACrB,SAAS,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG;4BACzC,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG;4BACrC,sCAAsC,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG;4BACjE,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;;wBAElC,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,kDAAkD,CAAC,CAAA;gBAChG,CAAC;qBACI,CAAC;oBACF,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC9B,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,CAAC,IAAI,GAAG;4BACrC,QAAQ,KAAK,CAAC,IAAI,GAAG;4BACrB,SAAS,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG;4BACzC,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG;4BACrC,sCAAsC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG;4BAC7D,oBAAoB,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI;4BAChD,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBAClC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE;4BAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;oBAC/F,CAAC;;wBAEG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,kDAAkD,CAAC,CAAA;gBAChG,CAAC;gBACD,IAAI,KAAK,KAAK,SAAS;oBACnB,QAAQ,CAAC,KAAK,CAAC,CAAA;qBACd,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;oBAC1B,QAAQ,EAAE,CAAA;gBACd,CAAC;YACL,CAAC;YACD,KAAK,CAAE,QAAQ;gBACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACf,QAAQ,EAAE,CAAA;YACd,CAAC;SACJ,CAAC,CAAA;IACN,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,KAAK;QACP,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACtB,CAAC;IACL,CAAC;;AApGL,sCAqGC"}
@@ -0,0 +1,13 @@
1
+ import SpeechFlowNode from "./speechflow-node";
2
+ export default class SpeechFlowNodeDevice extends SpeechFlowNode {
3
+ static name: string;
4
+ private io;
5
+ constructor(id: string, cfg: {
6
+ [id: string]: any;
7
+ }, opts: {
8
+ [id: string]: any;
9
+ }, args: any[]);
10
+ private audioDeviceFromURL;
11
+ open(): Promise<void>;
12
+ close(): Promise<void>;
13
+ }