speechflow 1.3.0 → 1.3.2

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 (83) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +165 -22
  3. package/dst/speechflow-node-a2a-gender.d.ts +2 -0
  4. package/dst/speechflow-node-a2a-gender.js +137 -59
  5. package/dst/speechflow-node-a2a-gender.js.map +1 -1
  6. package/dst/speechflow-node-a2a-meter.d.ts +3 -1
  7. package/dst/speechflow-node-a2a-meter.js +79 -35
  8. package/dst/speechflow-node-a2a-meter.js.map +1 -1
  9. package/dst/speechflow-node-a2a-mute.d.ts +1 -0
  10. package/dst/speechflow-node-a2a-mute.js +37 -11
  11. package/dst/speechflow-node-a2a-mute.js.map +1 -1
  12. package/dst/speechflow-node-a2a-vad.d.ts +3 -0
  13. package/dst/speechflow-node-a2a-vad.js +194 -96
  14. package/dst/speechflow-node-a2a-vad.js.map +1 -1
  15. package/dst/speechflow-node-a2a-wav.js +27 -11
  16. package/dst/speechflow-node-a2a-wav.js.map +1 -1
  17. package/dst/speechflow-node-a2t-deepgram.d.ts +4 -0
  18. package/dst/speechflow-node-a2t-deepgram.js +141 -43
  19. package/dst/speechflow-node-a2t-deepgram.js.map +1 -1
  20. package/dst/speechflow-node-t2a-elevenlabs.d.ts +2 -0
  21. package/dst/speechflow-node-t2a-elevenlabs.js +61 -12
  22. package/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
  23. package/dst/speechflow-node-t2a-kokoro.d.ts +1 -0
  24. package/dst/speechflow-node-t2a-kokoro.js +10 -4
  25. package/dst/speechflow-node-t2a-kokoro.js.map +1 -1
  26. package/dst/speechflow-node-t2t-deepl.js +8 -4
  27. package/dst/speechflow-node-t2t-deepl.js.map +1 -1
  28. package/dst/speechflow-node-t2t-format.js +2 -2
  29. package/dst/speechflow-node-t2t-format.js.map +1 -1
  30. package/dst/speechflow-node-t2t-ollama.js +1 -1
  31. package/dst/speechflow-node-t2t-ollama.js.map +1 -1
  32. package/dst/speechflow-node-t2t-openai.js +1 -1
  33. package/dst/speechflow-node-t2t-openai.js.map +1 -1
  34. package/dst/speechflow-node-t2t-sentence.d.ts +1 -1
  35. package/dst/speechflow-node-t2t-sentence.js +35 -24
  36. package/dst/speechflow-node-t2t-sentence.js.map +1 -1
  37. package/dst/speechflow-node-t2t-subtitle.js +85 -17
  38. package/dst/speechflow-node-t2t-subtitle.js.map +1 -1
  39. package/dst/speechflow-node-t2t-transformers.js +2 -2
  40. package/dst/speechflow-node-t2t-transformers.js.map +1 -1
  41. package/dst/speechflow-node-x2x-filter.js +4 -4
  42. package/dst/speechflow-node-x2x-trace.js +1 -1
  43. package/dst/speechflow-node-x2x-trace.js.map +1 -1
  44. package/dst/speechflow-node-xio-device.js +12 -8
  45. package/dst/speechflow-node-xio-device.js.map +1 -1
  46. package/dst/speechflow-node-xio-file.js +9 -3
  47. package/dst/speechflow-node-xio-file.js.map +1 -1
  48. package/dst/speechflow-node-xio-mqtt.js +5 -2
  49. package/dst/speechflow-node-xio-mqtt.js.map +1 -1
  50. package/dst/speechflow-node-xio-websocket.js +11 -11
  51. package/dst/speechflow-node-xio-websocket.js.map +1 -1
  52. package/dst/speechflow-utils.d.ts +5 -0
  53. package/dst/speechflow-utils.js +77 -44
  54. package/dst/speechflow-utils.js.map +1 -1
  55. package/dst/speechflow.js +104 -34
  56. package/dst/speechflow.js.map +1 -1
  57. package/etc/eslint.mjs +1 -2
  58. package/etc/speechflow.yaml +18 -7
  59. package/etc/stx.conf +3 -3
  60. package/package.json +14 -13
  61. package/src/speechflow-node-a2a-gender.ts +148 -64
  62. package/src/speechflow-node-a2a-meter.ts +87 -40
  63. package/src/speechflow-node-a2a-mute.ts +39 -11
  64. package/src/speechflow-node-a2a-vad.ts +206 -100
  65. package/src/speechflow-node-a2a-wav.ts +27 -11
  66. package/src/speechflow-node-a2t-deepgram.ts +148 -45
  67. package/src/speechflow-node-t2a-elevenlabs.ts +65 -12
  68. package/src/speechflow-node-t2a-kokoro.ts +11 -4
  69. package/src/speechflow-node-t2t-deepl.ts +9 -4
  70. package/src/speechflow-node-t2t-format.ts +2 -2
  71. package/src/speechflow-node-t2t-ollama.ts +1 -1
  72. package/src/speechflow-node-t2t-openai.ts +1 -1
  73. package/src/speechflow-node-t2t-sentence.ts +38 -27
  74. package/src/speechflow-node-t2t-subtitle.ts +62 -15
  75. package/src/speechflow-node-t2t-transformers.ts +4 -3
  76. package/src/speechflow-node-x2x-filter.ts +4 -4
  77. package/src/speechflow-node-x2x-trace.ts +1 -1
  78. package/src/speechflow-node-xio-device.ts +12 -8
  79. package/src/speechflow-node-xio-file.ts +9 -3
  80. package/src/speechflow-node-xio-mqtt.ts +5 -2
  81. package/src/speechflow-node-xio-websocket.ts +12 -12
  82. package/src/speechflow-utils.ts +78 -44
  83. package/src/speechflow.ts +117 -36
