speechflow 1.3.1 → 1.4.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.
Files changed (156) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/etc/stx.conf +54 -58
  3. package/package.json +25 -106
  4. package/{etc → speechflow-cli/etc}/eslint.mjs +1 -2
  5. package/speechflow-cli/etc/stx.conf +77 -0
  6. package/speechflow-cli/package.json +116 -0
  7. package/{src → speechflow-cli/src}/speechflow-node-a2a-gender.ts +148 -64
  8. package/speechflow-cli/src/speechflow-node-a2a-meter.ts +217 -0
  9. package/{src → speechflow-cli/src}/speechflow-node-a2a-mute.ts +39 -11
  10. package/speechflow-cli/src/speechflow-node-a2a-vad.ts +384 -0
  11. package/{src → speechflow-cli/src}/speechflow-node-a2a-wav.ts +27 -11
  12. package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +313 -0
  13. package/{src → speechflow-cli/src}/speechflow-node-t2a-elevenlabs.ts +59 -12
  14. package/{src → speechflow-cli/src}/speechflow-node-t2a-kokoro.ts +11 -4
  15. package/{src → speechflow-cli/src}/speechflow-node-t2t-deepl.ts +9 -4
  16. package/{src → speechflow-cli/src}/speechflow-node-t2t-format.ts +2 -2
  17. package/{src → speechflow-cli/src}/speechflow-node-t2t-ollama.ts +1 -1
  18. package/{src → speechflow-cli/src}/speechflow-node-t2t-openai.ts +1 -1
  19. package/{src → speechflow-cli/src}/speechflow-node-t2t-sentence.ts +37 -20
  20. package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +276 -0
  21. package/{src → speechflow-cli/src}/speechflow-node-t2t-transformers.ts +4 -3
  22. package/{src → speechflow-cli/src}/speechflow-node-x2x-filter.ts +9 -5
  23. package/{src → speechflow-cli/src}/speechflow-node-x2x-trace.ts +16 -8
  24. package/{src → speechflow-cli/src}/speechflow-node-xio-device.ts +12 -8
  25. package/{src → speechflow-cli/src}/speechflow-node-xio-file.ts +9 -3
  26. package/{src → speechflow-cli/src}/speechflow-node-xio-mqtt.ts +5 -2
  27. package/{src → speechflow-cli/src}/speechflow-node-xio-websocket.ts +12 -12
  28. package/{src → speechflow-cli/src}/speechflow-node.ts +7 -0
  29. package/{src → speechflow-cli/src}/speechflow-utils.ts +78 -44
  30. package/{src → speechflow-cli/src}/speechflow.ts +188 -53
  31. package/speechflow-ui-db/etc/eslint.mjs +106 -0
  32. package/speechflow-ui-db/etc/htmllint.json +55 -0
  33. package/speechflow-ui-db/etc/stx.conf +79 -0
  34. package/speechflow-ui-db/etc/stylelint.js +46 -0
  35. package/speechflow-ui-db/etc/stylelint.yaml +33 -0
  36. package/speechflow-ui-db/etc/tsc-client.json +30 -0
  37. package/speechflow-ui-db/etc/tsc.node.json +9 -0
  38. package/speechflow-ui-db/etc/vite-client.mts +63 -0
  39. package/speechflow-ui-db/package.d/htmllint-cli+0.0.7.patch +20 -0
  40. package/speechflow-ui-db/package.json +75 -0
  41. package/speechflow-ui-db/src/app-icon.ai +1989 -4
  42. package/speechflow-ui-db/src/app-icon.svg +26 -0
  43. package/speechflow-ui-db/src/app.styl +64 -0
  44. package/speechflow-ui-db/src/app.vue +221 -0
  45. package/speechflow-ui-db/src/index.html +23 -0
  46. package/speechflow-ui-db/src/index.ts +26 -0
  47. package/{dst/speechflow.d.ts → speechflow-ui-db/src/lib.d.ts} +5 -3
  48. package/speechflow-ui-db/src/tsconfig.json +3 -0
  49. package/speechflow-ui-st/etc/eslint.mjs +106 -0
  50. package/speechflow-ui-st/etc/htmllint.json +55 -0
  51. package/speechflow-ui-st/etc/stx.conf +79 -0
  52. package/speechflow-ui-st/etc/stylelint.js +46 -0
  53. package/speechflow-ui-st/etc/stylelint.yaml +33 -0
  54. package/speechflow-ui-st/etc/tsc-client.json +30 -0
  55. package/speechflow-ui-st/etc/tsc.node.json +9 -0
  56. package/speechflow-ui-st/etc/vite-client.mts +63 -0
  57. package/speechflow-ui-st/package.d/htmllint-cli+0.0.7.patch +20 -0
  58. package/speechflow-ui-st/package.json +79 -0
  59. package/speechflow-ui-st/src/app-icon.ai +1989 -4
  60. package/speechflow-ui-st/src/app-icon.svg +26 -0
  61. package/speechflow-ui-st/src/app.styl +64 -0
  62. package/speechflow-ui-st/src/app.vue +142 -0
  63. package/speechflow-ui-st/src/index.html +23 -0
  64. package/speechflow-ui-st/src/index.ts +26 -0
  65. package/speechflow-ui-st/src/lib.d.ts +9 -0
  66. package/speechflow-ui-st/src/tsconfig.json +3 -0
  67. package/dst/speechflow-node-a2a-ffmpeg.d.ts +0 -13
  68. package/dst/speechflow-node-a2a-ffmpeg.js +0 -153
  69. package/dst/speechflow-node-a2a-ffmpeg.js.map +0 -1
  70. package/dst/speechflow-node-a2a-gender.d.ts +0 -18
  71. package/dst/speechflow-node-a2a-gender.js +0 -271
  72. package/dst/speechflow-node-a2a-gender.js.map +0 -1
  73. package/dst/speechflow-node-a2a-meter.d.ts +0 -12
  74. package/dst/speechflow-node-a2a-meter.js +0 -155
  75. package/dst/speechflow-node-a2a-meter.js.map +0 -1
  76. package/dst/speechflow-node-a2a-mute.d.ts +0 -16
  77. package/dst/speechflow-node-a2a-mute.js +0 -91
  78. package/dst/speechflow-node-a2a-mute.js.map +0 -1
  79. package/dst/speechflow-node-a2a-vad.d.ts +0 -16
  80. package/dst/speechflow-node-a2a-vad.js +0 -285
  81. package/dst/speechflow-node-a2a-vad.js.map +0 -1
  82. package/dst/speechflow-node-a2a-wav.d.ts +0 -11
  83. package/dst/speechflow-node-a2a-wav.js +0 -195
  84. package/dst/speechflow-node-a2a-wav.js.map +0 -1
  85. package/dst/speechflow-node-a2t-deepgram.d.ts +0 -15
  86. package/dst/speechflow-node-a2t-deepgram.js +0 -255
  87. package/dst/speechflow-node-a2t-deepgram.js.map +0 -1
  88. package/dst/speechflow-node-t2a-elevenlabs.d.ts +0 -16
  89. package/dst/speechflow-node-t2a-elevenlabs.js +0 -195
  90. package/dst/speechflow-node-t2a-elevenlabs.js.map +0 -1
  91. package/dst/speechflow-node-t2a-kokoro.d.ts +0 -13
  92. package/dst/speechflow-node-t2a-kokoro.js +0 -149
  93. package/dst/speechflow-node-t2a-kokoro.js.map +0 -1
  94. package/dst/speechflow-node-t2t-deepl.d.ts +0 -15
  95. package/dst/speechflow-node-t2t-deepl.js +0 -142
  96. package/dst/speechflow-node-t2t-deepl.js.map +0 -1
  97. package/dst/speechflow-node-t2t-format.d.ts +0 -11
  98. package/dst/speechflow-node-t2t-format.js +0 -82
  99. package/dst/speechflow-node-t2t-format.js.map +0 -1
  100. package/dst/speechflow-node-t2t-ollama.d.ts +0 -13
  101. package/dst/speechflow-node-t2t-ollama.js +0 -247
  102. package/dst/speechflow-node-t2t-ollama.js.map +0 -1
  103. package/dst/speechflow-node-t2t-openai.d.ts +0 -13
  104. package/dst/speechflow-node-t2t-openai.js +0 -227
  105. package/dst/speechflow-node-t2t-openai.js.map +0 -1
  106. package/dst/speechflow-node-t2t-sentence.d.ts +0 -17
  107. package/dst/speechflow-node-t2t-sentence.js +0 -234
  108. package/dst/speechflow-node-t2t-sentence.js.map +0 -1
  109. package/dst/speechflow-node-t2t-subtitle.d.ts +0 -13
  110. package/dst/speechflow-node-t2t-subtitle.js +0 -278
  111. package/dst/speechflow-node-t2t-subtitle.js.map +0 -1
  112. package/dst/speechflow-node-t2t-transformers.d.ts +0 -14
  113. package/dst/speechflow-node-t2t-transformers.js +0 -265
  114. package/dst/speechflow-node-t2t-transformers.js.map +0 -1
  115. package/dst/speechflow-node-x2x-filter.d.ts +0 -11
  116. package/dst/speechflow-node-x2x-filter.js +0 -117
  117. package/dst/speechflow-node-x2x-filter.js.map +0 -1
  118. package/dst/speechflow-node-x2x-trace.d.ts +0 -11
  119. package/dst/speechflow-node-x2x-trace.js +0 -111
  120. package/dst/speechflow-node-x2x-trace.js.map +0 -1
  121. package/dst/speechflow-node-xio-device.d.ts +0 -13
  122. package/dst/speechflow-node-xio-device.js +0 -226
  123. package/dst/speechflow-node-xio-device.js.map +0 -1
  124. package/dst/speechflow-node-xio-file.d.ts +0 -11
  125. package/dst/speechflow-node-xio-file.js +0 -210
  126. package/dst/speechflow-node-xio-file.js.map +0 -1
  127. package/dst/speechflow-node-xio-mqtt.d.ts +0 -13
  128. package/dst/speechflow-node-xio-mqtt.js +0 -185
  129. package/dst/speechflow-node-xio-mqtt.js.map +0 -1
  130. package/dst/speechflow-node-xio-websocket.d.ts +0 -13
  131. package/dst/speechflow-node-xio-websocket.js +0 -278
  132. package/dst/speechflow-node-xio-websocket.js.map +0 -1
  133. package/dst/speechflow-node.d.ts +0 -65
  134. package/dst/speechflow-node.js +0 -180
  135. package/dst/speechflow-node.js.map +0 -1
  136. package/dst/speechflow-utils.d.ts +0 -69
  137. package/dst/speechflow-utils.js +0 -486
  138. package/dst/speechflow-utils.js.map +0 -1
  139. package/dst/speechflow.js +0 -768
  140. package/dst/speechflow.js.map +0 -1
  141. package/src/speechflow-node-a2a-meter.ts +0 -130
  142. package/src/speechflow-node-a2a-vad.ts +0 -285
  143. package/src/speechflow-node-a2t-deepgram.ts +0 -234
  144. package/src/speechflow-node-t2t-subtitle.ts +0 -149
  145. /package/{etc → speechflow-cli/etc}/biome.jsonc +0 -0
  146. /package/{etc → speechflow-cli/etc}/oxlint.jsonc +0 -0
  147. /package/{etc → speechflow-cli/etc}/speechflow.bat +0 -0
  148. /package/{etc → speechflow-cli/etc}/speechflow.sh +0 -0
  149. /package/{etc → speechflow-cli/etc}/speechflow.yaml +0 -0
  150. /package/{etc → speechflow-cli/etc}/tsconfig.json +0 -0
  151. /package/{package.d → speechflow-cli/package.d}/@ericedouard+vad-node-realtime+0.2.0.patch +0 -0
  152. /package/{src → speechflow-cli/src}/lib.d.ts +0 -0
  153. /package/{src → speechflow-cli/src}/speechflow-logo.ai +0 -0
  154. /package/{src → speechflow-cli/src}/speechflow-logo.svg +0 -0
  155. /package/{src → speechflow-cli/src}/speechflow-node-a2a-ffmpeg.ts +0 -0
  156. /package/{tsconfig.json → speechflow-cli/tsconfig.json} +0 -0
