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.
Files changed (120) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +57 -9
  3. package/dst/speechflow-node-a2a-ffmpeg.js +1 -0
  4. package/dst/speechflow-node-a2a-ffmpeg.js.map +1 -0
  5. package/dst/{speechflow-node-gemma.d.ts → speechflow-node-a2a-meter.d.ts} +2 -3
  6. package/dst/speechflow-node-a2a-meter.js +151 -0
  7. package/dst/speechflow-node-a2a-meter.js.map +1 -0
  8. package/dst/speechflow-node-a2a-mute.d.ts +16 -0
  9. package/dst/speechflow-node-a2a-mute.js +90 -0
  10. package/dst/speechflow-node-a2a-mute.js.map +1 -0
  11. package/dst/speechflow-node-a2a-vad.js +130 -289
  12. package/dst/speechflow-node-a2a-vad.js.map +1 -0
  13. package/dst/speechflow-node-a2a-wav.js +1 -0
  14. package/dst/speechflow-node-a2a-wav.js.map +1 -0
  15. package/dst/speechflow-node-a2t-deepgram.d.ts +3 -0
  16. package/dst/speechflow-node-a2t-deepgram.js +18 -2
  17. package/dst/speechflow-node-a2t-deepgram.js.map +1 -0
  18. package/dst/speechflow-node-t2a-elevenlabs.d.ts +3 -0
  19. package/dst/speechflow-node-t2a-elevenlabs.js +9 -1
  20. package/dst/speechflow-node-t2a-elevenlabs.js.map +1 -0
  21. package/dst/speechflow-node-t2a-kokoro.js +1 -0
  22. package/dst/speechflow-node-t2a-kokoro.js.map +1 -0
  23. package/dst/speechflow-node-t2t-deepl.d.ts +3 -0
  24. package/dst/speechflow-node-t2t-deepl.js +9 -1
  25. package/dst/speechflow-node-t2t-deepl.js.map +1 -0
  26. package/dst/speechflow-node-t2t-format.js +1 -0
  27. package/dst/speechflow-node-t2t-format.js.map +1 -0
  28. package/dst/speechflow-node-t2t-ollama.js +1 -0
  29. package/dst/speechflow-node-t2t-ollama.js.map +1 -0
  30. package/dst/speechflow-node-t2t-openai.js +2 -1
  31. package/dst/speechflow-node-t2t-openai.js.map +1 -0
  32. package/dst/speechflow-node-t2t-subtitle.js +1 -0
  33. package/dst/speechflow-node-t2t-subtitle.js.map +1 -0
  34. package/dst/speechflow-node-t2t-transformers.js +10 -6
  35. package/dst/speechflow-node-t2t-transformers.js.map +1 -0
  36. package/dst/speechflow-node-x2x-trace.js +2 -1
  37. package/dst/speechflow-node-x2x-trace.js.map +1 -0
  38. package/dst/speechflow-node-xio-device.js +4 -1
  39. package/dst/speechflow-node-xio-device.js.map +1 -0
  40. package/dst/speechflow-node-xio-file.js +4 -1
  41. package/dst/speechflow-node-xio-file.js.map +1 -0
  42. package/dst/speechflow-node-xio-mqtt.js +8 -5
  43. package/dst/speechflow-node-xio-mqtt.js.map +1 -0
  44. package/dst/speechflow-node-xio-websocket.js +6 -5
  45. package/dst/speechflow-node-xio-websocket.js.map +1 -0
  46. package/dst/speechflow-node.d.ts +8 -1
  47. package/dst/speechflow-node.js +18 -2
  48. package/dst/speechflow-node.js.map +1 -0
  49. package/dst/speechflow-utils.d.ts +33 -0
  50. package/dst/speechflow-utils.js +183 -1
  51. package/dst/speechflow-utils.js.map +1 -0
  52. package/dst/speechflow.js +259 -16
  53. package/dst/speechflow.js.map +1 -0
  54. package/etc/speechflow.yaml +9 -7
  55. package/etc/stx.conf +1 -1
  56. package/etc/tsconfig.json +2 -2
  57. package/package.json +19 -12
  58. package/src/speechflow-node-a2a-meter.ts +129 -0
  59. package/src/speechflow-node-a2a-mute.ts +101 -0
  60. package/src/speechflow-node-a2a-vad.ts +266 -0
  61. package/src/speechflow-node-a2t-deepgram.ts +18 -2
  62. package/src/speechflow-node-t2a-elevenlabs.ts +9 -1
  63. package/src/speechflow-node-t2t-deepl.ts +9 -1
  64. package/src/speechflow-node-t2t-openai.ts +1 -1
  65. package/src/speechflow-node-t2t-transformers.ts +12 -7
  66. package/src/speechflow-node-x2x-trace.ts +1 -1
  67. package/src/speechflow-node-xio-device.ts +4 -1
  68. package/src/speechflow-node-xio-file.ts +3 -1
  69. package/src/speechflow-node-xio-mqtt.ts +8 -6
  70. package/src/speechflow-node-xio-websocket.ts +11 -11
  71. package/src/speechflow-node.ts +21 -2
  72. package/src/speechflow-utils.ts +195 -0
  73. package/src/speechflow.ts +245 -16
  74. package/dst/speechflow-node-deepgram.d.ts +0 -12
  75. package/dst/speechflow-node-deepgram.js +0 -220
  76. package/dst/speechflow-node-deepl.d.ts +0 -12
  77. package/dst/speechflow-node-deepl.js +0 -128
  78. package/dst/speechflow-node-device.d.ts +0 -13
  79. package/dst/speechflow-node-device.js +0 -205
  80. package/dst/speechflow-node-elevenlabs.d.ts +0 -13
  81. package/dst/speechflow-node-elevenlabs.js +0 -182
  82. package/dst/speechflow-node-ffmpeg.d.ts +0 -13
  83. package/dst/speechflow-node-ffmpeg.js +0 -152
  84. package/dst/speechflow-node-file.d.ts +0 -11
  85. package/dst/speechflow-node-file.js +0 -176
  86. package/dst/speechflow-node-format.d.ts +0 -11
  87. package/dst/speechflow-node-format.js +0 -80
  88. package/dst/speechflow-node-gemma.js +0 -213
  89. package/dst/speechflow-node-mqtt.d.ts +0 -13
  90. package/dst/speechflow-node-mqtt.js +0 -181
  91. package/dst/speechflow-node-opus.d.ts +0 -12
  92. package/dst/speechflow-node-opus.js +0 -135
  93. package/dst/speechflow-node-subtitle.d.ts +0 -12
  94. package/dst/speechflow-node-subtitle.js +0 -96
  95. package/dst/speechflow-node-t2t-gemma.d.ts +0 -13
  96. package/dst/speechflow-node-t2t-gemma.js +0 -233
  97. package/dst/speechflow-node-t2t-opus.d.ts +0 -12
  98. package/dst/speechflow-node-t2t-opus.js +0 -135
  99. package/dst/speechflow-node-trace.d.ts +0 -11
  100. package/dst/speechflow-node-trace.js +0 -88
  101. package/dst/speechflow-node-wav.d.ts +0 -11
  102. package/dst/speechflow-node-wav.js +0 -170
  103. package/dst/speechflow-node-websocket.d.ts +0 -13
  104. package/dst/speechflow-node-websocket.js +0 -275
  105. package/dst/speechflow-node-whisper-common.d.ts +0 -34
  106. package/dst/speechflow-node-whisper-common.js +0 -7
  107. package/dst/speechflow-node-whisper-ggml.d.ts +0 -1
  108. package/dst/speechflow-node-whisper-ggml.js +0 -97
  109. package/dst/speechflow-node-whisper-onnx.d.ts +0 -1
  110. package/dst/speechflow-node-whisper-onnx.js +0 -131
  111. package/dst/speechflow-node-whisper-worker-ggml.d.ts +0 -1
  112. package/dst/speechflow-node-whisper-worker-ggml.js +0 -97
  113. package/dst/speechflow-node-whisper-worker-onnx.d.ts +0 -1
  114. package/dst/speechflow-node-whisper-worker-onnx.js +0 -131
  115. package/dst/speechflow-node-whisper-worker.d.ts +0 -1
  116. package/dst/speechflow-node-whisper-worker.js +0 -116
  117. package/dst/speechflow-node-whisper-worker2.d.ts +0 -1
  118. package/dst/speechflow-node-whisper-worker2.js +0 -82
  119. package/dst/speechflow-node-whisper.d.ts +0 -19
  120. 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 = __importDefault(require("./speechflow-node"));
