speechflow 0.9.9 → 1.0.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 (110) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +48 -1
  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 +147 -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.js +2 -1
  16. package/dst/speechflow-node-a2t-deepgram.js.map +1 -0
  17. package/dst/speechflow-node-t2a-elevenlabs.js +1 -0
  18. package/dst/speechflow-node-t2a-elevenlabs.js.map +1 -0
  19. package/dst/speechflow-node-t2a-kokoro.js +1 -0
  20. package/dst/speechflow-node-t2a-kokoro.js.map +1 -0
  21. package/dst/speechflow-node-t2t-deepl.js +1 -0
  22. package/dst/speechflow-node-t2t-deepl.js.map +1 -0
  23. package/dst/speechflow-node-t2t-format.js +1 -0
  24. package/dst/speechflow-node-t2t-format.js.map +1 -0
  25. package/dst/speechflow-node-t2t-ollama.js +1 -0
  26. package/dst/speechflow-node-t2t-ollama.js.map +1 -0
  27. package/dst/speechflow-node-t2t-openai.js +1 -0
  28. package/dst/speechflow-node-t2t-openai.js.map +1 -0
  29. package/dst/speechflow-node-t2t-subtitle.js +1 -0
  30. package/dst/speechflow-node-t2t-subtitle.js.map +1 -0
  31. package/dst/speechflow-node-t2t-transformers.js +10 -6
  32. package/dst/speechflow-node-t2t-transformers.js.map +1 -0
  33. package/dst/speechflow-node-x2x-trace.js +1 -0
  34. package/dst/speechflow-node-x2x-trace.js.map +1 -0
  35. package/dst/speechflow-node-xio-device.js +1 -0
  36. package/dst/speechflow-node-xio-device.js.map +1 -0
  37. package/dst/speechflow-node-xio-file.js +1 -0
  38. package/dst/speechflow-node-xio-file.js.map +1 -0
  39. package/dst/speechflow-node-xio-mqtt.js +1 -0
  40. package/dst/speechflow-node-xio-mqtt.js.map +1 -0
  41. package/dst/speechflow-node-xio-websocket.js +1 -0
  42. package/dst/speechflow-node-xio-websocket.js.map +1 -0
  43. package/dst/speechflow-node.d.ts +3 -0
  44. package/dst/speechflow-node.js +10 -0
  45. package/dst/speechflow-node.js.map +1 -0
  46. package/dst/speechflow-utils.d.ts +33 -0
  47. package/dst/speechflow-utils.js +183 -1
  48. package/dst/speechflow-utils.js.map +1 -0
  49. package/dst/speechflow.js +209 -6
  50. package/dst/speechflow.js.map +1 -0
  51. package/etc/speechflow.yaml +5 -3
  52. package/etc/stx.conf +1 -1
  53. package/etc/tsconfig.json +2 -2
  54. package/package.json +14 -8
  55. package/src/speechflow-node-a2a-meter.ts +125 -0
  56. package/src/speechflow-node-a2a-mute.ts +101 -0
  57. package/src/speechflow-node-a2a-vad.ts +266 -0
  58. package/src/speechflow-node-a2t-deepgram.ts +1 -1
  59. package/src/speechflow-node-t2t-transformers.ts +12 -7
  60. package/src/speechflow-node-xio-websocket.ts +5 -5
  61. package/src/speechflow-node.ts +12 -0
  62. package/src/speechflow-utils.ts +195 -0
  63. package/src/speechflow.ts +193 -6
  64. package/dst/speechflow-node-deepgram.d.ts +0 -12
  65. package/dst/speechflow-node-deepgram.js +0 -220
  66. package/dst/speechflow-node-deepl.d.ts +0 -12
  67. package/dst/speechflow-node-deepl.js +0 -128
  68. package/dst/speechflow-node-device.d.ts +0 -13
  69. package/dst/speechflow-node-device.js +0 -205
  70. package/dst/speechflow-node-elevenlabs.d.ts +0 -13
  71. package/dst/speechflow-node-elevenlabs.js +0 -182
  72. package/dst/speechflow-node-ffmpeg.d.ts +0 -13
  73. package/dst/speechflow-node-ffmpeg.js +0 -152
  74. package/dst/speechflow-node-file.d.ts +0 -11
  75. package/dst/speechflow-node-file.js +0 -176
  76. package/dst/speechflow-node-format.d.ts +0 -11
  77. package/dst/speechflow-node-format.js +0 -80
  78. package/dst/speechflow-node-gemma.js +0 -213
  79. package/dst/speechflow-node-mqtt.d.ts +0 -13
  80. package/dst/speechflow-node-mqtt.js +0 -181
  81. package/dst/speechflow-node-opus.d.ts +0 -12
  82. package/dst/speechflow-node-opus.js +0 -135
  83. package/dst/speechflow-node-subtitle.d.ts +0 -12
  84. package/dst/speechflow-node-subtitle.js +0 -96
  85. package/dst/speechflow-node-t2t-gemma.d.ts +0 -13
  86. package/dst/speechflow-node-t2t-gemma.js +0 -233
  87. package/dst/speechflow-node-t2t-opus.d.ts +0 -12
  88. package/dst/speechflow-node-t2t-opus.js +0 -135
  89. package/dst/speechflow-node-trace.d.ts +0 -11
  90. package/dst/speechflow-node-trace.js +0 -88
  91. package/dst/speechflow-node-wav.d.ts +0 -11
  92. package/dst/speechflow-node-wav.js +0 -170
  93. package/dst/speechflow-node-websocket.d.ts +0 -13
  94. package/dst/speechflow-node-websocket.js +0 -275
  95. package/dst/speechflow-node-whisper-common.d.ts +0 -34
  96. package/dst/speechflow-node-whisper-common.js +0 -7
  97. package/dst/speechflow-node-whisper-ggml.d.ts +0 -1
  98. package/dst/speechflow-node-whisper-ggml.js +0 -97
  99. package/dst/speechflow-node-whisper-onnx.d.ts +0 -1
  100. package/dst/speechflow-node-whisper-onnx.js +0 -131
  101. package/dst/speechflow-node-whisper-worker-ggml.d.ts +0 -1
  102. package/dst/speechflow-node-whisper-worker-ggml.js +0 -97
  103. package/dst/speechflow-node-whisper-worker-onnx.d.ts +0 -1
  104. package/dst/speechflow-node-whisper-worker-onnx.js +0 -131
  105. package/dst/speechflow-node-whisper-worker.d.ts +0 -1
  106. package/dst/speechflow-node-whisper-worker.js +0 -116
  107. package/dst/speechflow-node-whisper-worker2.d.ts +0 -1
  108. package/dst/speechflow-node-whisper-worker2.js +0 -82
  109. package/dst/speechflow-node-whisper.d.ts +0 -19
  110. package/dst/speechflow-node-whisper.js +0 -604
