speechflow 1.0.0 → 1.2.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.
- package/CHANGELOG.md +19 -0
- package/README.md +46 -11
- package/dst/speechflow-node-a2a-gender.d.ts +17 -0
- package/dst/speechflow-node-a2a-gender.js +272 -0
- package/dst/speechflow-node-a2a-gender.js.map +1 -0
- package/dst/speechflow-node-a2a-meter.js +7 -3
- package/dst/speechflow-node-a2a-meter.js.map +1 -1
- package/dst/speechflow-node-a2a-mute.js +1 -0
- package/dst/speechflow-node-a2a-mute.js.map +1 -1
- package/dst/speechflow-node-a2a-vad.js +47 -63
- package/dst/speechflow-node-a2a-vad.js.map +1 -1
- package/dst/speechflow-node-a2a-wav.js +145 -122
- package/dst/speechflow-node-a2a-wav.js.map +1 -1
- package/dst/speechflow-node-a2t-deepgram.d.ts +3 -0
- package/dst/speechflow-node-a2t-deepgram.js +29 -4
- package/dst/speechflow-node-a2t-deepgram.js.map +1 -1
- package/dst/speechflow-node-t2a-elevenlabs.d.ts +3 -0
- package/dst/speechflow-node-t2a-elevenlabs.js +18 -6
- package/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
- package/dst/speechflow-node-t2a-kokoro.js.map +1 -1
- package/dst/speechflow-node-t2t-deepl.d.ts +3 -0
- package/dst/speechflow-node-t2t-deepl.js +8 -1
- package/dst/speechflow-node-t2t-deepl.js.map +1 -1
- package/dst/speechflow-node-t2t-format.js.map +1 -1
- package/dst/speechflow-node-t2t-ollama.js.map +1 -1
- package/dst/speechflow-node-t2t-openai.js +1 -1
- package/dst/speechflow-node-t2t-openai.js.map +1 -1
- package/dst/speechflow-node-t2t-subtitle.js.map +1 -1
- package/dst/speechflow-node-t2t-transformers.js.map +1 -1
- package/dst/speechflow-node-x2x-filter.d.ts +11 -0
- package/dst/speechflow-node-x2x-filter.js +113 -0
- package/dst/speechflow-node-x2x-filter.js.map +1 -0
- package/dst/speechflow-node-x2x-trace.js +25 -11
- package/dst/speechflow-node-x2x-trace.js.map +1 -1
- package/dst/speechflow-node-xio-device.js +17 -6
- package/dst/speechflow-node-xio-device.js.map +1 -1
- package/dst/speechflow-node-xio-file.js +61 -28
- package/dst/speechflow-node-xio-file.js.map +1 -1
- package/dst/speechflow-node-xio-mqtt.js +7 -5
- package/dst/speechflow-node-xio-mqtt.js.map +1 -1
- package/dst/speechflow-node-xio-websocket.js +5 -5
- package/dst/speechflow-node-xio-websocket.js.map +1 -1
- package/dst/speechflow-node.d.ts +5 -1
- package/dst/speechflow-node.js +9 -2
- package/dst/speechflow-node.js.map +1 -1
- package/dst/speechflow-utils.d.ts +14 -1
- package/dst/speechflow-utils.js +110 -2
- package/dst/speechflow-utils.js.map +1 -1
- package/dst/speechflow.js +73 -14
- package/dst/speechflow.js.map +1 -1
- package/etc/speechflow.yaml +53 -26
- package/package.json +12 -10
- package/src/speechflow-node-a2a-gender.ts +272 -0
- package/src/speechflow-node-a2a-meter.ts +8 -4
- package/src/speechflow-node-a2a-mute.ts +1 -0
- package/src/speechflow-node-a2a-vad.ts +58 -68
- package/src/speechflow-node-a2a-wav.ts +128 -91
- package/src/speechflow-node-a2t-deepgram.ts +32 -5
- package/src/speechflow-node-t2a-elevenlabs.ts +21 -8
- package/src/speechflow-node-t2a-kokoro.ts +3 -3
- package/src/speechflow-node-t2t-deepl.ts +11 -3
- package/src/speechflow-node-t2t-format.ts +2 -2
- package/src/speechflow-node-t2t-ollama.ts +2 -2
- package/src/speechflow-node-t2t-openai.ts +3 -3
- package/src/speechflow-node-t2t-subtitle.ts +1 -1
- package/src/speechflow-node-t2t-transformers.ts +2 -2
- package/src/speechflow-node-x2x-filter.ts +122 -0
- package/src/speechflow-node-x2x-trace.ts +29 -12
- package/src/speechflow-node-xio-device.ts +24 -9
- package/src/speechflow-node-xio-file.ts +76 -36
- package/src/speechflow-node-xio-mqtt.ts +11 -9
- package/src/speechflow-node-xio-websocket.ts +7 -7
- package/src/speechflow-node.ts +11 -2
- package/src/speechflow-utils.ts +81 -2
- package/src/speechflow.ts +96 -35
|
@@ -45,9 +45,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
45
45
|
const node_stream_1 = __importDefault(require("node:stream"));
|
|
46
46
|
/* external dependencies */
|
|
47
47
|
const vad_node_realtime_1 = require("@ericedouard/vad-node-realtime");
|
|
48
|
-
const luxon_1 = require("luxon");
|
|
49
48
|
/* internal dependencies */
|
|
50
|
-
const speechflow_node_1 =
|
|
49
|
+
const speechflow_node_1 = __importDefault(require("./speechflow-node"));
|
|
51
50
|
const utils = __importStar(require("./speechflow-utils"));
|
|
52
51
|
/* SpeechFlow node for VAD speech-to-speech processing */
|
|
53
52
|
class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
@@ -106,10 +105,21 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
106
105
|
log("info", "VAD: speech end (segment too short)");
|
|
107
106
|
},
|
|
108
107
|
onFrameProcessed: (audio) => {
|
|
109
|
-
/* annotate the current audio
|
|
108
|
+
/* annotate the current audio segment */
|
|
110
109
|
const element = this.queueVAD.peek();
|
|
111
|
-
if (element
|
|
112
|
-
|
|
110
|
+
if (element === undefined || element.type !== "audio-frame")
|
|
111
|
+
throw new Error("internal error which cannot happen: no more queued element");
|
|
112
|
+
const segment = element.segmentData[element.segmentIdx++];
|
|
113
|
+
segment.isSpeech = (audio.isSpeech > audio.notSpeech);
|
|
114
|
+
/* annotate the entire audio chunk */
|
|
115
|
+
if (element.segmentIdx >= element.segmentData.length) {
|
|
116
|
+
let isSpeech = false;
|
|
117
|
+
for (const segment of element.segmentData) {
|
|
118
|
+
if (segment.isSpeech) {
|
|
119
|
+
isSpeech = true;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
113
123
|
element.isSpeech = isSpeech;
|
|
114
124
|
this.queueVAD.touch();
|
|
115
125
|
this.queueVAD.walk(+1);
|
|
@@ -118,14 +128,7 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
118
128
|
});
|
|
119
129
|
this.vad.start();
|
|
120
130
|
/* provide Duplex stream and internally attach to VAD */
|
|
121
|
-
const
|
|
122
|
-
const cfg = this.config;
|
|
123
|
-
const queue = this.queue;
|
|
124
|
-
const queueRecv = this.queueRecv;
|
|
125
|
-
const queueSend = this.queueSend;
|
|
126
|
-
const mode = this.params.mode;
|
|
127
|
-
let carrySamples = new Float32Array();
|
|
128
|
-
let carryStart = luxon_1.Duration.fromDurationLike(0);
|
|
131
|
+
const self = this;
|
|
129
132
|
this.stream = new node_stream_1.default.Duplex({
|
|
130
133
|
writableObjectMode: true,
|
|
131
134
|
readableObjectMode: true,
|
|
@@ -138,58 +141,38 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
138
141
|
callback();
|
|
139
142
|
else {
|
|
140
143
|
/* convert audio samples from PCM/I16 to PCM/F32 */
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
start = carryStart;
|
|
146
|
-
const merged = new Float32Array(carrySamples.length + data.length);
|
|
147
|
-
merged.set(carrySamples);
|
|
148
|
-
merged.set(data, carrySamples.length);
|
|
149
|
-
data = merged;
|
|
150
|
-
carrySamples = new Float32Array();
|
|
151
|
-
}
|
|
152
|
-
/* queue audio samples as individual VAD-sized frames
|
|
153
|
-
and in parallel send it into the Voice Activity Detection (VAD) */
|
|
154
|
-
const chunkSize = (vadSamplesPerFrame * (cfg.audioSampleRate / vadSampleRateTarget));
|
|
144
|
+
const data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
|
|
145
|
+
/* segment audio samples as individual VAD-sized frames */
|
|
146
|
+
const segmentData = [];
|
|
147
|
+
const chunkSize = vadSamplesPerFrame * (self.config.audioSampleRate / vadSampleRateTarget);
|
|
155
148
|
const chunks = Math.trunc(data.length / chunkSize);
|
|
156
149
|
for (let i = 0; i < chunks; i++) {
|
|
157
150
|
const frame = data.slice(i * chunkSize, (i + 1) * chunkSize);
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
const end = start.plus(duration);
|
|
161
|
-
const chunk = new speechflow_node_1.SpeechFlowChunk(start, end, "final", "audio", buf);
|
|
162
|
-
queueRecv.append({ type: "audio-frame", chunk });
|
|
163
|
-
vad.processAudio(frame);
|
|
164
|
-
start = end;
|
|
151
|
+
const segment = { data: frame };
|
|
152
|
+
segmentData.push(segment);
|
|
165
153
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
154
|
+
if ((chunks * chunkSize) < data.length) {
|
|
155
|
+
const frame = new Float32Array(chunkSize);
|
|
156
|
+
frame.fill(0);
|
|
157
|
+
frame.set(data.slice(chunks * chunkSize, data.length));
|
|
158
|
+
const segment = { data: frame };
|
|
159
|
+
segmentData.push(segment);
|
|
160
|
+
}
|
|
161
|
+
/* queue the results */
|
|
162
|
+
self.queueRecv.append({
|
|
163
|
+
type: "audio-frame", chunk,
|
|
164
|
+
segmentIdx: 0, segmentData
|
|
165
|
+
});
|
|
166
|
+
/* push segments through Voice Activity Detection (VAD) */
|
|
167
|
+
for (const segment of segmentData)
|
|
168
|
+
self.vad.processAudio(segment.data);
|
|
170
169
|
callback();
|
|
171
170
|
}
|
|
172
171
|
},
|
|
173
172
|
/* receive no more audio chunks (writable side of stream) */
|
|
174
173
|
final(callback) {
|
|
175
|
-
/* flush pending audio chunks */
|
|
176
|
-
if (carrySamples.length > 0) {
|
|
177
|
-
const chunkSize = (vadSamplesPerFrame * (cfg.audioSampleRate / vadSampleRateTarget));
|
|
178
|
-
if (carrySamples.length < chunkSize) {
|
|
179
|
-
const merged = new Float32Array(chunkSize);
|
|
180
|
-
merged.set(carrySamples);
|
|
181
|
-
merged.fill(0.0, carrySamples.length, chunkSize);
|
|
182
|
-
carrySamples = merged;
|
|
183
|
-
}
|
|
184
|
-
const buf = utils.convertF32ToBuf(carrySamples);
|
|
185
|
-
const duration = utils.audioBufferDuration(buf);
|
|
186
|
-
const end = carryStart.plus(duration);
|
|
187
|
-
const chunk = new speechflow_node_1.SpeechFlowChunk(carryStart, end, "final", "audio", buf);
|
|
188
|
-
queueRecv.append({ type: "audio-frame", chunk });
|
|
189
|
-
vad.processAudio(carrySamples);
|
|
190
|
-
}
|
|
191
174
|
/* signal end of file */
|
|
192
|
-
queueRecv.append({ type: "audio-eof" });
|
|
175
|
+
self.queueRecv.append({ type: "audio-eof" });
|
|
193
176
|
callback();
|
|
194
177
|
},
|
|
195
178
|
/* send audio chunk(s) (readable side of stream) */
|
|
@@ -200,7 +183,7 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
200
183
|
const flushPendingChunks = () => {
|
|
201
184
|
let pushed = 0;
|
|
202
185
|
while (true) {
|
|
203
|
-
const element = queueSend.peek();
|
|
186
|
+
const element = self.queueSend.peek();
|
|
204
187
|
if (element === undefined)
|
|
205
188
|
break;
|
|
206
189
|
else if (element.type === "audio-eof") {
|
|
@@ -210,19 +193,20 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
210
193
|
else if (element.type === "audio-frame"
|
|
211
194
|
&& element.isSpeech === undefined)
|
|
212
195
|
break;
|
|
213
|
-
queueSend.walk(+1);
|
|
196
|
+
self.queueSend.walk(+1);
|
|
197
|
+
self.queue.trim();
|
|
214
198
|
if (element.isSpeech) {
|
|
215
199
|
this.push(element.chunk);
|
|
216
200
|
pushed++;
|
|
217
201
|
}
|
|
218
|
-
else if (mode === "silenced") {
|
|
202
|
+
else if (self.params.mode === "silenced") {
|
|
219
203
|
const chunk = element.chunk.clone();
|
|
220
204
|
const buffer = chunk.payload;
|
|
221
205
|
buffer.fill(0);
|
|
222
206
|
this.push(chunk);
|
|
223
207
|
pushed++;
|
|
224
208
|
}
|
|
225
|
-
else if (mode === "unplugged" && pushed === 0)
|
|
209
|
+
else if (self.params.mode === "unplugged" && pushed === 0)
|
|
226
210
|
/* we have to await chunks now, as in unplugged
|
|
227
211
|
mode we else would be never called again until
|
|
228
212
|
we at least once push a new chunk as the result */
|
|
@@ -231,15 +215,15 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
231
215
|
};
|
|
232
216
|
/* await forthcoming audio chunks */
|
|
233
217
|
const awaitForthcomingChunks = () => {
|
|
234
|
-
const element = queueSend.peek();
|
|
218
|
+
const element = self.queueSend.peek();
|
|
235
219
|
if (element !== undefined
|
|
236
220
|
&& element.type === "audio-frame"
|
|
237
221
|
&& element.isSpeech !== undefined)
|
|
238
222
|
flushPendingChunks();
|
|
239
223
|
else
|
|
240
|
-
queue.once("write", awaitForthcomingChunks);
|
|
224
|
+
self.queue.once("write", awaitForthcomingChunks);
|
|
241
225
|
};
|
|
242
|
-
const element = queueSend.peek();
|
|
226
|
+
const element = self.queueSend.peek();
|
|
243
227
|
if (element !== undefined && element.type === "audio-eof")
|
|
244
228
|
this.push(null);
|
|
245
229
|
else if (element !== undefined
|
|
@@ -247,7 +231,7 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
247
231
|
&& element.isSpeech !== undefined)
|
|
248
232
|
flushPendingChunks();
|
|
249
233
|
else
|
|
250
|
-
queue.once("write", awaitForthcomingChunks);
|
|
234
|
+
self.queue.once("write", awaitForthcomingChunks);
|
|
251
235
|
};
|
|
252
236
|
tryToRead();
|
|
253
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-a2a-vad.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-vad.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,6BAA6B;AAC7B,8DAA4C;AAE5C,6BAA6B;AAC7B,sEAA+D;
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-vad.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-vad.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,91 +4,93 @@
|
|
|
4
4
|
** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
5
5
|
** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
|
|
6
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
7
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
8
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
9
|
};
|
|
43
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
11
|
/* standard dependencies */
|
|
45
12
|
const node_stream_1 = __importDefault(require("node:stream"));
|
|
46
|
-
/* external dependencies */
|
|
47
|
-
const wav_1 = __importDefault(require("wav"));
|
|
48
13
|
/* internal dependencies */
|
|
49
14
|
const speechflow_node_1 = __importDefault(require("./speechflow-node"));
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
15
|
+
/* write WAV header */
|
|
16
|
+
const writeWavHeader = (length, options) => {
|
|
17
|
+
const audioFormat = options?.audioFormat ?? 0x001; /* PCM */
|
|
18
|
+
const channels = options?.channels ?? 1; /* mono */
|
|
19
|
+
const sampleRate = options?.sampleRate ?? 44100; /* 44KHz */
|
|
20
|
+
const bitDepth = options?.bitDepth ?? 16; /* 16-Bit */
|
|
21
|
+
const headerLength = 44;
|
|
22
|
+
const dataLength = length || (4294967295 - 100);
|
|
23
|
+
const fileSize = dataLength + headerLength;
|
|
24
|
+
const header = Buffer.alloc(headerLength);
|
|
25
|
+
const RIFF = Buffer.alloc(4, "RIFF");
|
|
26
|
+
const WAVE = Buffer.alloc(4, "WAVE");
|
|
27
|
+
const fmt = Buffer.alloc(4, "fmt ");
|
|
28
|
+
const data = Buffer.alloc(4, "data");
|
|
29
|
+
const byteRate = (sampleRate * channels * bitDepth) / 8;
|
|
30
|
+
const blockAlign = (channels * bitDepth) / 8;
|
|
31
|
+
let offset = 0;
|
|
32
|
+
RIFF.copy(header, offset);
|
|
33
|
+
offset += RIFF.length;
|
|
34
|
+
header.writeUInt32LE(fileSize - 8, offset);
|
|
35
|
+
offset += 4;
|
|
36
|
+
WAVE.copy(header, offset);
|
|
37
|
+
offset += WAVE.length;
|
|
38
|
+
fmt.copy(header, offset);
|
|
39
|
+
offset += fmt.length;
|
|
40
|
+
header.writeUInt32LE(16, offset);
|
|
41
|
+
offset += 4;
|
|
42
|
+
header.writeUInt16LE(audioFormat, offset);
|
|
43
|
+
offset += 2;
|
|
44
|
+
header.writeUInt16LE(channels, offset);
|
|
45
|
+
offset += 2;
|
|
46
|
+
header.writeUInt32LE(sampleRate, offset);
|
|
47
|
+
offset += 4;
|
|
48
|
+
header.writeUInt32LE(byteRate, offset);
|
|
49
|
+
offset += 4;
|
|
50
|
+
header.writeUInt16LE(blockAlign, offset);
|
|
51
|
+
offset += 2;
|
|
52
|
+
header.writeUInt16LE(bitDepth, offset);
|
|
53
|
+
offset += 2;
|
|
54
|
+
data.copy(header, offset);
|
|
55
|
+
offset += data.length;
|
|
56
|
+
header.writeUInt32LE(dataLength, offset);
|
|
57
|
+
offset += 4;
|
|
58
|
+
return header;
|
|
59
|
+
};
|
|
60
|
+
/* read WAV header */
|
|
61
|
+
const readWavHeader = (buffer) => {
|
|
62
|
+
let offset = 0;
|
|
63
|
+
const riffHead = buffer.subarray(offset, offset + 4).toString();
|
|
64
|
+
offset += 4;
|
|
65
|
+
const fileSize = buffer.readUInt32LE(offset);
|
|
66
|
+
offset += 4;
|
|
67
|
+
const waveHead = buffer.subarray(offset, offset + 4).toString();
|
|
68
|
+
offset += 4;
|
|
69
|
+
const fmtHead = buffer.subarray(offset, offset + 4).toString();
|
|
70
|
+
offset += 4;
|
|
71
|
+
const formatLength = buffer.readUInt32LE(offset);
|
|
72
|
+
offset += 4;
|
|
73
|
+
const audioFormat = buffer.readUInt16LE(offset);
|
|
74
|
+
offset += 2;
|
|
75
|
+
const channels = buffer.readUInt16LE(offset);
|
|
76
|
+
offset += 2;
|
|
77
|
+
const sampleRate = buffer.readUInt32LE(offset);
|
|
78
|
+
offset += 4;
|
|
79
|
+
const byteRate = buffer.readUInt32LE(offset);
|
|
80
|
+
offset += 4;
|
|
81
|
+
const blockAlign = buffer.readUInt16LE(offset);
|
|
82
|
+
offset += 2;
|
|
83
|
+
const bitDepth = buffer.readUInt16LE(offset);
|
|
84
|
+
offset += 2;
|
|
85
|
+
const data = buffer.subarray(offset, offset + 4).toString();
|
|
86
|
+
offset += 4;
|
|
87
|
+
const dataLength = buffer.readUInt32LE(offset);
|
|
88
|
+
offset += 4;
|
|
89
|
+
return {
|
|
90
|
+
riffHead, fileSize, waveHead, fmtHead, formatLength, audioFormat,
|
|
91
|
+
channels, sampleRate, byteRate, blockAlign, bitDepth, data, dataLength
|
|
92
|
+
};
|
|
93
|
+
};
|
|
92
94
|
/* SpeechFlow node for WAV format conversion */
|
|
93
95
|
class SpeechFlowNodeWAV extends speechflow_node_1.default {
|
|
94
96
|
/* declare official node name */
|
|
@@ -106,51 +108,72 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
|
|
|
106
108
|
}
|
|
107
109
|
/* open node */
|
|
108
110
|
async open() {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
111
|
+
/* establish a transform stream */
|
|
112
|
+
const self = this;
|
|
113
|
+
let firstChunk = true;
|
|
114
|
+
this.stream = new node_stream_1.default.Transform({
|
|
115
|
+
readableObjectMode: true,
|
|
116
|
+
writableObjectMode: true,
|
|
117
|
+
decodeStrings: false,
|
|
118
|
+
transform(chunk, encoding, callback) {
|
|
119
|
+
if (!Buffer.isBuffer(chunk.payload))
|
|
120
|
+
callback(new Error("invalid chunk payload type"));
|
|
121
|
+
else if (firstChunk) {
|
|
122
|
+
if (self.params.mode === "encode") {
|
|
123
|
+
/* convert raw/PCM to WAV/PCM
|
|
124
|
+
(NOTICE: as this is a continuous stream, the
|
|
125
|
+
resulting WAV header is not 100% conforming
|
|
126
|
+
to the WAV standard, as it has to use a zero
|
|
127
|
+
duration information. This cannot be changed in
|
|
128
|
+
a stream-based processing.) */
|
|
129
|
+
const headerBuffer = writeWavHeader(0, {
|
|
130
|
+
audioFormat: 0x0001 /* PCM */,
|
|
131
|
+
channels: self.config.audioChannels,
|
|
132
|
+
sampleRate: self.config.audioSampleRate,
|
|
133
|
+
bitDepth: self.config.audioBitDepth
|
|
134
|
+
});
|
|
135
|
+
const headerChunk = chunk.clone();
|
|
136
|
+
headerChunk.payload = headerBuffer;
|
|
137
|
+
this.push(headerChunk);
|
|
138
|
+
this.push(chunk);
|
|
139
|
+
callback();
|
|
140
|
+
}
|
|
141
|
+
else if (self.params.mode === "decode") {
|
|
142
|
+
/* convert WAV/PCM to raw/PCM */
|
|
143
|
+
const header = readWavHeader(chunk.payload);
|
|
144
|
+
self.log("info", "WAV audio stream: " +
|
|
145
|
+
`audioFormat=${header.audioFormat === 0x0001 ? "PCM" :
|
|
146
|
+
"0x" + header.audioFormat.toString(16).padStart(4, "0")} ` +
|
|
147
|
+
`channels=${header.channels} ` +
|
|
148
|
+
`sampleRate=${header.sampleRate} ` +
|
|
149
|
+
`bitDepth=${header.bitDepth}`);
|
|
150
|
+
if (header.audioFormat !== 0x0001 /* PCM */)
|
|
151
|
+
throw new Error("WAV not based on PCM format");
|
|
152
|
+
if (header.bitDepth !== 16)
|
|
153
|
+
throw new Error("WAV not based on 16 bit samples");
|
|
154
|
+
if (header.sampleRate !== 48000)
|
|
155
|
+
throw new Error("WAV not based on 48Khz sample rate");
|
|
156
|
+
if (header.channels !== 1)
|
|
157
|
+
throw new Error("WAV not based on mono channel");
|
|
158
|
+
chunk.payload = chunk.payload.subarray(44);
|
|
159
|
+
this.push(chunk);
|
|
160
|
+
callback();
|
|
161
|
+
}
|
|
162
|
+
else
|
|
163
|
+
throw new Error(`invalid operation mode "${self.params.mode}"`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
/* pass-through original chunk */
|
|
167
|
+
this.push(chunk);
|
|
168
|
+
callback();
|
|
169
|
+
}
|
|
170
|
+
firstChunk = false;
|
|
171
|
+
},
|
|
172
|
+
final(callback) {
|
|
173
|
+
this.push(null);
|
|
174
|
+
callback();
|
|
175
|
+
}
|
|
176
|
+
});
|
|
154
177
|
}
|
|
155
178
|
/* close node */
|
|
156
179
|
async close() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-a2a-wav.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-wav.ts"],"names":[],"mappings":";AAAA;;;;EAIE
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-wav.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-wav.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;AAEF,6BAA6B;AAC7B,8DAA0C;AAE1C,6BAA6B;AAC7B,wEAAmE;AAEnE,wBAAwB;AACxB,MAAM,cAAc,GAAG,CACnB,MAAc,EACd,OAA6F,EAC/F,EAAE;IACA,MAAM,WAAW,GAAI,OAAO,EAAE,WAAW,IAAI,KAAK,CAAA,CAAC,SAAS;IAC5D,MAAM,QAAQ,GAAO,OAAO,EAAE,QAAQ,IAAO,CAAC,CAAA,CAAK,UAAU;IAC7D,MAAM,UAAU,GAAK,OAAO,EAAE,UAAU,IAAK,KAAK,CAAA,CAAC,WAAW;IAC9D,MAAM,QAAQ,GAAO,OAAO,EAAE,QAAQ,IAAO,EAAE,CAAA,CAAI,YAAY;IAE/D,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,MAAM,UAAU,GAAK,MAAM,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAO,UAAU,GAAG,YAAY,CAAA;IAC9C,MAAM,MAAM,GAAS,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAE/C,MAAM,IAAI,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5C,MAAM,GAAG,GAAY,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAO,CAAC,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC3D,MAAM,UAAU,GAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAE9C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAkB,MAAM,IAAI,IAAI,CAAC,MAAM,CAAA;IACjE,MAAM,CAAC,aAAa,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAkB,MAAM,IAAI,IAAI,CAAC,MAAM,CAAA;IACjE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAmB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAA;IAChE,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAAW,MAAM,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAAE,MAAM,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAK,MAAM,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAAG,MAAM,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAK,MAAM,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAAG,MAAM,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAK,MAAM,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAkB,MAAM,IAAI,IAAI,CAAC,MAAM,CAAA;IACjE,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAAG,MAAM,IAAI,CAAC,CAAA;IAEvD,OAAO,MAAM,CAAA;AACjB,CAAC,CAAA;AAED,uBAAuB;AACvB,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAE;IACrC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,MAAM,QAAQ,GAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAAC,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,QAAQ,GAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,QAAQ,GAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAAC,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,OAAO,GAAQ,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAAC,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,WAAW,GAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,QAAQ,GAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,UAAU,GAAK,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,QAAQ,GAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,UAAU,GAAK,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,QAAQ,GAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,IAAI,GAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAAC,MAAM,IAAI,CAAC,CAAA;IAChF,MAAM,UAAU,GAAK,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAAoB,MAAM,IAAI,CAAC,CAAA;IAEhF,OAAO;QACH,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW;QAChE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU;KACzE,CAAA;AACL,CAAC,CAAA;AAED,iDAAiD;AACjD,MAAqB,iBAAkB,SAAQ,yBAAc;IACzD,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,KAAK,CAAA;IAE1B,sBAAsB;IACtB,YAAa,EAAU,EAAE,GAA4B,EAAE,IAA6B,EAAE,IAAW;QAC7F,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAE1B,6CAA6C;QAC7C,IAAI,CAAC,SAAS,CAAC;YACX,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE;SAChF,CAAC,CAAA;QAEF,wCAAwC;QACxC,IAAI,CAAC,KAAK,GAAI,OAAO,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAA;IACzB,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,IAAI;QACN,oCAAoC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAA;QACjB,IAAI,UAAU,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAM,CAAC,SAAS,CAAC;YAC/B,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAO,KAAK;YACzB,SAAS,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;gBACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC/B,QAAQ,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;qBAChD,IAAI,UAAU,EAAE,CAAC;oBAClB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAChC;;;;;2DAKmC;wBACnC,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,EAAE;4BACnC,WAAW,EAAE,MAAM,CAAC,SAAS;4BAC7B,QAAQ,EAAK,IAAI,CAAC,MAAM,CAAC,aAAa;4BACtC,UAAU,EAAG,IAAI,CAAC,MAAM,CAAC,eAAe;4BACxC,QAAQ,EAAK,IAAI,CAAC,MAAM,CAAC,aAAa;yBACzC,CAAC,CAAA;wBACF,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;wBACjC,WAAW,CAAC,OAAO,GAAG,YAAY,CAAA;wBAClC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;wBACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBAChB,QAAQ,EAAE,CAAA;oBACd,CAAC;yBACI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACrC,kCAAkC;wBAClC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;wBAC3C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB;4BACjC,eAAe,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gCAClD,IAAI,GAAI,MAAM,CAAC,WAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;4BAC1E,YAAY,MAAM,CAAC,QAAQ,GAAG;4BAC9B,cAAc,MAAM,CAAC,UAAU,GAAG;4BAClC,YAAY,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;wBAClC,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,SAAS;4BACvC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;wBAClD,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE;4BACtB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;wBACtD,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK;4BAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;wBACzD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;4BACrB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;wBACpD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;wBAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBAChB,QAAQ,EAAE,CAAA;oBACd,CAAC;;wBAEG,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAA;gBACvE,CAAC;qBACI,CAAC;oBACF,mCAAmC;oBACnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBAChB,QAAQ,EAAE,CAAA;gBACd,CAAC;gBACD,UAAU,GAAG,KAAK,CAAA;YACtB,CAAC;YACD,KAAK,CAAE,QAAQ;gBACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACf,QAAQ,EAAE,CAAA;YACd,CAAC;SACJ,CAAC,CAAA;IACN,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,KAAK;QACP,uBAAuB;QACvB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAChC,IAAI,IAAI,CAAC,MAAM,YAAY,qBAAM,CAAC,MAAM;oBACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;;oBAEpC,OAAO,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACtB,CAAC;IACL,CAAC;;AArGL,oCAsGC"}
|