speechflow 0.9.9 → 1.1.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.
- package/CHANGELOG.md +16 -0
- package/README.md +57 -9
- package/dst/speechflow-node-a2a-ffmpeg.js +1 -0
- package/dst/speechflow-node-a2a-ffmpeg.js.map +1 -0
- package/dst/{speechflow-node-gemma.d.ts → speechflow-node-a2a-meter.d.ts} +2 -3
- package/dst/speechflow-node-a2a-meter.js +151 -0
- package/dst/speechflow-node-a2a-meter.js.map +1 -0
- package/dst/speechflow-node-a2a-mute.d.ts +16 -0
- package/dst/speechflow-node-a2a-mute.js +90 -0
- package/dst/speechflow-node-a2a-mute.js.map +1 -0
- package/dst/speechflow-node-a2a-vad.js +130 -289
- package/dst/speechflow-node-a2a-vad.js.map +1 -0
- package/dst/speechflow-node-a2a-wav.js +1 -0
- package/dst/speechflow-node-a2a-wav.js.map +1 -0
- package/dst/speechflow-node-a2t-deepgram.d.ts +3 -0
- package/dst/speechflow-node-a2t-deepgram.js +18 -2
- package/dst/speechflow-node-a2t-deepgram.js.map +1 -0
- package/dst/speechflow-node-t2a-elevenlabs.d.ts +3 -0
- package/dst/speechflow-node-t2a-elevenlabs.js +9 -1
- package/dst/speechflow-node-t2a-elevenlabs.js.map +1 -0
- package/dst/speechflow-node-t2a-kokoro.js +1 -0
- package/dst/speechflow-node-t2a-kokoro.js.map +1 -0
- package/dst/speechflow-node-t2t-deepl.d.ts +3 -0
- package/dst/speechflow-node-t2t-deepl.js +9 -1
- package/dst/speechflow-node-t2t-deepl.js.map +1 -0
- package/dst/speechflow-node-t2t-format.js +1 -0
- package/dst/speechflow-node-t2t-format.js.map +1 -0
- package/dst/speechflow-node-t2t-ollama.js +1 -0
- package/dst/speechflow-node-t2t-ollama.js.map +1 -0
- package/dst/speechflow-node-t2t-openai.js +2 -1
- package/dst/speechflow-node-t2t-openai.js.map +1 -0
- package/dst/speechflow-node-t2t-subtitle.js +1 -0
- package/dst/speechflow-node-t2t-subtitle.js.map +1 -0
- package/dst/speechflow-node-t2t-transformers.js +10 -6
- package/dst/speechflow-node-t2t-transformers.js.map +1 -0
- package/dst/speechflow-node-x2x-trace.js +2 -1
- package/dst/speechflow-node-x2x-trace.js.map +1 -0
- package/dst/speechflow-node-xio-device.js +4 -1
- package/dst/speechflow-node-xio-device.js.map +1 -0
- package/dst/speechflow-node-xio-file.js +4 -1
- package/dst/speechflow-node-xio-file.js.map +1 -0
- package/dst/speechflow-node-xio-mqtt.js +8 -5
- package/dst/speechflow-node-xio-mqtt.js.map +1 -0
- package/dst/speechflow-node-xio-websocket.js +6 -5
- package/dst/speechflow-node-xio-websocket.js.map +1 -0
- package/dst/speechflow-node.d.ts +8 -1
- package/dst/speechflow-node.js +18 -2
- package/dst/speechflow-node.js.map +1 -0
- package/dst/speechflow-utils.d.ts +33 -0
- package/dst/speechflow-utils.js +183 -1
- package/dst/speechflow-utils.js.map +1 -0
- package/dst/speechflow.js +259 -16
- package/dst/speechflow.js.map +1 -0
- package/etc/speechflow.yaml +9 -7
- package/etc/stx.conf +1 -1
- package/etc/tsconfig.json +2 -2
- package/package.json +19 -12
- package/src/speechflow-node-a2a-meter.ts +129 -0
- package/src/speechflow-node-a2a-mute.ts +101 -0
- package/src/speechflow-node-a2a-vad.ts +266 -0
- package/src/speechflow-node-a2t-deepgram.ts +18 -2
- package/src/speechflow-node-t2a-elevenlabs.ts +9 -1
- package/src/speechflow-node-t2t-deepl.ts +9 -1
- package/src/speechflow-node-t2t-openai.ts +1 -1
- package/src/speechflow-node-t2t-transformers.ts +12 -7
- package/src/speechflow-node-x2x-trace.ts +1 -1
- package/src/speechflow-node-xio-device.ts +4 -1
- package/src/speechflow-node-xio-file.ts +3 -1
- package/src/speechflow-node-xio-mqtt.ts +8 -6
- package/src/speechflow-node-xio-websocket.ts +11 -11
- package/src/speechflow-node.ts +21 -2
- package/src/speechflow-utils.ts +195 -0
- package/src/speechflow.ts +245 -16
- package/dst/speechflow-node-deepgram.d.ts +0 -12
- package/dst/speechflow-node-deepgram.js +0 -220
- package/dst/speechflow-node-deepl.d.ts +0 -12
- package/dst/speechflow-node-deepl.js +0 -128
- package/dst/speechflow-node-device.d.ts +0 -13
- package/dst/speechflow-node-device.js +0 -205
- package/dst/speechflow-node-elevenlabs.d.ts +0 -13
- package/dst/speechflow-node-elevenlabs.js +0 -182
- package/dst/speechflow-node-ffmpeg.d.ts +0 -13
- package/dst/speechflow-node-ffmpeg.js +0 -152
- package/dst/speechflow-node-file.d.ts +0 -11
- package/dst/speechflow-node-file.js +0 -176
- package/dst/speechflow-node-format.d.ts +0 -11
- package/dst/speechflow-node-format.js +0 -80
- package/dst/speechflow-node-gemma.js +0 -213
- package/dst/speechflow-node-mqtt.d.ts +0 -13
- package/dst/speechflow-node-mqtt.js +0 -181
- package/dst/speechflow-node-opus.d.ts +0 -12
- package/dst/speechflow-node-opus.js +0 -135
- package/dst/speechflow-node-subtitle.d.ts +0 -12
- package/dst/speechflow-node-subtitle.js +0 -96
- package/dst/speechflow-node-t2t-gemma.d.ts +0 -13
- package/dst/speechflow-node-t2t-gemma.js +0 -233
- package/dst/speechflow-node-t2t-opus.d.ts +0 -12
- package/dst/speechflow-node-t2t-opus.js +0 -135
- package/dst/speechflow-node-trace.d.ts +0 -11
- package/dst/speechflow-node-trace.js +0 -88
- package/dst/speechflow-node-wav.d.ts +0 -11
- package/dst/speechflow-node-wav.js +0 -170
- package/dst/speechflow-node-websocket.d.ts +0 -13
- package/dst/speechflow-node-websocket.js +0 -275
- package/dst/speechflow-node-whisper-common.d.ts +0 -34
- package/dst/speechflow-node-whisper-common.js +0 -7
- package/dst/speechflow-node-whisper-ggml.d.ts +0 -1
- package/dst/speechflow-node-whisper-ggml.js +0 -97
- package/dst/speechflow-node-whisper-onnx.d.ts +0 -1
- package/dst/speechflow-node-whisper-onnx.js +0 -131
- package/dst/speechflow-node-whisper-worker-ggml.d.ts +0 -1
- package/dst/speechflow-node-whisper-worker-ggml.js +0 -97
- package/dst/speechflow-node-whisper-worker-onnx.d.ts +0 -1
- package/dst/speechflow-node-whisper-worker-onnx.js +0 -131
- package/dst/speechflow-node-whisper-worker.d.ts +0 -1
- package/dst/speechflow-node-whisper-worker.js +0 -116
- package/dst/speechflow-node-whisper-worker2.d.ts +0 -1
- package/dst/speechflow-node-whisper-worker2.js +0 -82
- package/dst/speechflow-node-whisper.d.ts +0 -19
- package/dst/speechflow-node-whisper.js +0 -604
|
@@ -42,166 +42,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
42
42
|
};
|
|
43
43
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
44
|
/* standard dependencies */
|
|
45
|
-
const node_events_1 = require("node:events");
|
|
46
45
|
const node_stream_1 = __importDefault(require("node:stream"));
|
|
47
46
|
/* external dependencies */
|
|
48
|
-
const wavefile = __importStar(require("wavefile"));
|
|
49
47
|
const vad_node_realtime_1 = require("@ericedouard/vad-node-realtime");
|
|
48
|
+
const luxon_1 = require("luxon");
|
|
50
49
|
/* internal dependencies */
|
|
51
|
-
const speechflow_node_1 =
|
|
52
|
-
|
|
53
|
-
class AudioQueuePointer extends node_events_1.EventEmitter {
|
|
54
|
-
name;
|
|
55
|
-
queue;
|
|
56
|
-
/* internal state */
|
|
57
|
-
index = 0;
|
|
58
|
-
/* construction */
|
|
59
|
-
constructor(name, queue) {
|
|
60
|
-
super();
|
|
61
|
-
this.name = name;
|
|
62
|
-
this.queue = queue;
|
|
63
|
-
}
|
|
64
|
-
/* positioning operations */
|
|
65
|
-
maxPosition() {
|
|
66
|
-
return this.queue.elements.length;
|
|
67
|
-
}
|
|
68
|
-
position(index) {
|
|
69
|
-
if (index !== undefined) {
|
|
70
|
-
this.index = index;
|
|
71
|
-
if (this.index < 0)
|
|
72
|
-
this.index = 0;
|
|
73
|
-
else if (this.index >= this.queue.elements.length)
|
|
74
|
-
this.index = this.queue.elements.length;
|
|
75
|
-
this.emit("position", this.index);
|
|
76
|
-
}
|
|
77
|
-
return this.index;
|
|
78
|
-
}
|
|
79
|
-
walk(num) {
|
|
80
|
-
if (num > 0) {
|
|
81
|
-
for (let i = 0; i < num && this.index < this.queue.elements.length; i++)
|
|
82
|
-
this.index++;
|
|
83
|
-
this.emit("position", { start: this.index });
|
|
84
|
-
}
|
|
85
|
-
else if (num < 0) {
|
|
86
|
-
for (let i = 0; i < Math.abs(num) && this.index > 0; i++)
|
|
87
|
-
this.index--;
|
|
88
|
-
this.emit("position", { start: this.index });
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
walkForwardUntil(type) {
|
|
92
|
-
while (this.index < this.queue.elements.length
|
|
93
|
-
&& this.queue.elements[this.index].type !== type)
|
|
94
|
-
this.index++;
|
|
95
|
-
this.emit("position", { start: this.index });
|
|
96
|
-
}
|
|
97
|
-
walkBackwardUntil(type) {
|
|
98
|
-
while (this.index > 0
|
|
99
|
-
&& this.queue.elements[this.index].type !== type)
|
|
100
|
-
this.index--;
|
|
101
|
-
this.emit("position", { start: this.index });
|
|
102
|
-
}
|
|
103
|
-
/* search operations */
|
|
104
|
-
searchForward(type) {
|
|
105
|
-
let position = this.index;
|
|
106
|
-
while (position < this.queue.elements.length
|
|
107
|
-
&& this.queue.elements[position].type !== type)
|
|
108
|
-
position++;
|
|
109
|
-
this.emit("search", { start: this.index, end: position });
|
|
110
|
-
return position;
|
|
111
|
-
}
|
|
112
|
-
searchBackward(type) {
|
|
113
|
-
let position = this.index;
|
|
114
|
-
while (position > 0
|
|
115
|
-
&& this.queue.elements[position].type !== type)
|
|
116
|
-
position--;
|
|
117
|
-
this.emit("search", { start: position, end: this.index });
|
|
118
|
-
}
|
|
119
|
-
/* reading operations */
|
|
120
|
-
peek(position) {
|
|
121
|
-
if (position === undefined)
|
|
122
|
-
position = this.index;
|
|
123
|
-
else {
|
|
124
|
-
if (position < 0)
|
|
125
|
-
position = 0;
|
|
126
|
-
else if (position >= this.queue.elements.length)
|
|
127
|
-
position = this.queue.elements.length;
|
|
128
|
-
}
|
|
129
|
-
const element = this.queue.elements[position];
|
|
130
|
-
this.queue.emit("read", { start: position, end: position });
|
|
131
|
-
return element;
|
|
132
|
-
}
|
|
133
|
-
read() {
|
|
134
|
-
const element = this.queue.elements[this.index];
|
|
135
|
-
if (this.index < this.queue.elements.length)
|
|
136
|
-
this.index++;
|
|
137
|
-
this.queue.emit("read", { start: this.index - 1, end: this.index - 1 });
|
|
138
|
-
return element;
|
|
139
|
-
}
|
|
140
|
-
slice(size) {
|
|
141
|
-
let slice;
|
|
142
|
-
const start = this.index;
|
|
143
|
-
if (size !== undefined) {
|
|
144
|
-
slice = this.queue.elements.slice(this.index, size);
|
|
145
|
-
this.index += size;
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
slice = this.queue.elements.slice(this.index);
|
|
149
|
-
this.index = this.queue.elements.length;
|
|
150
|
-
}
|
|
151
|
-
this.queue.emit("read", { start, end: this.index });
|
|
152
|
-
return slice;
|
|
153
|
-
}
|
|
154
|
-
/* writing operations */
|
|
155
|
-
append(element) {
|
|
156
|
-
this.queue.elements.push(element);
|
|
157
|
-
this.index = this.queue.elements.length;
|
|
158
|
-
this.queue.emit("write", { start: this.index - 1, end: this.index - 1 });
|
|
159
|
-
}
|
|
160
|
-
insert(element) {
|
|
161
|
-
this.queue.elements.splice(this.index++, 0, element);
|
|
162
|
-
this.queue.emit("write", { start: this.index - 1, end: this.index });
|
|
163
|
-
}
|
|
164
|
-
delete() {
|
|
165
|
-
if (this.index >= this.queue.elements.length)
|
|
166
|
-
throw new Error("cannot delete after last element");
|
|
167
|
-
this.queue.elements.splice(this.index, 1);
|
|
168
|
-
this.queue.emit("write", { start: this.index, end: this.index });
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
/* audio stream queue */
|
|
172
|
-
class AudioQueue extends node_events_1.EventEmitter {
|
|
173
|
-
elements = [];
|
|
174
|
-
pointers = new Map();
|
|
175
|
-
pointerUse(name) {
|
|
176
|
-
if (!this.pointers.has(name))
|
|
177
|
-
this.pointers.set(name, new AudioQueuePointer(name, this));
|
|
178
|
-
return this.pointers.get(name);
|
|
179
|
-
}
|
|
180
|
-
pointerDelete(name) {
|
|
181
|
-
if (!this.pointers.has(name))
|
|
182
|
-
throw new Error("pointer not exists");
|
|
183
|
-
this.pointers.delete(name);
|
|
184
|
-
}
|
|
185
|
-
trim() {
|
|
186
|
-
/* determine minimum pointer position */
|
|
187
|
-
let min = this.elements.length;
|
|
188
|
-
for (const pointer of this.pointers.values())
|
|
189
|
-
if (min > pointer.position())
|
|
190
|
-
min = pointer.position();
|
|
191
|
-
/* trim the maximum amount of first elements */
|
|
192
|
-
this.elements.splice(0, min);
|
|
193
|
-
/* shift all pointers */
|
|
194
|
-
for (const pointer of this.pointers.values())
|
|
195
|
-
pointer.position(pointer.position() - min);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
50
|
+
const speechflow_node_1 = __importStar(require("./speechflow-node"));
|
|
51
|
+
const utils = __importStar(require("./speechflow-utils"));
|
|
198
52
|
/* SpeechFlow node for VAD speech-to-speech processing */
|
|
199
53
|
class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
200
54
|
/* declare official node name */
|
|
201
55
|
static name = "vad";
|
|
202
56
|
/* internal state */
|
|
203
57
|
vad = null;
|
|
204
|
-
queue = new
|
|
58
|
+
queue = new utils.Queue();
|
|
205
59
|
queueRecv = this.queue.pointerUse("recv");
|
|
206
60
|
queueVAD = this.queue.pointerUse("vad");
|
|
207
61
|
queueSend = this.queue.pointerUse("send");
|
|
@@ -209,7 +63,14 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
209
63
|
constructor(id, cfg, opts, args) {
|
|
210
64
|
super(id, cfg, opts, args);
|
|
211
65
|
/* declare node configuration parameters */
|
|
212
|
-
this.configure({
|
|
66
|
+
this.configure({
|
|
67
|
+
mode: { type: "string", val: "unplugged", match: /^(?:silenced|unplugged)$/ },
|
|
68
|
+
posSpeechThreshold: { type: "number", val: 0.50 },
|
|
69
|
+
negSpeechThreshold: { type: "number", val: 0.35 },
|
|
70
|
+
minSpeechFrames: { type: "number", val: 2 },
|
|
71
|
+
redemptionFrames: { type: "number", val: 12 },
|
|
72
|
+
preSpeechPadFrames: { type: "number", val: 1 }
|
|
73
|
+
});
|
|
213
74
|
/* declare node input/output format */
|
|
214
75
|
this.input = "audio";
|
|
215
76
|
this.output = "audio";
|
|
@@ -222,139 +83,66 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
222
83
|
/* pass-through logging */
|
|
223
84
|
const log = (level, msg) => { this.log(level, msg); };
|
|
224
85
|
/* internal processing constants */
|
|
225
|
-
const
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
/* track audio queue element changes */
|
|
229
|
-
let speechActive = false;
|
|
230
|
-
let speechStart = -1;
|
|
231
|
-
let speechEnd = -1;
|
|
232
|
-
let speechMinSeconds = 2;
|
|
233
|
-
this.queue.on("write", () => {
|
|
234
|
-
if (!speechActive) {
|
|
235
|
-
const position = this.queueSend.searchForward("speech-start");
|
|
236
|
-
const element = this.queueSend.peek(position);
|
|
237
|
-
if (element !== undefined && element.type === "speech-start") {
|
|
238
|
-
this.queueSend.position(position + 1);
|
|
239
|
-
speechActive = true;
|
|
240
|
-
speechStart = this.queueSend.position();
|
|
241
|
-
speechEnd = speechStart;
|
|
242
|
-
speechMinSeconds = 2;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
speechEnd = this.queueSend.searchForward("speech-end");
|
|
247
|
-
/* determine number of speech and fill frames */
|
|
248
|
-
let framesSpeech = 0;
|
|
249
|
-
for (let f = speechStart; f < speechEnd; f++) {
|
|
250
|
-
const element = this.queueSend.peek(f);
|
|
251
|
-
if (element.type === "audio-frame")
|
|
252
|
-
framesSpeech++;
|
|
253
|
-
}
|
|
254
|
-
let framesFilled = minFramesPerSecond - framesSpeech;
|
|
255
|
-
if (framesFilled < 0)
|
|
256
|
-
framesFilled = 0;
|
|
257
|
-
/* assemble all speech and fill frames */
|
|
258
|
-
/*
|
|
259
|
-
const assembleFrames = () => {
|
|
260
|
-
const speech = new Float32Array((framesSpeech + framesFilled) * samplesPerVADFrame)
|
|
261
|
-
let i = 0
|
|
262
|
-
for (let f = speechStart; f < speechEnd; f++) {
|
|
263
|
-
const element = this.queueSend.peek(f)
|
|
264
|
-
if (element.type === "audio-frame")
|
|
265
|
-
speech.set(element.data, samplesPerVADFrame * i++)
|
|
266
|
-
}
|
|
267
|
-
if (framesFilled > 0)
|
|
268
|
-
speech.fill(0.0, i * samplesPerVADFrame, (i + framesFilled) * samplesPerVADFrame)
|
|
269
|
-
return speech
|
|
270
|
-
}
|
|
271
|
-
*/
|
|
272
|
-
if (speechEnd === this.queueSend.maxPosition()) {
|
|
273
|
-
/* intermediate transcription */
|
|
274
|
-
const duration = ((framesSpeech + framesFilled) * samplesPerVADFrame) / sampleRateTarget;
|
|
275
|
-
if (duration >= speechMinSeconds) {
|
|
276
|
-
/* intermediate transcription of at least the next required minimum seconds */
|
|
277
|
-
// const samples = assembleFrames()
|
|
278
|
-
this.log("info", `trigger intermediate transcription (duration: ${duration.toFixed(1)}s)`);
|
|
279
|
-
// this.tqueue!.enqueue({ id: speechStart, type: "intermediate", audio: samples, language: this.params.language })
|
|
280
|
-
speechMinSeconds++;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
/* final transcription */
|
|
285
|
-
const duration = ((framesSpeech + framesFilled) * samplesPerVADFrame) / sampleRateTarget;
|
|
286
|
-
if (duration >= 1.0) {
|
|
287
|
-
// const samples = assembleFrames()
|
|
288
|
-
this.log("info", `trigger final transcription (duration: ${duration.toFixed(1)}s)`);
|
|
289
|
-
// this.tqueue!.enqueue({ id: speechStart, type: "final", audio: samples, language: this.params.language })
|
|
290
|
-
this.queueSend.position(speechEnd + 1);
|
|
291
|
-
}
|
|
292
|
-
else
|
|
293
|
-
this.log("info", `skipping final transcription -- too short (duration: ${duration.toFixed(1)}s)`);
|
|
294
|
-
speechActive = false;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
/* Voice Activity Detection (VAD) */
|
|
86
|
+
const vadSampleRateTarget = 16000; /* internal target of VAD */
|
|
87
|
+
const vadSamplesPerFrame = 512; /* required for VAD v5 */
|
|
88
|
+
/* establish Voice Activity Detection (VAD) facility */
|
|
299
89
|
this.vad = await vad_node_realtime_1.RealTimeVAD.new({
|
|
90
|
+
model: "v5",
|
|
91
|
+
sampleRate: this.config.audioSampleRate, /* before resampling to 16KHz */
|
|
92
|
+
frameSamples: vadSamplesPerFrame, /* after resampling to 16KHz */
|
|
93
|
+
positiveSpeechThreshold: this.params.posSpeechThreshold,
|
|
94
|
+
negativeSpeechThreshold: this.params.negSpeechThreshold,
|
|
95
|
+
minSpeechFrames: this.params.minSpeechFrames,
|
|
96
|
+
redemptionFrames: this.params.redemptionFrames,
|
|
97
|
+
preSpeechPadFrames: this.params.preSpeechPadFrames,
|
|
300
98
|
onSpeechStart: () => {
|
|
301
|
-
|
|
302
|
-
this.queueVAD.insert({ type: "speech-start" });
|
|
99
|
+
log("info", "VAD: speech start");
|
|
303
100
|
},
|
|
304
101
|
onSpeechEnd: (audio) => {
|
|
305
|
-
|
|
306
|
-
|
|
102
|
+
const duration = utils.audioArrayDuration(audio, vadSampleRateTarget);
|
|
103
|
+
log("info", `VAD: speech end (duration: ${duration.toFixed(2)}s)`);
|
|
307
104
|
},
|
|
308
105
|
onVADMisfire: () => {
|
|
309
|
-
|
|
310
|
-
this.queueVAD.insert({ type: "speech-end", short: true });
|
|
106
|
+
log("info", "VAD: speech end (segment too short)");
|
|
311
107
|
},
|
|
312
|
-
onFrameProcessed: () => {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
preSpeechPadFrames: 1, /* (= 32ms: 1 x 512 frameSamples) */
|
|
108
|
+
onFrameProcessed: (audio) => {
|
|
109
|
+
/* annotate the current audio frame */
|
|
110
|
+
const element = this.queueVAD.peek();
|
|
111
|
+
if (element !== undefined && element.type === "audio-frame") {
|
|
112
|
+
const isSpeech = audio.isSpeech > audio.notSpeech;
|
|
113
|
+
element.isSpeech = isSpeech;
|
|
114
|
+
this.queueVAD.touch();
|
|
115
|
+
this.queueVAD.walk(+1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
323
118
|
});
|
|
324
119
|
this.vad.start();
|
|
325
120
|
/* provide Duplex stream and internally attach to VAD */
|
|
326
121
|
const vad = this.vad;
|
|
327
122
|
const cfg = this.config;
|
|
123
|
+
const queue = this.queue;
|
|
328
124
|
const queueRecv = this.queueRecv;
|
|
329
125
|
const queueSend = this.queueSend;
|
|
126
|
+
const mode = this.params.mode;
|
|
330
127
|
let carrySamples = new Float32Array();
|
|
331
|
-
let
|
|
128
|
+
let carryStart = luxon_1.Duration.fromDurationLike(0);
|
|
332
129
|
this.stream = new node_stream_1.default.Duplex({
|
|
333
130
|
writableObjectMode: true,
|
|
334
131
|
readableObjectMode: true,
|
|
335
132
|
decodeStrings: false,
|
|
336
|
-
/* receive audio
|
|
133
|
+
/* receive audio chunk (writable side of stream) */
|
|
337
134
|
write(chunk, encoding, callback) {
|
|
338
135
|
if (!Buffer.isBuffer(chunk.payload))
|
|
339
136
|
callback(new Error("expected audio input as Buffer chunks"));
|
|
340
137
|
else if (chunk.payload.byteLength === 0)
|
|
341
138
|
callback();
|
|
342
139
|
else {
|
|
343
|
-
/* convert audio samples from PCM/I16
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
const result = new Int16Array(buf.length / 2);
|
|
347
|
-
for (let i = 0; i < result.length; i++)
|
|
348
|
-
result[i] = dataView.getInt16(i * 2, cfg.audioLittleEndian);
|
|
349
|
-
return result;
|
|
350
|
-
};
|
|
351
|
-
const wav = new wavefile.WaveFile();
|
|
352
|
-
wav.fromScratch(cfg.audioChannels, cfg.audioSampleRate, String(cfg.audioBitDepth), bufferToInt16Array(chunk.payload));
|
|
353
|
-
wav.toBitDepth("32f");
|
|
354
|
-
wav.toSampleRate(16000, { method: "cubic" });
|
|
355
|
-
let data = wav.getSamples(false, Float32Array);
|
|
140
|
+
/* convert audio samples from PCM/I16 to PCM/F32 */
|
|
141
|
+
let data = utils.convertBufToF32(chunk.payload, cfg.audioLittleEndian);
|
|
142
|
+
let start = chunk.timestampStart;
|
|
356
143
|
/* merge previous carry samples */
|
|
357
144
|
if (carrySamples.length > 0) {
|
|
145
|
+
start = carryStart;
|
|
358
146
|
const merged = new Float32Array(carrySamples.length + data.length);
|
|
359
147
|
merged.set(carrySamples);
|
|
360
148
|
merged.set(data, carrySamples.length);
|
|
@@ -363,53 +151,105 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
363
151
|
}
|
|
364
152
|
/* queue audio samples as individual VAD-sized frames
|
|
365
153
|
and in parallel send it into the Voice Activity Detection (VAD) */
|
|
366
|
-
const
|
|
154
|
+
const chunkSize = (vadSamplesPerFrame * (cfg.audioSampleRate / vadSampleRateTarget));
|
|
155
|
+
const chunks = Math.trunc(data.length / chunkSize);
|
|
367
156
|
for (let i = 0; i < chunks; i++) {
|
|
368
|
-
const frame = data.slice(i *
|
|
369
|
-
|
|
157
|
+
const frame = data.slice(i * chunkSize, (i + 1) * chunkSize);
|
|
158
|
+
const buf = utils.convertF32ToBuf(frame);
|
|
159
|
+
const duration = utils.audioBufferDuration(buf);
|
|
160
|
+
const end = start.plus(duration);
|
|
161
|
+
const chunk = new speechflow_node_1.SpeechFlowChunk(start, end, "final", "audio", buf);
|
|
162
|
+
queueRecv.append({ type: "audio-frame", chunk });
|
|
370
163
|
vad.processAudio(frame);
|
|
164
|
+
start = end;
|
|
371
165
|
}
|
|
372
166
|
/* remember new carry samples */
|
|
373
|
-
const bulkLen = chunks *
|
|
167
|
+
const bulkLen = chunks * chunkSize;
|
|
374
168
|
carrySamples = data.slice(bulkLen);
|
|
169
|
+
carryStart = start;
|
|
375
170
|
callback();
|
|
376
171
|
}
|
|
377
172
|
},
|
|
378
|
-
/*
|
|
379
|
-
read(size) {
|
|
380
|
-
if (endOfStream)
|
|
381
|
-
this.push(null);
|
|
382
|
-
else {
|
|
383
|
-
queueSend.once("write", (text) => {
|
|
384
|
-
log("info", `VAD: receive data (${text.length} bytes)`);
|
|
385
|
-
this.push(text, cfg.textEncoding);
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
},
|
|
389
|
-
/* react on end of input */
|
|
173
|
+
/* receive no more audio chunks (writable side of stream) */
|
|
390
174
|
final(callback) {
|
|
175
|
+
/* flush pending audio chunks */
|
|
391
176
|
if (carrySamples.length > 0) {
|
|
392
|
-
|
|
393
|
-
if (carrySamples.length <
|
|
394
|
-
const merged = new Float32Array(
|
|
177
|
+
const chunkSize = (vadSamplesPerFrame * (cfg.audioSampleRate / vadSampleRateTarget));
|
|
178
|
+
if (carrySamples.length < chunkSize) {
|
|
179
|
+
const merged = new Float32Array(chunkSize);
|
|
395
180
|
merged.set(carrySamples);
|
|
396
|
-
merged.fill(0.0, carrySamples.length,
|
|
181
|
+
merged.fill(0.0, carrySamples.length, chunkSize);
|
|
397
182
|
carrySamples = merged;
|
|
398
183
|
}
|
|
399
|
-
|
|
184
|
+
const buf = utils.convertF32ToBuf(carrySamples);
|
|
185
|
+
const duration = utils.audioBufferDuration(buf);
|
|
186
|
+
const end = carryStart.plus(duration);
|
|
187
|
+
const chunk = new speechflow_node_1.SpeechFlowChunk(carryStart, end, "final", "audio", buf);
|
|
188
|
+
queueRecv.append({ type: "audio-frame", chunk });
|
|
400
189
|
vad.processAudio(carrySamples);
|
|
401
|
-
/* give the processing a chance to still process the remaining samples */
|
|
402
|
-
setTimeout(() => {
|
|
403
|
-
endOfStream = true;
|
|
404
|
-
this.push(null);
|
|
405
|
-
callback();
|
|
406
|
-
}, 2000);
|
|
407
|
-
}
|
|
408
|
-
else {
|
|
409
|
-
endOfStream = true;
|
|
410
|
-
this.push(null);
|
|
411
|
-
callback();
|
|
412
190
|
}
|
|
191
|
+
/* signal end of file */
|
|
192
|
+
queueRecv.append({ type: "audio-eof" });
|
|
193
|
+
callback();
|
|
194
|
+
},
|
|
195
|
+
/* send audio chunk(s) (readable side of stream) */
|
|
196
|
+
read(_size) {
|
|
197
|
+
/* try to perform read operation from scratch */
|
|
198
|
+
const tryToRead = () => {
|
|
199
|
+
/* flush pending audio chunks */
|
|
200
|
+
const flushPendingChunks = () => {
|
|
201
|
+
let pushed = 0;
|
|
202
|
+
while (true) {
|
|
203
|
+
const element = queueSend.peek();
|
|
204
|
+
if (element === undefined)
|
|
205
|
+
break;
|
|
206
|
+
else if (element.type === "audio-eof") {
|
|
207
|
+
this.push(null);
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
else if (element.type === "audio-frame"
|
|
211
|
+
&& element.isSpeech === undefined)
|
|
212
|
+
break;
|
|
213
|
+
queueSend.walk(+1);
|
|
214
|
+
if (element.isSpeech) {
|
|
215
|
+
this.push(element.chunk);
|
|
216
|
+
pushed++;
|
|
217
|
+
}
|
|
218
|
+
else if (mode === "silenced") {
|
|
219
|
+
const chunk = element.chunk.clone();
|
|
220
|
+
const buffer = chunk.payload;
|
|
221
|
+
buffer.fill(0);
|
|
222
|
+
this.push(chunk);
|
|
223
|
+
pushed++;
|
|
224
|
+
}
|
|
225
|
+
else if (mode === "unplugged" && pushed === 0)
|
|
226
|
+
/* we have to await chunks now, as in unplugged
|
|
227
|
+
mode we else would be never called again until
|
|
228
|
+
we at least once push a new chunk as the result */
|
|
229
|
+
tryToRead();
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
/* await forthcoming audio chunks */
|
|
233
|
+
const awaitForthcomingChunks = () => {
|
|
234
|
+
const element = queueSend.peek();
|
|
235
|
+
if (element !== undefined
|
|
236
|
+
&& element.type === "audio-frame"
|
|
237
|
+
&& element.isSpeech !== undefined)
|
|
238
|
+
flushPendingChunks();
|
|
239
|
+
else
|
|
240
|
+
queue.once("write", awaitForthcomingChunks);
|
|
241
|
+
};
|
|
242
|
+
const element = queueSend.peek();
|
|
243
|
+
if (element !== undefined && element.type === "audio-eof")
|
|
244
|
+
this.push(null);
|
|
245
|
+
else if (element !== undefined
|
|
246
|
+
&& element.type === "audio-frame"
|
|
247
|
+
&& element.isSpeech !== undefined)
|
|
248
|
+
flushPendingChunks();
|
|
249
|
+
else
|
|
250
|
+
queue.once("write", awaitForthcomingChunks);
|
|
251
|
+
};
|
|
252
|
+
tryToRead();
|
|
413
253
|
}
|
|
414
254
|
});
|
|
415
255
|
}
|
|
@@ -429,3 +269,4 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
429
269
|
}
|
|
430
270
|
}
|
|
431
271
|
exports.default = SpeechFlowNodeVAD;
|
|
272
|
+
//# sourceMappingURL=speechflow-node-a2a-vad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-vad.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-vad.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-wav.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-wav.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,8 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
60
60
|
super(id, cfg, opts, args);
|
|
61
61
|
/* declare node configuration parameters */
|
|
62
62
|
this.configure({
|
|
63
|
-
key: { type: "string", val: process.env.
|
|
63
|
+
key: { type: "string", val: process.env.SPEECHFLOW_DEEPGRAM_KEY },
|
|
64
|
+
keyAdm: { type: "string", val: process.env.SPEECHFLOW_DEEPGRAM_KEY_ADM },
|
|
64
65
|
model: { type: "string", val: "nova-3", pos: 0 },
|
|
65
66
|
version: { type: "string", val: "latest", pos: 1 },
|
|
66
67
|
language: { type: "string", val: "multi", pos: 2 }
|
|
@@ -69,6 +70,20 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
69
70
|
this.input = "audio";
|
|
70
71
|
this.output = "text";
|
|
71
72
|
}
|
|
73
|
+
/* one-time status of node */
|
|
74
|
+
async status() {
|
|
75
|
+
let balance = 0;
|
|
76
|
+
const deepgram = Deepgram.createClient(this.params.keyAdm);
|
|
77
|
+
const response = await deepgram.manage.getProjects();
|
|
78
|
+
if (response !== null && response.error === null) {
|
|
79
|
+
for (const project of response.result.projects) {
|
|
80
|
+
const response = await deepgram.manage.getProjectBalances(project.project_id);
|
|
81
|
+
if (response !== null && response.error === null)
|
|
82
|
+
balance += response.result.balances[0]?.amount ?? 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { balance: balance.toFixed(2) };
|
|
86
|
+
}
|
|
72
87
|
/* open node */
|
|
73
88
|
async open() {
|
|
74
89
|
/* sanity check situation */
|
|
@@ -186,7 +201,7 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
186
201
|
if (chunk.payload.byteLength > 0) {
|
|
187
202
|
log("info", `Deepgram: send data (${chunk.payload.byteLength} bytes)`);
|
|
188
203
|
initTimeoutStart();
|
|
189
|
-
dg.send(chunk.payload); /* intentionally discard all time information */
|
|
204
|
+
dg.send(chunk.payload.buffer); /* intentionally discard all time information */
|
|
190
205
|
}
|
|
191
206
|
callback();
|
|
192
207
|
}
|
|
@@ -218,3 +233,4 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
218
233
|
}
|
|
219
234
|
}
|
|
220
235
|
exports.default = SpeechFlowNodeDeepgram;
|
|
236
|
+
//# sourceMappingURL=speechflow-node-a2t-deepgram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2t-deepgram.js","sourceRoot":"","sources":["../src/speechflow-node-a2t-deepgram.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,7 +61,7 @@ class SpeechFlowNodeElevenlabs extends speechflow_node_1.default {
|
|
|
61
61
|
super(id, cfg, opts, args);
|
|
62
62
|
/* declare node configuration parameters */
|
|
63
63
|
this.configure({
|
|
64
|
-
key: { type: "string", val: process.env.
|
|
64
|
+
key: { type: "string", val: process.env.SPEECHFLOW_ELEVENLABS_KEY },
|
|
65
65
|
voice: { type: "string", val: "Brian", pos: 0, match: /^(?:.+)$/ },
|
|
66
66
|
language: { type: "string", val: "en", pos: 1, match: /^(?:de|en)$/ },
|
|
67
67
|
speed: { type: "number", val: 1.05, pos: 2, match: (n) => n >= 0.7 && n <= 1.2 },
|
|
@@ -71,6 +71,13 @@ class SpeechFlowNodeElevenlabs extends speechflow_node_1.default {
|
|
|
71
71
|
this.input = "text";
|
|
72
72
|
this.output = "audio";
|
|
73
73
|
}
|
|
74
|
+
/* one-time status of node */
|
|
75
|
+
async status() {
|
|
76
|
+
const elevenlabs = new ElevenLabs.ElevenLabsClient({ apiKey: this.params.key });
|
|
77
|
+
const subscription = await elevenlabs.user.subscription.get();
|
|
78
|
+
const percent = subscription.characterCount / subscription.characterLimit;
|
|
79
|
+
return { usage: `${percent.toFixed(2)}%` };
|
|
80
|
+
}
|
|
74
81
|
/* open node */
|
|
75
82
|
async open() {
|
|
76
83
|
/* establish ElevenLabs API connection */
|
|
@@ -180,3 +187,4 @@ class SpeechFlowNodeElevenlabs extends speechflow_node_1.default {
|
|
|
180
187
|
}
|
|
181
188
|
}
|
|
182
189
|
exports.default = SpeechFlowNodeElevenlabs;
|
|
190
|
+
//# sourceMappingURL=speechflow-node-t2a-elevenlabs.js.map
|