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.
- package/CHANGELOG.md +19 -0
- package/etc/stx.conf +17 -11
- package/package.json +7 -4
- package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js +153 -0
- package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2a-gender.d.ts +20 -0
- package/speechflow-cli/dst/speechflow-node-a2a-gender.js +349 -0
- package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2a-meter.d.ts +16 -0
- package/speechflow-cli/dst/speechflow-node-a2a-meter.js +232 -0
- package/speechflow-cli/dst/speechflow-node-a2a-meter.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2a-mute.d.ts +17 -0
- package/speechflow-cli/dst/speechflow-node-a2a-mute.js +117 -0
- package/speechflow-cli/dst/speechflow-node-a2a-mute.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2a-vad.d.ts +19 -0
- package/speechflow-cli/dst/speechflow-node-a2a-vad.js +374 -0
- package/speechflow-cli/dst/speechflow-node-a2a-vad.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2a-wav.d.ts +11 -0
- package/speechflow-cli/dst/speechflow-node-a2a-wav.js +211 -0
- package/speechflow-cli/dst/speechflow-node-a2a-wav.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.d.ts +19 -0
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +328 -0
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.d.ts +18 -0
- package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js +238 -0
- package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.d.ts +14 -0
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +155 -0
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-deepl.d.ts +15 -0
- package/speechflow-cli/dst/speechflow-node-t2t-deepl.js +146 -0
- package/speechflow-cli/dst/speechflow-node-t2t-deepl.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-format.d.ts +11 -0
- package/speechflow-cli/dst/speechflow-node-t2t-format.js +82 -0
- package/speechflow-cli/dst/speechflow-node-t2t-format.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-ollama.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-t2t-ollama.js +247 -0
- package/speechflow-cli/dst/speechflow-node-t2t-ollama.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-openai.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-t2t-openai.js +227 -0
- package/speechflow-cli/dst/speechflow-node-t2t-openai.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-sentence.d.ts +17 -0
- package/speechflow-cli/dst/speechflow-node-t2t-sentence.js +250 -0
- package/speechflow-cli/dst/speechflow-node-t2t-sentence.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-subtitle.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +278 -0
- package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-transformers.d.ts +14 -0
- package/speechflow-cli/dst/speechflow-node-t2t-transformers.js +265 -0
- package/speechflow-cli/dst/speechflow-node-t2t-transformers.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-x2x-filter.d.ts +11 -0
- package/speechflow-cli/dst/speechflow-node-x2x-filter.js +121 -0
- package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-x2x-trace.d.ts +11 -0
- package/speechflow-cli/dst/speechflow-node-x2x-trace.js +111 -0
- package/speechflow-cli/dst/speechflow-node-x2x-trace.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-device.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-xio-device.js +230 -0
- package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-file.d.ts +11 -0
- package/speechflow-cli/dst/speechflow-node-xio-file.js +216 -0
- package/speechflow-cli/dst/speechflow-node-xio-file.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-mqtt.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +188 -0
- package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-websocket.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-xio-websocket.js +278 -0
- package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node.d.ts +65 -0
- package/speechflow-cli/dst/speechflow-node.js +180 -0
- package/speechflow-cli/dst/speechflow-node.js.map +1 -0
- package/speechflow-cli/dst/speechflow-utils.d.ts +74 -0
- package/speechflow-cli/dst/speechflow-utils.js +519 -0
- package/speechflow-cli/dst/speechflow-utils.js.map +1 -0
- package/speechflow-cli/dst/speechflow.d.ts +7 -0
- package/speechflow-cli/dst/speechflow.js +837 -0
- package/speechflow-cli/dst/speechflow.js.map +1 -0
- package/speechflow-cli/etc/stx.conf +13 -13
- package/speechflow-cli/package.json +7 -7
- package/speechflow-cli/src/speechflow.ts +5 -5
- package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Bold.eot +0 -0
- package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Bold.ttf +0 -0
- package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Bold.woff +0 -0
- package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Regular.eot +0 -0
- package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Regular.ttf +0 -0
- package/speechflow-ui-db/dst/app-font-TypoPRO-SourceSansPro-Regular.woff +0 -0
- package/speechflow-ui-db/dst/app-font-fa-brands-400.woff2 +0 -0
- package/speechflow-ui-db/dst/app-font-fa-regular-400.woff2 +0 -0
- package/speechflow-ui-db/dst/app-font-fa-solid-900.woff2 +0 -0
- package/speechflow-ui-db/dst/app-font-fa-v4compatibility.woff2 +0 -0
- package/speechflow-ui-db/dst/app-icon.svg +26 -0
- package/speechflow-ui-db/dst/index.css +5 -0
- package/speechflow-ui-db/dst/index.html +24 -0
- package/speechflow-ui-db/dst/index.js +616 -0
- package/speechflow-ui-db/etc/stx.conf +17 -17
- package/speechflow-ui-db/package.json +2 -2
- package/speechflow-ui-db/src/app.vue +14 -7
- package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Bold.eot +0 -0
- package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Bold.ttf +0 -0
- package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Bold.woff +0 -0
- package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Regular.eot +0 -0
- package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Regular.ttf +0 -0
- package/speechflow-ui-st/dst/app-font-TypoPRO-SourceSansPro-Regular.woff +0 -0
- package/speechflow-ui-st/dst/app-font-fa-brands-400.woff2 +0 -0
- package/speechflow-ui-st/dst/app-font-fa-regular-400.woff2 +0 -0
- package/speechflow-ui-st/dst/app-font-fa-solid-900.woff2 +0 -0
- package/speechflow-ui-st/dst/app-font-fa-v4compatibility.woff2 +0 -0
- package/speechflow-ui-st/dst/app-icon.svg +26 -0
- package/speechflow-ui-st/dst/index.css +5 -0
- package/speechflow-ui-st/dst/index.html +24 -0
- package/speechflow-ui-st/dst/index.js +610 -0
- package/speechflow-ui-st/etc/stx.conf +17 -17
- package/speechflow-ui-st/package.json +2 -2
- /package/{speechflow-cli/etc → etc}/speechflow.yaml +0 -0
|
@@ -0,0 +1,349 @@
|
|
|
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
|
+
workingOffTimer = null;
|
|
66
|
+
progressInterval = null;
|
|
67
|
+
/* construct node */
|
|
68
|
+
constructor(id, cfg, opts, args) {
|
|
69
|
+
super(id, cfg, opts, args);
|
|
70
|
+
/* declare node configuration parameters */
|
|
71
|
+
this.configure({
|
|
72
|
+
window: { type: "number", pos: 0, val: 500 }
|
|
73
|
+
});
|
|
74
|
+
/* declare node input/output format */
|
|
75
|
+
this.input = "audio";
|
|
76
|
+
this.output = "audio";
|
|
77
|
+
}
|
|
78
|
+
/* open node */
|
|
79
|
+
async open() {
|
|
80
|
+
/* sanity check situation */
|
|
81
|
+
if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
|
|
82
|
+
throw new Error("Gender node currently supports PCM-S16LE audio only");
|
|
83
|
+
/* clear shutdown flag */
|
|
84
|
+
this.shutdown = false;
|
|
85
|
+
/* pass-through logging */
|
|
86
|
+
const log = (level, msg) => { this.log(level, msg); };
|
|
87
|
+
/* the used model */
|
|
88
|
+
const model = "Xenova/wav2vec2-large-xlsr-53-gender-recognition-librispeech";
|
|
89
|
+
/* track download progress when instantiating Transformers engine and model */
|
|
90
|
+
const progressState = new Map();
|
|
91
|
+
const progressCallback = (progress) => {
|
|
92
|
+
if (this.shutdown)
|
|
93
|
+
return;
|
|
94
|
+
let artifact = model;
|
|
95
|
+
if (typeof progress.file === "string")
|
|
96
|
+
artifact += `:${progress.file}`;
|
|
97
|
+
let percent = 0;
|
|
98
|
+
if (typeof progress.loaded === "number" && typeof progress.total === "number")
|
|
99
|
+
percent = progress.loaded / progress.total * 100;
|
|
100
|
+
else if (typeof progress.progress === "number")
|
|
101
|
+
percent = progress.progress;
|
|
102
|
+
if (percent > 0)
|
|
103
|
+
progressState.set(artifact, percent);
|
|
104
|
+
};
|
|
105
|
+
this.progressInterval = setInterval(() => {
|
|
106
|
+
if (this.shutdown)
|
|
107
|
+
return;
|
|
108
|
+
for (const [artifact, percent] of progressState) {
|
|
109
|
+
this.log("info", `downloaded ${percent.toFixed(2)}% of artifact "${artifact}"`);
|
|
110
|
+
if (percent >= 1.0)
|
|
111
|
+
progressState.delete(artifact);
|
|
112
|
+
}
|
|
113
|
+
}, 1000);
|
|
114
|
+
try {
|
|
115
|
+
const pipelinePromise = Transformers.pipeline("audio-classification", model, {
|
|
116
|
+
cache_dir: node_path_1.default.join(this.config.cacheDir, "gender"),
|
|
117
|
+
dtype: "q4",
|
|
118
|
+
device: "auto",
|
|
119
|
+
progress_callback: progressCallback
|
|
120
|
+
});
|
|
121
|
+
const timeoutPromise = new Promise((resolve, reject) => setTimeout(() => reject(new Error("model initialization timeout")), 30 * 1000));
|
|
122
|
+
this.classifier = await Promise.race([
|
|
123
|
+
pipelinePromise, timeoutPromise
|
|
124
|
+
]);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (this.progressInterval) {
|
|
128
|
+
clearInterval(this.progressInterval);
|
|
129
|
+
this.progressInterval = null;
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`failed to initialize classifier pipeline: ${error}`);
|
|
132
|
+
}
|
|
133
|
+
if (this.progressInterval) {
|
|
134
|
+
clearInterval(this.progressInterval);
|
|
135
|
+
this.progressInterval = null;
|
|
136
|
+
}
|
|
137
|
+
if (this.classifier === null)
|
|
138
|
+
throw new Error("failed to instantiate classifier pipeline");
|
|
139
|
+
/* classify a single large-enough concatenated audio frame */
|
|
140
|
+
const classify = async (data) => {
|
|
141
|
+
if (this.shutdown || this.classifier === null)
|
|
142
|
+
throw new Error("classifier shutdown during operation");
|
|
143
|
+
const classifyPromise = this.classifier(data);
|
|
144
|
+
const timeoutPromise = new Promise((resolve, reject) => setTimeout(() => reject(new Error("classification timeout")), 30 * 1000));
|
|
145
|
+
const result = await Promise.race([classifyPromise, timeoutPromise]);
|
|
146
|
+
const classified = Array.isArray(result) ?
|
|
147
|
+
result :
|
|
148
|
+
[result];
|
|
149
|
+
const c1 = classified.find((c) => c.label === "male");
|
|
150
|
+
const c2 = classified.find((c) => c.label === "female");
|
|
151
|
+
const male = c1 ? c1.score : 0.0;
|
|
152
|
+
const female = c2 ? c2.score : 0.0;
|
|
153
|
+
return (male > female ? "male" : "female");
|
|
154
|
+
};
|
|
155
|
+
/* define sample rate required by model */
|
|
156
|
+
const sampleRateTarget = 16000;
|
|
157
|
+
/* work off queued audio frames */
|
|
158
|
+
const frameWindowDuration = 0.5;
|
|
159
|
+
const frameWindowSamples = frameWindowDuration * sampleRateTarget;
|
|
160
|
+
let lastGender = "";
|
|
161
|
+
let workingOff = false;
|
|
162
|
+
const workOffQueue = async () => {
|
|
163
|
+
/* control working off round */
|
|
164
|
+
if (workingOff || this.shutdown)
|
|
165
|
+
return;
|
|
166
|
+
workingOff = true;
|
|
167
|
+
if (this.workingOffTimer !== null) {
|
|
168
|
+
clearTimeout(this.workingOffTimer);
|
|
169
|
+
this.workingOffTimer = null;
|
|
170
|
+
}
|
|
171
|
+
this.queue.off("write", workOffQueue);
|
|
172
|
+
try {
|
|
173
|
+
let pos0 = this.queueAC.position();
|
|
174
|
+
const posL = this.queueAC.maxPosition();
|
|
175
|
+
const data = new Float32Array(frameWindowSamples);
|
|
176
|
+
data.fill(0);
|
|
177
|
+
let samples = 0;
|
|
178
|
+
let pos = pos0;
|
|
179
|
+
while (pos < posL && samples < frameWindowSamples && !this.shutdown) {
|
|
180
|
+
const element = this.queueAC.peek(pos);
|
|
181
|
+
if (element === undefined || element.type !== "audio-frame")
|
|
182
|
+
break;
|
|
183
|
+
if ((samples + element.data.length) < frameWindowSamples) {
|
|
184
|
+
data.set(element.data, samples);
|
|
185
|
+
samples += element.data.length;
|
|
186
|
+
}
|
|
187
|
+
pos++;
|
|
188
|
+
}
|
|
189
|
+
if (pos0 < pos && samples > frameWindowSamples * 0.75 && !this.shutdown) {
|
|
190
|
+
const gender = await classify(data);
|
|
191
|
+
if (this.shutdown)
|
|
192
|
+
return;
|
|
193
|
+
const posM = pos0 + Math.trunc((pos - pos0) * 0.25);
|
|
194
|
+
while (pos0 < posM && pos0 < posL && !this.shutdown) {
|
|
195
|
+
const element = this.queueAC.peek(pos0);
|
|
196
|
+
if (element === undefined || element.type !== "audio-frame")
|
|
197
|
+
break;
|
|
198
|
+
element.gender = gender;
|
|
199
|
+
this.queueAC.touch();
|
|
200
|
+
this.queueAC.walk(+1);
|
|
201
|
+
pos0++;
|
|
202
|
+
}
|
|
203
|
+
if (lastGender !== gender && !this.shutdown) {
|
|
204
|
+
log("info", `gender now recognized as <${gender}>`);
|
|
205
|
+
lastGender = gender;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
log("error", `gender classification error: ${error}`);
|
|
211
|
+
}
|
|
212
|
+
/* re-initiate working off round */
|
|
213
|
+
workingOff = false;
|
|
214
|
+
if (!this.shutdown) {
|
|
215
|
+
this.workingOffTimer = setTimeout(workOffQueue, 100);
|
|
216
|
+
this.queue.once("write", workOffQueue);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
this.queue.once("write", workOffQueue);
|
|
220
|
+
/* provide Duplex stream and internally attach to classifier */
|
|
221
|
+
const self = this;
|
|
222
|
+
this.stream = new node_stream_1.default.Duplex({
|
|
223
|
+
writableObjectMode: true,
|
|
224
|
+
readableObjectMode: true,
|
|
225
|
+
decodeStrings: false,
|
|
226
|
+
highWaterMark: 1,
|
|
227
|
+
/* receive audio chunk (writable side of stream) */
|
|
228
|
+
write(chunk, encoding, callback) {
|
|
229
|
+
if (self.shutdown) {
|
|
230
|
+
callback(new Error("stream already destroyed"));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (!Buffer.isBuffer(chunk.payload))
|
|
234
|
+
callback(new Error("expected audio input as Buffer chunks"));
|
|
235
|
+
else if (chunk.payload.byteLength === 0)
|
|
236
|
+
callback();
|
|
237
|
+
else {
|
|
238
|
+
try {
|
|
239
|
+
/* convert audio samples from PCM/I16/48KHz to PCM/F32/16KHz */
|
|
240
|
+
let data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
|
|
241
|
+
const wav = new wavefile_1.WaveFile();
|
|
242
|
+
wav.fromScratch(self.config.audioChannels, self.config.audioSampleRate, "32f", data);
|
|
243
|
+
wav.toSampleRate(sampleRateTarget, { method: "cubic" });
|
|
244
|
+
data = wav.getSamples(false, (Float32Array));
|
|
245
|
+
/* queue chunk and converted data */
|
|
246
|
+
self.queueRecv.append({ type: "audio-frame", chunk, data });
|
|
247
|
+
callback();
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
callback(error instanceof Error ? error : new Error("audio processing failed"));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
/* receive no more audio chunks (writable side of stream) */
|
|
255
|
+
final(callback) {
|
|
256
|
+
if (self.shutdown) {
|
|
257
|
+
callback();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
/* signal end of file */
|
|
261
|
+
self.queueRecv.append({ type: "audio-eof" });
|
|
262
|
+
callback();
|
|
263
|
+
},
|
|
264
|
+
/* send audio chunk(s) (readable side of stream) */
|
|
265
|
+
read(_size) {
|
|
266
|
+
/* flush pending audio chunks */
|
|
267
|
+
const flushPendingChunks = () => {
|
|
268
|
+
if (self.shutdown) {
|
|
269
|
+
this.push(null);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const element = self.queueSend.peek();
|
|
273
|
+
if (element !== undefined
|
|
274
|
+
&& element.type === "audio-eof")
|
|
275
|
+
this.push(null);
|
|
276
|
+
else if (element !== undefined
|
|
277
|
+
&& element.type === "audio-frame"
|
|
278
|
+
&& element.gender !== undefined) {
|
|
279
|
+
while (true) {
|
|
280
|
+
if (self.shutdown) {
|
|
281
|
+
this.push(null);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const element = self.queueSend.peek();
|
|
285
|
+
if (element === undefined)
|
|
286
|
+
break;
|
|
287
|
+
else if (element.type === "audio-eof") {
|
|
288
|
+
this.push(null);
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
else if (element.type === "audio-frame"
|
|
292
|
+
&& element.gender === undefined)
|
|
293
|
+
break;
|
|
294
|
+
const duration = utils.audioArrayDuration(element.data);
|
|
295
|
+
log("debug", `send chunk (${duration.toFixed(3)}s) with gender <${element.gender}>`);
|
|
296
|
+
element.chunk.meta.set("gender", element.gender);
|
|
297
|
+
this.push(element.chunk);
|
|
298
|
+
self.queueSend.walk(+1);
|
|
299
|
+
self.queue.trim();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else if (!self.shutdown)
|
|
303
|
+
self.queue.once("write", flushPendingChunks);
|
|
304
|
+
};
|
|
305
|
+
flushPendingChunks();
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
/* close node */
|
|
310
|
+
async close() {
|
|
311
|
+
/* indicate shutdown */
|
|
312
|
+
this.shutdown = true;
|
|
313
|
+
/* cleanup working-off timer */
|
|
314
|
+
if (this.workingOffTimer !== null) {
|
|
315
|
+
clearTimeout(this.workingOffTimer);
|
|
316
|
+
this.workingOffTimer = null;
|
|
317
|
+
}
|
|
318
|
+
/* cleanup progress interval */
|
|
319
|
+
if (this.progressInterval !== null) {
|
|
320
|
+
clearInterval(this.progressInterval);
|
|
321
|
+
this.progressInterval = null;
|
|
322
|
+
}
|
|
323
|
+
/* remove all event listeners */
|
|
324
|
+
this.queue.removeAllListeners("write");
|
|
325
|
+
/* close stream */
|
|
326
|
+
if (this.stream !== null) {
|
|
327
|
+
this.stream.destroy();
|
|
328
|
+
this.stream = null;
|
|
329
|
+
}
|
|
330
|
+
/* cleanup classifier */
|
|
331
|
+
if (this.classifier !== null) {
|
|
332
|
+
try {
|
|
333
|
+
const disposePromise = this.classifier.dispose();
|
|
334
|
+
const timeoutPromise = new Promise((resolve) => setTimeout(resolve, 5000));
|
|
335
|
+
await Promise.race([disposePromise, timeoutPromise]);
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
this.log("warning", `error during classifier cleanup: ${error}`);
|
|
339
|
+
}
|
|
340
|
+
this.classifier = null;
|
|
341
|
+
}
|
|
342
|
+
/* cleanup queue pointers */
|
|
343
|
+
this.queue.pointerDelete("recv");
|
|
344
|
+
this.queue.pointerDelete("ac");
|
|
345
|
+
this.queue.pointerDelete("send");
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.default = SpeechFlowNodeGender;
|
|
349
|
+
//# sourceMappingURL=speechflow-node-a2a-gender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-gender.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-gender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import SpeechFlowNode from "./speechflow-node";
|
|
2
|
+
export default class SpeechFlowNodeMeter extends SpeechFlowNode {
|
|
3
|
+
static name: string;
|
|
4
|
+
private emitInterval;
|
|
5
|
+
private calcInterval;
|
|
6
|
+
private pendingCalculations;
|
|
7
|
+
private chunkBuffer;
|
|
8
|
+
private destroyed;
|
|
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
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
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
|
+
emitInterval = null;
|
|
57
|
+
calcInterval = null;
|
|
58
|
+
pendingCalculations = new Set();
|
|
59
|
+
chunkBuffer = new Float32Array(0);
|
|
60
|
+
destroyed = false;
|
|
61
|
+
/* construct node */
|
|
62
|
+
constructor(id, cfg, opts, args) {
|
|
63
|
+
super(id, cfg, opts, args);
|
|
64
|
+
/* declare node configuration parameters */
|
|
65
|
+
this.configure({
|
|
66
|
+
interval: { type: "number", pos: 0, val: 250 },
|
|
67
|
+
dashboard: { type: "string", val: "" }
|
|
68
|
+
});
|
|
69
|
+
/* declare node input/output format */
|
|
70
|
+
this.input = "audio";
|
|
71
|
+
this.output = "audio";
|
|
72
|
+
}
|
|
73
|
+
/* open node */
|
|
74
|
+
async open() {
|
|
75
|
+
/* sanity check situation */
|
|
76
|
+
if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
|
|
77
|
+
throw new Error("meter node currently supports PCM-S16LE audio only");
|
|
78
|
+
/* clear destruction flag */
|
|
79
|
+
this.destroyed = false;
|
|
80
|
+
/* internal state */
|
|
81
|
+
const sampleWindowDuration = 3; /* LUFS-S requires 3s */
|
|
82
|
+
const sampleWindowSize = Math.floor(this.config.audioSampleRate * sampleWindowDuration);
|
|
83
|
+
let sampleWindow = new Float32Array(sampleWindowSize);
|
|
84
|
+
sampleWindow.fill(0, 0, sampleWindowSize);
|
|
85
|
+
let lufss = -60;
|
|
86
|
+
let rms = -60;
|
|
87
|
+
/* chunk processing state */
|
|
88
|
+
const chunkDuration = 0.050; /* meter update frequency is about 50ms */
|
|
89
|
+
const samplesPerChunk = Math.floor(this.config.audioSampleRate * chunkDuration);
|
|
90
|
+
this.chunkBuffer = new Float32Array(0);
|
|
91
|
+
/* define chunk processing function */
|
|
92
|
+
const processChunk = (chunkData) => {
|
|
93
|
+
/* update internal audio sample sliding window */
|
|
94
|
+
const newWindow = new Float32Array(sampleWindowSize);
|
|
95
|
+
const keepSize = sampleWindowSize - chunkData.length;
|
|
96
|
+
newWindow.set(sampleWindow.slice(sampleWindow.length - keepSize), 0);
|
|
97
|
+
newWindow.set(chunkData, keepSize);
|
|
98
|
+
sampleWindow = newWindow;
|
|
99
|
+
/* asynchronously calculate the LUFS-S metric */
|
|
100
|
+
const calculator = setTimeout(() => {
|
|
101
|
+
if (this.destroyed)
|
|
102
|
+
return;
|
|
103
|
+
try {
|
|
104
|
+
this.pendingCalculations.delete(calculator);
|
|
105
|
+
const audioData = {
|
|
106
|
+
sampleRate: this.config.audioSampleRate,
|
|
107
|
+
numberOfChannels: this.config.audioChannels,
|
|
108
|
+
channelData: [sampleWindow],
|
|
109
|
+
duration: sampleWindowDuration,
|
|
110
|
+
length: sampleWindow.length
|
|
111
|
+
};
|
|
112
|
+
const lufs = (0, audio_inspect_1.getLUFS)(audioData, {
|
|
113
|
+
channelMode: this.config.audioChannels === 1 ? "mono" : "stereo",
|
|
114
|
+
calculateShortTerm: true,
|
|
115
|
+
calculateMomentary: false,
|
|
116
|
+
calculateLoudnessRange: false,
|
|
117
|
+
calculateTruePeak: false
|
|
118
|
+
});
|
|
119
|
+
if (!this.destroyed) {
|
|
120
|
+
if (timer !== null) {
|
|
121
|
+
clearTimeout(timer);
|
|
122
|
+
timer = null;
|
|
123
|
+
}
|
|
124
|
+
lufss = lufs.shortTerm ? lufs.shortTerm[0] : 0;
|
|
125
|
+
rms = (0, audio_inspect_1.getRMS)(audioData, { asDB: true });
|
|
126
|
+
timer = setTimeout(() => {
|
|
127
|
+
lufss = -60;
|
|
128
|
+
rms = -60;
|
|
129
|
+
}, 500);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (!this.destroyed)
|
|
134
|
+
this.log("warning", `meter calculation error: ${error}`);
|
|
135
|
+
}
|
|
136
|
+
}, 0);
|
|
137
|
+
this.pendingCalculations.add(calculator);
|
|
138
|
+
};
|
|
139
|
+
/* setup chunking interval */
|
|
140
|
+
this.calcInterval = setInterval(() => {
|
|
141
|
+
if (this.destroyed)
|
|
142
|
+
return;
|
|
143
|
+
/* process one single 50ms chunk if available */
|
|
144
|
+
if (this.chunkBuffer.length >= samplesPerChunk) {
|
|
145
|
+
const chunkData = this.chunkBuffer.slice(0, samplesPerChunk);
|
|
146
|
+
processChunk(chunkData);
|
|
147
|
+
this.chunkBuffer = this.chunkBuffer.slice(samplesPerChunk);
|
|
148
|
+
}
|
|
149
|
+
}, chunkDuration * 1000);
|
|
150
|
+
/* setup loudness emitting interval */
|
|
151
|
+
this.emitInterval = setInterval(() => {
|
|
152
|
+
if (this.destroyed)
|
|
153
|
+
return;
|
|
154
|
+
this.log("debug", `LUFS-S: ${lufss.toFixed(1)} dB, RMS: ${rms.toFixed(1)} dB`);
|
|
155
|
+
this.sendResponse(["meter", "LUFS-S", lufss]);
|
|
156
|
+
this.sendResponse(["meter", "RMS", rms]);
|
|
157
|
+
if (this.params.dashboard !== "")
|
|
158
|
+
this.dashboardInfo("audio", this.params.dashboard, "final", lufss);
|
|
159
|
+
}, this.params.interval);
|
|
160
|
+
/* provide Duplex stream and internally attach to meter */
|
|
161
|
+
const self = this;
|
|
162
|
+
let timer = null;
|
|
163
|
+
this.stream = new node_stream_1.default.Transform({
|
|
164
|
+
writableObjectMode: true,
|
|
165
|
+
readableObjectMode: true,
|
|
166
|
+
decodeStrings: false,
|
|
167
|
+
highWaterMark: 1,
|
|
168
|
+
/* transform audio chunk */
|
|
169
|
+
transform(chunk, encoding, callback) {
|
|
170
|
+
if (self.destroyed) {
|
|
171
|
+
callback(new Error("stream already destroyed"));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (!Buffer.isBuffer(chunk.payload))
|
|
175
|
+
callback(new Error("expected audio input as Buffer chunks"));
|
|
176
|
+
else if (chunk.payload.byteLength === 0)
|
|
177
|
+
callback();
|
|
178
|
+
else {
|
|
179
|
+
try {
|
|
180
|
+
/* convert audio samples from PCM/I16 to PCM/F32 */
|
|
181
|
+
const data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
|
|
182
|
+
/* append new data to buffer */
|
|
183
|
+
const combinedLength = self.chunkBuffer.length + data.length;
|
|
184
|
+
const newBuffer = new Float32Array(combinedLength);
|
|
185
|
+
newBuffer.set(self.chunkBuffer, 0);
|
|
186
|
+
newBuffer.set(data, self.chunkBuffer.length);
|
|
187
|
+
self.chunkBuffer = newBuffer;
|
|
188
|
+
/* pass-through original audio chunk */
|
|
189
|
+
this.push(chunk);
|
|
190
|
+
callback();
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
callback(error instanceof Error ? error : new Error("Meter processing failed"));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
final(callback) {
|
|
198
|
+
if (self.destroyed) {
|
|
199
|
+
callback();
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
this.push(null);
|
|
203
|
+
callback();
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/* close node */
|
|
208
|
+
async close() {
|
|
209
|
+
/* indicate destruction */
|
|
210
|
+
this.destroyed = true;
|
|
211
|
+
/* clear all pending calculations */
|
|
212
|
+
for (const timeout of this.pendingCalculations)
|
|
213
|
+
clearTimeout(timeout);
|
|
214
|
+
this.pendingCalculations.clear();
|
|
215
|
+
/* stop intervals */
|
|
216
|
+
if (this.emitInterval !== null) {
|
|
217
|
+
clearInterval(this.emitInterval);
|
|
218
|
+
this.emitInterval = null;
|
|
219
|
+
}
|
|
220
|
+
if (this.calcInterval !== null) {
|
|
221
|
+
clearInterval(this.calcInterval);
|
|
222
|
+
this.calcInterval = null;
|
|
223
|
+
}
|
|
224
|
+
/* close stream */
|
|
225
|
+
if (this.stream !== null) {
|
|
226
|
+
this.stream.destroy();
|
|
227
|
+
this.stream = null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
exports.default = SpeechFlowNodeMeter;
|
|
232
|
+
//# sourceMappingURL=speechflow-node-a2a-meter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-meter.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-meter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
private destroyed;
|
|
7
|
+
constructor(id: string, cfg: {
|
|
8
|
+
[id: string]: any;
|
|
9
|
+
}, opts: {
|
|
10
|
+
[id: string]: any;
|
|
11
|
+
}, args: any[]);
|
|
12
|
+
receiveRequest(params: any[]): Promise<void>;
|
|
13
|
+
setMuteMode(mode: MuteMode): void;
|
|
14
|
+
open(): Promise<void>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export {};
|