speechflow 1.4.3 → 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 +6 -0
- package/package.json +3 -3
- 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/package.json +1 -1
- 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-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
|
@@ -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":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,6BAA6B;AAC7B,8DAAgC;AAEhC,6BAA6B;AAC7B,iDAA0D;AAE1D,6BAA6B;AAC7B,wEAAmE;AACnE,0DAAoE;AAEpE,0CAA0C;AAC1C,MAAqB,mBAAoB,SAAQ,yBAAc;IAC3D,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAA;IAE5B,sBAAsB;IACd,YAAY,GAA0C,IAAI,CAAA;IAC1D,YAAY,GAA0C,IAAI,CAAA;IAC1D,mBAAmB,GAAG,IAAI,GAAG,EAAiC,CAAA;IAC9D,WAAW,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;IACjC,SAAS,GAAG,KAAK,CAAA;IAEzB,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,QAAQ,EAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;YAC/C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAU,GAAG,EAAE,EAAE,EAAE;SACjD,CAAC,CAAA;QAEF,wCAAwC;QACxC,IAAI,CAAC,KAAK,GAAI,OAAO,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAA;IACzB,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,IAAI;QACN,8BAA8B;QAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAClE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QAEzE,8BAA8B;QAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;QAEtB,sBAAsB;QACtB,MAAM,oBAAoB,GAAG,CAAC,CAAA,CAAC,wBAAwB;QACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,oBAAoB,CAAC,CAAA;QACvF,IAAI,YAAY,GAAG,IAAI,YAAY,CAAC,gBAAgB,CAAC,CAAA;QACrD,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAA;QACzC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAA;QACf,IAAI,GAAG,GAAG,CAAC,EAAE,CAAA;QAEb,8BAA8B;QAC9B,MAAM,aAAa,GAAG,KAAK,CAAA,CAAC,0CAA0C;QACtE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,aAAa,CAAC,CAAA;QAC/E,IAAI,CAAC,WAAW,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;QAEtC,wCAAwC;QACxC,MAAM,YAAY,GAAG,CAAC,SAAuB,EAAE,EAAE;YAC7C,mDAAmD;YACnD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,gBAAgB,CAAC,CAAA;YACpD,MAAM,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAA;YACpD,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;YACpE,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAClC,YAAY,GAAG,SAAS,CAAA;YAExB,kDAAkD;YAClD,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC/B,IAAI,IAAI,CAAC,SAAS;oBACd,OAAM;gBACV,IAAI,CAAC;oBACD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;oBAC3C,MAAM,SAAS,GAAG;wBACd,UAAU,EAAQ,IAAI,CAAC,MAAM,CAAC,eAAe;wBAC7C,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;wBAC3C,WAAW,EAAO,CAAE,YAAY,CAAE;wBAClC,QAAQ,EAAU,oBAAoB;wBACtC,MAAM,EAAY,YAAY,CAAC,MAAM;qBACpB,CAAA;oBACrB,MAAM,IAAI,GAAG,IAAA,uBAAO,EAAC,SAAS,EAAE;wBAC5B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;wBAChE,kBAAkB,EAAM,IAAI;wBAC5B,kBAAkB,EAAM,KAAK;wBAC7B,sBAAsB,EAAE,KAAK;wBAC7B,iBAAiB,EAAO,KAAK;qBAChC,CAAC,CAAA;oBACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;wBAClB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;4BACjB,YAAY,CAAC,KAAK,CAAC,CAAA;4BACnB,KAAK,GAAG,IAAI,CAAA;wBAChB,CAAC;wBACD,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;wBAC9C,GAAG,GAAG,IAAA,sBAAM,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;wBACvC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;4BACpB,KAAK,GAAG,CAAC,EAAE,CAAA;4BACX,GAAG,GAAK,CAAC,EAAE,CAAA;wBACf,CAAC,EAAE,GAAG,CAAC,CAAA;oBACX,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,EAAE,CAAC;oBACX,IAAI,CAAC,IAAI,CAAC,SAAS;wBACf,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,4BAA4B,KAAK,EAAE,CAAC,CAAA;gBAChE,CAAC;YACL,CAAC,EAAE,CAAC,CAAC,CAAA;YACL,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC5C,CAAC,CAAA;QAED,+BAA+B;QAC/B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,IAAI,CAAC,SAAS;gBACd,OAAM;YAEV,kDAAkD;YAClD,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;gBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;gBAC5D,YAAY,CAAC,SAAS,CAAC,CAAA;gBACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YAC9D,CAAC;QACL,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,CAAA;QAExB,wCAAwC;QACxC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,IAAI,CAAC,SAAS;gBACd,OAAM;YACV,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAC9E,IAAI,CAAC,YAAY,CAAC,CAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAE,CAAC,CAAA;YAC/C,IAAI,CAAC,YAAY,CAAC,CAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAE,CAAC,CAAA;YAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE;gBAC5B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QAC1E,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAExB,4DAA4D;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAA;QACjB,IAAI,KAAK,GAAyC,IAAI,CAAA;QACtD,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;YAErB,6BAA6B;YAC7B,SAAS,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;gBACjD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACjB,QAAQ,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;oBAC/C,OAAM;gBACV,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC/B,QAAQ,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAA;qBAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC;oBACnC,QAAQ,EAAE,CAAA;qBACT,CAAC;oBACF,IAAI,CAAC;wBACD,qDAAqD;wBACrD,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;wBAEhF,iCAAiC;wBACjC,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;wBAC5D,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,CAAA;wBAClD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;wBAClC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;wBAC5C,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;wBAE5B,yCAAyC;wBACzC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBAChB,QAAQ,EAAE,CAAA;oBACd,CAAC;oBACD,OAAO,KAAK,EAAE,CAAC;wBACX,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAA;oBACnF,CAAC;gBACL,CAAC;YACL,CAAC;YACD,KAAK,CAAE,QAAQ;gBACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACjB,QAAQ,EAAE,CAAA;oBACV,OAAM;gBACV,CAAC;gBACD,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,4BAA4B;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QAErB,sCAAsC;QACtC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,mBAAmB;YAC1C,YAAY,CAAC,OAAO,CAAC,CAAA;QACzB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAA;QAEhC,sBAAsB;QACtB,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAC5B,CAAC;QAED,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;;AAtML,sCAuMC"}
|
|
@@ -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 {};
|
|
@@ -0,0 +1,117 @@
|
|
|
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
|
+
destroyed = false;
|
|
22
|
+
/* construct node */
|
|
23
|
+
constructor(id, cfg, opts, args) {
|
|
24
|
+
super(id, cfg, opts, args);
|
|
25
|
+
/* declare node configuration parameters */
|
|
26
|
+
this.configure({});
|
|
27
|
+
/* declare node input/output format */
|
|
28
|
+
this.input = "audio";
|
|
29
|
+
this.output = "audio";
|
|
30
|
+
}
|
|
31
|
+
/* receive external request */
|
|
32
|
+
async receiveRequest(params) {
|
|
33
|
+
if (this.destroyed)
|
|
34
|
+
throw new Error("mute: node already destroyed");
|
|
35
|
+
try {
|
|
36
|
+
if (params.length === 2 && params[0] === "mode") {
|
|
37
|
+
if (!params[1].match(/^(?:none|silenced|unplugged)$/))
|
|
38
|
+
throw new Error("mute: invalid mode argument in external request");
|
|
39
|
+
const muteMode = params[1];
|
|
40
|
+
this.setMuteMode(muteMode);
|
|
41
|
+
this.sendResponse(["mute", "mode", muteMode]);
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
throw new Error("mute: invalid arguments in external request");
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
this.log("error", `receive request error: ${error}`);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/* change mute mode */
|
|
52
|
+
setMuteMode(mode) {
|
|
53
|
+
if (this.destroyed) {
|
|
54
|
+
this.log("warning", "attempted to set mute mode on destroyed node");
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.log("info", `setting mute mode to "${mode}"`);
|
|
58
|
+
this.muteMode = mode;
|
|
59
|
+
}
|
|
60
|
+
/* open node */
|
|
61
|
+
async open() {
|
|
62
|
+
/* clear destruction flag */
|
|
63
|
+
this.destroyed = false;
|
|
64
|
+
/* establish a transform stream */
|
|
65
|
+
const self = this;
|
|
66
|
+
this.stream = new node_stream_1.default.Transform({
|
|
67
|
+
readableObjectMode: true,
|
|
68
|
+
writableObjectMode: true,
|
|
69
|
+
decodeStrings: false,
|
|
70
|
+
transform(chunk, encoding, callback) {
|
|
71
|
+
if (self.destroyed) {
|
|
72
|
+
callback(new Error("stream already destroyed"));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!Buffer.isBuffer(chunk.payload))
|
|
76
|
+
callback(new Error("invalid chunk payload type"));
|
|
77
|
+
else if (self.muteMode === "unplugged")
|
|
78
|
+
/* pass-through nothing */
|
|
79
|
+
callback();
|
|
80
|
+
else if (self.muteMode === "silenced") {
|
|
81
|
+
/* pass-through a silenced chunk */
|
|
82
|
+
const chunkSilenced = chunk.clone();
|
|
83
|
+
chunkSilenced.meta.set("muted", true);
|
|
84
|
+
const buffer = chunkSilenced.payload;
|
|
85
|
+
buffer.fill(0);
|
|
86
|
+
this.push(chunkSilenced);
|
|
87
|
+
callback();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
/* pass-through original chunk */
|
|
91
|
+
this.push(chunk);
|
|
92
|
+
callback();
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
final(callback) {
|
|
96
|
+
if (self.destroyed) {
|
|
97
|
+
callback();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.push(null);
|
|
101
|
+
callback();
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/* close node */
|
|
106
|
+
async close() {
|
|
107
|
+
/* indicate destruction */
|
|
108
|
+
this.destroyed = true;
|
|
109
|
+
/* close stream */
|
|
110
|
+
if (this.stream !== null) {
|
|
111
|
+
this.stream.destroy();
|
|
112
|
+
this.stream = null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.default = SpeechFlowNodeMute;
|
|
117
|
+
//# sourceMappingURL=speechflow-node-a2a-mute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-mute.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-mute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
private destroyed;
|
|
10
|
+
private tailTimer;
|
|
11
|
+
private activeEventListeners;
|
|
12
|
+
constructor(id: string, cfg: {
|
|
13
|
+
[id: string]: any;
|
|
14
|
+
}, opts: {
|
|
15
|
+
[id: string]: any;
|
|
16
|
+
}, args: any[]);
|
|
17
|
+
open(): Promise<void>;
|
|
18
|
+
close(): Promise<void>;
|
|
19
|
+
}
|