speechflow 1.6.0 → 1.6.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 +12 -0
- package/README.md +1 -1
- package/etc/claude.md +9 -4
- package/etc/keyfiles.txt +19 -0
- package/etc/speechflow.yaml +4 -4
- package/package.json +3 -3
- package/speechflow-cli/dst/speechflow-main-api.d.ts +12 -0
- package/speechflow-cli/dst/speechflow-main-api.js +319 -0
- package/speechflow-cli/dst/speechflow-main-api.js.map +1 -0
- package/speechflow-cli/dst/speechflow-main-cli.d.ts +28 -0
- package/speechflow-cli/dst/speechflow-main-cli.js +271 -0
- package/speechflow-cli/dst/speechflow-main-cli.js.map +1 -0
- package/speechflow-cli/dst/speechflow-main-config.d.ts +9 -0
- package/speechflow-cli/dst/speechflow-main-config.js +27 -0
- package/speechflow-cli/dst/speechflow-main-config.js.map +1 -0
- package/speechflow-cli/dst/speechflow-main-graph.d.ts +34 -0
- package/speechflow-cli/dst/speechflow-main-graph.js +365 -0
- package/speechflow-cli/dst/speechflow-main-graph.js.map +1 -0
- package/speechflow-cli/dst/speechflow-main-nodes.d.ts +10 -0
- package/speechflow-cli/dst/speechflow-main-nodes.js +60 -0
- package/speechflow-cli/dst/speechflow-main-nodes.js.map +1 -0
- package/speechflow-cli/dst/speechflow-main-status.d.ts +11 -0
- package/speechflow-cli/dst/speechflow-main-status.js +60 -0
- package/speechflow-cli/dst/speechflow-main-status.js.map +1 -0
- package/speechflow-cli/dst/speechflow-main.d.ts +7 -0
- package/speechflow-cli/dst/speechflow-main.js +127 -0
- package/speechflow-cli/dst/speechflow-main.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js +4 -4
- package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-compressor.js +5 -6
- package/speechflow-cli/dst/speechflow-node-a2a-compressor.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js +5 -5
- package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-expander.js +5 -6
- package/speechflow-cli/dst/speechflow-node-a2a-expander.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js +5 -5
- package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-filler.js +3 -3
- package/speechflow-cli/dst/speechflow-node-a2a-filler.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-gain.js +2 -2
- package/speechflow-cli/dst/speechflow-node-a2a-gain.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-gender.js +4 -4
- package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-meter.js +2 -2
- package/speechflow-cli/dst/speechflow-node-a2a-meter.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js +4 -4
- package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-speex.js +4 -4
- package/speechflow-cli/dst/speechflow-node-a2a-speex.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-vad.js +4 -4
- package/speechflow-cli/dst/speechflow-node-a2a-vad.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2t-amazon.js +6 -6
- package/speechflow-cli/dst/speechflow-node-a2t-amazon.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +4 -4
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2t-openai.js +4 -4
- package/speechflow-cli/dst/speechflow-node-a2t-openai.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2a-amazon.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2a-amazon.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-amazon.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-amazon.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-deepl.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-deepl.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-google.js +5 -5
- package/speechflow-cli/dst/speechflow-node-t2t-google.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-modify.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-modify.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-ollama.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-ollama.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-openai.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-openai.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-sentence.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-sentence.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-transformers.js +2 -2
- package/speechflow-cli/dst/speechflow-node-t2t-transformers.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-x2x-filter.js +2 -2
- package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-device.js +5 -5
- package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-file.js +27 -27
- package/speechflow-cli/dst/speechflow-node-xio-file.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +4 -4
- package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-websocket.js +7 -7
- package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -1
- package/speechflow-cli/dst/{speechflow-utils-audio-wt.js → speechflow-util-audio-wt.js} +1 -1
- package/speechflow-cli/dst/speechflow-util-audio-wt.js.map +1 -0
- package/speechflow-cli/dst/speechflow-util-audio.d.ts +22 -0
- package/speechflow-cli/dst/speechflow-util-audio.js +251 -0
- package/speechflow-cli/dst/speechflow-util-audio.js.map +1 -0
- package/speechflow-cli/dst/speechflow-util-error.d.ts +14 -0
- package/speechflow-cli/dst/speechflow-util-error.js +131 -0
- package/speechflow-cli/dst/speechflow-util-error.js.map +1 -0
- package/speechflow-cli/dst/speechflow-util-queue.d.ts +68 -0
- package/speechflow-cli/dst/speechflow-util-queue.js +338 -0
- package/speechflow-cli/dst/speechflow-util-queue.js.map +1 -0
- package/speechflow-cli/dst/speechflow-util-stream.d.ts +18 -0
- package/speechflow-cli/dst/speechflow-util-stream.js +219 -0
- package/speechflow-cli/dst/speechflow-util-stream.js.map +1 -0
- package/speechflow-cli/dst/speechflow-util-webaudio-wt.js +124 -0
- package/speechflow-cli/dst/speechflow-util-webaudio-wt.js.map +1 -0
- package/speechflow-cli/dst/{speechflow-utils-audio.js → speechflow-util-webaudio.js} +2 -2
- package/speechflow-cli/dst/speechflow-util-webaudio.js.map +1 -0
- package/speechflow-cli/dst/speechflow-util.d.ts +4 -0
- package/speechflow-cli/dst/speechflow-util.js +26 -0
- package/speechflow-cli/dst/speechflow-util.js.map +1 -0
- package/speechflow-cli/dst/speechflow.js +3 -912
- package/speechflow-cli/dst/speechflow.js.map +1 -1
- package/speechflow-cli/etc/oxlint.jsonc +4 -1
- package/speechflow-cli/package.json +1 -0
- package/speechflow-cli/src/lib.d.ts +2 -0
- package/speechflow-cli/src/speechflow-main-api.ts +315 -0
- package/speechflow-cli/src/speechflow-main-cli.ts +259 -0
- package/speechflow-cli/src/speechflow-main-config.ts +17 -0
- package/speechflow-cli/src/speechflow-main-graph.ts +370 -0
- package/speechflow-cli/src/speechflow-main-nodes.ts +61 -0
- package/speechflow-cli/src/speechflow-main-status.ts +70 -0
- package/speechflow-cli/src/speechflow-main.ts +106 -0
- package/speechflow-cli/src/speechflow-node-a2a-compressor-wt.ts +4 -4
- package/speechflow-cli/src/speechflow-node-a2a-compressor.ts +5 -6
- package/speechflow-cli/src/speechflow-node-a2a-expander-wt.ts +5 -5
- package/speechflow-cli/src/speechflow-node-a2a-expander.ts +5 -6
- package/speechflow-cli/src/speechflow-node-a2a-ffmpeg.ts +5 -5
- package/speechflow-cli/src/speechflow-node-a2a-filler.ts +4 -4
- package/speechflow-cli/src/speechflow-node-a2a-gain.ts +2 -2
- package/speechflow-cli/src/speechflow-node-a2a-gender.ts +4 -4
- package/speechflow-cli/src/speechflow-node-a2a-meter.ts +2 -2
- package/speechflow-cli/src/speechflow-node-a2a-rnnoise.ts +4 -4
- package/speechflow-cli/src/speechflow-node-a2a-speex.ts +4 -4
- package/speechflow-cli/src/speechflow-node-a2a-vad.ts +4 -4
- package/speechflow-cli/src/speechflow-node-a2t-amazon.ts +7 -7
- package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +5 -5
- package/speechflow-cli/src/speechflow-node-a2t-openai.ts +5 -5
- package/speechflow-cli/src/speechflow-node-t2a-amazon.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2a-kokoro.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-amazon.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-deepl.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-google.ts +5 -5
- package/speechflow-cli/src/speechflow-node-t2t-modify.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-ollama.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-openai.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-sentence.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +2 -2
- package/speechflow-cli/src/speechflow-node-t2t-transformers.ts +2 -2
- package/speechflow-cli/src/speechflow-node-x2x-filter.ts +2 -2
- package/speechflow-cli/src/speechflow-node-xio-device.ts +5 -5
- package/speechflow-cli/src/speechflow-node-xio-file.ts +9 -10
- package/speechflow-cli/src/speechflow-node-xio-mqtt.ts +5 -5
- package/speechflow-cli/src/speechflow-node-xio-websocket.ts +7 -7
- package/speechflow-cli/src/{speechflow-utils-audio.ts → speechflow-util-audio.ts} +131 -1
- package/speechflow-cli/src/speechflow-util-error.ts +184 -0
- package/speechflow-cli/src/speechflow-util-queue.ts +320 -0
- package/speechflow-cli/src/speechflow-util-stream.ts +197 -0
- package/speechflow-cli/src/speechflow-util.ts +10 -0
- package/speechflow-cli/src/speechflow.ts +3 -953
- package/speechflow-ui-db/dst/index.js +1 -1
- package/speechflow-ui-db/etc/vite-client.mts +0 -2
- package/speechflow-ui-db/src/app.vue +20 -19
- package/speechflow-ui-st/dst/index.js +1 -1
- package/speechflow-ui-st/etc/vite-client.mts +0 -2
- package/speechflow-ui-st/src/app.vue +10 -6
- package/speechflow-cli/dst/speechflow-node-a2a-dynamics-wt.js +0 -208
- package/speechflow-cli/dst/speechflow-node-a2a-dynamics-wt.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-a2a-dynamics.d.ts +0 -15
- package/speechflow-cli/dst/speechflow-node-a2a-dynamics.js +0 -312
- package/speechflow-cli/dst/speechflow-node-a2a-dynamics.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-a2t-awstranscribe.d.ts +0 -18
- package/speechflow-cli/dst/speechflow-node-a2t-awstranscribe.js +0 -312
- package/speechflow-cli/dst/speechflow-node-a2t-awstranscribe.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-a2t-openaitranscribe.d.ts +0 -19
- package/speechflow-cli/dst/speechflow-node-a2t-openaitranscribe.js +0 -351
- package/speechflow-cli/dst/speechflow-node-a2t-openaitranscribe.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-t2a-awspolly.d.ts +0 -16
- package/speechflow-cli/dst/speechflow-node-t2a-awspolly.js +0 -204
- package/speechflow-cli/dst/speechflow-node-t2a-awspolly.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-t2t-awstranslate.d.ts +0 -13
- package/speechflow-cli/dst/speechflow-node-t2t-awstranslate.js +0 -175
- package/speechflow-cli/dst/speechflow-node-t2t-awstranslate.js.map +0 -1
- package/speechflow-cli/dst/speechflow-utils-audio-wt.js.map +0 -1
- package/speechflow-cli/dst/speechflow-utils-audio.js.map +0 -1
- package/speechflow-cli/dst/speechflow-utils.d.ts +0 -108
- package/speechflow-cli/dst/speechflow-utils.js +0 -746
- package/speechflow-cli/dst/speechflow-utils.js.map +0 -1
- package/speechflow-cli/src/speechflow-utils.ts +0 -810
- /package/speechflow-cli/dst/{speechflow-node-a2a-dynamics-wt.d.ts → speechflow-util-audio-wt.d.ts} +0 -0
- /package/speechflow-cli/dst/{speechflow-utils-audio-wt.d.ts → speechflow-util-webaudio-wt.d.ts} +0 -0
- /package/speechflow-cli/dst/{speechflow-utils-audio.d.ts → speechflow-util-webaudio.d.ts} +0 -0
- /package/speechflow-cli/src/{speechflow-utils-audio-wt.ts → speechflow-util-audio-wt.ts} +0 -0
|
@@ -0,0 +1,251 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.WebAudio = void 0;
|
|
12
|
+
exports.audioBufferDuration = audioBufferDuration;
|
|
13
|
+
exports.audioArrayDuration = audioArrayDuration;
|
|
14
|
+
exports.convertBufToF32 = convertBufToF32;
|
|
15
|
+
exports.convertF32ToBuf = convertF32ToBuf;
|
|
16
|
+
exports.convertBufToI16 = convertBufToI16;
|
|
17
|
+
exports.convertI16ToBuf = convertI16ToBuf;
|
|
18
|
+
exports.processInt16ArrayInSegments = processInt16ArrayInSegments;
|
|
19
|
+
exports.lin2dB = lin2dB;
|
|
20
|
+
exports.dB2lin = dB2lin;
|
|
21
|
+
/* standard dependencies */
|
|
22
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
23
|
+
/* external dependencies */
|
|
24
|
+
const node_web_audio_api_1 = require("node-web-audio-api");
|
|
25
|
+
/* calculate duration of an audio buffer */
|
|
26
|
+
function audioBufferDuration(buffer, sampleRate = 48000, bitDepth = 16, channels = 1, littleEndian = true) {
|
|
27
|
+
/* sanity check parameters */
|
|
28
|
+
if (!Buffer.isBuffer(buffer))
|
|
29
|
+
throw new Error("invalid input (Buffer expected)");
|
|
30
|
+
if (littleEndian !== true)
|
|
31
|
+
throw new Error("only Little Endian supported");
|
|
32
|
+
if (sampleRate <= 0)
|
|
33
|
+
throw new Error("sample rate must be positive");
|
|
34
|
+
if (bitDepth <= 0 || bitDepth % 8 !== 0)
|
|
35
|
+
throw new Error("bit depth must be positive and multiple of 8");
|
|
36
|
+
if (channels <= 0)
|
|
37
|
+
throw new Error("channels must be positive");
|
|
38
|
+
/* calculate duration */
|
|
39
|
+
const bytesPerSample = bitDepth / 8;
|
|
40
|
+
const totalSamples = buffer.length / (bytesPerSample * channels);
|
|
41
|
+
return totalSamples / sampleRate;
|
|
42
|
+
}
|
|
43
|
+
/* calculate duration of an audio array */
|
|
44
|
+
function audioArrayDuration(arr, sampleRate = 48000, channels = 1) {
|
|
45
|
+
/* sanity check parameters */
|
|
46
|
+
if (arr.length === 0)
|
|
47
|
+
return 0;
|
|
48
|
+
if (sampleRate <= 0)
|
|
49
|
+
throw new Error("sample rate must be positive");
|
|
50
|
+
if (channels <= 0)
|
|
51
|
+
throw new Error("channels must be positive");
|
|
52
|
+
/* calculate duration */
|
|
53
|
+
const totalSamples = arr.length / channels;
|
|
54
|
+
return totalSamples / sampleRate;
|
|
55
|
+
}
|
|
56
|
+
/* helper function: convert Buffer in PCM/I16 to Float32Array in PCM/F32 format */
|
|
57
|
+
function convertBufToF32(buf, littleEndian = true) {
|
|
58
|
+
if (buf.length % 2 !== 0)
|
|
59
|
+
throw new Error("buffer length must be even for 16-bit samples");
|
|
60
|
+
const dataView = new DataView(buf.buffer);
|
|
61
|
+
const arr = new Float32Array(buf.length / 2);
|
|
62
|
+
for (let i = 0; i < arr.length; i++)
|
|
63
|
+
arr[i] = dataView.getInt16(i * 2, littleEndian) / 32768;
|
|
64
|
+
return arr;
|
|
65
|
+
}
|
|
66
|
+
/* helper function: convert Float32Array in PCM/F32 to Buffer in PCM/I16 format */
|
|
67
|
+
function convertF32ToBuf(arr) {
|
|
68
|
+
if (arr.length === 0)
|
|
69
|
+
return Buffer.alloc(0);
|
|
70
|
+
const int16Array = new Int16Array(arr.length);
|
|
71
|
+
for (let i = 0; i < arr.length; i++) {
|
|
72
|
+
let sample = arr[i];
|
|
73
|
+
if (Number.isNaN(sample))
|
|
74
|
+
sample = 0;
|
|
75
|
+
int16Array[i] = Math.max(-32768, Math.min(32767, Math.round(sample * 32768)));
|
|
76
|
+
}
|
|
77
|
+
return Buffer.from(int16Array.buffer);
|
|
78
|
+
}
|
|
79
|
+
/* helper function: convert Buffer in PCM/I16 to Int16Array */
|
|
80
|
+
function convertBufToI16(buf, littleEndian = true) {
|
|
81
|
+
if (buf.length % 2 !== 0)
|
|
82
|
+
throw new Error("buffer length must be even for 16-bit samples");
|
|
83
|
+
const dataView = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
84
|
+
const arr = new Int16Array(buf.length / 2);
|
|
85
|
+
for (let i = 0; i < buf.length / 2; i++)
|
|
86
|
+
arr[i] = dataView.getInt16(i * 2, littleEndian);
|
|
87
|
+
return arr;
|
|
88
|
+
}
|
|
89
|
+
/* helper function: convert In16Array in PCM/I16 to Buffer */
|
|
90
|
+
function convertI16ToBuf(arr, littleEndian = true) {
|
|
91
|
+
if (arr.length === 0)
|
|
92
|
+
return Buffer.alloc(0);
|
|
93
|
+
const buf = Buffer.allocUnsafe(arr.length * 2);
|
|
94
|
+
for (let i = 0; i < arr.length; i++) {
|
|
95
|
+
if (littleEndian)
|
|
96
|
+
buf.writeInt16LE(arr[i], i * 2);
|
|
97
|
+
else
|
|
98
|
+
buf.writeInt16BE(arr[i], i * 2);
|
|
99
|
+
}
|
|
100
|
+
return buf;
|
|
101
|
+
}
|
|
102
|
+
/* process Int16Array in fixed-size segments */
|
|
103
|
+
async function processInt16ArrayInSegments(data, segmentSize, processor) {
|
|
104
|
+
/* process full segments */
|
|
105
|
+
let i = 0;
|
|
106
|
+
while ((i + segmentSize) <= data.length) {
|
|
107
|
+
const segment = data.slice(i, i + segmentSize);
|
|
108
|
+
const result = await processor(segment);
|
|
109
|
+
data.set(result, i);
|
|
110
|
+
i += segmentSize;
|
|
111
|
+
}
|
|
112
|
+
/* process final partial segment if it exists */
|
|
113
|
+
if (i < data.length) {
|
|
114
|
+
const len = data.length - i;
|
|
115
|
+
const segment = new Int16Array(segmentSize);
|
|
116
|
+
segment.set(data.slice(i), 0);
|
|
117
|
+
segment.fill(0, len, segmentSize);
|
|
118
|
+
const result = await processor(segment);
|
|
119
|
+
data.set(result.slice(0, len), i);
|
|
120
|
+
}
|
|
121
|
+
return data;
|
|
122
|
+
}
|
|
123
|
+
/* helper functions for linear/decibel conversions */
|
|
124
|
+
function lin2dB(x) {
|
|
125
|
+
return 20 * Math.log10(Math.max(x, 1e-12));
|
|
126
|
+
}
|
|
127
|
+
function dB2lin(db) {
|
|
128
|
+
return Math.pow(10, db / 20);
|
|
129
|
+
}
|
|
130
|
+
class WebAudio {
|
|
131
|
+
sampleRate;
|
|
132
|
+
channels;
|
|
133
|
+
/* internal state */
|
|
134
|
+
audioContext;
|
|
135
|
+
sourceNode = null;
|
|
136
|
+
captureNode = null;
|
|
137
|
+
pendingPromises = new Map();
|
|
138
|
+
/* construct object */
|
|
139
|
+
constructor(sampleRate, channels) {
|
|
140
|
+
this.sampleRate = sampleRate;
|
|
141
|
+
this.channels = channels;
|
|
142
|
+
/* create new audio context */
|
|
143
|
+
this.audioContext = new node_web_audio_api_1.AudioContext({
|
|
144
|
+
sampleRate,
|
|
145
|
+
latencyHint: "interactive"
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/* setup object */
|
|
149
|
+
async setup() {
|
|
150
|
+
/* ensure audio context is not suspended */
|
|
151
|
+
if (this.audioContext.state === "suspended")
|
|
152
|
+
await this.audioContext.resume();
|
|
153
|
+
/* add audio worklet module */
|
|
154
|
+
const url = node_path_1.default.resolve(__dirname, "speechflow-util-audio-wt.js");
|
|
155
|
+
await this.audioContext.audioWorklet.addModule(url);
|
|
156
|
+
/* create source node */
|
|
157
|
+
this.sourceNode = new node_web_audio_api_1.AudioWorkletNode(this.audioContext, "source", {
|
|
158
|
+
numberOfInputs: 0,
|
|
159
|
+
numberOfOutputs: 1,
|
|
160
|
+
outputChannelCount: [this.channels]
|
|
161
|
+
});
|
|
162
|
+
/* create capture node */
|
|
163
|
+
this.captureNode = new node_web_audio_api_1.AudioWorkletNode(this.audioContext, "capture", {
|
|
164
|
+
numberOfInputs: 1,
|
|
165
|
+
numberOfOutputs: 0
|
|
166
|
+
});
|
|
167
|
+
this.captureNode.port.addEventListener("message", (event) => {
|
|
168
|
+
const { type, chunkId, data } = event.data ?? {};
|
|
169
|
+
if (type === "capture-complete") {
|
|
170
|
+
const promise = this.pendingPromises.get(chunkId);
|
|
171
|
+
if (promise) {
|
|
172
|
+
clearTimeout(promise.timeout);
|
|
173
|
+
this.pendingPromises.delete(chunkId);
|
|
174
|
+
const int16Data = new Int16Array(data.length);
|
|
175
|
+
for (let i = 0; i < data.length; i++)
|
|
176
|
+
int16Data[i] = Math.max(-32768, Math.min(32767, Math.round(data[i] * 32767)));
|
|
177
|
+
promise.resolve(int16Data);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
/* start ports */
|
|
182
|
+
this.sourceNode.port.start();
|
|
183
|
+
this.captureNode.port.start();
|
|
184
|
+
}
|
|
185
|
+
/* process single audio chunk */
|
|
186
|
+
async process(int16Array) {
|
|
187
|
+
const chunkId = `chunk_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
const timeout = setTimeout(() => {
|
|
190
|
+
this.pendingPromises.delete(chunkId);
|
|
191
|
+
reject(new Error("processing timeout"));
|
|
192
|
+
}, (int16Array.length / this.audioContext.sampleRate) * 1000 + 250);
|
|
193
|
+
if (this.captureNode !== null)
|
|
194
|
+
this.pendingPromises.set(chunkId, { resolve, reject, timeout });
|
|
195
|
+
try {
|
|
196
|
+
const float32Data = new Float32Array(int16Array.length);
|
|
197
|
+
for (let i = 0; i < int16Array.length; i++)
|
|
198
|
+
float32Data[i] = int16Array[i] / 32768.0;
|
|
199
|
+
/* start capture first */
|
|
200
|
+
if (this.captureNode !== null) {
|
|
201
|
+
this.captureNode?.port.postMessage({
|
|
202
|
+
type: "start-capture",
|
|
203
|
+
chunkId,
|
|
204
|
+
expectedSamples: int16Array.length
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/* small delay to ensure capture is ready before sending data */
|
|
208
|
+
setTimeout(() => {
|
|
209
|
+
/* send input to source node */
|
|
210
|
+
this.sourceNode?.port.postMessage({
|
|
211
|
+
type: "input-chunk",
|
|
212
|
+
chunkId,
|
|
213
|
+
data: { pcmData: float32Data, channels: this.channels }
|
|
214
|
+
}, [float32Data.buffer]);
|
|
215
|
+
}, 5);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
clearTimeout(timeout);
|
|
219
|
+
if (this.captureNode !== null)
|
|
220
|
+
this.pendingPromises.delete(chunkId);
|
|
221
|
+
reject(new Error(`failed to process chunk: ${error}`));
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async destroy() {
|
|
226
|
+
/* reject all pending promises */
|
|
227
|
+
try {
|
|
228
|
+
this.pendingPromises.forEach(({ reject, timeout }) => {
|
|
229
|
+
clearTimeout(timeout);
|
|
230
|
+
reject(new Error("WebAudio destroyed"));
|
|
231
|
+
});
|
|
232
|
+
this.pendingPromises.clear();
|
|
233
|
+
}
|
|
234
|
+
catch (_err) {
|
|
235
|
+
/* ignored - cleanup during shutdown */
|
|
236
|
+
}
|
|
237
|
+
/* disconnect nodes */
|
|
238
|
+
if (this.sourceNode !== null) {
|
|
239
|
+
this.sourceNode.disconnect();
|
|
240
|
+
this.sourceNode = null;
|
|
241
|
+
}
|
|
242
|
+
if (this.captureNode !== null) {
|
|
243
|
+
this.captureNode.disconnect();
|
|
244
|
+
this.captureNode = null;
|
|
245
|
+
}
|
|
246
|
+
/* stop context */
|
|
247
|
+
await this.audioContext.close();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.WebAudio = WebAudio;
|
|
251
|
+
//# sourceMappingURL=speechflow-util-audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-util-audio.js","sourceRoot":"","sources":["../src/speechflow-util-audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function ensureError(error: unknown, prefix?: string, debug?: boolean): Error;
|
|
2
|
+
export declare function ensurePromise<T>(arg: T | Promise<T>): Promise<T>;
|
|
3
|
+
type runNoPromise<T> = [
|
|
4
|
+
T
|
|
5
|
+
] extends [Promise<any>] ? never : T;
|
|
6
|
+
export declare function run<T, X extends runNoPromise<T> | never>(action: () => X, oncatch?: (error: Error) => X | never, onfinally?: () => void): X;
|
|
7
|
+
export declare function run<T, X extends runNoPromise<T> | never>(description: string, action: () => X, oncatch?: (error: Error) => X | never, onfinally?: () => void): X;
|
|
8
|
+
export declare function run<T, X extends (T | Promise<T>)>(action: () => X, oncatch?: (error: Error) => X, onfinally?: () => void): Promise<T>;
|
|
9
|
+
export declare function run<T, X extends (T | Promise<T>)>(description: string, action: () => X, oncatch?: (error: Error) => X, onfinally?: () => void): Promise<T>;
|
|
10
|
+
export declare function runner<T, X extends runNoPromise<T> | never, F extends (...args: any[]) => X>(action: F, oncatch?: (error: Error) => X | never, onfinally?: () => void): F;
|
|
11
|
+
export declare function runner<T, X extends runNoPromise<T> | never, F extends (...args: any[]) => X>(description: string, action: F, oncatch?: (error: Error) => X | never, onfinally?: () => void): F;
|
|
12
|
+
export declare function runner<T, X extends (T | Promise<T>), F extends (...args: any[]) => Promise<T>>(action: F, oncatch?: (error: Error) => X, onfinally?: () => void): F;
|
|
13
|
+
export declare function runner<T, X extends (T | Promise<T>), F extends (...args: any[]) => Promise<T>>(description: string, action: F, oncatch?: (error: Error) => X, onfinally?: () => void): F;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ensureError = ensureError;
|
|
9
|
+
exports.ensurePromise = ensurePromise;
|
|
10
|
+
exports.run = run;
|
|
11
|
+
exports.runner = runner;
|
|
12
|
+
/* helper function for retrieving an Error object */
|
|
13
|
+
function ensureError(error, prefix, debug = false) {
|
|
14
|
+
if (error instanceof Error && prefix === undefined && debug === false)
|
|
15
|
+
return error;
|
|
16
|
+
let msg = error instanceof Error ?
|
|
17
|
+
error.message : String(error);
|
|
18
|
+
if (prefix)
|
|
19
|
+
msg = `${prefix}: ${msg}`;
|
|
20
|
+
if (debug && error instanceof Error)
|
|
21
|
+
msg = `${msg}\n${error.stack}`;
|
|
22
|
+
return new Error(msg, { cause: error });
|
|
23
|
+
}
|
|
24
|
+
/* helper function for retrieving a Promise object */
|
|
25
|
+
function ensurePromise(arg) {
|
|
26
|
+
if (!(arg instanceof Promise))
|
|
27
|
+
arg = Promise.resolve(arg);
|
|
28
|
+
return arg;
|
|
29
|
+
}
|
|
30
|
+
/* helper function for running the finally code of "run" */
|
|
31
|
+
function runFinally(onfinally) {
|
|
32
|
+
if (!onfinally)
|
|
33
|
+
return;
|
|
34
|
+
try {
|
|
35
|
+
onfinally();
|
|
36
|
+
}
|
|
37
|
+
catch (_error) { /* ignored */ }
|
|
38
|
+
}
|
|
39
|
+
function run(...args) {
|
|
40
|
+
/* support overloaded signatures */
|
|
41
|
+
let description;
|
|
42
|
+
let action;
|
|
43
|
+
let oncatch;
|
|
44
|
+
let onfinally;
|
|
45
|
+
if (typeof args[0] === "string") {
|
|
46
|
+
description = args[0];
|
|
47
|
+
action = args[1];
|
|
48
|
+
oncatch = args[2];
|
|
49
|
+
onfinally = args[3];
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
action = args[0];
|
|
53
|
+
oncatch = args[1];
|
|
54
|
+
onfinally = args[2];
|
|
55
|
+
}
|
|
56
|
+
/* perform the action */
|
|
57
|
+
let result;
|
|
58
|
+
try {
|
|
59
|
+
result = action();
|
|
60
|
+
}
|
|
61
|
+
catch (arg) {
|
|
62
|
+
/* synchronous case (error branch) */
|
|
63
|
+
let error = ensureError(arg, description);
|
|
64
|
+
if (oncatch) {
|
|
65
|
+
try {
|
|
66
|
+
result = oncatch(error);
|
|
67
|
+
}
|
|
68
|
+
catch (arg) {
|
|
69
|
+
error = ensureError(arg, description);
|
|
70
|
+
runFinally(onfinally);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
runFinally(onfinally);
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
runFinally(onfinally);
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
if (result instanceof Promise) {
|
|
80
|
+
/* asynchronous case (result or error branch) */
|
|
81
|
+
return result.catch((arg) => {
|
|
82
|
+
/* asynchronous case (error branch) */
|
|
83
|
+
let error = ensureError(arg, description);
|
|
84
|
+
if (oncatch) {
|
|
85
|
+
try {
|
|
86
|
+
return oncatch(error);
|
|
87
|
+
}
|
|
88
|
+
catch (arg) {
|
|
89
|
+
error = ensureError(arg, description);
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}).finally(() => {
|
|
95
|
+
/* asynchronous case (result and error branch) */
|
|
96
|
+
runFinally(onfinally);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
/* synchronous case (result branch) */
|
|
101
|
+
runFinally(onfinally);
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function runner(...args) {
|
|
106
|
+
/* support overloaded signatures */
|
|
107
|
+
let description;
|
|
108
|
+
let action;
|
|
109
|
+
let oncatch;
|
|
110
|
+
let onfinally;
|
|
111
|
+
if (typeof args[0] === "string") {
|
|
112
|
+
description = args[0];
|
|
113
|
+
action = args[1];
|
|
114
|
+
oncatch = args[2];
|
|
115
|
+
onfinally = args[3];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
action = args[0];
|
|
119
|
+
oncatch = args[1];
|
|
120
|
+
onfinally = args[2];
|
|
121
|
+
}
|
|
122
|
+
/* wrap the "run" operation on "action" into function
|
|
123
|
+
which exposes the signature of "action" */
|
|
124
|
+
return (...args) => {
|
|
125
|
+
if (description)
|
|
126
|
+
return run(description, () => action(...args), oncatch, onfinally);
|
|
127
|
+
else
|
|
128
|
+
return run(() => action(...args), oncatch, onfinally);
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=speechflow-util-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-util-error.js","sourceRoot":"","sources":["../src/speechflow-util-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { type Type } from "arktype";
|
|
3
|
+
import { Duration } from "luxon";
|
|
4
|
+
export declare function importObject<T>(name: string, arg: object | string, validator: Type<T, {}>): T;
|
|
5
|
+
export declare class SingleQueue<T> extends EventEmitter {
|
|
6
|
+
private queue;
|
|
7
|
+
write(item: T): void;
|
|
8
|
+
read(): Promise<T>;
|
|
9
|
+
}
|
|
10
|
+
export declare class DoubleQueue<T0, T1> extends EventEmitter {
|
|
11
|
+
private queue0;
|
|
12
|
+
private queue1;
|
|
13
|
+
private notify;
|
|
14
|
+
write0(item: T0): void;
|
|
15
|
+
write1(item: T1): void;
|
|
16
|
+
read(): Promise<[T0, T1]>;
|
|
17
|
+
}
|
|
18
|
+
export type QueueElement = {
|
|
19
|
+
type: string;
|
|
20
|
+
};
|
|
21
|
+
export declare class QueuePointer<T extends QueueElement> extends EventEmitter {
|
|
22
|
+
private name;
|
|
23
|
+
private queue;
|
|
24
|
+
private index;
|
|
25
|
+
constructor(name: string, queue: Queue<T>);
|
|
26
|
+
maxPosition(): number;
|
|
27
|
+
position(index?: number): number;
|
|
28
|
+
walk(num: number): void;
|
|
29
|
+
walkForwardUntil(type: T["type"]): void;
|
|
30
|
+
walkBackwardUntil(type: T["type"]): void;
|
|
31
|
+
searchForward(type: T["type"]): number;
|
|
32
|
+
searchBackward(type: T["type"]): number;
|
|
33
|
+
peek(position?: number): T;
|
|
34
|
+
read(): T;
|
|
35
|
+
slice(size?: number): T[];
|
|
36
|
+
touch(): void;
|
|
37
|
+
append(element: T): void;
|
|
38
|
+
insert(element: T): void;
|
|
39
|
+
delete(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare class Queue<T extends QueueElement> extends EventEmitter {
|
|
42
|
+
elements: T[];
|
|
43
|
+
private pointers;
|
|
44
|
+
constructor();
|
|
45
|
+
pointerUse(name: string): QueuePointer<T>;
|
|
46
|
+
pointerDelete(name: string): void;
|
|
47
|
+
trim(): void;
|
|
48
|
+
}
|
|
49
|
+
export declare class TimeStore<T> extends EventEmitter {
|
|
50
|
+
private tree;
|
|
51
|
+
store(start: Duration, end: Duration, item: T): void;
|
|
52
|
+
fetch(start: Duration, end: Duration): T[];
|
|
53
|
+
prune(_before: Duration): void;
|
|
54
|
+
clear(): void;
|
|
55
|
+
}
|
|
56
|
+
export declare class AsyncQueue<T> {
|
|
57
|
+
private queue;
|
|
58
|
+
private resolvers;
|
|
59
|
+
write(v: T | null): void;
|
|
60
|
+
read(): Promise<T | null>;
|
|
61
|
+
destroy(): void;
|
|
62
|
+
}
|
|
63
|
+
export declare class CachedRegExp {
|
|
64
|
+
private cache;
|
|
65
|
+
compile(pattern: string): RegExp | null;
|
|
66
|
+
clear(): void;
|
|
67
|
+
size(): number;
|
|
68
|
+
}
|