speechflow 2.3.0 → 2.3.1

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 (64) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/package.json +2 -2
  3. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js +10 -9
  4. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js.map +1 -1
  5. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js +17 -2
  6. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js.map +1 -1
  7. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js +7 -8
  8. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js.map +1 -1
  9. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js +5 -5
  10. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js.map +1 -1
  11. package/speechflow-cli/dst/speechflow-node-a2a-filler.js +5 -0
  12. package/speechflow-cli/dst/speechflow-node-a2a-filler.js.map +1 -1
  13. package/speechflow-cli/dst/speechflow-node-a2a-gender.js +1 -4
  14. package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -1
  15. package/speechflow-cli/dst/speechflow-node-a2a-meter.js +1 -1
  16. package/speechflow-cli/dst/speechflow-node-a2a-meter.js.map +1 -1
  17. package/speechflow-cli/dst/speechflow-node-a2t-amazon.js +8 -3
  18. package/speechflow-cli/dst/speechflow-node-a2t-amazon.js.map +1 -1
  19. package/speechflow-cli/dst/speechflow-node-a2t-google.d.ts +1 -0
  20. package/speechflow-cli/dst/speechflow-node-a2t-google.js +6 -1
  21. package/speechflow-cli/dst/speechflow-node-a2t-google.js.map +1 -1
  22. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +3 -1
  23. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -1
  24. package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js +1 -0
  25. package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js.map +1 -1
  26. package/speechflow-cli/dst/speechflow-node-t2t-opus.js +9 -1
  27. package/speechflow-cli/dst/speechflow-node-t2t-opus.js.map +1 -1
  28. package/speechflow-cli/dst/speechflow-node-t2t-sentence.d.ts +3 -0
  29. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js +159 -56
  30. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js.map +1 -1
  31. package/speechflow-cli/dst/speechflow-node-xio-exec.js +4 -4
  32. package/speechflow-cli/dst/speechflow-node-xio-exec.js.map +1 -1
  33. package/speechflow-cli/dst/speechflow-node-xio-webrtc.d.ts +1 -0
  34. package/speechflow-cli/dst/speechflow-node-xio-webrtc.js +6 -1
  35. package/speechflow-cli/dst/speechflow-node-xio-webrtc.js.map +1 -1
  36. package/speechflow-cli/dst/speechflow-node-xio-websocket.js +14 -4
  37. package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -1
  38. package/speechflow-cli/dst/speechflow-util-audio.js +11 -9
  39. package/speechflow-cli/dst/speechflow-util-audio.js.map +1 -1
  40. package/speechflow-cli/dst/speechflow-util-llm.js +12 -2
  41. package/speechflow-cli/dst/speechflow-util-llm.js.map +1 -1
  42. package/speechflow-cli/dst/speechflow-util-queue.d.ts +4 -0
  43. package/speechflow-cli/dst/speechflow-util-queue.js +41 -0
  44. package/speechflow-cli/dst/speechflow-util-queue.js.map +1 -1
  45. package/speechflow-cli/src/speechflow-node-a2a-compressor-wt.ts +12 -9
  46. package/speechflow-cli/src/speechflow-node-a2a-compressor.ts +23 -7
  47. package/speechflow-cli/src/speechflow-node-a2a-expander-wt.ts +7 -8
  48. package/speechflow-cli/src/speechflow-node-a2a-ffmpeg.ts +6 -6
  49. package/speechflow-cli/src/speechflow-node-a2a-filler.ts +6 -0
  50. package/speechflow-cli/src/speechflow-node-a2a-gender.ts +3 -6
  51. package/speechflow-cli/src/speechflow-node-a2a-meter.ts +1 -1
  52. package/speechflow-cli/src/speechflow-node-a2t-amazon.ts +12 -3
  53. package/speechflow-cli/src/speechflow-node-a2t-google.ts +8 -1
  54. package/speechflow-cli/src/speechflow-node-t2a-kokoro.ts +3 -1
  55. package/speechflow-cli/src/speechflow-node-t2a-supertonic.ts +1 -0
  56. package/speechflow-cli/src/speechflow-node-t2t-opus.ts +9 -1
  57. package/speechflow-cli/src/speechflow-node-t2t-sentence.ts +214 -61
  58. package/speechflow-cli/src/speechflow-node-xio-exec.ts +5 -5
  59. package/speechflow-cli/src/speechflow-node-xio-webrtc.ts +7 -1
  60. package/speechflow-cli/src/speechflow-node-xio-websocket.ts +14 -4
  61. package/speechflow-cli/src/speechflow-util-audio.ts +12 -10
  62. package/speechflow-cli/src/speechflow-util-llm.ts +13 -2
  63. package/speechflow-cli/src/speechflow-util-queue.ts +43 -0
  64. package/speechflow-ui-db/dst/index.js +3 -3