package/dst/speechflow.js CHANGED
@@ -5,6 +5,39 @@
5
5
  ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
6
6
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
7
7
  */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
8
41
  var __importDefault = (this && this.__importDefault) || function (mod) {
9
42
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
43
  };
@@ -13,6 +46,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
46
  const node_path_1 = __importDefault(require("node:path"));
14
47
  const node_stream_1 = __importDefault(require("node:stream"));
15
48
  const node_events_1 = require("node:events");
49
+ const HAPI = __importStar(require("@hapi/hapi"));
50
+ const hapi_plugin_websocket_1 = __importDefault(require("hapi-plugin-websocket"));
51
+ const hapi_plugin_header_1 = __importDefault(require("hapi-plugin-header"));
16
52
  /* external dependencies */
17
53
  const luxon_1 = require("luxon");
18
54
  const cli_io_1 = __importDefault(require("cli-io"));
@@ -24,6 +60,7 @@ const object_path_1 = __importDefault(require("object-path"));
24
60
  const installed_packages_1 = __importDefault(require("installed-packages"));
25
61
  const dotenvx_1 = __importDefault(require("@dotenvx/dotenvx"));
26
62
  const syspath_1 = __importDefault(require("syspath"));
63
+ const arktype = __importStar(require("arktype"));
27
64
  const package_json_1 = __importDefault(require("../package.json"));
28
65
  /* central CLI context */
29
66
  let cli = null;
@@ -41,6 +78,8 @@ let cli = null;
41
78
  "[-h|--help] " +
42
79
  "[-V|--version] " +
43
80
  "[-v|--verbose <level>] " +
