speechflow 1.2.2 → 1.2.3

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 (65) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +81 -67
  3. package/dst/speechflow-node-a2a-gender.js +33 -39
  4. package/dst/speechflow-node-a2a-gender.js.map +1 -1
  5. package/dst/speechflow-node-a2a-meter.js +1 -0
  6. package/dst/speechflow-node-a2a-meter.js.map +1 -1
  7. package/dst/speechflow-node-a2a-vad.js +32 -3
  8. package/dst/speechflow-node-a2a-vad.js.map +1 -1
  9. package/dst/speechflow-node-a2a-wav.js +1 -0
  10. package/dst/speechflow-node-a2a-wav.js.map +1 -1
  11. package/dst/speechflow-node-a2t-deepgram.js +1 -0
  12. package/dst/speechflow-node-a2t-deepgram.js.map +1 -1
  13. package/dst/speechflow-node-t2a-elevenlabs.js +1 -0
  14. package/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
  15. package/dst/speechflow-node-t2a-kokoro.js +1 -0
  16. package/dst/speechflow-node-t2a-kokoro.js.map +1 -1
  17. package/dst/speechflow-node-t2t-deepl.js +1 -0
  18. package/dst/speechflow-node-t2t-deepl.js.map +1 -1
  19. package/dst/speechflow-node-t2t-format.js +1 -0
  20. package/dst/speechflow-node-t2t-format.js.map +1 -1
  21. package/dst/speechflow-node-t2t-ollama.js +1 -0
  22. package/dst/speechflow-node-t2t-ollama.js.map +1 -1
  23. package/dst/speechflow-node-t2t-openai.js +1 -0
  24. package/dst/speechflow-node-t2t-openai.js.map +1 -1
  25. package/dst/speechflow-node-t2t-subtitle.js +1 -0
  26. package/dst/speechflow-node-t2t-subtitle.js.map +1 -1
  27. package/dst/speechflow-node-t2t-transformers.js +1 -0
  28. package/dst/speechflow-node-t2t-transformers.js.map +1 -1
  29. package/dst/speechflow-node-x2x-filter.js +3 -2
  30. package/dst/speechflow-node-x2x-filter.js.map +1 -1
  31. package/dst/speechflow-node-x2x-trace.js +3 -2
  32. package/dst/speechflow-node-x2x-trace.js.map +1 -1
  33. package/dst/speechflow-node-xio-device.js +1 -0
  34. package/dst/speechflow-node-xio-device.js.map +1 -1
  35. package/dst/speechflow-node-xio-mqtt.js +1 -0
  36. package/dst/speechflow-node-xio-mqtt.js.map +1 -1
  37. package/dst/speechflow-node-xio-websocket.js +2 -0
  38. package/dst/speechflow-node-xio-websocket.js.map +1 -1
  39. package/dst/speechflow-utils.js +2 -0
  40. package/dst/speechflow-utils.js.map +1 -1
  41. package/dst/speechflow.js +3 -7
  42. package/dst/speechflow.js.map +1 -1
  43. package/etc/speechflow.yaml +28 -31
  44. package/package.json +6 -7
  45. package/src/lib.d.ts +0 -14
  46. package/src/speechflow-node-a2a-gender.ts +34 -42
  47. package/src/speechflow-node-a2a-meter.ts +1 -0
  48. package/src/speechflow-node-a2a-vad.ts +32 -3
  49. package/src/speechflow-node-a2a-wav.ts +1 -0
  50. package/src/speechflow-node-a2t-deepgram.ts +1 -0
  51. package/src/speechflow-node-t2a-elevenlabs.ts +1 -0
  52. package/src/speechflow-node-t2a-kokoro.ts +1 -0
  53. package/src/speechflow-node-t2t-deepl.ts +1 -0
  54. package/src/speechflow-node-t2t-format.ts +1 -0
  55. package/src/speechflow-node-t2t-ollama.ts +1 -0
  56. package/src/speechflow-node-t2t-openai.ts +1 -0
  57. package/src/speechflow-node-t2t-subtitle.ts +1 -0
  58. package/src/speechflow-node-t2t-transformers.ts +1 -0
  59. package/src/speechflow-node-x2x-filter.ts +3 -2
  60. package/src/speechflow-node-x2x-trace.ts +3 -2
  61. package/src/speechflow-node-xio-device.ts +1 -0
  62. package/src/speechflow-node-xio-mqtt.ts +1 -0
  63. package/src/speechflow-node-xio-websocket.ts +2 -0
  64. package/src/speechflow-utils.ts +2 -0
  65. package/src/speechflow.ts +3 -8