@@ -75,6 +75,15 @@ class QueuePointer extends node_events_1.EventEmitter {
75
75
  silent(silence) {
76
76
  this.silence = silence;
77
77
  }
78
+ silently(fn) {
79
+ this.silence = true;
80
+ try {
81
+ return fn();
82
+ }
83
+ finally {
84
+ this.silence = false;
85
+ }
86
+ }
78
87
  /* notify about operation */
79
88
  notify(event, info) {
80
89
  if (!this.silence)
@@ -193,12 +202,14 @@ class QueuePointer extends node_events_1.EventEmitter {
193
202
  }
194
203
  insert(element) {
195
204
  this.queue.elements.splice(this.index, 0, element);
205
+ this.queue.adjustPointers(this, this.index, "insert");
196
206
  this.queue.notify("write", { start: this.index, end: this.index, op: "insert" });
197
207
  }
198
208
  delete() {
199
209
  if (this.index >= this.queue.elements.length)
200
210
  throw new Error("cannot delete after last element");
201
211
  this.queue.elements.splice(this.index, 1);
212
+ this.queue.adjustPointers(this, this.index, "delete");
202
213
  this.queue.notify("write", { start: this.index, end: this.index, op: "delete" });
203
214
  }
204
215
  }
@@ -215,6 +226,15 @@ class Queue extends node_events_1.EventEmitter {
215
226
  silent(silence) {
216
227
  this.silence = silence;
217
228
  }
229
+ silently(fn) {
230
+ this.silence = true;
231
+ try {
232
+ return fn();
233
+ }
234
+ finally {
235
+ this.silence = false;
236
+ }
237
+ }
218
238
  notify(event, info) {
219
239
  if (!this.silence)
220
240
  this.emit(event, info);
@@ -229,6 +249,22 @@ class Queue extends node_events_1.EventEmitter {
229
249
  throw new Error("pointer does not exist");
230
250
  this.pointers.delete(name);
231
251
  }
252
+ /* adjust all sibling pointer positions (after insert/delete splice)
253
+ NOTICE: for insert, pointers AT the index are shifted forward to preserve
254
+ their pointer-to-element binding; for delete, pointers AT the index are
255
+ intentionally NOT adjusted, causing them to silently advance to the next
256
+ element (which shifted into the deleted position). */
257
+ adjustPointers(exclude, index, op) {
258
+ for (const pointer of this.pointers.values()) {
259
+ if (pointer === exclude)
260
+ continue;
261
+ const pos = pointer.position();
262
+ if (op === "insert" && pos >= index)
263
+ pointer.position(pos + 1);
264
+ else if (op === "delete" && pos > index)
265
+ pointer.position(pos - 1);
266
+ }
267
+ }
232
268
  trim() {
233
269
  /* determine minimum pointer position */
234
270
  let min = this.elements.length;
@@ -246,6 +282,11 @@ class Queue extends node_events_1.EventEmitter {
246
282
  this.notify("write", { start: 0, end: min, op: "trim" });
247
283
  }
248
284
  }
285
+ clear() {
286
+ this.elements.length = 0;
287
+ for (const pointer of this.pointers.values())
288
+ pointer.position(0);
289
+ }
249
290
  }
250
291
  exports.Queue = Queue;
251
292
  class TimeStore extends node_events_1.EventEmitter {
@@ -1 +1 @@
1
- {"version":3,"file":"speechflow-util-queue.js","sourceRoot":"","sources":["../src/speechflow-util-queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"speechflow-util-queue.js","sourceRoot":"","sources":["../src/speechflow-util-queue.ts"],"names":[],"mappings":"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"}
@@ -38,20 +38,19 @@ class CompressorProcessor extends AudioWorkletProcessor {
38
38
  if (ratio <= 1.0)
39
39
  return 0
40
40
 
41
- /* determine thresholds */
41
+ /* determine knee boundaries (symmetric around threshold) */
42
42
  const halfKnee = kneeDB * 0.5
43
- const belowThr = levelDB < thresholdDB
44
- const aboveKnee = levelDB >= (thresholdDB + halfKnee)
43
+ const belowKnee = levelDB < (thresholdDB - halfKnee)
44
+ const aboveKnee = levelDB > (thresholdDB + halfKnee)
45
45
 
46
- /* short-circuit for no compression (below threshold) */
47
- if (belowThr)
46
+ /* short-circuit for no compression (below knee) */
47
+ if (belowKnee)
48
48
  return 0
49
49
 
50
- /* apply soft-knee */
50
+ /* apply soft-knee (standard textbook quadratic) */
51
51
  if (kneeDB > 0 && !aboveKnee) {
52
- const x = (levelDB - thresholdDB) / kneeDB
53
- const idealGainDB = (thresholdDB + (levelDB - thresholdDB) / ratio) - levelDB
54
- return idealGainDB * x * x
52
+ const d = levelDB - thresholdDB + halfKnee
53
+ return (1.0 / ratio - 1.0) * d * d / (2.0 * kneeDB)
55
54
  }
56
55
 
57
56
  /* determine target level */
@@ -116,6 +115,10 @@ class CompressorProcessor extends AudioWorkletProcessor {
116
115
  for (let i = 0; i < inp.length; i++)
117
116
  out[i] = inp[i] * gainLin
118
117
  }
118
+
119
+ /* report reduction to main thread */
120
+ this.port.postMessage({ type: "reduction", reduction: this.reduction })
121
+
119
122
  return true
120
123
  }
121
124
  }
@@ -29,11 +29,13 @@ interface AudioCompressorConfig {
29
29
  /* audio compressor class */
30
30
  class AudioCompressor extends util.WebAudio {
31
31
  /* internal state */
32
- private type: "standalone" | "sidechain"
33
- private mode: "compress" | "measure" | "adjust"
34
- private config: Required<AudioCompressorConfig>
35
- private compressorNode: AudioWorkletNode | null = null
36
- private gainNode: GainNode | null = null
32
+ private type: "standalone" | "sidechain"
33
+ private mode: "compress" | "measure" | "adjust"
34
+ private config: Required<AudioCompressorConfig>
35
+ private compressorNode: AudioWorkletNode | null = null
36
+ private gainNode: GainNode | null = null
37
+ private _reduction = 0
38
+ private _reductionListener: ((event: MessageEvent) => void) | null = null
37
39
 
38
40
  /* construct object */
39
41
  constructor (
@@ -85,6 +87,16 @@ class AudioCompressor extends util.WebAudio {
85
87
  })
86
88
  }
87
89
 
90
+ /* listen for reduction updates from compressor worklet */
91
+ if (needsCompressor) {
92
+ this._reductionListener = (event: MessageEvent) => {
93
+ if (event.data?.type === "reduction")
94
+ this._reduction = event.data.reduction
95
+ }
96
+ this.compressorNode!.port.addEventListener("message", this._reductionListener)
97
+ this.compressorNode!.port.start()
98
+ }
99
+
88
100
  /* create gain node */
89
101
  if (needsGain)
90
102
  this.gainNode = this.audioContext.createGain()
@@ -97,6 +109,7 @@ class AudioCompressor extends util.WebAudio {
97
109
  }
98
110
  else if (this.type === "sidechain" && this.mode === "measure") {
99
111
  this.sourceNode!.connect(this.compressorNode!)
112
+ this.compressorNode!.connect(this.captureNode!)
100
113
  }
101
114
  else if (this.type === "sidechain" && this.mode === "adjust") {
102
115
  this.sourceNode!.connect(this.gainNode!)
@@ -123,8 +136,7 @@ class AudioCompressor extends util.WebAudio {
123
136
 
124
137
  /* get the current gain reduction */
125
138
  public getGainReduction (): number {
126
- const processor = (this.compressorNode as any)?.port?.processor
127
- return processor?.reduction ?? 0
139
+ return this._reduction
128
140
  }
129
141
 
130
142
  /* set the current gain */
@@ -137,6 +149,10 @@ class AudioCompressor extends util.WebAudio {
137
149
  public async destroy (): Promise<void> {
138
150
  /* destroy nodes */
139
151
  if (this.compressorNode !== null) {
152
+ if (this._reductionListener !== null) {
153
+ this.compressorNode.port.removeEventListener("message", this._reductionListener)
154
+ this._reductionListener = null
155
+ }
140
156
  this.compressorNode.disconnect()
141
157
  this.compressorNode = null
142
158
  }
@@ -39,20 +39,19 @@ class ExpanderProcessor extends AudioWorkletProcessor {
39
39
  if (ratio <= 1.0)
40
40
  return 0
41
41
 
42
- /* determine thresholds */
42
+ /* determine knee boundaries (symmetric around threshold) */
43
43
  const halfKnee = kneeDB * 0.5
44
44
  const belowKnee = levelDB < (thresholdDB - halfKnee)
45
- const aboveThr = levelDB >= thresholdDB
45
+ const aboveKnee = levelDB > (thresholdDB + halfKnee)
46
46
 
47
- /* short-circuit for no expansion (above threshold) */
48
- if (aboveThr)
47
+ /* short-circuit for no expansion (above knee) */
48
+ if (aboveKnee)
49
49
  return 0
50
50
 
51
- /* apply soft-knee */
51
+ /* apply soft-knee (standard textbook quadratic) */
52
52
  if (kneeDB > 0 && !belowKnee) {
53
- const x = (levelDB - (thresholdDB - halfKnee)) / kneeDB
54
- const idealGainDB = (thresholdDB + (levelDB - thresholdDB) * ratio) - levelDB
55
- return idealGainDB * x * x
53
+ const d = thresholdDB + halfKnee - levelDB
54
+ return (1.0 - ratio) * d * d / (2.0 * kneeDB)
56
55
  }
57
56
 
58
57
  /* determine target level */
@@ -107,12 +107,6 @@ export default class SpeechFlowNodeA2AFFMPEG extends SpeechFlowNode {
107
107
 
108
108
  /* close node */
109
109
  async close () {
110
- /* shutdown stream */
111
- if (this.stream !== null) {
112
- await util.destroyStream(this.stream)
113
- this.stream = null
114
- }
115
-
116
110
  /* shutdown FFmpeg */
117
111
  if (this.ffmpeg !== null) {
118
112
  util.run("stopping FFmpeg process",
@@ -120,6 +114,12 @@ export default class SpeechFlowNodeA2AFFMPEG extends SpeechFlowNode {
120
114
  () => {})
121
115
  this.ffmpeg = null
122
116
  }
117
+
118
+ /* shutdown stream */
119
+ if (this.stream !== null) {
120
+ await util.destroyStream(this.stream)
121
+ this.stream = null
122
+ }
123
123
  }
124
124
  }
125
125
 
@@ -196,6 +196,12 @@ export default class SpeechFlowNodeA2AFiller extends SpeechFlowNode {
196
196
  self.filler.done()
197
197
  await util.sleep(10)
198
198
 
199
+ /* re-check after await (close() may have run during sleep) */
200
+ if (self.closing || self.sendQueue === null) {
201
+ callback()
202
+ return
203
+ }
204
+
199
205
  /* signal end of stream */
200
206
  self.sendQueue.write(null)
201
207
  }
@@ -151,15 +151,12 @@ export default class SpeechFlowNodeA2AGender extends SpeechFlowNode {
151
151
 
152
152
  /* classify audio */
153
153
  const ac = new AbortController()
154
- const result = await Promise.race([
155
- this.classifier(data),
154
+ const classified = await Promise.race([
155
+ this.classifier(data) as Promise<Transformers.AudioClassificationOutput>,
156
156
  util.timeout(30 * 1000, "classification timeout", ac.signal)
157
157
  ]).finally(() => {
158
158
  ac.abort()
159
- }) as Transformers.AudioClassificationOutput | Transformers.AudioClassificationOutput[]
160
- const classified = Array.isArray(result) ?
161
- result as Transformers.AudioClassificationOutput :
162
- [ result ]
159
+ })
163
160
  const c1 = classified.find((c) => c.label === "male")
164
161
  const c2 = classified.find((c) => c.label === "female")
165
162
  const male = c1 ? c1.score : 0.0
@@ -81,7 +81,7 @@ export default class SpeechFlowNodeA2AMeter extends SpeechFlowNode {
81
81
 
82
82
  /* grab the accumulated chunk data */
83
83
  const chunkData = this.chunkBuffer
84
- this.chunkBuffer = chunkData.subarray(samplesPerChunk)
84
+ this.chunkBuffer = chunkData.slice(samplesPerChunk)
85
85
 
86
86
  /* update internal audio sample sliding window for LUFS-M */
87
87
  if (chunkData.length > sampleWindow.length)
@@ -139,6 +139,9 @@ export default class SpeechFlowNodeA2TAmazon extends SpeechFlowNode {
139
139
  }
140
140
  })(audioQueue)
141
141
 
142
+ /* provide a self-reference for use in callbacks below */
143
+ const self = this
144
+
142
145
  /* start streaming */
143
146
  const ensureAudioStreamActive = async () => {
144
147
  if (this.clientStream !== null || this.clientStreamStarting || this.closing)
@@ -202,6 +205,7 @@ export default class SpeechFlowNodeA2TAmazon extends SpeechFlowNode {
202
205
  this.queue?.write(chunk)
203
206
  }
204
207
  }
208
+ self.queue?.write(null)
205
209
  })().catch((err: unknown) => {
206
210
  this.log("warning", `failed to establish connectivity to Amazon Transcribe: ${util.ensureError(err).message}`)
207
211
  this.clientStream = null
@@ -213,7 +217,6 @@ export default class SpeechFlowNodeA2TAmazon extends SpeechFlowNode {
213
217
  this.timeOpen = DateTime.now()
214
218
 
215
219
  /* provide Duplex stream and internally attach to Amazon Transcribe API */
216
- const self = this
217
220
  const reads = new util.PromiseSet<void>()
218
221
  this.stream = new Stream.Duplex({
219
222
  writableObjectMode: true,
@@ -247,12 +250,18 @@ export default class SpeechFlowNodeA2TAmazon extends SpeechFlowNode {
247
250
  callback()
248
251
  return
249
252
  }
250
- await reads.awaitAll()
253
+
254
+ /* signal end-of-audio to Amazon Transcribe first */
255
+ audioQueue.push(null)
256
+
257
+ /* await all pending read operations (with safety timeout) */
258
+ await reads.awaitAll(5000)
259
+
260
+ /* clean up Amazon Transcribe connection and audio queue */
251
261
  util.run("closing Amazon Transcribe connection",
252
262
  () => self.client!.destroy(),
253
263
  (error: Error) => self.log("warning", `error closing Amazon Transcribe connection: ${error}`)
254
264
  )
255
- audioQueue.push(null) /* do not push null to stream, let Amazon Transcribe do it */
256
265
  audioQueue.destroy()
257
266
  callback()
258
267
  },
@@ -26,6 +26,7 @@ export default class SpeechFlowNodeA2TGoogle extends SpeechFlowNode {
26
26
  private recognizeStream: ReturnType<GoogleSpeech.SpeechClient["streamingRecognize"]> | null = null
27
27
  private queue: util.AsyncQueue<SpeechFlowChunk | null> | null = null
28
28
  private closing = false
29
+ private lastResultEndMs = 0
29
30
 
30
31
  /* construct node */
31
32
  constructor (id: string, cfg: { [ id: string ]: any }, opts: { [ id: string ]: any }, args: any[]) {
@@ -62,6 +63,9 @@ export default class SpeechFlowNodeA2TGoogle extends SpeechFlowNode {
62
63
  /* clear destruction flag */
63
64
  this.closing = false
64
65
 
66
+ /* reset result end time tracking */
67
+ this.lastResultEndMs = 0
68
+
65
69
  /* create queue for results */
66
70
  this.queue = new util.AsyncQueue<SpeechFlowChunk | null>()
67
71
 
@@ -152,13 +156,16 @@ export default class SpeechFlowNodeA2TGoogle extends SpeechFlowNode {
152
156
  /* fallback: use result timing */
153
157
  const resultEnd = result.resultEndTime
154
158
  if (resultEnd) {
155
- tsStart = Duration.fromMillis(0).plus(this.timeZeroOffset)
159
+ tsStart = Duration.fromMillis(this.lastResultEndMs).plus(this.timeZeroOffset)
156
160
  tsEnd = Duration.fromMillis(
157
161
  (Number(resultEnd.seconds ?? 0) * 1000) +
158
162
  (Number(resultEnd.nanos ?? 0) / 1000000)
159
163
  ).plus(this.timeZeroOffset)
160
164
  }
161
165
  }
166
+ /* track raw end time for next fallback estimation */
167
+ this.lastResultEndMs = tsEnd.minus(this.timeZeroOffset).toMillis()
168
+
162
169
  this.log("info", `text received (start: ${tsStart.toMillis()}ms, ` +
163
170
  `end: ${tsEnd.toMillis()}ms, ` +
164
171
  `kind: ${isFinal ? "final" : "intermediate"}): ` +
@@ -211,8 +211,10 @@ export default class SpeechFlowNodeT2AKokoro extends SpeechFlowNode {
211
211
  }
212
212
 
213
213
  /* destroy Kokoro API */
214
- if (this.kokoro !== null)
214
+ if (this.kokoro !== null) {
215
+ await this.kokoro.model.dispose()
215
216
  this.kokoro = null
217
+ }
216
218
  }
217
219
  }
218
220
 
@@ -141,6 +141,7 @@ export default class SpeechFlowNodeT2ASupertonic extends SpeechFlowNode {
141
141
  if (outputSampleRate !== this.sampleRate) {
142
142
  this.log("warning", `unexpected sample rate change ${this.sampleRate}Hz -> ${outputSampleRate}Hz (recreating resampler)`)
143
143
  this.sampleRate = outputSampleRate
144
+ this.resampler?.destroy()
144
145
  this.resampler = new SpeexResampler(1, this.sampleRate, this.config.audioSampleRate, 7)
145
146
  }
146
147
 
@@ -129,7 +129,15 @@ export default class SpeechFlowNodeT2TOPUS extends SpeechFlowNode {
129
129
 
130
130
  /* shutdown Transformers */
131
131
  if (this.translator !== null) {
132
- this.translator.dispose()
132
+ const ac = new AbortController()
133
+ await Promise.race([
134
+ this.translator.dispose(),
135
+ util.timeout(5000, "translator dispose timeout", ac.signal)
136
+ ]).finally(() => {
137
+ ac.abort()
138
+ }).catch((error) => {
139
+ this.log("warning", `error during translator cleanup: ${error}`)
140
+ })
133
141
  this.translator = null
134
142
  }
135
143
  }