81
+ "[-a|--address <ip-address>] " +
82
+ "[-p|--port <tcp-port>] " +
44
83
  "[-C|--cache <directory>] " +
45
84
  "[-e|--expression <expression>] " +
46
85
  "[-f|--file <file>] " +
@@ -62,6 +101,24 @@ let cli = null;
62
101
  nargs: 1,
63
102
  default: "warning",
64
103
  describe: "level for verbose logging ('none', 'error', 'warning', 'info', 'debug')"
104
+ })
105
+ .option("a", {
106
+ alias: "address",
107
+ type: "string",
108
+ array: false,
109
+ coerce,
110
+ nargs: 1,
111
+ default: "0.0.0.0",
112
+ describe: "IP address for REST/WebSocket API"
113
+ })
114
+ .option("p", {
115
+ alias: "port",
116
+ type: "number",
117
+ array: false,
118
+ coerce,
119
+ nargs: 1,
120
+ default: 8484,
121
+ describe: "TCP port for REST/WebSocket API"
65
122
  })
66
123
  .option("C", {
67
124
  alias: "cache",
@@ -174,6 +231,9 @@ let cli = null;
174
231
  const pkgsI = [
175
232
  "./speechflow-node-a2a-ffmpeg.js",
176
233
  "./speechflow-node-a2a-wav.js",
234
+ "./speechflow-node-a2a-mute.js",
235
+ "./speechflow-node-a2a-meter.js",
236
+ "./speechflow-node-a2a-vad.js",
177
237
  "./speechflow-node-a2t-deepgram.js",
178
238
  "./speechflow-node-t2a-elevenlabs.js",
179
239
  "./speechflow-node-t2a-kokoro.js",
@@ -181,7 +241,6 @@ let cli = null;
181
241
  "./speechflow-node-t2t-openai.js",
182
242
  "./speechflow-node-t2t-ollama.js",
183
243
  "./speechflow-node-t2t-transformers.js",
184
- "./speechflow-node-t2t-opus.js",
185
244
  "./speechflow-node-t2t-subtitle.js",
186
245
  "./speechflow-node-t2t-format.js",
187
246
  "./speechflow-node-x2x-trace.js",
@@ -223,9 +282,9 @@ let cli = null;
223
282
  cli.log("debug", msg);
224
283
  }
225
284
  });
226
- let nodenum = 1;
227
285
  const variables = { argv: args._, env: process.env };
228
286
  const graphNodes = new Set();
287
+ const nodeNums = new Map();
229
288
  const cfg = {
230
289
  audioChannels: 1,
231
290
  audioBitDepth: 16,
@@ -261,17 +320,19 @@ let cli = null;
261
320
  throw new Error(`unknown node "${id}"`);
262
321
  let node;
263
322
  try {
264
- node = new nodes[id](`${id}[${nodenum}]`, cfg, opts, args);
323
+ let num = nodeNums.get(nodes[id]) ?? 0;
324
+ nodeNums.set(nodes[id], ++num);
325
+ const name = num === 1 ? id : `${id}:${num}`;
326
+ node = new nodes[id](name, cfg, opts, args);
265
327
  }
266
328
  catch (err) {
267
329
  /* fatal error */
268
330
  if (err instanceof Error)
269
- cli.log("error", `creation of "${id}[${nodenum}]" node failed: ${err.message}`);
331
+ cli.log("error", `creation of <${id}> node failed: ${err.message}`);
270
332
  else
271
- cli.log("error", `creation of "${id}"[${nodenum}] node failed: ${err}`);
333
+ cli.log("error", `creation of <${id}> node failed: ${err}`);
272
334
  process.exit(1);
273
335
  }
274
- nodenum++;
275
336
  const params = Object.keys(node.params)
276
337
  .map((key) => `${key}: ${JSON.stringify(node.params[key])}`).join(", ");
277
338
  cli.log("info", `create node "${node.id}" (${params})`);
@@ -377,6 +438,144 @@ let cli = null;
377
438
  }
378
439
  });
379
440
  }