@@ -18,6 +18,7 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
18
18
  static name = "mute";
19
19
  /* internal state */
20
20
  muteMode = "none";
21
+ destroyed = false;
21
22
  /* construct node */
22
23
  constructor(id, cfg, opts, args) {
23
24
  super(id, cfg, opts, args);
@@ -29,23 +30,37 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
29
30
  }
30
31
  /* receive external request */
31
32
  async receiveRequest(params) {
32
- if (params.length === 2 && params[0] === "mode") {
33
- if (!params[1].match(/^(?:none|silenced|unplugged)$/))
34
- throw new Error("mute: invalid mode argument in external request");
35
- const muteMode = params[1];
36
- this.setMuteMode(muteMode);
37
- this.sendResponse(["mute", "mode", muteMode]);
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;
38
49
  }
39
- else
40
- throw new Error("mute: invalid arguments in external request");
41
50
  }
42
51
  /* change mute mode */
43
52
  setMuteMode(mode) {
53
+ if (this.destroyed) {
54
+ this.log("warning", "attempted to set mute mode on destroyed node");
55
+ return;
56
+ }
44
57
  this.log("info", `setting mute mode to "${mode}"`);
45
58
  this.muteMode = mode;
46
59
  }
47
60
  /* open node */
48
61
  async open() {
62
+ /* clear destruction flag */
63
+ this.destroyed = false;
49
64
  /* establish a transform stream */
50
65
  const self = this;
51
66
  this.stream = new node_stream_1.default.Transform({
@@ -53,6 +68,10 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
53
68
  writableObjectMode: true,
54
69
  decodeStrings: false,
55
70
  transform(chunk, encoding, callback) {
71
+ if (self.destroyed) {
72
+ callback(new Error("stream already destroyed"));
73
+ return;
74
+ }
56
75
  if (!Buffer.isBuffer(chunk.payload))
57
76
  callback(new Error("invalid chunk payload type"));
58
77
  else if (self.muteMode === "unplugged")
@@ -60,10 +79,11 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
60
79
  callback();
61
80
  else if (self.muteMode === "silenced") {
62
81
  /* pass-through a silenced chunk */
63
- chunk = chunk.clone();
64
- chunk.meta.set("muted", true);
65
- const buffer = chunk.payload;
82
+ const chunkSilenced = chunk.clone();
83
+ chunkSilenced.meta.set("muted", true);
84
+ const buffer = chunkSilenced.payload;
66
85
  buffer.fill(0);
86
+ this.push(chunkSilenced);
67
87
  callback();
68
88
  }
69
89
  else {
@@ -73,6 +93,10 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
73
93
  }
74
94
  },
75
95
  final(callback) {
96
+ if (self.destroyed) {
97
+ callback();
98
+ return;
99
+ }
76
100
  this.push(null);
77
101
  callback();
78
102
  }
@@ -80,6 +104,8 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
80
104
  }
81
105
  /* close node */
82
106
  async close() {
107
+ /* indicate destruction */
108
+ this.destroyed = true;
83
109
  /* close stream */
84
110
  if (this.stream !== null) {
85
111
  this.stream.destroy();
@@ -1 +1 @@
1
- {"version":3,"file":"speechflow-node-a2a-mute.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-mute.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"speechflow-node-a2a-mute.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-mute.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,9 @@ export default class SpeechFlowNodeVAD extends SpeechFlowNode {
6
6
  private queueRecv;
7
7
  private queueVAD;
8
8
  private queueSend;
9
+ private destroyed;
10
+ private tailTimer;
11
+ private activeEventListeners;
9
12
  constructor(id: string, cfg: {
10
13
  [id: string]: any;
11
14
  }, opts: {
@@ -58,6 +58,9 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
58
58
  queueRecv = this.queue.pointerUse("recv");
59
59
  queueVAD = this.queue.pointerUse("vad");
60
60
  queueSend = this.queue.pointerUse("send");
61
+ destroyed = false;
62
+ tailTimer = null;
63
+ activeEventListeners = new Set();
61
64
  /* construct node */
62
65
  constructor(id, cfg, opts, args) {
63
66
  super(id, cfg, opts, args);
@@ -80,81 +83,108 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
80
83
  /* sanity check situation */
81
84
  if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
82
85
  throw new Error("VAD node currently supports PCM-S16LE audio only");
83
- /* pass-through logging */
84
- const log = (level, msg) => { this.log(level, msg); };
86
+ /* clear destruction flag */
87
+ this.destroyed = false;
85
88
  /* internal processing constants */
86
89
  const vadSampleRateTarget = 16000; /* internal target of VAD */
87
90
  const vadSamplesPerFrame = 512; /* required for VAD v5 */
88
91
  /* establish Voice Activity Detection (VAD) facility */
89
92
  let tail = false;
90
- let tailTimer = null;
91
- this.vad = await vad_node_realtime_1.RealTimeVAD.new({
92
- model: "v5",
93
- sampleRate: this.config.audioSampleRate, /* before resampling to 16KHz */
94
- frameSamples: vadSamplesPerFrame, /* after resampling to 16KHz */
95
- positiveSpeechThreshold: this.params.posSpeechThreshold,
96
- negativeSpeechThreshold: this.params.negSpeechThreshold,
97
- minSpeechFrames: this.params.minSpeechFrames,
98
- redemptionFrames: this.params.redemptionFrames,
99
- preSpeechPadFrames: this.params.preSpeechPadFrames,
100
- onSpeechStart: () => {
101
- log("info", "VAD: speech start");
102
- if (this.params.mode === "unlugged") {
103
- tail = false;
104
- if (tailTimer !== null) {
105
- clearTimeout(tailTimer);
106
- tailTimer = null;
107
- }
108
- }
109
- },
110
- onSpeechEnd: (audio) => {
111
- const duration = utils.audioArrayDuration(audio, vadSampleRateTarget);
112
- log("info", `VAD: speech end (duration: ${duration.toFixed(2)}s)`);
113
- if (this.params.mode === "unlugged") {
114
- tail = true;
115
- if (tailTimer !== null)
116
- clearTimeout(tailTimer);
117
- tailTimer = setTimeout(() => {
118
- tail = false;
119
- tailTimer = null;
120
- }, this.params.postSpeechTail);
121
- }
122
- },
123
- onVADMisfire: () => {
124
- log("info", "VAD: speech end (segment too short)");
125
- if (this.params.mode === "unlugged") {
126
- tail = true;
127
- if (tailTimer !== null)
128
- clearTimeout(tailTimer);
129
- tailTimer = setTimeout(() => {
93
+ try {
94
+ this.vad = await vad_node_realtime_1.RealTimeVAD.new({
95
+ model: "v5",
96
+ sampleRate: this.config.audioSampleRate, /* before resampling to 16KHz */
97
+ frameSamples: vadSamplesPerFrame, /* after resampling to 16KHz */
98
+ positiveSpeechThreshold: this.params.posSpeechThreshold,
99
+ negativeSpeechThreshold: this.params.negSpeechThreshold,
100
+ minSpeechFrames: this.params.minSpeechFrames,
101
+ redemptionFrames: this.params.redemptionFrames,
102
+ preSpeechPadFrames: this.params.preSpeechPadFrames,
103
+ onSpeechStart: () => {
104
+ if (this.destroyed)
105
+ return;
106
+ this.log("info", "VAD: speech start");
107
+ if (this.params.mode === "unplugged") {
130
108
  tail = false;
131
- tailTimer = null;
132
- }, this.params.postSpeechTail);
133
- }
134
- },
135
- onFrameProcessed: (audio) => {
136
- /* annotate the current audio segment */
137
- const element = this.queueVAD.peek();
138
- if (element === undefined || element.type !== "audio-frame")
139
- throw new Error("internal error which cannot happen: no more queued element");
140
- const segment = element.segmentData[element.segmentIdx++];
141
- segment.isSpeech = (audio.isSpeech > audio.notSpeech) || tail;
142
- /* annotate the entire audio chunk */
143
- if (element.segmentIdx >= element.segmentData.length) {
144
- let isSpeech = false;
145
- for (const segment of element.segmentData) {
146
- if (segment.isSpeech) {
147
- isSpeech = true;
148
- break;
109
+ if (this.tailTimer !== null) {
110
+ clearTimeout(this.tailTimer);
111
+ this.tailTimer = null;
149
112
  }
150
113
  }
151
- element.isSpeech = isSpeech;
152
- this.queueVAD.touch();
153
- this.queueVAD.walk(+1);
114
+ },
115
+ onSpeechEnd: (audio) => {
116
+ if (this.destroyed)
117
+ return;
118
+ const duration = utils.audioArrayDuration(audio, vadSampleRateTarget);
119
+ this.log("info", `VAD: speech end (duration: ${duration.toFixed(2)}s)`);
120
+ if (this.params.mode === "unplugged") {
121
+ tail = true;
122
+ if (this.tailTimer !== null) {
123
+ clearTimeout(this.tailTimer);
124
+ this.tailTimer = null;
125
+ }
126
+ this.tailTimer = setTimeout(() => {
127
+ if (this.destroyed || this.tailTimer === null)
128
+ return;
129
+ tail = false;
130
+ this.tailTimer = null;
131
+ }, this.params.postSpeechTail);
132
+ }
133
+ },
134
+ onVADMisfire: () => {
135
+ if (this.destroyed)
136
+ return;
137
+ this.log("info", "VAD: speech end (segment too short)");
138
+ if (this.params.mode === "unplugged") {
139
+ tail = true;
140
+ if (this.tailTimer !== null) {
141
+ clearTimeout(this.tailTimer);
142
+ this.tailTimer = null;
143
+ }
144
+ this.tailTimer = setTimeout(() => {
145
+ if (this.destroyed || this.tailTimer === null)
146
+ return;
147
+ tail = false;
148
+ this.tailTimer = null;
149
+ }, this.params.postSpeechTail);
150
+ }
151
+ },
152
+ onFrameProcessed: (audio) => {
153
+ if (this.destroyed)
154
+ return;
155
+ try {
156
+ /* annotate the current audio segment */
157
+ const element = this.queueVAD.peek();
158
+ if (element === undefined || element.type !== "audio-frame")
159
+ throw new Error("internal error which cannot happen: no more queued element");
160
+ if (element.segmentIdx >= element.segmentData.length)
161
+ throw new Error("segment index out of bounds");
162
+ const segment = element.segmentData[element.segmentIdx++];
163
+ segment.isSpeech = (audio.isSpeech > audio.notSpeech) || tail;
164
+ /* annotate the entire audio chunk */
165
+ if (element.segmentIdx >= element.segmentData.length) {
166
+ let isSpeech = false;
167
+ for (const segment of element.segmentData) {
168
+ if (segment.isSpeech) {
169
+ isSpeech = true;
170
+ break;
171
+ }
172
+ }
173
+ element.isSpeech = isSpeech;
174
+ this.queueVAD.touch();
175
+ this.queueVAD.walk(+1);
176
+ }
177
+ }
178
+ catch (error) {
179
+ this.log("error", `VAD frame processing error: ${error}`);
180
+ }
154
181
  }
155
- }
156
- });
157
- this.vad.start();
182
+ });
183
+ this.vad.start();
184
+ }
185
+ catch (error) {
186
+ throw new Error(`failed to initialize VAD: ${error}`);
187
+ }
158
188
  /* provide Duplex stream and internally attach to VAD */
159
189
  const self = this;
160
190
  this.stream = new node_stream_1.default.Duplex({
@@ -164,54 +194,87 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
164
194
  highWaterMark: 1,
165
195
  /* receive audio chunk (writable side of stream) */
166
196
  write(chunk, encoding, callback) {
197
+ if (self.destroyed) {
198
+ callback(new Error("stream already destroyed"));
199
+ return;
200
+ }
167
201
  if (!Buffer.isBuffer(chunk.payload))
168
202
  callback(new Error("expected audio input as Buffer chunks"));
169
203
  else if (chunk.payload.byteLength === 0)
170
204
  callback();
171
205
  else {
172
- /* convert audio samples from PCM/I16 to PCM/F32 */
173
- const data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
174
- /* segment audio samples as individual VAD-sized frames */
175
- const segmentData = [];
176
- const chunkSize = vadSamplesPerFrame * (self.config.audioSampleRate / vadSampleRateTarget);
177
- const chunks = Math.trunc(data.length / chunkSize);
178
- for (let i = 0; i < chunks; i++) {
179
- const frame = data.slice(i * chunkSize, (i + 1) * chunkSize);
180
- const segment = { data: frame };
181
- segmentData.push(segment);
206
+ try {
207
+ /* convert audio samples from PCM/I16 to PCM/F32 */
208
+ const data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
209
+ /* segment audio samples as individual VAD-sized frames */
210
+ const segmentData = [];
211
+ const chunkSize = vadSamplesPerFrame *
212
+ (self.config.audioSampleRate / vadSampleRateTarget);
213
+ const chunks = Math.trunc(data.length / chunkSize);
214
+ for (let i = 0; i < chunks; i++) {
215
+ const frame = data.slice(i * chunkSize, (i + 1) * chunkSize);
216
+ const segment = { data: frame };
217
+ segmentData.push(segment);
218
+ }
219
+ if ((chunks * chunkSize) < data.length) {
220
+ const frame = new Float32Array(chunkSize);
221
+ frame.fill(0);
222
+ frame.set(data.slice(chunks * chunkSize, data.length));
223
+ const segment = { data: frame };
224
+ segmentData.push(segment);
225
+ }
226
+ /* queue the results */
227
+ self.queueRecv.append({
228
+ type: "audio-frame", chunk,
229
+ segmentIdx: 0, segmentData
230
+ });
231
+ /* push segments through Voice Activity Detection (VAD) */
232
+ if (self.vad && !self.destroyed) {
233
+ try {
234
+ for (const segment of segmentData)
235
+ self.vad.processAudio(segment.data);
236
+ }
237
+ catch (error) {
238
+ self.log("error", `VAD processAudio error: ${error}`);
239
+ }
240
+ }
241
+ callback();
182
242
  }
183
- if ((chunks * chunkSize) < data.length) {
184
- const frame = new Float32Array(chunkSize);
185
- frame.fill(0);
186
- frame.set(data.slice(chunks * chunkSize, data.length));
187
- const segment = { data: frame };
188
- segmentData.push(segment);
243
+ catch (error) {
244
+ callback(error instanceof Error ? error : new Error("VAD processing failed"));
189
245
  }
190
- /* queue the results */
191
- self.queueRecv.append({
192
- type: "audio-frame", chunk,
193
- segmentIdx: 0, segmentData
194
- });
195
- /* push segments through Voice Activity Detection (VAD) */
196
- for (const segment of segmentData)
197
- self.vad.processAudio(segment.data);
198
- callback();
199
246
  }
200
247
  },
201
248
  /* receive no more audio chunks (writable side of stream) */
202
249
  final(callback) {
250
+ if (self.destroyed) {
251
+ callback();
252
+ return;
253
+ }
203
254
  /* signal end of file */
204
255
  self.queueRecv.append({ type: "audio-eof" });
205
256
  callback();
206
257
  },
207
258
  /* send audio chunk(s) (readable side of stream) */
208
259
  read(_size) {
260
+ if (self.destroyed) {
261
+ this.push(null);
262
+ return;
263
+ }
209
264
  /* try to perform read operation from scratch */
210
265
  const tryToRead = () => {
266
+ if (self.destroyed) {
267
+ this.push(null);
268
+ return;
269
+ }
211
270
  /* flush pending audio chunks */
212
271
  const flushPendingChunks = () => {
213
272
  let pushed = 0;
214
273
  while (true) {
274
+ if (self.destroyed) {
275
+ this.push(null);
276
+ return;
277
+ }
215
278
  const element = self.queueSend.peek();
216
279
  if (element === undefined)
217
280
  break;
@@ -235,22 +298,32 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
235
298
  this.push(chunk);
236
299
  pushed++;
237
300
  }
238
- else if (self.params.mode === "unplugged" && pushed === 0)
301
+ else if (self.params.mode === "unplugged" && pushed === 0) {
239
302
  /* we have to await chunks now, as in unplugged
240
303
  mode we else would be never called again until
241
304
  we at least once push a new chunk as the result */
242
- tryToRead();
305
+ setTimeout(() => {
306
+ if (self.destroyed)
307
+ return;
308
+ tryToRead();
309
+ }, 0);
310
+ return;
311
+ }
243
312
  }
244
313
  };
245
314
  /* await forthcoming audio chunks */
246
315
  const awaitForthcomingChunks = () => {
316
+ if (self.destroyed)
317
+ return;
247
318
  const element = self.queueSend.peek();
248
319
  if (element !== undefined
249
320
  && element.type === "audio-frame"
250
321
  && element.isSpeech !== undefined)
251
322
  flushPendingChunks();
252
- else
323
+ else if (!self.destroyed) {
253
324
  self.queue.once("write", awaitForthcomingChunks);
325
+ self.activeEventListeners.add(awaitForthcomingChunks);
326
+ }
254
327
  };
255
328
  const element = self.queueSend.peek();
256
329
  if (element !== undefined && element.type === "audio-eof")
@@ -259,8 +332,10 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
259
332
  && element.type === "audio-frame"
260
333
  && element.isSpeech !== undefined)
261
334
  flushPendingChunks();
262
- else
335
+ else if (!self.destroyed) {
263
336
  self.queue.once("write", awaitForthcomingChunks);
337
+ self.activeEventListeners.add(awaitForthcomingChunks);
338
+ }
264
339
  };
265
340
  tryToRead();
266
341
  }
@@ -268,14 +343,37 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
268
343
  }
269
344
  /* close node */
270
345
  async close() {
346
+ /* indicate destruction */
347
+ this.destroyed = true;
348
+ /* cleanup tail timer */
349
+ if (this.tailTimer !== null) {
350
+ clearTimeout(this.tailTimer);
351
+ this.tailTimer = null;
352
+ }
353
+ /* remove all event listeners */
354
+ this.activeEventListeners.forEach((listener) => {
355
+ this.queue.removeListener("write", listener);
356
+ });
357
+ this.activeEventListeners.clear();
271
358
  /* close stream */
272
359
  if (this.stream !== null) {
273
360
  this.stream.destroy();
274
361
  this.stream = null;
275
362
  }
363
+ /* cleanup queue pointers before closing VAD to prevent callback access */
364
+ this.queue.pointerDelete("recv");
365
+ this.queue.pointerDelete("vad");
366
+ this.queue.pointerDelete("send");
276
367
  /* close VAD */
277
368
  if (this.vad !== null) {
278
- await this.vad.flush();
369
+ try {
370
+ const flushPromise = this.vad.flush();
371
+ const timeoutPromise = new Promise((resolve) => setTimeout(resolve, 5000));
372
+ await Promise.race([flushPromise, timeoutPromise]);
373
+ }
374
+ catch (error) {
375
+ this.log("warning", `VAD flush error during close: ${error}`);
376
+ }
279
377
  this.vad.destroy();
280
378
  this.vad = null;
281
379
  }
@@ -1 +1 @@
1
- {"version":3,"file":"speechflow-node-a2a-vad.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-vad.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"speechflow-node-a2a-vad.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-vad.ts"],"names":[],"mappings":"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"}
@@ -117,8 +117,10 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
117
117
  decodeStrings: false,
118
118
  highWaterMark: 1,
119
119
  transform(chunk, encoding, callback) {
120
- if (!Buffer.isBuffer(chunk.payload))
120
+ if (!Buffer.isBuffer(chunk.payload)) {
121
121
  callback(new Error("invalid chunk payload type"));
122
+ return;
123
+ }
122
124
  else if (firstChunk) {
123
125
  if (self.params.mode === "encode") {
124
126
  /* convert raw/PCM to WAV/PCM
@@ -141,6 +143,10 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
141
143
  }
142
144
  else if (self.params.mode === "decode") {
143
145
  /* convert WAV/PCM to raw/PCM */
146
+ if (chunk.payload.length < 44) {
147
+ callback(new Error("WAV header too short, expected at least 44 bytes"));
148
+ return;
149
+ }
144
150
  const header = readWavHeader(chunk.payload);
145
151
  self.log("info", "WAV audio stream: " +
146
152
  `audioFormat=${header.audioFormat === 0x0001 ? "PCM" :
@@ -148,20 +154,30 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
148
154
  `channels=${header.channels} ` +
149
155
  `sampleRate=${header.sampleRate} ` +
150
156
  `bitDepth=${header.bitDepth}`);
151
- if (header.audioFormat !== 0x0001 /* PCM */)
152
- throw new Error("WAV not based on PCM format");
153
- if (header.bitDepth !== 16)
154
- throw new Error("WAV not based on 16 bit samples");
155
- if (header.sampleRate !== 48000)
156
- throw new Error("WAV not based on 48Khz sample rate");
157
- if (header.channels !== 1)
158
- throw new Error("WAV not based on mono channel");
157
+ if (header.audioFormat !== 0x0001 /* PCM */) {
158
+ callback(new Error("WAV not based on PCM format"));
159
+ return;
160
+ }
161
+ if (header.bitDepth !== self.config.audioBitDepth) {
162
+ callback(new Error(`WAV not based on ${self.config.audioBitDepth} bit samples`));
163
+ return;
164
+ }
165
+ if (header.sampleRate !== self.config.audioSampleRate) {
166
+ callback(new Error(`WAV not based on ${self.config.audioSampleRate}Hz sample rate`));
167
+ return;
168
+ }
169
+ if (header.channels !== self.config.audioChannels) {
170
+ callback(new Error(`WAV not based on ${self.config.audioChannels} channel(s)`));
171
+ return;
172
+ }
159
173
  chunk.payload = chunk.payload.subarray(44);
160
174
  this.push(chunk);
161
175
  callback();
162
176
  }
163
- else
164
- throw new Error(`invalid operation mode "${self.params.mode}"`);
177
+ else {
178
+ callback(new Error(`invalid operation mode "${self.params.mode}"`));
179
+ return;
180
+ }
165
181
  }
166
182
  else {
167
183
  /* pass-through original chunk */