@@ -222,6 +222,7 @@ export default class SpeechFlowNodeOllama extends SpeechFlowNode {
222
222
  readableObjectMode: true,
223
223
  writableObjectMode: true,
224
224
  decodeStrings: false,
225
+ highWaterMark: 1,
225
226
  transform (chunk: SpeechFlowChunk, encoding, callback) {
226
227
  if (Buffer.isBuffer(chunk.payload))
227
228
  callback(new Error("invalid chunk payload type"))
@@ -203,6 +203,7 @@ export default class SpeechFlowNodeOpenAI extends SpeechFlowNode {
203
203
  readableObjectMode: true,
204
204
  writableObjectMode: true,
205
205
  decodeStrings: false,
206
+ highWaterMark: 1,
206
207
  transform (chunk: SpeechFlowChunk, encoding, callback) {
207
208
  if (Buffer.isBuffer(chunk.payload))
208
209
  callback(new Error("invalid chunk payload type"))
@@ -63,6 +63,7 @@ export default class SpeechFlowNodeSubtitle extends SpeechFlowNode {
63
63
  readableObjectMode: true,
64
64
  writableObjectMode: true,
65
65
  decodeStrings: false,
66
+ highWaterMark: 1,
66
67
  transform (chunk: SpeechFlowChunk, encoding, callback) {
67
68
  if (Buffer.isBuffer(chunk.payload))
68
69
  callback(new Error("invalid chunk payload type"))
@@ -200,6 +200,7 @@ export default class SpeechFlowNodeTransformers extends SpeechFlowNode {
200
200
  readableObjectMode: true,
201
201
  writableObjectMode: true,
202
202
  decodeStrings: false,
203
+ highWaterMark: 1,
203
204
  transform (chunk: SpeechFlowChunk, encoding, callback) {
204
205
  if (Buffer.isBuffer(chunk.payload))
205
206
  callback(new Error("invalid chunk payload type"))
@@ -86,12 +86,13 @@ export default class SpeechFlowNodeFilter extends SpeechFlowNode {
86
86
  writableObjectMode: true,
87
87
  readableObjectMode: true,
88
88
  decodeStrings: false,
89
+ highWaterMark: 1,
89
90
  transform (chunk: SpeechFlowChunk, encoding, callback) {
90
91
  let val1: any
91
92
  const val2: any = self.params.val
92
93
  const m = self.params.var.match(/^meta:(.+)$/)
93
94
  if (m !== null)
94
- val1 = chunk.meta.get(m[1])
95
+ val1 = chunk.meta.get(m[1]) ?? ""
95
96
  else if (self.params.key === "payload:length")
96
97
  val1 = chunk.payload.length
97
98
  else if (self.params.key === "payload:text")
@@ -100,7 +101,7 @@ export default class SpeechFlowNodeFilter extends SpeechFlowNode {
100
101
  val1 = chunk.timestampStart.toMillis()
101
102
  else if (self.params.key === "time:end")
102
103
  val1 = chunk.timestampEnd.toMillis()
103
- if (comparison(val1, self.params.ops, val2))
104
+ if (comparison(val1, self.params.op, val2))
104
105
  this.push(chunk)
105
106
  callback()
106
107
  },
@@ -49,6 +49,7 @@ export default class SpeechFlowNodeTrace extends SpeechFlowNode {
49
49
  writableObjectMode: true,
50
50
  readableObjectMode: true,
51
51
  decodeStrings: false,
52
+ highWaterMark: 1,
52
53
  transform (chunk: SpeechFlowChunk, encoding, callback) {
53
54
  let error: Error | undefined
54
55
  const fmtTime = (t: Duration) => t.toFormat("hh:mm:ss.SSS")
@@ -74,12 +75,12 @@ export default class SpeechFlowNodeTrace extends SpeechFlowNode {
74
75
  }
75
76
  else {
76
77
  if (type === "text")
77
- log("debug", `${type} chunk: type=${chunk.type}` +
78
+ log("debug", `${type} chunk: type=${chunk.type} ` +
78
79
  `kind=${chunk.kind} ` +
79
80
  `start=${fmtTime(chunk.timestampStart)} ` +
80
81
  `end=${fmtTime(chunk.timestampEnd)} ` +
81
82
  `payload-type=String payload-length=${chunk.payload.length} ` +
82
- `payload-encoding=${encoding} payload-content="${chunk.payload.toString()}" ` +
83
+ `payload-content="${chunk.payload.toString()}" ` +
83
84
  `meta=${fmtMeta(chunk.meta)}`)
84
85
  else
85
86
  error = new Error(`${type} chunk: seen String instead of Buffer chunk type`)
@@ -199,6 +199,7 @@ export default class SpeechFlowNodeDevice extends SpeechFlowNode {
199
199
  async close () {
200
200
  /* shutdown PortAudio */
201
201
  if (this.io !== null) {
202
+ this.io.abort()
202
203
  this.io.quit()
203
204
  this.io = null
204
205
  }
@@ -111,6 +111,7 @@ export default class SpeechFlowNodeMQTT extends SpeechFlowNode {
111
111
  writableObjectMode: true,
112
112
  readableObjectMode: true,
113
113
  decodeStrings: false,
114
+ highWaterMark: 1,
114
115
  write (chunk: SpeechFlowChunk, encoding, callback) {
115
116
  if (mode === "r")
116
117
  callback(new Error("write operation on read-only node"))
@@ -114,6 +114,7 @@ export default class SpeechFlowNodeWebsocket extends SpeechFlowNode {
114
114
  writableObjectMode: true,
115
115
  readableObjectMode: true,
116
116
  decodeStrings: false,
117
+ highWaterMark: 1,
117
118
  write (chunk: SpeechFlowChunk, encoding, callback) {
118
119
  if (mode === "r")
119
120
  callback(new Error("write operation on read-only node"))
@@ -195,6 +196,7 @@ export default class SpeechFlowNodeWebsocket extends SpeechFlowNode {
195
196
  writableObjectMode: true,
196
197
  readableObjectMode: true,
197
198
  decodeStrings: false,
199
+ highWaterMark: 1,
198
200
  write (chunk: SpeechFlowChunk, encoding, callback) {
199
201
  if (mode === "r")
200
202
  callback(new Error("write operation on read-only node"))
@@ -68,6 +68,7 @@ export function createTransformStreamForWritableSide () {
68
68
  readableObjectMode: true,
69
69
  writableObjectMode: true,
70
70
  decodeStrings: false,
71
+ highWaterMark: 1,
71
72
  transform (chunk: SpeechFlowChunk, encoding, callback) {
72
73
  this.push(chunk.payload)
73
74
  callback()
@@ -86,6 +87,7 @@ export function createTransformStreamForReadableSide (type: "text" | "audio", ge
86
87
  readableObjectMode: true,
87
88
  writableObjectMode: true,
88
89
  decodeStrings: false,
90
+ highWaterMark: (type === "audio" ? 19200 : 65536),
89
91
  transform (chunk: Buffer | string, encoding, callback) {
90
92
  const timeZero = getTimeZero()
91
93
  const start = DateTime.now().diff(timeZero)
package/src/speechflow.ts CHANGED
@@ -423,6 +423,7 @@ type wsPeerInfo = {
423
423
  }
424
424
 
425
425
  /* graph processing: PASS 3: open nodes */
426
+ const timeZero = DateTime.now()
426
427
  for (const node of graphNodes) {
427
428
  /* connect node events */
428
429
  node.on("log", (level: string, msg: string, data?: any) => {
@@ -434,20 +435,14 @@ type wsPeerInfo = {
434
435
 
435
436
  /* open node */
436
437
  cli!.log("info", `open node <${node.id}>`)
438
+ node.setTimeZero(timeZero)
437
439
  await node.open().catch((err: Error) => {
438
440
  cli!.log("error", `[${node.id}]: ${err.message}`)
439
441
  throw new Error(`failed to open node <${node.id}>`)
440
442
  })
441
443
  }
442
444
 
443
- /* graph processing: PASS 4: set time zero in all nodes */
444
- const timeZero = DateTime.now()
445
- for (const node of graphNodes) {
446
- cli!.log("info", `set time zero in node <${node.id}>`)
447
- node.setTimeZero(timeZero)
448
- }
449
-
450
- /* graph processing: PASS 5: connect node streams */
445
+ /* graph processing: PASS 4: connect node streams */
451
446
  for (const node of graphNodes) {
452
447
  if (node.stream === null)
453
448
  throw new Error(`stream of node <${node.id}> still not initialized`)