441
+ /* define external request/response structure */
442
+ const requestValidator = arktype.type({
443
+ request: "string",
444
+ node: "string",
445
+ args: "unknown[]"
446
+ });
447
+ /* forward external request to target node in graph */
448
+ const consumeExternalRequest = async (_req) => {
449
+ const req = requestValidator(_req);
450
+ if (req instanceof arktype.type.errors)
451
+ throw new Error(`invalid request: ${req.summary}`);
452
+ if (req.request !== "COMMAND")
453
+ throw new Error("invalid external request (command expected)");
454
+ const name = req.node;
455
+ const args = req.args;
456
+ const foundNode = Array.from(graphNodes).find((node) => node.id === name);
457
+ if (foundNode === undefined)
458
+ cli.log("warning", `external request failed: no such node <${name}>`);
459
+ else {
460
+ await foundNode.receiveRequest(args).catch((err) => {
461
+ cli.log("warning", `external request to node <${name}> failed: ${err}`);
462
+ throw new Error(`external request to node <${name}> failed: ${err}`);
463
+ });
464
+ }
465
+ };
466
+ /* establish REST/WebSocket API */
467
+ const wsPeers = new Map();
468
+ const hapi = new HAPI.Server({
469
+ address: args.a,
470
+ port: args.p
471
+ });
472
+ await hapi.register({ plugin: hapi_plugin_header_1.default, options: { Server: `${package_json_1.default.name}/${package_json_1.default.version}` } });
473
+ await hapi.register({ plugin: hapi_plugin_websocket_1.default });
474
+ hapi.events.on("response", (request) => {
475
+ let protocol = `HTTP/${request.raw.req.httpVersion}`;
476
+ const ws = request.websocket();
477
+ if (ws.mode === "websocket") {
478
+ const wsVersion = ws.ws.protocolVersion ??
479
+ request.headers["sec-websocket-version"] ?? "13?";
480
+ protocol = `WebSocket/${wsVersion}+${protocol}`;
481
+ }
482
+ const msg = "remote=" + request.info.remoteAddress + ", " +
483
+ "method=" + request.method.toUpperCase() + ", " +
484
+ "url=" + request.url.pathname + ", " +
485
+ "protocol=" + protocol + ", " +
486
+ "response=" + ("statusCode" in request.response ? request.response.statusCode : "<unknown>");
487
+ cli.log("info", `HAPI: request: ${msg}`);
488
+ });
489
+ hapi.events.on({ name: "request", channels: ["error"] }, (request, event, tags) => {
490
+ if (event.error instanceof Error)
491
+ cli.log("error", `HAPI: request-error: ${event.error.message}`);
492
+ else
493
+ cli.log("error", `HAPI: request-error: ${event.error}`);
494
+ });
495
+ hapi.events.on("log", (event, tags) => {
496
+ if (tags.error) {
497
+ const err = event.error;
498
+ if (err instanceof Error)
499
+ cli.log("error", `HAPI: log: ${err.message}`);
500
+ else
501
+ cli.log("error", `HAPI: log: ${err}`);
502
+ }
503
+ });
504
+ hapi.route({
505
+ method: "GET",
506
+ path: "/api/{req}/{node}/{params*}",
507
+ options: {},
508
+ handler: (request, h) => {
509
+ const peer = request.info.remoteAddress;
510
+ const req = {
511
+ request: request.params.req,
512
+ node: request.params.node,
513
+ args: (request.params.params ?? "").split("/").filter((seg) => seg !== "")
514
+ };
515
+ cli.log("info", `HAPI: peer ${peer}: GET: ${JSON.stringify(req)}`);
516
+ return consumeExternalRequest(req).then(() => {
517
+ return h.response({ response: "OK" }).code(200);
518
+ }).catch((err) => {
519
+ return h.response({ response: "ERROR", data: err.message }).code(417);
520
+ });
521
+ }
522
+ });
523
+ hapi.route({
524
+ method: "POST",
525
+ path: "/api",
526
+ options: {
527
+ payload: {
528
+ output: "data",
529
+ parse: true,
530
+ allow: "application/json"
531
+ },
532
+ plugins: {
533
+ websocket: {
534
+ autoping: 30 * 1000,
535
+ connect: (args) => {
536
+ const ctx = args.ctx;
537
+ const ws = args.ws;
538
+ const req = args.req;
539
+ const peer = `${req.socket.remoteAddress}:${req.socket.remotePort}`;
540
+ ctx.peer = peer;
541
+ wsPeers.set(peer, { ctx, ws, req });
542
+ cli.log("info", `HAPI: WebSocket: connect: peer ${peer}`);
543
+ },
544
+ disconnect: (args) => {
545
+ const ctx = args.ctx;
546
+ const peer = ctx.peer;
547
+ wsPeers.delete(peer);
548
+ cli.log("info", `HAPI: WebSocket: disconnect: peer ${peer}`);
549
+ }
550
+ }
551
+ }
552
+ },
553
+ handler: (request, h) => {
554
+ /* on WebSocket message transfer */
555
+ const peer = request.info.remoteAddress;
556
+ const req = requestValidator(request.payload);
557
+ if (req instanceof arktype.type.errors)
558
+ return h.response({ response: "ERROR", data: `invalid request: ${req.summary}` }).code(417);
559
+ cli.log("info", `HAPI: peer ${peer}: POST: ${JSON.stringify(req)}`);
560
+ return consumeExternalRequest(req).then(() => {
561
+ return h.response({ response: "OK" }).code(200);
562
+ }).catch((err) => {
563
+ return h.response({ response: "ERROR", data: err.message }).code(417);
564
+ });
565
+ }
566
+ });
567
+ await hapi.start();
568
+ cli.log("info", `HAPI: started REST/WebSocket network service: http://${args.address}:${args.port}`);
569
+ /* hook for sendResponse method of nodes */
570
+ for (const node of graphNodes) {
571
+ node.on("send-response", (args) => {
572
+ const data = JSON.stringify({ response: "NOTIFY", node: node.id, args });
573
+ for (const [peer, info] of wsPeers.entries()) {
574
+ cli.log("info", `HAPI: peer ${peer}: ${data}`);
575
+ info.ws.send(data);
576
+ }
577
+ });
578
+ }
380
579
  /* start of internal stream processing */