@@ -1,271 +0,0 @@
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
- const wavefile_1 = require("wavefile");
50
- /* internal dependencies */
51
- const speechflow_node_1 = __importDefault(require("./speechflow-node"));
52
- const utils = __importStar(require("./speechflow-utils"));
53
- /* SpeechFlow node for Gender recognition */
54
- class SpeechFlowNodeGender extends speechflow_node_1.default {
55
- /* declare official node name */
56
- static name = "gender";
57
- /* internal state */
58
- static speexInitialized = false;
59
- classifier = null;
60
- queue = new utils.Queue();
61
- queueRecv = this.queue.pointerUse("recv");
62
- queueAC = this.queue.pointerUse("ac");
63
- queueSend = this.queue.pointerUse("send");
64
- shutdown = false;
65
- /* construct node */
66
- constructor(id, cfg, opts, args) {
67
- super(id, cfg, opts, args);
68
- /* declare node configuration parameters */
69
- this.configure({
70
- window: { type: "number", pos: 0, val: 500 }
71
- });
72
- /* declare node input/output format */
73
- this.input = "audio";
74
- this.output = "audio";
75
- }
76
- /* open node */
77
- async open() {
78
- /* sanity check situation */
79
- if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
80
- throw new Error("Gender node currently supports PCM-S16LE audio only");
81
- /* pass-through logging */
82
- const log = (level, msg) => { this.log(level, msg); };
83
- /* the used model */
84
- const model = "Xenova/wav2vec2-large-xlsr-53-gender-recognition-librispeech";
85
- /* track download progress when instantiating Transformers engine and model */
86
- const progressState = new Map();
87
- const progressCallback = (progress) => {
88
- let artifact = model;
89
- if (typeof progress.file === "string")
90
- artifact += `:${progress.file}`;
91
- let percent = 0;
92
- if (typeof progress.loaded === "number" && typeof progress.total === "number")
93
- percent = progress.loaded / progress.total * 100;
94
- else if (typeof progress.progress === "number")
95
- percent = progress.progress;
96
- if (percent > 0)
97
- progressState.set(artifact, percent);
98
- };
99
- const interval = setInterval(() => {
100
- for (const [artifact, percent] of progressState) {
101
- this.log("info", `downloaded ${percent.toFixed(2)}% of artifact "${artifact}"`);
102
- if (percent >= 1.0)
103
- progressState.delete(artifact);
104
- }
105
- }, 1000);
106
- /* instantiate Transformers engine and model */
107
- const pipeline = Transformers.pipeline("audio-classification", model, {
108
- cache_dir: node_path_1.default.join(this.config.cacheDir, "gender"),
109
- dtype: "q4",
110
- device: "auto",
111
- progress_callback: progressCallback
112
- });
113
- this.classifier = await pipeline;
114
- clearInterval(interval);
115
- if (this.classifier === null)
116
- throw new Error("failed to instantiate classifier pipeline");
117
- /* classify a single large-enough concatenated audio frame */
118
- const classify = async (data) => {
119
- const result = await this.classifier(data);
120
- const classified = Array.isArray(result) ? result : [result];
121
- const c1 = classified.find((c) => c.label === "male");
122
- const c2 = classified.find((c) => c.label === "female");
123
- const male = c1 ? c1.score : 0.0;
124
- const female = c2 ? c2.score : 0.0;
125
- return (male > female ? "male" : "female");
126
- };
127
- /* define sample rate required by model */
128
- const sampleRateTarget = 16000;
129
- /* work off queued audio frames */
130
- const frameWindowDuration = 0.5;
131
- const frameWindowSamples = frameWindowDuration * sampleRateTarget;
132
- let lastGender = "";
133
- let workingOffTimer = null;
134
- let workingOff = false;
135
- const workOffQueue = async () => {
136
- /* control working off round */
137
- if (workingOff || this.shutdown)
138
- return;
139
- workingOff = true;
140
- if (workingOffTimer !== null) {
141
- clearTimeout(workingOffTimer);
142
- workingOffTimer = null;
143
- }
144
- this.queue.off("write", workOffQueue);
145
- let pos0 = this.queueAC.position();
146
- const posL = this.queueAC.maxPosition();
147
- const data = new Float32Array(frameWindowSamples);
148
- data.fill(0);
149
- let samples = 0;
150
- let pos = pos0;
151
- while (pos < posL && samples < frameWindowSamples) {
152
- const element = this.queueAC.peek(pos);
153
- if (element === undefined || element.type !== "audio-frame")
154
- break;
155
- if ((samples + element.data.length) < frameWindowSamples) {
156
- data.set(element.data, samples);
157
- samples += element.data.length;
158
- }
159
- pos++;
160
- }
161
- if (pos0 < pos && samples > frameWindowSamples * 0.75) {
162
- const gender = await classify(data);
163
- const posM = pos0 + Math.trunc((pos - pos0) * 0.25);
164
- while (pos0 < posM && pos0 < posL) {
165
- const element = this.queueAC.peek(pos0);
166
- if (element === undefined || element.type !== "audio-frame")
167
- break;
168
- element.gender = gender;
169
- this.queueAC.touch();
170
- this.queueAC.walk(+1);
171
- pos0++;
172
- }
173
- if (lastGender !== gender) {
174
- log("info", `gender now recognized as <${gender}>`);
175
- lastGender = gender;
176
- }
177
- }
178
- /* re-initiate working off round */
179
- workingOff = false;
180
- workingOffTimer = setTimeout(workOffQueue, 100);
181
- this.queue.once("write", workOffQueue);
182
- };
183
- this.queue.once("write", workOffQueue);
184
- /* provide Duplex stream and internally attach to classifier */
185
- const self = this;
186
- this.stream = new node_stream_1.default.Duplex({
187
- writableObjectMode: true,
188
- readableObjectMode: true,
189
- decodeStrings: false,
190
- highWaterMark: 1,
191
- /* receive audio chunk (writable side of stream) */
192
- write(chunk, encoding, callback) {
193
- if (!Buffer.isBuffer(chunk.payload))
194
- callback(new Error("expected audio input as Buffer chunks"));
195
- else if (chunk.payload.byteLength === 0)
196
- callback();
197
- else {
198
- /* convert audio samples from PCM/I16/48KHz to PCM/F32/16KHz */
199
- let data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
200
- const wav = new wavefile_1.WaveFile();
201
- wav.fromScratch(self.config.audioChannels, self.config.audioSampleRate, "32f", data);
202
- wav.toSampleRate(sampleRateTarget, { method: "cubic" });
203
- data = wav.getSamples(false, (Float32Array));
204
- /* queue chunk and converted data */
205
- self.queueRecv.append({ type: "audio-frame", chunk, data });
206
- callback();
207
- }
208
- },
209
- /* receive no more audio chunks (writable side of stream) */
210
- final(callback) {
211
- /* signal end of file */
212
- self.queueRecv.append({ type: "audio-eof" });
213
- callback();
214
- },
215
- /* send audio chunk(s) (readable side of stream) */
216
- read(_size) {
217
- /* flush pending audio chunks */
218
- const flushPendingChunks = () => {
219
- if (self.shutdown)
220
- return;
221
- const element = self.queueSend.peek();
222
- if (element !== undefined
223
- && element.type === "audio-eof")
224
- this.push(null);
225
- else if (element !== undefined
226
- && element.type === "audio-frame"
227
- && element.gender !== undefined) {
228
- while (true) {
229
- const element = self.queueSend.peek();
230
- if (element === undefined)
231
- break;
232
- else if (element.type === "audio-eof") {
233
- this.push(null);
234
- break;
235
- }
236
- else if (element.type === "audio-frame"
237
- && element.gender === undefined)
238
- break;
239
- const duration = utils.audioArrayDuration(element.data);
240
- log("debug", `send chunk (${duration.toFixed(3)}s) with gender <${element.gender}>`);
241
- element.chunk.meta.set("gender", element.gender);
242
- this.push(element.chunk);
243
- self.queueSend.walk(+1);
244
- self.queue.trim();
245
- }
246
- }
247
- else
248
- self.queue.once("write", flushPendingChunks);
249
- };
250
- flushPendingChunks();
251
- }
252
- });
253
- }
254
- /* close node */
255
- async close() {
256
- /* indicate shutdown */
257
- this.shutdown = true;
258
- /* close stream */
259
- if (this.stream !== null) {
260
- this.stream.destroy();
261
- this.stream = null;
262
- }
263
- /* close classifier */
264
- if (this.classifier !== null) {
265
- this.classifier.dispose();
266
- this.classifier = null;
267
- }
268
- }
269
- }
270
- exports.default = SpeechFlowNodeGender;
271
- //# sourceMappingURL=speechflow-node-a2a-gender.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"speechflow-node-a2a-gender.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-gender.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import SpeechFlowNode from "./speechflow-node";
2
- export default class SpeechFlowNodeMeter extends SpeechFlowNode {
3
- static name: string;
4
- interval: ReturnType<typeof setInterval> | null;
5
- constructor(id: string, cfg: {
6
- [id: string]: any;
7
- }, opts: {
8
- [id: string]: any;
9
- }, args: any[]);
10
- open(): Promise<void>;
11
- close(): Promise<void>;
12
- }
@@ -1,155 +0,0 @@
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_stream_1 = __importDefault(require("node:stream"));
46
- /* external dependencies */
47
- const audio_inspect_1 = require("audio-inspect");
48
- /* internal dependencies */
49
- const speechflow_node_1 = __importDefault(require("./speechflow-node"));
50
- const utils = __importStar(require("./speechflow-utils"));
51
- /* SpeechFlow node for audio metering */
52
- class SpeechFlowNodeMeter extends speechflow_node_1.default {
53
- /* declare official node name */
54
- static name = "meter";
55
- /* internal state */
56
- interval = null;
57
- /* construct node */
58
- constructor(id, cfg, opts, args) {
59
- super(id, cfg, opts, args);
60
- /* declare node configuration parameters */
61
- this.configure({
62
- interval: { type: "number", pos: 0, val: 250 },
63
- dashboard: { type: "string", val: "" }
64
- });
65
- /* declare node input/output format */
66
- this.input = "audio";
67
- this.output = "audio";
68
- }
69
- /* open node */
70
- async open() {
71
- /* sanity check situation */
72
- if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
73
- throw new Error("meter node currently supports PCM-S16LE audio only");
74
- /* internal state */
75
- const sampleWindowDuration = 3; /* LUFS-S requires 3s */
76
- const sampleWindowSize = this.config.audioSampleRate * sampleWindowDuration;
77
- let sampleWindow = new Float32Array(sampleWindowSize);
78
- sampleWindow.fill(0, 0, sampleWindowSize);
79
- let lufss = 0;
80
- let rms = 0;
81
- /* setup loudness emitting interval */
82
- this.interval = setInterval(() => {
83
- this.log("debug", `LUFS-S: ${lufss.toFixed(1)} dB, RMS: ${rms.toFixed(1)} dB`);
84
- this.sendResponse(["meter", "LUFS-S", lufss]);
85
- this.sendResponse(["meter", "RMS", rms]);
86
- if (this.params.dashboard !== "")
87
- this.dashboardInfo("audio", this.params.dashboard, "final", lufss);
88
- }, this.params.interval);
89
- /* provide Duplex stream and internally attach to VAD */
90
- const self = this;
91
- this.stream = new node_stream_1.default.Transform({
92
- writableObjectMode: true,
93
- readableObjectMode: true,
94
- decodeStrings: false,
95
- highWaterMark: 1,
96
- /* transform audio chunk */
97
- transform(chunk, encoding, callback) {
98
- if (!Buffer.isBuffer(chunk.payload))
99
- callback(new Error("expected audio input as Buffer chunks"));
100
- else if (chunk.payload.byteLength === 0)
101
- callback();
102
- else {
103
- /* convert audio samples from PCM/I16 to PCM/F32 */
104
- const data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
105
- /* update internal audio sample sliding window */
106
- const fusion = new Float32Array(sampleWindow.length + data.length);
107
- fusion.set(sampleWindow, 0);
108
- fusion.set(data, sampleWindow.length);
109
- sampleWindow = fusion.slice(fusion.length - sampleWindowSize);
110
- /* asynchronously calculate the LUFS-S metric */
111
- setTimeout(() => {
112
- const audioData = {
113
- sampleRate: self.config.audioSampleRate,
114
- numberOfChannels: self.config.audioChannels,
115
- channelData: [sampleWindow],
116
- duration: sampleWindowDuration,
117
- length: sampleWindow.length
118
- };
119
- const lufs = (0, audio_inspect_1.getLUFS)(audioData, {
120
- channelMode: self.config.audioChannels === 1 ? "mono" : "stereo",
121
- calculateShortTerm: true,
122
- calculateMomentary: false,
123
- calculateLoudnessRange: false,
124
- calculateTruePeak: false
125
- });
126
- lufss = lufs.shortTerm ? lufs.shortTerm[0] : 0;
127
- rms = (0, audio_inspect_1.getRMS)(audioData, { asDB: true });
128
- }, 0);
129
- /* pass-through original audio chunk */
130
- this.push(chunk);
131
- callback();
132
- }
133
- },
134
- final(callback) {
135
- this.push(null);
136
- callback();
137
- }
138
- });
139
- }
140
- /* close node */
141
- async close() {
142
- /* close stream */
143
- if (this.stream !== null) {
144
- this.stream.destroy();
145
- this.stream = null;
146
- }
147
- /* stop interval */
148
- if (this.interval !== null) {
149
- clearInterval(this.interval);
150
- this.interval = null;
151
- }
152
- }
153
- }
154
- exports.default = SpeechFlowNodeMeter;
155
- //# sourceMappingURL=speechflow-node-a2a-meter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"speechflow-node-a2a-meter.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-meter.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import SpeechFlowNode from "./speechflow-node";
2
- type MuteMode = "none" | /* not muted */ "silenced" | /* muted by changing audio samples to silence */ "unplugged";
3
- export default class SpeechFlowNodeMute extends SpeechFlowNode {
4
- static name: string;
5
- private muteMode;
6
- constructor(id: string, cfg: {
7
- [id: string]: any;
8
- }, opts: {
9
- [id: string]: any;
10
- }, args: any[]);
11
- receiveRequest(params: any[]): Promise<void>;
12
- setMuteMode(mode: MuteMode): void;
13
- open(): Promise<void>;
14
- close(): Promise<void>;
15
- }
16
- export {};
@@ -1,91 +0,0 @@
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 muting in audio-to-audio passing */
16
- class SpeechFlowNodeMute extends speechflow_node_1.default {
17
- /* declare official node name */
18
- static name = "mute";
19
- /* internal state */
20
- muteMode = "none";
21
- /* construct node */
22
- constructor(id, cfg, opts, args) {
23
- super(id, cfg, opts, args);
24
- /* declare node configuration parameters */
25
- this.configure({});
26
- /* declare node input/output format */
27
- this.input = "audio";
28
- this.output = "audio";
29
- }
30
- /* receive external request */
31
- async receiveRequest(params) {
32
- if (params.length === 2 && params[0] === "mode") {
33
- if (!params[1].match(/^(?:none|silenced|unplugged)$/))
34
- throw new Error("mute: invalid mode argument in external request");
35
- const muteMode = params[1];
36
- this.setMuteMode(muteMode);
37
- this.sendResponse(["mute", "mode", muteMode]);
38
- }
39
- else
40
- throw new Error("mute: invalid arguments in external request");
41
- }
42
- /* change mute mode */
43
- setMuteMode(mode) {
44
- this.log("info", `setting mute mode to "${mode}"`);
45
- this.muteMode = mode;
46
- }
47
- /* open node */
48
- async open() {
49
- /* establish a transform stream */
50
- const self = this;
51
- this.stream = new node_stream_1.default.Transform({
52
- readableObjectMode: true,
53
- writableObjectMode: true,
54
- decodeStrings: false,
55
- transform(chunk, encoding, callback) {
56
- if (!Buffer.isBuffer(chunk.payload))
57
- callback(new Error("invalid chunk payload type"));
58
- else if (self.muteMode === "unplugged")
59
- /* pass-through nothing */
60
- callback();
61
- else if (self.muteMode === "silenced") {
62
- /* pass-through a silenced chunk */
63
- chunk = chunk.clone();
64
- chunk.meta.set("muted", true);
65
- const buffer = chunk.payload;
66
- buffer.fill(0);
67
- callback();
68
- }
69
- else {
70
- /* pass-through original chunk */
71
- this.push(chunk);
72
- callback();
73
- }
74
- },
75
- final(callback) {
76
- this.push(null);
77
- callback();
78
- }
79
- });
80
- }
81
- /* close node */
82
- async close() {
83
- /* close stream */
84
- if (this.stream !== null) {
85
- this.stream.destroy();
86
- this.stream = null;
87
- }
88
- }
89
- }
90
- exports.default = SpeechFlowNodeMute;
91
- //# sourceMappingURL=speechflow-node-a2a-mute.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"speechflow-node-a2a-mute.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-mute.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import SpeechFlowNode from "./speechflow-node";
2
- export default class SpeechFlowNodeVAD extends SpeechFlowNode {
3
- static name: string;
4
- private vad;
5
- private queue;
6
- private queueRecv;
7
- private queueVAD;
8
- private queueSend;
9
- constructor(id: string, cfg: {
10
- [id: string]: any;
11
- }, opts: {
12
- [id: string]: any;
13
- }, args: any[]);
14
- open(): Promise<void>;
15
- close(): Promise<void>;
16
- }