52
- /* audio stream queue pointer */
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 AudioQueue();
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 sampleRateTarget = 16000;
226
- const samplesPerVADFrame = 512; /* required for VAD v5 */
227
- const minFramesPerSecond = Math.trunc(sampleRateTarget / samplesPerVADFrame) + 1;
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
- this.log("info", "VAD: speech start");
302
- this.queueVAD.insert({ type: "speech-start" });
99
+ log("info", "VAD: speech start");
303
100
  },
304
101
  onSpeechEnd: (audio) => {
305
- this.log("info", `VAD: speech end (samples: ${audio.length})`);
306
- this.queueVAD.insert({ type: "speech-end", short: false });
102
+ const duration = utils.audioArrayDuration(audio, vadSampleRateTarget);
103
+ log("info", `VAD: speech end (duration: ${duration.toFixed(2)}s)`);
307
104
  },
308
105
  onVADMisfire: () => {
309
- this.log("info", "VAD: speech end (segment too short)");
310
- this.queueVAD.insert({ type: "speech-end", short: true });
106
+ log("info", "VAD: speech end (segment too short)");
311
107
  },
312
- onFrameProcessed: () => {
313
- this.queueVAD.walk(+1);
314
- },
315
- sampleRate: 16000,
316
- model: "v5",
317
- frameSamples: samplesPerVADFrame, /* (= 32ms: 512 frameSamples / 16000 sampleSize) */
318
- positiveSpeechThreshold: 0.50,
319
- negativeSpeechThreshold: 0.35,
320
- minSpeechFrames: 4, /* (= 128ms: 4 x 512 frameSamples) */
321
- redemptionFrames: 8, /* (= 256ms: 8 x 512 frameSamples) */
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 endOfStream = false;
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 samples */
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/48KHz to PCM/F32/16KHz */
344
- const bufferToInt16Array = (buf) => {
345
- const dataView = new DataView(buf.buffer);
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 chunks = Math.trunc(data.length / samplesPerVADFrame);
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 * samplesPerVADFrame, (i + 1) * samplesPerVADFrame);
369
- queueRecv.append({ type: "audio-frame", data: frame });
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 * samplesPerVADFrame;
167
+ const bulkLen = chunks * chunkSize;
374
168
  carrySamples = data.slice(bulkLen);