381
580
  cli.log("info", "**** everything established -- stream processing in SpeechFlow graph starts ****");
382
581
  /* gracefully shutdown process */
@@ -389,6 +588,9 @@ let cli = null;
389
588
  cli.log("info", "**** streams of all nodes finished -- shutting down service ****");
390
589
  else
391
590
  cli.log("warning", `**** received signal ${signal} -- shutting down service ****`);
591
+ /* shutdown HAPI service */
592
+ cli.log("info", `HAPI: stopping REST/WebSocket network service: http://${args.address}:${args.port}`);
593
+ await hapi.stop();
392
594
  /* graph processing: PASS 1: disconnect node streams */
393
595
  for (const node of graphNodes) {
394
596
  if (node.stream === null) {
@@ -462,3 +664,4 @@ let cli = null;
462
664
  process.stderr.write(`${package_json_1.default.name}: ERROR: ${err.message}\n`);
463
665
  process.exit(1);
464
666
  });
667
+ //# sourceMappingURL=speechflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechflow.js","sourceRoot":"","sources":["../src/speechflow.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,11 @@
4
4
 
5
5
  # Capture audio from microphone device into WAV audio file
6
6
  capturing: |
7
- device(device: "wasapi:VoiceMeeter Out B1", mode: "r") |
8
- wav(mode: "encode") |
9
- file(path: "capture.wav", mode: "w", type: "audio")
7
+ device(device: "coreaudio:Elgato Wave:3", mode: "r") |
8
+ vad() |
9
+ meter(1000) |
10
+ wav(mode: "encode") |
11
+ file(path: "capture.wav", mode: "w", type: "audio")
10
12
 
11
13
  # Pass-through audio from microphone device to speaker
12
14
  # device and in parallel record it to WAV audio file
package/etc/stx.conf CHANGED
@@ -48,7 +48,7 @@ server-delay
48
48
 
49
49
  # run program
50
50
  server
51
- node dst/speechflow.js -v info -c studio@etc/speechflow.yaml "$@"
51
+ node --enable-source-maps dst/speechflow.js -v info -c studio@etc/speechflow.yaml "$@"
52
52
 
53
53
  # run program with file watching
54
54
  server-watch
package/etc/tsconfig.json CHANGED
@@ -7,16 +7,16 @@
7
7
  "useDefineForClassFields": true,
8
8
  "composite": false,
9
9
  "strict": true,
10
- "jsx": "preserve",
11
10
  "resolveJsonModule": true,
12
11
  "isolatedModules": true,
13
12
  "esModuleInterop": true,
