speechflow 1.7.0 → 2.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 (169) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +425 -146
  3. package/etc/claude.md +5 -5
  4. package/etc/speechflow.yaml +2 -2
  5. package/package.json +3 -3
  6. package/speechflow-cli/dst/speechflow-main-api.js +6 -5
  7. package/speechflow-cli/dst/speechflow-main-api.js.map +1 -1
  8. package/speechflow-cli/dst/speechflow-main-graph.d.ts +1 -0
  9. package/speechflow-cli/dst/speechflow-main-graph.js +35 -13
  10. package/speechflow-cli/dst/speechflow-main-graph.js.map +1 -1
  11. package/speechflow-cli/dst/speechflow-main-status.js +3 -7
  12. package/speechflow-cli/dst/speechflow-main-status.js.map +1 -1
  13. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js +3 -0
  14. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js.map +1 -1
  15. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js +4 -2
  16. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js.map +1 -1
  17. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js +1 -1
  18. package/speechflow-cli/dst/speechflow-node-a2a-expander.js +4 -2
  19. package/speechflow-cli/dst/speechflow-node-a2a-expander.js.map +1 -1
  20. package/speechflow-cli/dst/speechflow-node-a2a-gender.js +2 -2
  21. package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -1
  22. package/speechflow-cli/dst/speechflow-node-a2a-pitch.js +1 -2
  23. package/speechflow-cli/dst/speechflow-node-a2a-pitch.js.map +1 -1
  24. package/speechflow-cli/dst/speechflow-node-a2a-wav.js +32 -5
  25. package/speechflow-cli/dst/speechflow-node-a2a-wav.js.map +1 -1
  26. package/speechflow-cli/dst/speechflow-node-a2t-amazon.d.ts +0 -1
  27. package/speechflow-cli/dst/speechflow-node-a2t-amazon.js +1 -6
  28. package/speechflow-cli/dst/speechflow-node-a2t-amazon.js.map +1 -1
  29. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.d.ts +0 -1
  30. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +9 -9
  31. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -1
  32. package/speechflow-cli/dst/speechflow-node-a2t-google.d.ts +17 -0
  33. package/speechflow-cli/dst/speechflow-node-a2t-google.js +320 -0
  34. package/speechflow-cli/dst/speechflow-node-a2t-google.js.map +1 -0
  35. package/speechflow-cli/dst/speechflow-node-a2t-openai.js +6 -4
  36. package/speechflow-cli/dst/speechflow-node-a2t-openai.js.map +1 -1
  37. package/speechflow-cli/dst/speechflow-node-t2a-amazon.js +6 -11
  38. package/speechflow-cli/dst/speechflow-node-t2a-amazon.js.map +1 -1
  39. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js +6 -5
  40. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
  41. package/speechflow-cli/dst/speechflow-node-t2a-google.d.ts +15 -0
  42. package/speechflow-cli/dst/speechflow-node-t2a-google.js +218 -0
  43. package/speechflow-cli/dst/speechflow-node-t2a-google.js.map +1 -0
  44. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.d.ts +2 -0
  45. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +19 -6
  46. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -1
  47. package/speechflow-cli/dst/speechflow-node-t2a-openai.d.ts +15 -0
  48. package/speechflow-cli/dst/speechflow-node-t2a-openai.js +195 -0
  49. package/speechflow-cli/dst/speechflow-node-t2a-openai.js.map +1 -0
  50. package/speechflow-cli/dst/speechflow-node-t2a-supertonic.d.ts +17 -0
  51. package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js +608 -0
  52. package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js.map +1 -0
  53. package/speechflow-cli/dst/speechflow-node-t2t-amazon.js.map +1 -1
  54. package/speechflow-cli/dst/{speechflow-node-t2t-transformers.d.ts → speechflow-node-t2t-opus.d.ts} +1 -3
  55. package/speechflow-cli/dst/speechflow-node-t2t-opus.js +159 -0
  56. package/speechflow-cli/dst/speechflow-node-t2t-opus.js.map +1 -0
  57. package/speechflow-cli/dst/speechflow-node-t2t-profanity.d.ts +11 -0
  58. package/speechflow-cli/dst/speechflow-node-t2t-profanity.js +118 -0
  59. package/speechflow-cli/dst/speechflow-node-t2t-profanity.js.map +1 -0
  60. package/speechflow-cli/dst/speechflow-node-t2t-punctuation.d.ts +13 -0
  61. package/speechflow-cli/dst/speechflow-node-t2t-punctuation.js +220 -0
  62. package/speechflow-cli/dst/speechflow-node-t2t-punctuation.js.map +1 -0
  63. package/speechflow-cli/dst/{speechflow-node-t2t-openai.d.ts → speechflow-node-t2t-spellcheck.d.ts} +2 -2
  64. package/speechflow-cli/dst/{speechflow-node-t2t-openai.js → speechflow-node-t2t-spellcheck.js} +47 -99
  65. package/speechflow-cli/dst/speechflow-node-t2t-spellcheck.js.map +1 -0
  66. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +3 -6
  67. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -1
  68. package/speechflow-cli/dst/speechflow-node-t2t-summary.d.ts +16 -0
  69. package/speechflow-cli/dst/speechflow-node-t2t-summary.js +241 -0
  70. package/speechflow-cli/dst/speechflow-node-t2t-summary.js.map +1 -0
  71. package/speechflow-cli/dst/{speechflow-node-t2t-ollama.d.ts → speechflow-node-t2t-translate.d.ts} +2 -2
  72. package/speechflow-cli/dst/{speechflow-node-t2t-transformers.js → speechflow-node-t2t-translate.js} +53 -115
  73. package/speechflow-cli/dst/speechflow-node-t2t-translate.js.map +1 -0
  74. package/speechflow-cli/dst/speechflow-node-x2x-filter.d.ts +1 -0
  75. package/speechflow-cli/dst/speechflow-node-x2x-filter.js +10 -0
  76. package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -1
  77. package/speechflow-cli/dst/speechflow-node-x2x-trace.js.map +1 -1
  78. package/speechflow-cli/dst/speechflow-node-xio-device.js +3 -3
  79. package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -1
  80. package/speechflow-cli/dst/speechflow-node-xio-exec.d.ts +12 -0
  81. package/speechflow-cli/dst/speechflow-node-xio-exec.js +223 -0
  82. package/speechflow-cli/dst/speechflow-node-xio-exec.js.map +1 -0
  83. package/speechflow-cli/dst/speechflow-node-xio-file.d.ts +1 -0
  84. package/speechflow-cli/dst/speechflow-node-xio-file.js +80 -67
  85. package/speechflow-cli/dst/speechflow-node-xio-file.js.map +1 -1
  86. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +2 -1
  87. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -1
  88. package/speechflow-cli/dst/speechflow-node-xio-vban.d.ts +17 -0
  89. package/speechflow-cli/dst/speechflow-node-xio-vban.js +330 -0
  90. package/speechflow-cli/dst/speechflow-node-xio-vban.js.map +1 -0
  91. package/speechflow-cli/dst/speechflow-node-xio-webrtc.d.ts +39 -0
  92. package/speechflow-cli/dst/speechflow-node-xio-webrtc.js +500 -0
  93. package/speechflow-cli/dst/speechflow-node-xio-webrtc.js.map +1 -0
  94. package/speechflow-cli/dst/speechflow-node-xio-websocket.js +2 -1
  95. package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -1
  96. package/speechflow-cli/dst/speechflow-util-audio.js +5 -6
  97. package/speechflow-cli/dst/speechflow-util-audio.js.map +1 -1
  98. package/speechflow-cli/dst/speechflow-util-error.d.ts +1 -1
  99. package/speechflow-cli/dst/speechflow-util-error.js +5 -7
  100. package/speechflow-cli/dst/speechflow-util-error.js.map +1 -1
  101. package/speechflow-cli/dst/speechflow-util-llm.d.ts +35 -0
  102. package/speechflow-cli/dst/speechflow-util-llm.js +363 -0
  103. package/speechflow-cli/dst/speechflow-util-llm.js.map +1 -0
  104. package/speechflow-cli/dst/speechflow-util-misc.d.ts +1 -1
  105. package/speechflow-cli/dst/speechflow-util-misc.js +4 -4
  106. package/speechflow-cli/dst/speechflow-util-misc.js.map +1 -1
  107. package/speechflow-cli/dst/speechflow-util-queue.js +3 -3
  108. package/speechflow-cli/dst/speechflow-util-queue.js.map +1 -1
  109. package/speechflow-cli/dst/speechflow-util-stream.js +4 -2
  110. package/speechflow-cli/dst/speechflow-util-stream.js.map +1 -1
  111. package/speechflow-cli/dst/speechflow-util.d.ts +1 -0
  112. package/speechflow-cli/dst/speechflow-util.js +1 -0
  113. package/speechflow-cli/dst/speechflow-util.js.map +1 -1
  114. package/speechflow-cli/etc/oxlint.jsonc +2 -1
  115. package/speechflow-cli/package.json +34 -17
  116. package/speechflow-cli/src/lib.d.ts +5 -0
  117. package/speechflow-cli/src/speechflow-main-api.ts +6 -5
  118. package/speechflow-cli/src/speechflow-main-graph.ts +40 -13
  119. package/speechflow-cli/src/speechflow-main-status.ts +4 -8
  120. package/speechflow-cli/src/speechflow-node-a2a-compressor-wt.ts +4 -0
  121. package/speechflow-cli/src/speechflow-node-a2a-compressor.ts +4 -2
  122. package/speechflow-cli/src/speechflow-node-a2a-expander-wt.ts +1 -1
  123. package/speechflow-cli/src/speechflow-node-a2a-expander.ts +4 -2
  124. package/speechflow-cli/src/speechflow-node-a2a-gender.ts +2 -2
  125. package/speechflow-cli/src/speechflow-node-a2a-pitch.ts +1 -2
  126. package/speechflow-cli/src/speechflow-node-a2a-wav.ts +33 -6
  127. package/speechflow-cli/src/speechflow-node-a2t-amazon.ts +6 -11
  128. package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +13 -12
  129. package/speechflow-cli/src/speechflow-node-a2t-google.ts +322 -0
  130. package/speechflow-cli/src/speechflow-node-a2t-openai.ts +8 -4
  131. package/speechflow-cli/src/speechflow-node-t2a-amazon.ts +7 -11
  132. package/speechflow-cli/src/speechflow-node-t2a-elevenlabs.ts +6 -5
  133. package/speechflow-cli/src/speechflow-node-t2a-google.ts +206 -0
  134. package/speechflow-cli/src/speechflow-node-t2a-kokoro.ts +22 -6
  135. package/speechflow-cli/src/speechflow-node-t2a-openai.ts +179 -0
  136. package/speechflow-cli/src/speechflow-node-t2a-supertonic.ts +701 -0
  137. package/speechflow-cli/src/speechflow-node-t2t-amazon.ts +2 -1
  138. package/speechflow-cli/src/speechflow-node-t2t-opus.ts +136 -0
  139. package/speechflow-cli/src/speechflow-node-t2t-profanity.ts +93 -0
  140. package/speechflow-cli/src/speechflow-node-t2t-punctuation.ts +201 -0
  141. package/speechflow-cli/src/{speechflow-node-t2t-openai.ts → speechflow-node-t2t-spellcheck.ts} +48 -107
  142. package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +3 -6
  143. package/speechflow-cli/src/speechflow-node-t2t-summary.ts +229 -0
  144. package/speechflow-cli/src/speechflow-node-t2t-translate.ts +181 -0
  145. package/speechflow-cli/src/speechflow-node-x2x-filter.ts +16 -3
  146. package/speechflow-cli/src/speechflow-node-x2x-trace.ts +3 -3
  147. package/speechflow-cli/src/speechflow-node-xio-device.ts +4 -7
  148. package/speechflow-cli/src/speechflow-node-xio-exec.ts +210 -0
  149. package/speechflow-cli/src/speechflow-node-xio-file.ts +93 -80
  150. package/speechflow-cli/src/speechflow-node-xio-mqtt.ts +3 -2
  151. package/speechflow-cli/src/speechflow-node-xio-vban.ts +325 -0
  152. package/speechflow-cli/src/speechflow-node-xio-webrtc.ts +533 -0
  153. package/speechflow-cli/src/speechflow-node-xio-websocket.ts +2 -1
  154. package/speechflow-cli/src/speechflow-util-audio-wt.ts +4 -4
  155. package/speechflow-cli/src/speechflow-util-audio.ts +10 -10
  156. package/speechflow-cli/src/speechflow-util-error.ts +9 -7
  157. package/speechflow-cli/src/speechflow-util-llm.ts +367 -0
  158. package/speechflow-cli/src/speechflow-util-misc.ts +4 -4
  159. package/speechflow-cli/src/speechflow-util-queue.ts +4 -4
  160. package/speechflow-cli/src/speechflow-util-stream.ts +5 -3
  161. package/speechflow-cli/src/speechflow-util.ts +1 -0
  162. package/speechflow-ui-db/package.json +9 -9
  163. package/speechflow-ui-st/package.json +9 -9
  164. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js +0 -293
  165. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js.map +0 -1
  166. package/speechflow-cli/dst/speechflow-node-t2t-openai.js.map +0 -1
  167. package/speechflow-cli/dst/speechflow-node-t2t-transformers.js.map +0 -1
  168. package/speechflow-cli/src/speechflow-node-t2t-ollama.ts +0 -281
  169. package/speechflow-cli/src/speechflow-node-t2t-transformers.ts +0 -247
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ /*
3
+ ** SpeechFlow - Speech Processing Flow Graph
4
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ /* standard dependencies */
45
+ const node_stream_1 = __importDefault(require("node:stream"));
46
+ /* external dependencies */
47
+ const luxon_1 = require("luxon");
48
+ const vban_1 = require("vban");
49
+ /* internal dependencies */
50
+ const speechflow_node_1 = __importStar(require("./speechflow-node"));
51
+ const util = __importStar(require("./speechflow-util"));
52
+ /* VBAN sample rate index to Hz mapping */
53
+ const sampleRateToIndex = {
54
+ 6000: 0, 12000: 1, 24000: 2, 48000: 3, 96000: 4, 192000: 5, 384000: 6,
55
+ 8000: 7, 16000: 8, 32000: 9, 64000: 10, 128000: 11, 256000: 12, 512000: 13,
56
+ 11025: 14, 22050: 15, 44100: 16, 88200: 17, 176400: 18, 352800: 19, 705600: 20
57
+ };
58
+ /* SpeechFlow node for VBAN networking */
59
+ class SpeechFlowNodeXIOVBAN extends speechflow_node_1.default {
60
+ /* declare official node name */
61
+ static name = "xio-vban";
62
+ /* internal state */
63
+ server = null;
64
+ chunkQueue = null;
65
+ frameCounter = 0;
66
+ targetAddress = "";
67
+ targetPort = 0;
68
+ /* construct node */
69
+ constructor(id, cfg, opts, args) {
70
+ super(id, cfg, opts, args);
71
+ /* declare node configuration parameters */
72
+ this.configure({
73
+ listen: { type: "string", pos: 0, val: "", match: /^(?:|\d+|.+?:\d+)$/ },
74
+ connect: { type: "string", pos: 1, val: "", match: /^(?:|.+?:\d+)$/ },
75
+ stream: { type: "string", pos: 2, val: "Stream", match: /^.{1,16}$/ },
76
+ mode: { type: "string", pos: 3, val: "rw", match: /^(?:r|w|rw)$/ }
77
+ });
78
+ /* sanity check parameters */
79
+ if (this.params.listen === "" && this.params.connect === "")
80
+ throw new Error("VBAN node requires either listen or connect mode");
81
+ if (this.params.mode === "r" && this.params.listen === "")
82
+ throw new Error("VBAN read mode requires a listen address");
83
+ if (this.params.mode === "w" && this.params.connect === "")
84
+ throw new Error("VBAN write mode requires a connect address");
85
+ /* VBAN only handles audio */
86
+ if (this.params.mode === "rw") {
87
+ this.input = "audio";
88
+ this.output = "audio";
89
+ }
90
+ else if (this.params.mode === "r") {
91
+ this.input = "none";
92
+ this.output = "audio";
93
+ }
94
+ else if (this.params.mode === "w") {
95
+ this.input = "audio";
96
+ this.output = "none";
97
+ }
98
+ }
99
+ /* parse address:port string */
100
+ parseAddress(addr, defaultPort) {
101
+ if (addr.match(/^\d+$/))
102
+ return { host: "0.0.0.0", port: Number.parseInt(addr, 10) };
103
+ const m = addr.match(/^(.+?):(\d+)$/);
104
+ if (m === null)
105
+ return { host: addr, port: defaultPort };
106
+ return { host: m[1], port: Number.parseInt(m[2], 10) };
107
+ }
108
+ /* open node */
109
+ async open() {
110
+ /* create VBAN server */
111
+ this.server = new vban_1.VBANServer({
112
+ application: {
113
+ applicationName: "SpeechFlow",
114
+ manufacturerName: "Dr. Ralf S. Engelschall",
115
+ deviceName: this.id
116
+ }
117
+ });
118
+ /* setup error handling */
119
+ this.server.on("error", (err) => {
120
+ this.log("error", `VBAN error: ${err.message}`);
121
+ });
122
+ /* setup chunk queue for incoming audio */
123
+ this.chunkQueue = new util.SingleQueue();
124
+ /* determine target for sending */
125
+ if (this.params.connect !== "") {
126
+ const target = this.parseAddress(this.params.connect, 6980);
127
+ this.targetAddress = target.host;
128
+ this.targetPort = target.port;
129
+ }
130
+ /* handle incoming VBAN packets */
131
+ this.server.on("message", (packet, sender) => {
132
+ if (this.params.mode === "w")
133
+ return;
134
+ /* only handle audio packets */
135
+ if (!(packet instanceof vban_1.VBANAudioPacket))
136
+ return;
137
+ /* optionally filter by stream name */
138
+ if (this.params.stream !== "" && packet.streamName !== this.params.stream)
139
+ return;
140
+ /* get audio data from packet */
141
+ if (!Buffer.isBuffer(packet.data)) {
142
+ this.log("warning", "VBAN packet data is not a Buffer");
143
+ return;
144
+ }
145
+ const data = packet.data;
146
+ /* convert audio format if necessary */
147
+ let audioBuffer;
148
+ const bitResolution = packet.bitResolution;
149
+ if (bitResolution === vban_1.EBitsResolutions.VBAN_DATATYPE_INT16) {
150
+ /* 16-bit signed integer - matches our format */
151
+ audioBuffer = data;
152
+ }
153
+ else if (bitResolution === vban_1.EBitsResolutions.VBAN_DATATYPE_BYTE8) {
154
+ /* 8-bit unsigned to 16-bit signed */
155
+ audioBuffer = Buffer.alloc(data.length * 2);
156
+ for (let i = 0; i < data.length; i++) {
157
+ const sample = ((data[i] - 128) / 128) * 32767;
158
+ audioBuffer.writeInt16LE(Math.round(sample), i * 2);
159
+ }
160
+ }
161
+ else if (bitResolution === vban_1.EBitsResolutions.VBAN_DATATYPE_INT24) {
162
+ /* 24-bit signed to 16-bit signed */
163
+ const samples = Math.floor(data.length / 3);
164
+ audioBuffer = Buffer.alloc(samples * 2);
165
+ for (let i = 0; i < samples; i++) {
166
+ const b0 = data[i * 3];
167
+ const b1 = data[i * 3 + 1];
168
+ const b2 = data[i * 3 + 2];
169
+ const value = ((b2 << 16) | (b1 << 8) | b0) & 0xFFFFFF;
170
+ const signed = value > 0x7FFFFF ? value - 0x1000000 : value;
171
+ const sample = (signed / 0x800000) * 32767;
172
+ audioBuffer.writeInt16LE(Math.round(sample), i * 2);
173
+ }
174
+ }
175
+ else if (bitResolution === vban_1.EBitsResolutions.VBAN_DATATYPE_INT32) {
176
+ /* 32-bit signed to 16-bit signed */
177
+ const samples = Math.floor(data.length / 4);
178
+ audioBuffer = Buffer.alloc(samples * 2);
179
+ for (let i = 0; i < samples; i++) {
180
+ const value = data.readInt32LE(i * 4);
181
+ const sample = (value / 0x80000000) * 32767;
182
+ audioBuffer.writeInt16LE(Math.round(sample), i * 2);
183
+ }
184
+ }
185
+ else if (bitResolution === vban_1.EBitsResolutions.VBAN_DATATYPE_FLOAT32) {
186
+ /* 32-bit float to 16-bit signed */
187
+ const samples = Math.floor(data.length / 4);
188
+ audioBuffer = Buffer.alloc(samples * 2);
189
+ for (let i = 0; i < samples; i++) {
190
+ const value = data.readFloatLE(i * 4);
191
+ const sample = Math.max(-32768, Math.min(32767, Math.round(value * 32767)));
192
+ audioBuffer.writeInt16LE(sample, i * 2);
193
+ }
194
+ }
195
+ else if (bitResolution === vban_1.EBitsResolutions.VBAN_DATATYPE_FLOAT64) {
196
+ /* 64-bit float to 16-bit signed */
197
+ const samples = Math.floor(data.length / 8);
198
+ audioBuffer = Buffer.alloc(samples * 2);
199
+ for (let i = 0; i < samples; i++) {
200
+ const value = data.readDoubleLE(i * 8);
201
+ const sample = Math.max(-32768, Math.min(32767, Math.round(value * 32767)));
202
+ audioBuffer.writeInt16LE(sample, i * 2);
203
+ }
204
+ }
205
+ else {
206
+ /* unsupported format */
207
+ this.log("warning", `unsupported VBAN bit resolution: ${bitResolution}`);
208
+ return;
209
+ }
210
+ /* handle channel conversion if needed */
211
+ const channels = packet.nbChannel + 1;
212
+ if (channels > 1 && this.config.audioChannels === 1) {
213
+ /* downmix to mono */
214
+ const samples = audioBuffer.length / 2 / channels;
215
+ const monoBuffer = Buffer.alloc(samples * 2);
216
+ for (let i = 0; i < samples; i++) {
217
+ let sum = 0;
218
+ for (let ch = 0; ch < channels; ch++)
219
+ sum += audioBuffer.readInt16LE((i * channels + ch) * 2);
220
+ monoBuffer.writeInt16LE(Math.round(sum / channels), i * 2);
221
+ }
222
+ audioBuffer = monoBuffer;
223
+ }
224
+ /* create chunk with timing information */
225
+ const now = luxon_1.DateTime.now();
226
+ const start = now.diff(this.timeZero);
227
+ const duration = util.audioBufferDuration(audioBuffer, this.config.audioSampleRate, this.config.audioBitDepth, this.config.audioChannels);
228
+ const end = start.plus(duration * 1000);
229
+ const chunk = new speechflow_node_1.SpeechFlowChunk(start, end, "final", "audio", audioBuffer);
230
+ this.chunkQueue?.write(chunk);
231
+ });
232
+ /* setup listening */
233
+ this.server.on("listening", () => {
234
+ const address = this.server.address();
235
+ this.log("info", `VBAN listening on ${address.address}:${address.port}`);
236
+ });
237
+ /* bind to listen port */
238
+ if (this.params.listen !== "") {
239
+ const listen = this.parseAddress(this.params.listen, 6980);
240
+ this.server.bind(listen.port, listen.host);
241
+ }
242
+ else
243
+ /* still need to bind for sending */
244
+ this.server.bind(0);
245
+ /* create duplex stream */
246
+ const self = this;
247
+ const reads = new util.PromiseSet();
248
+ this.stream = new node_stream_1.default.Duplex({
249
+ writableObjectMode: true,
250
+ readableObjectMode: true,
251
+ decodeStrings: false,
252
+ highWaterMark: 1,
253
+ write(chunk, encoding, callback) {
254
+ if (self.params.mode === "r") {
255
+ callback(new Error("write operation on read-only node"));
256
+ return;
257
+ }
258
+ if (chunk.type !== "audio") {
259
+ callback(new Error("VBAN only supports audio type"));
260
+ return;
261
+ }
262
+ if (self.targetAddress === "") {
263
+ callback(new Error("no VBAN target address configured"));
264
+ return;
265
+ }
266
+ /* get audio buffer */
267
+ const audioBuffer = chunk.payload;
268
+ /* determine VBAN sample rate index */
269
+ const sampleRateIndex = sampleRateToIndex[self.config.audioSampleRate];
270
+ if (sampleRateIndex === undefined) {
271
+ callback(new Error(`unsupported sample rate for VBAN: ${self.config.audioSampleRate}`));
272
+ return;
273
+ }
274
+ /* calculate number of samples */
275
+ const bytesPerSample = self.config.audioBitDepth / 8;
276
+ const nbSample = (audioBuffer.length / bytesPerSample / self.config.audioChannels) - 1;
277
+ if (nbSample < 0 || nbSample > 255)
278
+ self.log("warning", `VBAN nbSample out of range: ${nbSample} (clamped to 0-255)`);
279
+ /* create VBAN audio packet */
280
+ const packet = new vban_1.VBANAudioPacket({
281
+ streamName: self.params.stream,
282
+ srIndex: sampleRateIndex,
283
+ nbSample: Math.min(255, Math.max(0, nbSample)),
284
+ nbChannel: self.config.audioChannels - 1,
285
+ bitResolution: vban_1.EBitsResolutions.VBAN_DATATYPE_INT16,
286
+ codec: vban_1.ECodecs.VBAN_CODEC_PCM,
287
+ frameCounter: self.frameCounter++
288
+ }, audioBuffer);
289
+ /* send packet */
290
+ self.server.send(packet, self.targetPort, self.targetAddress)
291
+ .then(() => callback())
292
+ .catch((err) => callback(err));
293
+ },
294
+ async final(callback) {
295
+ await reads.awaitAll();
296
+ callback();
297
+ },
298
+ read(size) {
299
+ if (self.params.mode === "w")
300
+ throw new Error("read operation on write-only node");
301
+ reads.add(self.chunkQueue.read().then((chunk) => {
302
+ this.push(chunk, "binary");
303
+ }).catch((err) => {
304
+ self.log("warning", `read on chunk queue operation failed: ${err}`);
305
+ this.push(null);
306
+ }));
307
+ }
308
+ });
309
+ }
310
+ /* close node */
311
+ async close() {
312
+ /* drain and clear chunk queue reference */
313
+ if (this.chunkQueue !== null) {
314
+ this.chunkQueue.drain();
315
+ this.chunkQueue = null;
316
+ }
317
+ /* close VBAN server */
318
+ if (this.server !== null) {
319
+ this.server.close();
320
+ this.server = null;
321
+ }
322
+ /* shutdown stream */
323
+ if (this.stream !== null) {
324
+ await util.destroyStream(this.stream);
325
+ this.stream = null;
326
+ }
327
+ }
328
+ }
329
+ exports.default = SpeechFlowNodeXIOVBAN;
330
+ //# sourceMappingURL=speechflow-node-xio-vban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechflow-node-xio-vban.js","sourceRoot":"","sources":["../src/speechflow-node-xio-vban.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import SpeechFlowNode from "./speechflow-node";
2
+ export default class SpeechFlowNodeXIOWebRTC extends SpeechFlowNode {
3
+ static name: string;
4
+ private peerConnections;
5
+ private httpServer;
6
+ private chunkQueue;
7
+ private opusEncoder;
8
+ private opusDecoder;
9
+ private pcmBuffer;
10
+ private rtpSequence;
11
+ private rtpTimestamp;
12
+ private rtpSSRC;
13
+ private maxConnections;
14
+ private readonly OPUS_SAMPLE_RATE;
15
+ private readonly OPUS_CHANNELS;
16
+ private readonly OPUS_BIT_DEPTH;
17
+ private readonly OPUS_FRAME_SIZE;
18
+ private readonly OPUS_FRAME_BYTES;
19
+ constructor(id: string, cfg: {
20
+ [id: string]: any;
21
+ }, opts: {
22
+ [id: string]: any;
23
+ }, args: any[]);
24
+ private parseAddress;
25
+ private readRequestBody;
26
+ private decodeOpusToChunk;
27
+ private bufferAndEncode;
28
+ private sendOpusToAllViewers;
29
+ private parseIceServers;
30
+ private createPeerConnection;
31
+ private closePeerConnection;
32
+ private performSDPNegotiation;
33
+ private handleWHIP;
34
+ private handleWHEP;
35
+ private handleDELETE;
36
+ private cleanupConnection;
37
+ open(): Promise<void>;
38
+ close(): Promise<void>;
39
+ }