speechflow 1.3.1 → 1.3.2
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 +6 -0
- package/dst/speechflow-node-a2a-gender.d.ts +2 -0
- package/dst/speechflow-node-a2a-gender.js +137 -59
- package/dst/speechflow-node-a2a-gender.js.map +1 -1
- package/dst/speechflow-node-a2a-meter.d.ts +3 -1
- package/dst/speechflow-node-a2a-meter.js +80 -39
- package/dst/speechflow-node-a2a-meter.js.map +1 -1
- package/dst/speechflow-node-a2a-mute.d.ts +1 -0
- package/dst/speechflow-node-a2a-mute.js +37 -11
- package/dst/speechflow-node-a2a-mute.js.map +1 -1
- package/dst/speechflow-node-a2a-vad.d.ts +3 -0
- package/dst/speechflow-node-a2a-vad.js +194 -96
- package/dst/speechflow-node-a2a-vad.js.map +1 -1
- package/dst/speechflow-node-a2a-wav.js +27 -11
- package/dst/speechflow-node-a2a-wav.js.map +1 -1
- package/dst/speechflow-node-a2t-deepgram.d.ts +4 -0
- package/dst/speechflow-node-a2t-deepgram.js +136 -46
- package/dst/speechflow-node-a2t-deepgram.js.map +1 -1
- package/dst/speechflow-node-t2a-elevenlabs.d.ts +2 -0
- package/dst/speechflow-node-t2a-elevenlabs.js +61 -12
- package/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
- package/dst/speechflow-node-t2a-kokoro.d.ts +1 -0
- package/dst/speechflow-node-t2a-kokoro.js +10 -4
- package/dst/speechflow-node-t2a-kokoro.js.map +1 -1
- package/dst/speechflow-node-t2t-deepl.js +8 -4
- package/dst/speechflow-node-t2t-deepl.js.map +1 -1
- package/dst/speechflow-node-t2t-format.js +2 -2
- package/dst/speechflow-node-t2t-format.js.map +1 -1
- package/dst/speechflow-node-t2t-ollama.js +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-sentence.d.ts +1 -1
- package/dst/speechflow-node-t2t-sentence.js +34 -18
- package/dst/speechflow-node-t2t-sentence.js.map +1 -1
- package/dst/speechflow-node-t2t-subtitle.d.ts +0 -1
- package/dst/speechflow-node-t2t-subtitle.js +78 -190
- package/dst/speechflow-node-t2t-subtitle.js.map +1 -1
- package/dst/speechflow-node-t2t-transformers.js +2 -2
- package/dst/speechflow-node-t2t-transformers.js.map +1 -1
- package/dst/speechflow-node-x2x-filter.js +4 -4
- package/dst/speechflow-node-x2x-trace.js +6 -13
- package/dst/speechflow-node-x2x-trace.js.map +1 -1
- package/dst/speechflow-node-xio-device.js +12 -8
- package/dst/speechflow-node-xio-device.js.map +1 -1
- package/dst/speechflow-node-xio-file.js +9 -3
- package/dst/speechflow-node-xio-file.js.map +1 -1
- package/dst/speechflow-node-xio-mqtt.js +5 -2
- package/dst/speechflow-node-xio-mqtt.js.map +1 -1
- package/dst/speechflow-node-xio-websocket.js +11 -11
- package/dst/speechflow-node-xio-websocket.js.map +1 -1
- package/dst/speechflow-node.d.ts +0 -2
- package/dst/speechflow-node.js +0 -3
- package/dst/speechflow-node.js.map +1 -1
- package/dst/speechflow-utils.d.ts +5 -0
- package/dst/speechflow-utils.js +77 -44
- package/dst/speechflow-utils.js.map +1 -1
- package/dst/speechflow.js +101 -82
- package/dst/speechflow.js.map +1 -1
- package/etc/eslint.mjs +1 -2
- package/etc/stx.conf +3 -3
- package/package.json +6 -6
- package/src/speechflow-node-a2a-gender.ts +148 -64
- package/src/speechflow-node-a2a-meter.ts +87 -40
- package/src/speechflow-node-a2a-mute.ts +39 -11
- package/src/speechflow-node-a2a-vad.ts +206 -100
- package/src/speechflow-node-a2a-wav.ts +27 -11
- package/src/speechflow-node-a2t-deepgram.ts +139 -43
- package/src/speechflow-node-t2a-elevenlabs.ts +65 -12
- package/src/speechflow-node-t2a-kokoro.ts +11 -4
- package/src/speechflow-node-t2t-deepl.ts +9 -4
- package/src/speechflow-node-t2t-format.ts +2 -2
- package/src/speechflow-node-t2t-ollama.ts +1 -1
- package/src/speechflow-node-t2t-openai.ts +1 -1
- package/src/speechflow-node-t2t-sentence.ts +37 -20
- package/src/speechflow-node-t2t-transformers.ts +4 -3
- package/src/speechflow-node-x2x-filter.ts +4 -4
- package/src/speechflow-node-x2x-trace.ts +1 -1
- package/src/speechflow-node-xio-device.ts +12 -8
- package/src/speechflow-node-xio-file.ts +9 -3
- package/src/speechflow-node-xio-mqtt.ts +5 -2
- package/src/speechflow-node-xio-websocket.ts +12 -12
- package/src/speechflow-utils.ts +78 -44
- package/src/speechflow.ts +114 -35
|
@@ -18,6 +18,7 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
|
|
|
18
18
|
static name = "mute";
|
|
19
19
|
/* internal state */
|
|
20
20
|
muteMode = "none";
|
|
21
|
+
destroyed = false;
|
|
21
22
|
/* construct node */
|
|
22
23
|
constructor(id, cfg, opts, args) {
|
|
23
24
|
super(id, cfg, opts, args);
|
|
@@ -29,23 +30,37 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
|
|
|
29
30
|
}
|
|
30
31
|
/* receive external request */
|
|
31
32
|
async receiveRequest(params) {
|
|
32
|
-
if (
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
if (this.destroyed)
|
|
34
|
+
throw new Error("mute: node already destroyed");
|
|
35
|
+
try {
|
|
36
|
+
if (params.length === 2 && params[0] === "mode") {
|
|
37
|
+
if (!params[1].match(/^(?:none|silenced|unplugged)$/))
|
|
38
|
+
throw new Error("mute: invalid mode argument in external request");
|
|
39
|
+
const muteMode = params[1];
|
|
40
|
+
this.setMuteMode(muteMode);
|
|
41
|
+
this.sendResponse(["mute", "mode", muteMode]);
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
throw new Error("mute: invalid arguments in external request");
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
this.log("error", `receive request error: ${error}`);
|
|
48
|
+
throw error;
|
|
38
49
|
}
|
|
39
|
-
else
|
|
40
|
-
throw new Error("mute: invalid arguments in external request");
|
|
41
50
|
}
|
|
42
51
|
/* change mute mode */
|
|
43
52
|
setMuteMode(mode) {
|
|
53
|
+
if (this.destroyed) {
|
|
54
|
+
this.log("warning", "attempted to set mute mode on destroyed node");
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
44
57
|
this.log("info", `setting mute mode to "${mode}"`);
|
|
45
58
|
this.muteMode = mode;
|
|
46
59
|
}
|
|
47
60
|
/* open node */
|
|
48
61
|
async open() {
|
|
62
|
+
/* clear destruction flag */
|
|
63
|
+
this.destroyed = false;
|
|
49
64
|
/* establish a transform stream */
|
|
50
65
|
const self = this;
|
|
51
66
|
this.stream = new node_stream_1.default.Transform({
|
|
@@ -53,6 +68,10 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
|
|
|
53
68
|
writableObjectMode: true,
|
|
54
69
|
decodeStrings: false,
|
|
55
70
|
transform(chunk, encoding, callback) {
|
|
71
|
+
if (self.destroyed) {
|
|
72
|
+
callback(new Error("stream already destroyed"));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
56
75
|
if (!Buffer.isBuffer(chunk.payload))
|
|
57
76
|
callback(new Error("invalid chunk payload type"));
|
|
58
77
|
else if (self.muteMode === "unplugged")
|
|
@@ -60,10 +79,11 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
|
|
|
60
79
|
callback();
|
|
61
80
|
else if (self.muteMode === "silenced") {
|
|
62
81
|
/* pass-through a silenced chunk */
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const buffer =
|
|
82
|
+
const chunkSilenced = chunk.clone();
|
|
83
|
+
chunkSilenced.meta.set("muted", true);
|
|
84
|
+
const buffer = chunkSilenced.payload;
|
|
66
85
|
buffer.fill(0);
|
|
86
|
+
this.push(chunkSilenced);
|
|
67
87
|
callback();
|
|
68
88
|
}
|
|
69
89
|
else {
|
|
@@ -73,6 +93,10 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
|
|
|
73
93
|
}
|
|
74
94
|
},
|
|
75
95
|
final(callback) {
|
|
96
|
+
if (self.destroyed) {
|
|
97
|
+
callback();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
76
100
|
this.push(null);
|
|
77
101
|
callback();
|
|
78
102
|
}
|
|
@@ -80,6 +104,8 @@ class SpeechFlowNodeMute extends speechflow_node_1.default {
|
|
|
80
104
|
}
|
|
81
105
|
/* close node */
|
|
82
106
|
async close() {
|
|
107
|
+
/* indicate destruction */
|
|
108
|
+
this.destroyed = true;
|
|
83
109
|
/* close stream */
|
|
84
110
|
if (this.stream !== null) {
|
|
85
111
|
this.stream.destroy();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-a2a-mute.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-mute.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;AAEF,6BAA6B;AAC7B,8DAAgC;AAEhC,6BAA6B;AAC7B,wEAAmE;AAQnE,4DAA4D;AAC5D,MAAqB,kBAAmB,SAAQ,yBAAc;IAC1D,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAA;IAE3B,sBAAsB;IACd,QAAQ,GAAa,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-mute.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-mute.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,9 @@ export default class SpeechFlowNodeVAD extends SpeechFlowNode {
|
|
|
6
6
|
private queueRecv;
|
|
7
7
|
private queueVAD;
|
|
8
8
|
private queueSend;
|
|
9
|
+
private destroyed;
|
|
10
|
+
private tailTimer;
|
|
11
|
+
private activeEventListeners;
|
|
9
12
|
constructor(id: string, cfg: {
|
|
10
13
|
[id: string]: any;
|
|
11
14
|
}, opts: {
|
|
@@ -58,6 +58,9 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
58
58
|
queueRecv = this.queue.pointerUse("recv");
|
|
59
59
|
queueVAD = this.queue.pointerUse("vad");
|
|
60
60
|
queueSend = this.queue.pointerUse("send");
|
|
61
|
+
destroyed = false;
|
|
62
|
+
tailTimer = null;
|
|
63
|
+
activeEventListeners = new Set();
|
|
61
64
|
/* construct node */
|
|
62
65
|
constructor(id, cfg, opts, args) {
|
|
63
66
|
super(id, cfg, opts, args);
|
|
@@ -80,81 +83,108 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
80
83
|
/* sanity check situation */
|
|
81
84
|
if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
|
|
82
85
|
throw new Error("VAD node currently supports PCM-S16LE audio only");
|
|
83
|
-
/*
|
|
84
|
-
|
|
86
|
+
/* clear destruction flag */
|
|
87
|
+
this.destroyed = false;
|
|
85
88
|
/* internal processing constants */
|
|
86
89
|
const vadSampleRateTarget = 16000; /* internal target of VAD */
|
|
87
90
|
const vadSamplesPerFrame = 512; /* required for VAD v5 */
|
|
88
91
|
/* establish Voice Activity Detection (VAD) facility */
|
|
89
92
|
let tail = false;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (
|
|
105
|
-
clearTimeout(tailTimer);
|
|
106
|
-
tailTimer = null;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
onSpeechEnd: (audio) => {
|
|
111
|
-
const duration = utils.audioArrayDuration(audio, vadSampleRateTarget);
|
|
112
|
-
log("info", `VAD: speech end (duration: ${duration.toFixed(2)}s)`);
|
|
113
|
-
if (this.params.mode === "unlugged") {
|
|
114
|
-
tail = true;
|
|
115
|
-
if (tailTimer !== null)
|
|
116
|
-
clearTimeout(tailTimer);
|
|
117
|
-
tailTimer = setTimeout(() => {
|
|
118
|
-
tail = false;
|
|
119
|
-
tailTimer = null;
|
|
120
|
-
}, this.params.postSpeechTail);
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
onVADMisfire: () => {
|
|
124
|
-
log("info", "VAD: speech end (segment too short)");
|
|
125
|
-
if (this.params.mode === "unlugged") {
|
|
126
|
-
tail = true;
|
|
127
|
-
if (tailTimer !== null)
|
|
128
|
-
clearTimeout(tailTimer);
|
|
129
|
-
tailTimer = setTimeout(() => {
|
|
93
|
+
try {
|
|
94
|
+
this.vad = await vad_node_realtime_1.RealTimeVAD.new({
|
|
95
|
+
model: "v5",
|
|
96
|
+
sampleRate: this.config.audioSampleRate, /* before resampling to 16KHz */
|
|
97
|
+
frameSamples: vadSamplesPerFrame, /* after resampling to 16KHz */
|
|
98
|
+
positiveSpeechThreshold: this.params.posSpeechThreshold,
|
|
99
|
+
negativeSpeechThreshold: this.params.negSpeechThreshold,
|
|
100
|
+
minSpeechFrames: this.params.minSpeechFrames,
|
|
101
|
+
redemptionFrames: this.params.redemptionFrames,
|
|
102
|
+
preSpeechPadFrames: this.params.preSpeechPadFrames,
|
|
103
|
+
onSpeechStart: () => {
|
|
104
|
+
if (this.destroyed)
|
|
105
|
+
return;
|
|
106
|
+
this.log("info", "VAD: speech start");
|
|
107
|
+
if (this.params.mode === "unplugged") {
|
|
130
108
|
tail = false;
|
|
131
|
-
tailTimer
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
},
|
|
135
|
-
onFrameProcessed: (audio) => {
|
|
136
|
-
/* annotate the current audio segment */
|
|
137
|
-
const element = this.queueVAD.peek();
|
|
138
|
-
if (element === undefined || element.type !== "audio-frame")
|
|
139
|
-
throw new Error("internal error which cannot happen: no more queued element");
|
|
140
|
-
const segment = element.segmentData[element.segmentIdx++];
|
|
141
|
-
segment.isSpeech = (audio.isSpeech > audio.notSpeech) || tail;
|
|
142
|
-
/* annotate the entire audio chunk */
|
|
143
|
-
if (element.segmentIdx >= element.segmentData.length) {
|
|
144
|
-
let isSpeech = false;
|
|
145
|
-
for (const segment of element.segmentData) {
|
|
146
|
-
if (segment.isSpeech) {
|
|
147
|
-
isSpeech = true;
|
|
148
|
-
break;
|
|
109
|
+
if (this.tailTimer !== null) {
|
|
110
|
+
clearTimeout(this.tailTimer);
|
|
111
|
+
this.tailTimer = null;
|
|
149
112
|
}
|
|
150
113
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
this.
|
|
114
|
+
},
|
|
115
|
+
onSpeechEnd: (audio) => {
|
|
116
|
+
if (this.destroyed)
|
|
117
|
+
return;
|
|
118
|
+
const duration = utils.audioArrayDuration(audio, vadSampleRateTarget);
|
|
119
|
+
this.log("info", `VAD: speech end (duration: ${duration.toFixed(2)}s)`);
|
|
120
|
+
if (this.params.mode === "unplugged") {
|
|
121
|
+
tail = true;
|
|
122
|
+
if (this.tailTimer !== null) {
|
|
123
|
+
clearTimeout(this.tailTimer);
|
|
124
|
+
this.tailTimer = null;
|
|
125
|
+
}
|
|
126
|
+
this.tailTimer = setTimeout(() => {
|
|
127
|
+
if (this.destroyed || this.tailTimer === null)
|
|
128
|
+
return;
|
|
129
|
+
tail = false;
|
|
130
|
+
this.tailTimer = null;
|
|
131
|
+
}, this.params.postSpeechTail);
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
onVADMisfire: () => {
|
|
135
|
+
if (this.destroyed)
|
|
136
|
+
return;
|
|
137
|
+
this.log("info", "VAD: speech end (segment too short)");
|
|
138
|
+
if (this.params.mode === "unplugged") {
|
|
139
|
+
tail = true;
|
|
140
|
+
if (this.tailTimer !== null) {
|
|
141
|
+
clearTimeout(this.tailTimer);
|
|
142
|
+
this.tailTimer = null;
|
|
143
|
+
}
|
|
144
|
+
this.tailTimer = setTimeout(() => {
|
|
145
|
+
if (this.destroyed || this.tailTimer === null)
|
|
146
|
+
return;
|
|
147
|
+
tail = false;
|
|
148
|
+
this.tailTimer = null;
|
|
149
|
+
}, this.params.postSpeechTail);
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
onFrameProcessed: (audio) => {
|
|
153
|
+
if (this.destroyed)
|
|
154
|
+
return;
|
|
155
|
+
try {
|
|
156
|
+
/* annotate the current audio segment */
|
|
157
|
+
const element = this.queueVAD.peek();
|
|
158
|
+
if (element === undefined || element.type !== "audio-frame")
|
|
159
|
+
throw new Error("internal error which cannot happen: no more queued element");
|
|
160
|
+
if (element.segmentIdx >= element.segmentData.length)
|
|
161
|
+
throw new Error("segment index out of bounds");
|
|
162
|
+
const segment = element.segmentData[element.segmentIdx++];
|
|
163
|
+
segment.isSpeech = (audio.isSpeech > audio.notSpeech) || tail;
|
|
164
|
+
/* annotate the entire audio chunk */
|
|
165
|
+
if (element.segmentIdx >= element.segmentData.length) {
|
|
166
|
+
let isSpeech = false;
|
|
167
|
+
for (const segment of element.segmentData) {
|
|
168
|
+
if (segment.isSpeech) {
|
|
169
|
+
isSpeech = true;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
element.isSpeech = isSpeech;
|
|
174
|
+
this.queueVAD.touch();
|
|
175
|
+
this.queueVAD.walk(+1);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
this.log("error", `VAD frame processing error: ${error}`);
|
|
180
|
+
}
|
|
154
181
|
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
182
|
+
});
|
|
183
|
+
this.vad.start();
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
throw new Error(`failed to initialize VAD: ${error}`);
|
|
187
|
+
}
|
|
158
188
|
/* provide Duplex stream and internally attach to VAD */
|
|
159
189
|
const self = this;
|
|
160
190
|
this.stream = new node_stream_1.default.Duplex({
|
|
@@ -164,54 +194,87 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
164
194
|
highWaterMark: 1,
|
|
165
195
|
/* receive audio chunk (writable side of stream) */
|
|
166
196
|
write(chunk, encoding, callback) {
|
|
197
|
+
if (self.destroyed) {
|
|
198
|
+
callback(new Error("stream already destroyed"));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
167
201
|
if (!Buffer.isBuffer(chunk.payload))
|
|
168
202
|
callback(new Error("expected audio input as Buffer chunks"));
|
|
169
203
|
else if (chunk.payload.byteLength === 0)
|
|
170
204
|
callback();
|
|
171
205
|
else {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
206
|
+
try {
|
|
207
|
+
/* convert audio samples from PCM/I16 to PCM/F32 */
|
|
208
|
+
const data = utils.convertBufToF32(chunk.payload, self.config.audioLittleEndian);
|
|
209
|
+
/* segment audio samples as individual VAD-sized frames */
|
|
210
|
+
const segmentData = [];
|
|
211
|
+
const chunkSize = vadSamplesPerFrame *
|
|
212
|
+
(self.config.audioSampleRate / vadSampleRateTarget);
|
|
213
|
+
const chunks = Math.trunc(data.length / chunkSize);
|
|
214
|
+
for (let i = 0; i < chunks; i++) {
|
|
215
|
+
const frame = data.slice(i * chunkSize, (i + 1) * chunkSize);
|
|
216
|
+
const segment = { data: frame };
|
|
217
|
+
segmentData.push(segment);
|
|
218
|
+
}
|
|
219
|
+
if ((chunks * chunkSize) < data.length) {
|
|
220
|
+
const frame = new Float32Array(chunkSize);
|
|
221
|
+
frame.fill(0);
|
|
222
|
+
frame.set(data.slice(chunks * chunkSize, data.length));
|
|
223
|
+
const segment = { data: frame };
|
|
224
|
+
segmentData.push(segment);
|
|
225
|
+
}
|
|
226
|
+
/* queue the results */
|
|
227
|
+
self.queueRecv.append({
|
|
228
|
+
type: "audio-frame", chunk,
|
|
229
|
+
segmentIdx: 0, segmentData
|
|
230
|
+
});
|
|
231
|
+
/* push segments through Voice Activity Detection (VAD) */
|
|
232
|
+
if (self.vad && !self.destroyed) {
|
|
233
|
+
try {
|
|
234
|
+
for (const segment of segmentData)
|
|
235
|
+
self.vad.processAudio(segment.data);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
self.log("error", `VAD processAudio error: ${error}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
callback();
|
|
182
242
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
frame.fill(0);
|
|
186
|
-
frame.set(data.slice(chunks * chunkSize, data.length));
|
|
187
|
-
const segment = { data: frame };
|
|
188
|
-
segmentData.push(segment);
|
|
243
|
+
catch (error) {
|
|
244
|
+
callback(error instanceof Error ? error : new Error("VAD processing failed"));
|
|
189
245
|
}
|
|
190
|
-
/* queue the results */
|
|
191
|
-
self.queueRecv.append({
|
|
192
|
-
type: "audio-frame", chunk,
|
|
193
|
-
segmentIdx: 0, segmentData
|
|
194
|
-
});
|
|
195
|
-
/* push segments through Voice Activity Detection (VAD) */
|
|
196
|
-
for (const segment of segmentData)
|
|
197
|
-
self.vad.processAudio(segment.data);
|
|
198
|
-
callback();
|
|
199
246
|
}
|
|
200
247
|
},
|
|
201
248
|
/* receive no more audio chunks (writable side of stream) */
|
|
202
249
|
final(callback) {
|
|
250
|
+
if (self.destroyed) {
|
|
251
|
+
callback();
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
203
254
|
/* signal end of file */
|
|
204
255
|
self.queueRecv.append({ type: "audio-eof" });
|
|
205
256
|
callback();
|
|
206
257
|
},
|
|
207
258
|
/* send audio chunk(s) (readable side of stream) */
|
|
208
259
|
read(_size) {
|
|
260
|
+
if (self.destroyed) {
|
|
261
|
+
this.push(null);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
209
264
|
/* try to perform read operation from scratch */
|
|
210
265
|
const tryToRead = () => {
|
|
266
|
+
if (self.destroyed) {
|
|
267
|
+
this.push(null);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
211
270
|
/* flush pending audio chunks */
|
|
212
271
|
const flushPendingChunks = () => {
|
|
213
272
|
let pushed = 0;
|
|
214
273
|
while (true) {
|
|
274
|
+
if (self.destroyed) {
|
|
275
|
+
this.push(null);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
215
278
|
const element = self.queueSend.peek();
|
|
216
279
|
if (element === undefined)
|
|
217
280
|
break;
|
|
@@ -235,22 +298,32 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
235
298
|
this.push(chunk);
|
|
236
299
|
pushed++;
|
|
237
300
|
}
|
|
238
|
-
else if (self.params.mode === "unplugged" && pushed === 0)
|
|
301
|
+
else if (self.params.mode === "unplugged" && pushed === 0) {
|
|
239
302
|
/* we have to await chunks now, as in unplugged
|
|
240
303
|
mode we else would be never called again until
|
|
241
304
|
we at least once push a new chunk as the result */
|
|
242
|
-
|
|
305
|
+
setTimeout(() => {
|
|
306
|
+
if (self.destroyed)
|
|
307
|
+
return;
|
|
308
|
+
tryToRead();
|
|
309
|
+
}, 0);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
243
312
|
}
|
|
244
313
|
};
|
|
245
314
|
/* await forthcoming audio chunks */
|
|
246
315
|
const awaitForthcomingChunks = () => {
|
|
316
|
+
if (self.destroyed)
|
|
317
|
+
return;
|
|
247
318
|
const element = self.queueSend.peek();
|
|
248
319
|
if (element !== undefined
|
|
249
320
|
&& element.type === "audio-frame"
|
|
250
321
|
&& element.isSpeech !== undefined)
|
|
251
322
|
flushPendingChunks();
|
|
252
|
-
else
|
|
323
|
+
else if (!self.destroyed) {
|
|
253
324
|
self.queue.once("write", awaitForthcomingChunks);
|
|
325
|
+
self.activeEventListeners.add(awaitForthcomingChunks);
|
|
326
|
+
}
|
|
254
327
|
};
|
|
255
328
|
const element = self.queueSend.peek();
|
|
256
329
|
if (element !== undefined && element.type === "audio-eof")
|
|
@@ -259,8 +332,10 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
259
332
|
&& element.type === "audio-frame"
|
|
260
333
|
&& element.isSpeech !== undefined)
|
|
261
334
|
flushPendingChunks();
|
|
262
|
-
else
|
|
335
|
+
else if (!self.destroyed) {
|
|
263
336
|
self.queue.once("write", awaitForthcomingChunks);
|
|
337
|
+
self.activeEventListeners.add(awaitForthcomingChunks);
|
|
338
|
+
}
|
|
264
339
|
};
|
|
265
340
|
tryToRead();
|
|
266
341
|
}
|
|
@@ -268,14 +343,37 @@ class SpeechFlowNodeVAD extends speechflow_node_1.default {
|
|
|
268
343
|
}
|
|
269
344
|
/* close node */
|
|
270
345
|
async close() {
|
|
346
|
+
/* indicate destruction */
|
|
347
|
+
this.destroyed = true;
|
|
348
|
+
/* cleanup tail timer */
|
|
349
|
+
if (this.tailTimer !== null) {
|
|
350
|
+
clearTimeout(this.tailTimer);
|
|
351
|
+
this.tailTimer = null;
|
|
352
|
+
}
|
|
353
|
+
/* remove all event listeners */
|
|
354
|
+
this.activeEventListeners.forEach((listener) => {
|
|
355
|
+
this.queue.removeListener("write", listener);
|
|
356
|
+
});
|
|
357
|
+
this.activeEventListeners.clear();
|
|
271
358
|
/* close stream */
|
|
272
359
|
if (this.stream !== null) {
|
|
273
360
|
this.stream.destroy();
|
|
274
361
|
this.stream = null;
|
|
275
362
|
}
|
|
363
|
+
/* cleanup queue pointers before closing VAD to prevent callback access */
|
|
364
|
+
this.queue.pointerDelete("recv");
|
|
365
|
+
this.queue.pointerDelete("vad");
|
|
366
|
+
this.queue.pointerDelete("send");
|
|
276
367
|
/* close VAD */
|
|
277
368
|
if (this.vad !== null) {
|
|
278
|
-
|
|
369
|
+
try {
|
|
370
|
+
const flushPromise = this.vad.flush();
|
|
371
|
+
const timeoutPromise = new Promise((resolve) => setTimeout(resolve, 5000));
|
|
372
|
+
await Promise.race([flushPromise, timeoutPromise]);
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
this.log("warning", `VAD flush error during close: ${error}`);
|
|
376
|
+
}
|
|
279
377
|
this.vad.destroy();
|
|
280
378
|
this.vad = null;
|
|
281
379
|
}
|
|
@@ -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;AAE/D,6BAA6B;AAC7B,wEAAmE;AACnE,0DAAoE;AAiBpE,2DAA2D;AAC3D,MAAqB,iBAAkB,SAAQ,yBAAc;IACzD,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,KAAK,CAAA;IAE1B,sBAAsB;IACd,GAAG,GAAuB,IAAI,CAAA;IAC9B,KAAK,GAAO,IAAI,KAAK,CAAC,KAAK,EAAqB,CAAA;IAChD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzC,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACxC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAEjD,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,EAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,0BAA0B,EAAE;YAC1F,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE;YACjD,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE;YACjD,eAAe,EAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAK;YACjD,gBAAgB,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAI;YACjD,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAK;YACjD,cAAc,EAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE;SACpD,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,8BAA8B;QAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAClE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;QAEvE,4BAA4B;QAC5B,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAA;QAEpE,qCAAqC;QACrC,MAAM,mBAAmB,GAAG,KAAK,CAAA,CAAC,4BAA4B;QAC9D,MAAM,kBAAkB,GAAI,GAAG,CAAA,CAAG,yBAAyB;QAE3D,yDAAyD;QACzD,IAAI,IAAI,GAAG,KAAK,CAAA;QAChB,IAAI,SAAS,GAAyC,IAAI,CAAA;QAC1D,IAAI,CAAC,GAAG,GAAG,MAAM,+BAAW,CAAC,GAAG,CAAC;YAC7B,KAAK,EAAoB,IAAI;YAC7B,UAAU,EAAe,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,gCAAgC;YACtF,YAAY,EAAa,kBAAkB,EAAW,gCAAgC;YACtF,uBAAuB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;YACvD,uBAAuB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;YACvD,eAAe,EAAU,IAAI,CAAC,MAAM,CAAC,eAAe;YACpD,gBAAgB,EAAS,IAAI,CAAC,MAAM,CAAC,gBAAgB;YACrD,kBAAkB,EAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB;YACvD,aAAa,EAAE,GAAG,EAAE;gBAChB,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;gBAChC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAClC,IAAI,GAAG,KAAK,CAAA;oBACZ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;wBACrB,YAAY,CAAC,SAAS,CAAC,CAAA;wBACvB,SAAS,GAAG,IAAI,CAAA;oBACpB,CAAC;gBACL,CAAC;YACL,CAAC;YACD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;gBACrE,GAAG,CAAC,MAAM,EAAE,8BAA8B,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;gBAClE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAClC,IAAI,GAAG,IAAI,CAAA;oBACX,IAAI,SAAS,KAAK,IAAI;wBAClB,YAAY,CAAC,SAAS,CAAC,CAAA;oBAC3B,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBACxB,IAAI,GAAG,KAAK,CAAA;wBACZ,SAAS,GAAG,IAAI,CAAA;oBACpB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;gBAClC,CAAC;YACL,CAAC;YACD,YAAY,EAAE,GAAG,EAAE;gBACf,GAAG,CAAC,MAAM,EAAE,qCAAqC,CAAC,CAAA;gBAClD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAClC,IAAI,GAAG,IAAI,CAAA;oBACX,IAAI,SAAS,KAAK,IAAI;wBAClB,YAAY,CAAC,SAAS,CAAC,CAAA;oBAC3B,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBACxB,IAAI,GAAG,KAAK,CAAA;wBACZ,SAAS,GAAG,IAAI,CAAA;oBACpB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;gBAClC,CAAC;YACL,CAAC;YACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;gBACxB,0CAA0C;gBAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACpC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa;oBACvD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;gBACjF,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;gBACzD,OAAO,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAA;gBAE7D,uCAAuC;gBACvC,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;oBACnD,IAAI,QAAQ,GAAG,KAAK,CAAA;oBACpB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;wBACxC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;4BACnB,QAAQ,GAAG,IAAI,CAAA;4BACf,MAAK;wBACT,CAAC;oBACL,CAAC;oBACD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;oBAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;oBACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC1B,CAAC;YACL,CAAC;SACJ,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QAEhB,0DAA0D;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAM,CAAC,MAAM,CAAC;YAC5B,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAO,KAAK;YACzB,aAAa,EAAO,CAAC;YAErB,qDAAqD;YACrD,KAAK,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;gBAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC/B,QAAQ,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAA;qBAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC;oBACnC,QAAQ,EAAE,CAAA;qBACT,CAAC;oBACF,qDAAqD;oBACrD,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;oBAEhF,4DAA4D;oBAC5D,MAAM,WAAW,GAA+B,EAAE,CAAA;oBAClD,MAAM,SAAS,GAAG,kBAAkB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,mBAAmB,CAAC,CAAA;oBAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;oBAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;wBAC5D,MAAM,OAAO,GAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;wBACzD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC7B,CAAC;oBACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;wBACrC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAA;wBACzC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;wBACb,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;wBACtD,MAAM,OAAO,GAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;wBACzD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC7B,CAAC;oBAED,yBAAyB;oBACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;wBAClB,IAAI,EAAE,aAAa,EAAE,KAAK;wBAC1B,UAAU,EAAE,CAAC,EAAE,WAAW;qBAC7B,CAAC,CAAA;oBAEF,4DAA4D;oBAC5D,KAAK,MAAM,OAAO,IAAI,WAAW;wBAC7B,IAAI,CAAC,GAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;oBAExC,QAAQ,EAAE,CAAA;gBACd,CAAC;YACL,CAAC;YAED,8DAA8D;YAC9D,KAAK,CAAE,QAAQ;gBACX,0BAA0B;gBAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;gBAC5C,QAAQ,EAAE,CAAA;YACd,CAAC;YAED,qDAAqD;YACrD,IAAI,CAAE,KAAK;gBACP,kDAAkD;gBAClD,MAAM,SAAS,GAAG,GAAG,EAAE;oBACnB,kCAAkC;oBAClC,MAAM,kBAAkB,GAAG,GAAG,EAAE;wBAC5B,IAAI,MAAM,GAAG,CAAC,CAAA;wBACd,OAAO,IAAI,EAAE,CAAC;4BACV,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;4BACrC,IAAI,OAAO,KAAK,SAAS;gCACrB,MAAK;iCACJ,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gCACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gCACf,MAAK;4BACT,CAAC;iCACI,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa;mCAChC,OAAO,CAAC,QAAQ,KAAK,SAAS;gCACjC,MAAK;4BACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;4BACvB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;4BACjB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gCACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gCACxB,MAAM,EAAE,CAAA;4BACZ,CAAC;iCACI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gCACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;gCACnC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAiB,CAAA;gCACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gCACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gCAChB,MAAM,EAAE,CAAA;4BACZ,CAAC;iCACI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,KAAK,CAAC;gCACrD;;uFAEuD;gCACvD,SAAS,EAAE,CAAA;wBACnB,CAAC;oBACL,CAAC,CAAA;oBAED,sCAAsC;oBACtC,MAAM,sBAAsB,GAAG,GAAG,EAAE;wBAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;wBACrC,IAAI,OAAO,KAAK,SAAS;+BAClB,OAAO,CAAC,IAAI,KAAK,aAAa;+BAC9B,OAAO,CAAC,QAAQ,KAAK,SAAS;4BACjC,kBAAkB,EAAE,CAAA;;4BAEpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;oBACxD,CAAC,CAAA;oBAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;oBACrC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;wBACrD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;yBACd,IAAI,OAAO,KAAK,SAAS;2BACvB,OAAO,CAAC,IAAI,KAAK,aAAa;2BAC9B,OAAO,CAAC,QAAQ,KAAK,SAAS;wBACjC,kBAAkB,EAAE,CAAA;;wBAEpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;gBACxD,CAAC,CAAA;gBACD,SAAS,EAAE,CAAA;YACf,CAAC;SACJ,CAAC,CAAA;IACN,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,KAAK;QACP,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACtB,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;YACtB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;YAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;QACnB,CAAC;IACL,CAAC;;AA3PL,oCA4PC"}
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2a-vad.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-vad.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,8 +117,10 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
|
|
|
117
117
|
decodeStrings: false,
|
|
118
118
|
highWaterMark: 1,
|
|
119
119
|
transform(chunk, encoding, callback) {
|
|
120
|
-
if (!Buffer.isBuffer(chunk.payload))
|
|
120
|
+
if (!Buffer.isBuffer(chunk.payload)) {
|
|
121
121
|
callback(new Error("invalid chunk payload type"));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
122
124
|
else if (firstChunk) {
|
|
123
125
|
if (self.params.mode === "encode") {
|
|
124
126
|
/* convert raw/PCM to WAV/PCM
|
|
@@ -141,6 +143,10 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
|
|
|
141
143
|
}
|
|
142
144
|
else if (self.params.mode === "decode") {
|
|
143
145
|
/* convert WAV/PCM to raw/PCM */
|
|
146
|
+
if (chunk.payload.length < 44) {
|
|
147
|
+
callback(new Error("WAV header too short, expected at least 44 bytes"));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
144
150
|
const header = readWavHeader(chunk.payload);
|
|
145
151
|
self.log("info", "WAV audio stream: " +
|
|
146
152
|
`audioFormat=${header.audioFormat === 0x0001 ? "PCM" :
|
|
@@ -148,20 +154,30 @@ class SpeechFlowNodeWAV extends speechflow_node_1.default {
|
|
|
148
154
|
`channels=${header.channels} ` +
|
|
149
155
|
`sampleRate=${header.sampleRate} ` +
|
|
150
156
|
`bitDepth=${header.bitDepth}`);
|
|
151
|
-
if (header.audioFormat !== 0x0001 /* PCM */)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (header.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
if (header.audioFormat !== 0x0001 /* PCM */) {
|
|
158
|
+
callback(new Error("WAV not based on PCM format"));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (header.bitDepth !== self.config.audioBitDepth) {
|
|
162
|
+
callback(new Error(`WAV not based on ${self.config.audioBitDepth} bit samples`));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (header.sampleRate !== self.config.audioSampleRate) {
|
|
166
|
+
callback(new Error(`WAV not based on ${self.config.audioSampleRate}Hz sample rate`));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (header.channels !== self.config.audioChannels) {
|
|
170
|
+
callback(new Error(`WAV not based on ${self.config.audioChannels} channel(s)`));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
159
173
|
chunk.payload = chunk.payload.subarray(44);
|
|
160
174
|
this.push(chunk);
|
|
161
175
|
callback();
|
|
162
176
|
}
|
|
163
|
-
else
|
|
164
|
-
|
|
177
|
+
else {
|
|
178
|
+
callback(new Error(`invalid operation mode "${self.params.mode}"`));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
165
181
|
}
|
|
166
182
|
else {
|
|
167
183
|
/* pass-through original chunk */
|