14
- "lib": [ "es2022" ],
13
+ "lib": [ "es2024" ],
15
14
  "skipLibCheck": true,
16
15
  "noEmit": false,
17
16
  "declaration": true,
18
17
  "emitDeclarationOnly": false,
19
18
  "types": [ "node" ],
19
+ "sourceMap": true,
20
20
  "rootDir": "../src"
21
21
  },
22
22
  "include": [
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "speechflow",
3
- "version": "0.9.9",
4
- "x-stdver": "0.9.9-EA",
5
- "x-release": "2025-07-13",
3
+ "version": "1.0.0",
4
+ "x-stdver": "1.0.0-GA",
5
+ "x-release": "2025-07-16",
6
6
  "homepage": "https://github.com/rse/speechflow",
7
7
  "description": "Speech Processing Flow Graph",
8
8
  "license": "GPL-3.0-only",
@@ -26,16 +26,20 @@
26
26
  "@elevenlabs/elevenlabs-js": "2.6.0",
27
27
  "stream-transform": "3.4.0",
28
28
  "get-stream": "9.0.1",
29
- "@dotenvx/dotenvx": "1.47.5",
29
+ "@dotenvx/dotenvx": "1.47.6",
30
30
  "speex-resampler": "3.0.1",
31
31
  "pcm-convert": "1.6.5",
32
32
  "object-path": "0.11.8",
33
33
  "ws": "8.18.3",
34
34
  "bufferutil": "4.0.9",
35
35
  "utf-8-validate": "6.0.5",
36
+ "@hapi/hapi": "21.4.0",
37
+ "@hapi/boom": "10.0.1",
38
+ "hapi-plugin-header": "1.1.8",
39
+ "hapi-plugin-websocket": "2.4.11",
36
40
  "@opensumi/reconnecting-websocket": "4.4.0",
37
41
  "ollama": "0.5.16",
38
- "openai": "5.9.0",
42
+ "openai": "5.10.0",
39
43
  "@rse/ffmpeg": "1.4.2",
40
44
  "ffmpeg-stream": "1.0.1",
41
45
  "installed-packages": "1.0.13",
@@ -43,8 +47,10 @@
43
47
  "wav": "1.0.2",
44
48
  "mqtt": "5.13.2",
45
49
  "cbor2": "2.0.1",
50
+ "arktype": "2.1.20",
46
51
  "pure-uuid": "1.8.1",
47
52
  "wavefile": "11.0.0",
53
+ "audio-inspect": "0.0.2",
48
54
  "@huggingface/transformers": "3.6.3",
49
55
  "kokoro-js": "1.2.1",
50
56
  "@ericedouard/vad-node-realtime": "0.2.0",
@@ -58,14 +64,14 @@
58
64
  "eslint-plugin-promise": "7.2.1",
59
65
  "eslint-plugin-import": "2.32.0",
60
66
  "eslint-plugin-node": "11.1.0",
61
- "@typescript-eslint/eslint-plugin": "8.36.0",
62
- "@typescript-eslint/parser": "8.36.0",
67
+ "@typescript-eslint/eslint-plugin": "8.37.0",
68
+ "@typescript-eslint/parser": "8.37.0",
63
69
  "oxlint": "1.6.0",
64
70
  "eslint-plugin-oxlint": "1.6.0",
65
71
  "@biomejs/biome": "2.0.6",
66
72
  "eslint-config-biome": "1.9.4",
67
73
 
68
- "@types/node": "24.0.13",
74
+ "@types/node": "24.0.14",
69
75
  "@types/yargs": "17.0.33",
70
76
  "@types/js-yaml": "4.0.9",
71
77
  "@types/object-path": "0.11.4",
@@ -0,0 +1,125 @@
1
+ /*
2
+ ** SpeechFlow - Speech Processing Flow Graph
3
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
+ */
6
+
7
+ /* standard dependencies */
8
+ import Stream from "node:stream"
9
+
10
+ /* external dependencies */
11
+ import { getLUFS, getRMS, AudioData } from "audio-inspect"
12
+
13
+ /* internal dependencies */
14
+ import SpeechFlowNode, { SpeechFlowChunk } from "./speechflow-node"
15
+ import * as utils from "./speechflow-utils"
16
+
17
+ /* SpeechFlow node for audio metering */
18
+ export default class SpeechFlowNodeMeter extends SpeechFlowNode {
19
+ /* declare official node name */
20
+ public static name = "meter"
21
+
22
+ /* internal state */
23
+ interval: ReturnType<typeof setInterval> | null = null
24
+
25
+ /* construct node */
26
+ constructor (id: string, cfg: { [ id: string ]: any }, opts: { [ id: string ]: any }, args: any[]) {
27
+ super(id, cfg, opts, args)
28
+
29
+ /* declare node configuration parameters */
30
+ this.configure({
31
+ interval: { type: "number", val: 250 }
32
+ })
33
+
34
+ /* declare node input/output format */
35
+ this.input = "audio"
36
+ this.output = "audio"
37
+ }
38
+
39
+ /* open node */
40
+ async open () {
41
+ /* sanity check situation */
42
+ if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
43
+ throw new Error("VAD node currently supports PCM-S16LE audio only")
44
+
45
+ /* internal state */
46
+ const sampleWindowDuration = 3 /* LUFS-S requires 3s */
47
+ const sampleWindowSize = this.config.audioSampleRate * sampleWindowDuration
48
+ let sampleWindow = new Float32Array(sampleWindowSize)
49
+ sampleWindow.fill(0, 0, sampleWindowSize)
50
+ let lufss = 0
51
+ let rms = 0
52
+
53
+ /* setup loundess emitting interval */
54
+ this.interval = setInterval(() => {
55
+ this.log("info", `LUFS-S: ${lufss.toFixed(1)} dB, RMS: ${rms.toFixed(1)} dB`)
56
+ this.sendResponse([ "meter", "LUFS-S", lufss ])
57
+ this.sendResponse([ "meter", "RMS", rms ])
58
+ }, this.params.interval)
59
+
60
+ /* provide Duplex stream and internally attach to VAD */
61
+ const self = this
62
+ this.stream = new Stream.Transform({
63
+ writableObjectMode: true,
64
+ readableObjectMode: true,
65
+ decodeStrings: false,
66
+
67
+ /* transform audio chunk */
68
+ transform (chunk: SpeechFlowChunk, encoding, callback) {
69
+ if (!Buffer.isBuffer(chunk.payload))
70
+ callback(new Error("expected audio input as Buffer chunks"))
71
+ else if (chunk.payload.byteLength === 0)
72
+ callback()
73
+ else {
74
+ /* convert audio samples from PCM/I16 to PCM/F32 */
75
+ const data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian)
76
+
77
+ /* update internal audio sample sliding window */
78
+ const fusion = new Float32Array(sampleWindow.length + data.length)
79
+ fusion.set(sampleWindow, 0)
80
+ fusion.set(data, sampleWindow.length)
81
+ sampleWindow = fusion.slice(fusion.length - sampleWindowSize)
82
+
83
+ /* asynchronously calculate the LUFS-S metric */
84
+ setTimeout(() => {
85
+ const audioData = {
86
+ sampleRate: self.config.audioSampleRate,
87
+ numberOfChannels: self.config.audioChannels,
88
+ channelData: [ sampleWindow ],
89
+ duration: sampleWindowDuration,
90
+ length: sampleWindow.length
91
+ } satisfies AudioData
92
+ const lufs = getLUFS(audioData, {
93
+ channelMode: self.config.audioChannels === 1 ? "mono" : "stereo",
94
+ calculateShortTerm: true,
95
+ calculateMomentary: false,
96
+ calculateLoudnessRange: false,
97
+ calculateTruePeak: false
98
+ })
99
+ lufss = lufs.shortTerm ? lufs.shortTerm[0] : 0
100
+ rms = getRMS(audioData, { asDB: true })
101
+ }, 0)
102
+
103
+ /* pass-through original audio chunk */
104
+ this.push(chunk)
105
+ callback()
106
+ }
107
+ }
108
+ })
109
+ }
110
+
111
+ /* close node */
112
+ async close () {
113
+ /* close stream */
114
+ if (this.stream !== null) {
115
+ this.stream.destroy()
116
+ this.stream = null
117
+ }
118
+
119
+ /* stop interval */
120
+ if (this.interval !== null) {
121
+ clearInterval(this.interval)
122
+ this.interval = null
123
+ }
124
+ }
125
+ }