169
+ carryStart = start;
375
170
  callback();
376
171
  }
377
172
  },
378
- /* send transcription texts */
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
- /* flush pending audio samples */
393
- if (carrySamples.length < samplesPerVADFrame) {
394
- const merged = new Float32Array(samplesPerVADFrame);
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, samplesPerVADFrame);
181
+ merged.fill(0.0, carrySamples.length, chunkSize);
397
182
  carrySamples = merged;
398
183
  }
399
- queueRecv.append({ type: "audio-frame", data: carrySamples });
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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"}
@@ -168,3 +168,4 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
168
168
  }
169
169
  }
170
170
  exports.default = SpeechFlowNodeWAV;
171
+ //# sourceMappingURL=speechflow-node-a2a-wav.js.map
@@ -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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"}
@@ -7,6 +7,9 @@ export default class SpeechFlowNodeDeepgram extends SpeechFlowNode {
7
7
  }, opts: {
8
8
  [id: string]: any;
9
9
  }, args: any[]);
10
+ status(): Promise<{
11
+ balance: string;
12
+ }>;
10
13
  open(): Promise<void>;
11
14
  close(): Promise<void>;
12
15
  }
@@ -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.SPEECHFLOW_KEY_DEEPGRAM },
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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"}
@@ -8,6 +8,9 @@ export default class SpeechFlowNodeElevenlabs extends SpeechFlowNode {
8
8
  }, opts: {
9
9
  [id: string]: any;
10
10
  }, args: any[]);
11
+ status(): Promise<{
12
+ usage: string;
13
+ }>;
11
14
  open(): Promise<void>;
12
15
  close(): Promise<void>;
13
16
  }
@@ -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.SPEECHFLOW_KEY_ELEVENLABS },
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