speechflow 1.3.1 → 1.4.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 +23 -0
- package/etc/stx.conf +54 -58
- package/package.json +25 -106
- package/{etc → speechflow-cli/etc}/eslint.mjs +1 -2
- package/speechflow-cli/etc/stx.conf +77 -0
- package/speechflow-cli/package.json +116 -0
- package/{src → speechflow-cli/src}/speechflow-node-a2a-gender.ts +148 -64
- package/speechflow-cli/src/speechflow-node-a2a-meter.ts +217 -0
- package/{src → speechflow-cli/src}/speechflow-node-a2a-mute.ts +39 -11
- package/speechflow-cli/src/speechflow-node-a2a-vad.ts +384 -0
- package/{src → speechflow-cli/src}/speechflow-node-a2a-wav.ts +27 -11
- package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +313 -0
- package/{src → speechflow-cli/src}/speechflow-node-t2a-elevenlabs.ts +59 -12
- package/{src → speechflow-cli/src}/speechflow-node-t2a-kokoro.ts +11 -4
- package/{src → speechflow-cli/src}/speechflow-node-t2t-deepl.ts +9 -4
- package/{src → speechflow-cli/src}/speechflow-node-t2t-format.ts +2 -2
- package/{src → speechflow-cli/src}/speechflow-node-t2t-ollama.ts +1 -1
- package/{src → speechflow-cli/src}/speechflow-node-t2t-openai.ts +1 -1
- package/{src → speechflow-cli/src}/speechflow-node-t2t-sentence.ts +37 -20
- package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +276 -0
- package/{src → speechflow-cli/src}/speechflow-node-t2t-transformers.ts +4 -3
- package/{src → speechflow-cli/src}/speechflow-node-x2x-filter.ts +9 -5
- package/{src → speechflow-cli/src}/speechflow-node-x2x-trace.ts +16 -8
- package/{src → speechflow-cli/src}/speechflow-node-xio-device.ts +12 -8
- package/{src → speechflow-cli/src}/speechflow-node-xio-file.ts +9 -3
- package/{src → speechflow-cli/src}/speechflow-node-xio-mqtt.ts +5 -2
- package/{src → speechflow-cli/src}/speechflow-node-xio-websocket.ts +12 -12
- package/{src → speechflow-cli/src}/speechflow-node.ts +7 -0
- package/{src → speechflow-cli/src}/speechflow-utils.ts +78 -44
- package/{src → speechflow-cli/src}/speechflow.ts +188 -53
- package/speechflow-ui-db/etc/eslint.mjs +106 -0
- package/speechflow-ui-db/etc/htmllint.json +55 -0
- package/speechflow-ui-db/etc/stx.conf +79 -0
- package/speechflow-ui-db/etc/stylelint.js +46 -0
- package/speechflow-ui-db/etc/stylelint.yaml +33 -0
- package/speechflow-ui-db/etc/tsc-client.json +30 -0
- package/speechflow-ui-db/etc/tsc.node.json +9 -0
- package/speechflow-ui-db/etc/vite-client.mts +63 -0
- package/speechflow-ui-db/package.d/htmllint-cli+0.0.7.patch +20 -0
- package/speechflow-ui-db/package.json +75 -0
- package/speechflow-ui-db/src/app-icon.ai +1989 -4
- package/speechflow-ui-db/src/app-icon.svg +26 -0
- package/speechflow-ui-db/src/app.styl +64 -0
- package/speechflow-ui-db/src/app.vue +221 -0
- package/speechflow-ui-db/src/index.html +23 -0
- package/speechflow-ui-db/src/index.ts +26 -0
- package/{dst/speechflow.d.ts → speechflow-ui-db/src/lib.d.ts} +5 -3
- package/speechflow-ui-db/src/tsconfig.json +3 -0
- package/speechflow-ui-st/etc/eslint.mjs +106 -0
- package/speechflow-ui-st/etc/htmllint.json +55 -0
- package/speechflow-ui-st/etc/stx.conf +79 -0
- package/speechflow-ui-st/etc/stylelint.js +46 -0
- package/speechflow-ui-st/etc/stylelint.yaml +33 -0
- package/speechflow-ui-st/etc/tsc-client.json +30 -0
- package/speechflow-ui-st/etc/tsc.node.json +9 -0
- package/speechflow-ui-st/etc/vite-client.mts +63 -0
- package/speechflow-ui-st/package.d/htmllint-cli+0.0.7.patch +20 -0
- package/speechflow-ui-st/package.json +79 -0
- package/speechflow-ui-st/src/app-icon.ai +1989 -4
- package/speechflow-ui-st/src/app-icon.svg +26 -0
- package/speechflow-ui-st/src/app.styl +64 -0
- package/speechflow-ui-st/src/app.vue +142 -0
- package/speechflow-ui-st/src/index.html +23 -0
- package/speechflow-ui-st/src/index.ts +26 -0
- package/speechflow-ui-st/src/lib.d.ts +9 -0
- package/speechflow-ui-st/src/tsconfig.json +3 -0
- package/dst/speechflow-node-a2a-ffmpeg.d.ts +0 -13
- package/dst/speechflow-node-a2a-ffmpeg.js +0 -153
- package/dst/speechflow-node-a2a-ffmpeg.js.map +0 -1
- package/dst/speechflow-node-a2a-gender.d.ts +0 -18
- package/dst/speechflow-node-a2a-gender.js +0 -271
- package/dst/speechflow-node-a2a-gender.js.map +0 -1
- package/dst/speechflow-node-a2a-meter.d.ts +0 -12
- package/dst/speechflow-node-a2a-meter.js +0 -155
- package/dst/speechflow-node-a2a-meter.js.map +0 -1
- package/dst/speechflow-node-a2a-mute.d.ts +0 -16
- package/dst/speechflow-node-a2a-mute.js +0 -91
- package/dst/speechflow-node-a2a-mute.js.map +0 -1
- package/dst/speechflow-node-a2a-vad.d.ts +0 -16
- package/dst/speechflow-node-a2a-vad.js +0 -285
- package/dst/speechflow-node-a2a-vad.js.map +0 -1
- package/dst/speechflow-node-a2a-wav.d.ts +0 -11
- package/dst/speechflow-node-a2a-wav.js +0 -195
- package/dst/speechflow-node-a2a-wav.js.map +0 -1
- package/dst/speechflow-node-a2t-deepgram.d.ts +0 -15
- package/dst/speechflow-node-a2t-deepgram.js +0 -255
- package/dst/speechflow-node-a2t-deepgram.js.map +0 -1
- package/dst/speechflow-node-t2a-elevenlabs.d.ts +0 -16
- package/dst/speechflow-node-t2a-elevenlabs.js +0 -195
- package/dst/speechflow-node-t2a-elevenlabs.js.map +0 -1
- package/dst/speechflow-node-t2a-kokoro.d.ts +0 -13
- package/dst/speechflow-node-t2a-kokoro.js +0 -149
- package/dst/speechflow-node-t2a-kokoro.js.map +0 -1
- package/dst/speechflow-node-t2t-deepl.d.ts +0 -15
- package/dst/speechflow-node-t2t-deepl.js +0 -142
- package/dst/speechflow-node-t2t-deepl.js.map +0 -1
- package/dst/speechflow-node-t2t-format.d.ts +0 -11
- package/dst/speechflow-node-t2t-format.js +0 -82
- package/dst/speechflow-node-t2t-format.js.map +0 -1
- package/dst/speechflow-node-t2t-ollama.d.ts +0 -13
- package/dst/speechflow-node-t2t-ollama.js +0 -247
- package/dst/speechflow-node-t2t-ollama.js.map +0 -1
- package/dst/speechflow-node-t2t-openai.d.ts +0 -13
- package/dst/speechflow-node-t2t-openai.js +0 -227
- package/dst/speechflow-node-t2t-openai.js.map +0 -1
- package/dst/speechflow-node-t2t-sentence.d.ts +0 -17
- package/dst/speechflow-node-t2t-sentence.js +0 -234
- package/dst/speechflow-node-t2t-sentence.js.map +0 -1
- package/dst/speechflow-node-t2t-subtitle.d.ts +0 -13
- package/dst/speechflow-node-t2t-subtitle.js +0 -278
- package/dst/speechflow-node-t2t-subtitle.js.map +0 -1
- package/dst/speechflow-node-t2t-transformers.d.ts +0 -14
- package/dst/speechflow-node-t2t-transformers.js +0 -265
- package/dst/speechflow-node-t2t-transformers.js.map +0 -1
- package/dst/speechflow-node-x2x-filter.d.ts +0 -11
- package/dst/speechflow-node-x2x-filter.js +0 -117
- package/dst/speechflow-node-x2x-filter.js.map +0 -1
- package/dst/speechflow-node-x2x-trace.d.ts +0 -11
- package/dst/speechflow-node-x2x-trace.js +0 -111
- package/dst/speechflow-node-x2x-trace.js.map +0 -1
- package/dst/speechflow-node-xio-device.d.ts +0 -13
- package/dst/speechflow-node-xio-device.js +0 -226
- package/dst/speechflow-node-xio-device.js.map +0 -1
- package/dst/speechflow-node-xio-file.d.ts +0 -11
- package/dst/speechflow-node-xio-file.js +0 -210
- package/dst/speechflow-node-xio-file.js.map +0 -1
- package/dst/speechflow-node-xio-mqtt.d.ts +0 -13
- package/dst/speechflow-node-xio-mqtt.js +0 -185
- package/dst/speechflow-node-xio-mqtt.js.map +0 -1
- package/dst/speechflow-node-xio-websocket.d.ts +0 -13
- package/dst/speechflow-node-xio-websocket.js +0 -278
- package/dst/speechflow-node-xio-websocket.js.map +0 -1
- package/dst/speechflow-node.d.ts +0 -65
- package/dst/speechflow-node.js +0 -180
- package/dst/speechflow-node.js.map +0 -1
- package/dst/speechflow-utils.d.ts +0 -69
- package/dst/speechflow-utils.js +0 -486
- package/dst/speechflow-utils.js.map +0 -1
- package/dst/speechflow.js +0 -768
- package/dst/speechflow.js.map +0 -1
- package/src/speechflow-node-a2a-meter.ts +0 -130
- package/src/speechflow-node-a2a-vad.ts +0 -285
- package/src/speechflow-node-a2t-deepgram.ts +0 -234
- package/src/speechflow-node-t2t-subtitle.ts +0 -149
- /package/{etc → speechflow-cli/etc}/biome.jsonc +0 -0
- /package/{etc → speechflow-cli/etc}/oxlint.jsonc +0 -0
- /package/{etc → speechflow-cli/etc}/speechflow.bat +0 -0
- /package/{etc → speechflow-cli/etc}/speechflow.sh +0 -0
- /package/{etc → speechflow-cli/etc}/speechflow.yaml +0 -0
- /package/{etc → speechflow-cli/etc}/tsconfig.json +0 -0
- /package/{package.d → speechflow-cli/package.d}/@ericedouard+vad-node-realtime+0.2.0.patch +0 -0
- /package/{src → speechflow-cli/src}/lib.d.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-logo.ai +0 -0
- /package/{src → speechflow-cli/src}/speechflow-logo.svg +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-a2a-ffmpeg.ts +0 -0
- /package/{tsconfig.json → speechflow-cli/tsconfig.json} +0 -0
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
** SpeechFlow - Speech Processing Flow Graph
|
|
4
|
-
** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
5
|
-
** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
|
|
6
|
-
*/
|
|
7
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
-
if (k2 === undefined) k2 = k;
|
|
9
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
-
}
|
|
13
|
-
Object.defineProperty(o, k2, desc);
|
|
14
|
-
}) : (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
o[k2] = m[k];
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
-
};
|
|
43
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
/* standard dependencies */
|
|
45
|
-
const node_stream_1 = __importDefault(require("node:stream"));
|
|
46
|
-
/* external dependencies */
|
|
47
|
-
const Deepgram = __importStar(require("@deepgram/sdk"));
|
|
48
|
-
const luxon_1 = require("luxon");
|
|
49
|
-
/* internal dependencies */
|
|
50
|
-
const speechflow_node_1 = __importStar(require("./speechflow-node"));
|
|
51
|
-
const utils = __importStar(require("./speechflow-utils"));
|
|
52
|
-
/* SpeechFlow node for Deepgram speech-to-text conversion */
|
|
53
|
-
class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
54
|
-
/* declare official node name */
|
|
55
|
-
static name = "deepgram";
|
|
56
|
-
/* internal state */
|
|
57
|
-
dg = null;
|
|
58
|
-
/* construct node */
|
|
59
|
-
constructor(id, cfg, opts, args) {
|
|
60
|
-
super(id, cfg, opts, args);
|
|
61
|
-
/* declare node configuration parameters */
|
|
62
|
-
this.configure({
|
|
63
|
-
key: { type: "string", val: process.env.SPEECHFLOW_DEEPGRAM_KEY },
|
|
64
|
-
keyAdm: { type: "string", val: process.env.SPEECHFLOW_DEEPGRAM_KEY_ADM },
|
|
65
|
-
model: { type: "string", val: "nova-3", pos: 0 },
|
|
66
|
-
version: { type: "string", val: "latest", pos: 1 },
|
|
67
|
-
language: { type: "string", val: "multi", pos: 2 },
|
|
68
|
-
interim: { type: "boolean", val: false, pos: 3 }
|
|
69
|
-
});
|
|
70
|
-
/* declare node input/output format */
|
|
71
|
-
this.input = "audio";
|
|
72
|
-
this.output = "text";
|
|
73
|
-
}
|
|
74
|
-
/* one-time status of node */
|
|
75
|
-
async status() {
|
|
76
|
-
let balance = 0;
|
|
77
|
-
const deepgram = Deepgram.createClient(this.params.keyAdm);
|
|
78
|
-
const response = await deepgram.manage.getProjects();
|
|
79
|
-
if (response !== null && response.error === null) {
|
|
80
|
-
for (const project of response.result.projects) {
|
|
81
|
-
const response = await deepgram.manage.getProjectBalances(project.project_id);
|
|
82
|
-
if (response !== null && response.error === null)
|
|
83
|
-
balance += response.result.balances[0]?.amount ?? 0;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return { balance: balance.toFixed(2) };
|
|
87
|
-
}
|
|
88
|
-
/* open node */
|
|
89
|
-
async open() {
|
|
90
|
-
/* sanity check situation */
|
|
91
|
-
if (this.config.audioBitDepth !== 16 || !this.config.audioLittleEndian)
|
|
92
|
-
throw new Error("Deepgram node currently supports PCM-S16LE audio only");
|
|
93
|
-
/* create queue for results */
|
|
94
|
-
const queue = new utils.SingleQueue();
|
|
95
|
-
/* create a store for the meta information */
|
|
96
|
-
const metastore = new utils.TimeStore();
|
|
97
|
-
/* connect to Deepgram API */
|
|
98
|
-
const deepgram = Deepgram.createClient(this.params.key);
|
|
99
|
-
let language = "en";
|
|
100
|
-
if (this.params.model.match(/^nova-2/) && this.params.language !== "en")
|
|
101
|
-
language = this.params.language;
|
|
102
|
-
else if (this.params.model.match(/^nova-3/) && this.params.language !== "en")
|
|
103
|
-
language = "multi";
|
|
104
|
-
this.dg = deepgram.listen.live({
|
|
105
|
-
mip_opt_out: true,
|
|
106
|
-
model: this.params.model,
|
|
107
|
-
version: this.params.version,
|
|
108
|
-
language,
|
|
109
|
-
channels: this.config.audioChannels,
|
|
110
|
-
sample_rate: this.config.audioSampleRate,
|
|
111
|
-
encoding: "linear16",
|
|
112
|
-
multichannel: false,
|
|
113
|
-
endpointing: 10,
|
|
114
|
-
interim_results: this.params.interim,
|
|
115
|
-
smart_format: true,
|
|
116
|
-
punctuate: true,
|
|
117
|
-
filler_words: true,
|
|
118
|
-
diarize: false,
|
|
119
|
-
numerals: true,
|
|
120
|
-
profanity_filter: false
|
|
121
|
-
});
|
|
122
|
-
/* hook onto Deepgram API events */
|
|
123
|
-
this.dg.on(Deepgram.LiveTranscriptionEvents.Transcript, async (data) => {
|
|
124
|
-
const text = (data.channel?.alternatives[0]?.transcript ?? "");
|
|
125
|
-
const words = (data.channel?.alternatives[0]?.words ?? []);
|
|
126
|
-
const isFinal = (data.is_final ?? false);
|
|
127
|
-
if (text === "")
|
|
128
|
-
this.log("info", `empty/dummy text received (start: ${data.start}s, duration: ${data.duration.toFixed(2)}s)`);
|
|
129
|
-
else {
|
|
130
|
-
this.log("info", `text received (start: ${data.start}s, duration: ${data.duration.toFixed(2)}s): "${text}"`);
|
|
131
|
-
const start = luxon_1.Duration.fromMillis(data.start * 1000).plus(this.timeZeroOffset);
|
|
132
|
-
const end = start.plus({ seconds: data.duration });
|
|
133
|
-
const metas = metastore.fetch(start, end);
|
|
134
|
-
const meta = metas.reduce((prev, curr) => {
|
|
135
|
-
curr.forEach((val, key) => { prev.set(key, val); });
|
|
136
|
-
return prev;
|
|
137
|
-
}, new Map());
|
|
138
|
-
metastore.prune(start);
|
|
139
|
-
meta.set("words", words.map((word) => {
|
|
140
|
-
const start = luxon_1.Duration.fromMillis(word.start * 1000).plus(this.timeZeroOffset);
|
|
141
|
-
const end = luxon_1.Duration.fromMillis(word.end * 1000).plus(this.timeZeroOffset);
|
|
142
|
-
return { word: word.punctuated_word ?? word.word, start, end };
|
|
143
|
-
}));
|
|
144
|
-
const chunk = new speechflow_node_1.SpeechFlowChunk(start, end, isFinal ? "final" : "intermediate", "text", text, meta);
|
|
145
|
-
queue.write(chunk);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
this.dg.on(Deepgram.LiveTranscriptionEvents.Metadata, (data) => {
|
|
149
|
-
this.log("info", "metadata received");
|
|
150
|
-
});
|
|
151
|
-
this.dg.on(Deepgram.LiveTranscriptionEvents.Close, () => {
|
|
152
|
-
this.log("info", "connection close");
|
|
153
|
-
});
|
|
154
|
-
this.dg.on(Deepgram.LiveTranscriptionEvents.Error, (error) => {
|
|
155
|
-
this.log("error", `error: ${error.message}`);
|
|
156
|
-
this.emit("error");
|
|
157
|
-
});
|
|
158
|
-
/* wait for Deepgram API to be available */
|
|
159
|
-
await new Promise((resolve, reject) => {
|
|
160
|
-
let timer = setTimeout(() => {
|
|
161
|
-
if (timer !== null) {
|
|
162
|
-
timer = null;
|
|
163
|
-
reject(new Error("Deepgram: timeout waiting for connection open"));
|
|
164
|
-
}
|
|
165
|
-
}, 8000);
|
|
166
|
-
this.dg.once(Deepgram.LiveTranscriptionEvents.Open, () => {
|
|
167
|
-
this.log("info", "connection open");
|
|
168
|
-
if (timer !== null) {
|
|
169
|
-
clearTimeout(timer);
|
|
170
|
-
timer = null;
|
|
171
|
-
}
|
|
172
|
-
resolve(true);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
/* remember opening time to receive time zero offset */
|
|
176
|
-
this.timeOpen = luxon_1.DateTime.now();
|
|
177
|
-
/* workaround Deepgram initialization problems */
|
|
178
|
-
let initDone = false;
|
|
179
|
-
let initTimeout = null;
|
|
180
|
-
const initTimeoutStart = () => {
|
|
181
|
-
if (initDone)
|
|
182
|
-
return;
|
|
183
|
-
setTimeout(async () => {
|
|
184
|
-
if (initTimeout === null)
|
|
185
|
-
return;
|
|
186
|
-
initTimeout = null;
|
|
187
|
-
this.log("warning", "initialization timeout -- restarting service usage");
|
|
188
|
-
await this.close();
|
|
189
|
-
this.open();
|
|
190
|
-
}, 3000);
|
|
191
|
-
};
|
|
192
|
-
const initTimeoutStop = () => {
|
|
193
|
-
if (initDone)
|
|
194
|
-
return;
|
|
195
|
-
initDone = true;
|
|
196
|
-
if (initTimeout !== null) {
|
|
197
|
-
clearTimeout(initTimeout);
|
|
198
|
-
initTimeout = null;
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
/* provide Duplex stream and internally attach to Deepgram API */
|
|
202
|
-
const dg = this.dg;
|
|
203
|
-
const log = (level, msg) => {
|
|
204
|
-
this.log(level, msg);
|
|
205
|
-
};
|
|
206
|
-
const encoding = this.config.textEncoding;
|
|
207
|
-
this.stream = new node_stream_1.default.Duplex({
|
|
208
|
-
writableObjectMode: true,
|
|
209
|
-
readableObjectMode: true,
|
|
210
|
-
decodeStrings: false,
|
|
211
|
-
highWaterMark: 1,
|
|
212
|
-
write(chunk, encoding, callback) {
|
|
213
|
-
if (chunk.type !== "audio")
|
|
214
|
-
callback(new Error("expected audio input chunk"));
|
|
215
|
-
else if (!Buffer.isBuffer(chunk.payload))
|
|
216
|
-
callback(new Error("expected Buffer input chunk"));
|
|
217
|
-
else {
|
|
218
|
-
if (chunk.payload.byteLength > 0) {
|
|
219
|
-
log("debug", `send data (${chunk.payload.byteLength} bytes)`);
|
|
220
|
-
initTimeoutStart();
|
|
221
|
-
if (chunk.meta.size > 0)
|
|
222
|
-
metastore.store(chunk.timestampStart, chunk.timestampEnd, chunk.meta);
|
|
223
|
-
dg.send(chunk.payload.buffer); /* intentionally discard all time information */
|
|
224
|
-
}
|
|
225
|
-
callback();
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
read(size) {
|
|
229
|
-
queue.read().then((chunk) => {
|
|
230
|
-
log("info", `receive data (${chunk.payload.length} bytes)`);
|
|
231
|
-
initTimeoutStop();
|
|
232
|
-
this.push(chunk, encoding);
|
|
233
|
-
});
|
|
234
|
-
},
|
|
235
|
-
final(callback) {
|
|
236
|
-
dg.requestClose();
|
|
237
|
-
this.push(null);
|
|
238
|
-
callback();
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
/* close node */
|
|
243
|
-
async close() {
|
|
244
|
-
/* close stream */
|
|
245
|
-
if (this.stream !== null) {
|
|
246
|
-
this.stream.destroy();
|
|
247
|
-
this.stream = null;
|
|
248
|
-
}
|
|
249
|
-
/* shutdown Deepgram API */
|
|
250
|
-
if (this.dg !== null)
|
|
251
|
-
this.dg.requestClose();
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
exports.default = SpeechFlowNodeDeepgram;
|
|
255
|
-
//# sourceMappingURL=speechflow-node-a2t-deepgram.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-a2t-deepgram.js","sourceRoot":"","sources":["../src/speechflow-node-a2t-deepgram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import SpeechFlowNode from "./speechflow-node";
|
|
2
|
-
export default class SpeechFlowNodeElevenlabs extends SpeechFlowNode {
|
|
3
|
-
static name: string;
|
|
4
|
-
private elevenlabs;
|
|
5
|
-
private static speexInitialized;
|
|
6
|
-
constructor(id: string, cfg: {
|
|
7
|
-
[id: string]: any;
|
|
8
|
-
}, opts: {
|
|
9
|
-
[id: string]: any;
|
|
10
|
-
}, args: any[]);
|
|
11
|
-
status(): Promise<{
|
|
12
|
-
usage: string;
|
|
13
|
-
}>;
|
|
14
|
-
open(): Promise<void>;
|
|
15
|
-
close(): Promise<void>;
|
|
16
|
-
}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
** SpeechFlow - Speech Processing Flow Graph
|
|
4
|
-
** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
5
|
-
** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
|
|
6
|
-
*/
|
|
7
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
-
if (k2 === undefined) k2 = k;
|
|
9
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
-
}
|
|
13
|
-
Object.defineProperty(o, k2, desc);
|
|
14
|
-
}) : (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
o[k2] = m[k];
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
-
};
|
|
43
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
/* standard dependencies */
|
|
45
|
-
const node_stream_1 = __importDefault(require("node:stream"));
|
|
46
|
-
/* external dependencies */
|
|
47
|
-
const ElevenLabs = __importStar(require("@elevenlabs/elevenlabs-js"));
|
|
48
|
-
const get_stream_1 = require("get-stream");
|
|
49
|
-
const speex_resampler_1 = __importDefault(require("speex-resampler"));
|
|
50
|
-
/* internal dependencies */
|
|
51
|
-
const speechflow_node_1 = __importDefault(require("./speechflow-node"));
|
|
52
|
-
/* SpeechFlow node for Elevenlabs text-to-speech conversion */
|
|
53
|
-
class SpeechFlowNodeElevenlabs extends speechflow_node_1.default {
|
|
54
|
-
/* declare official node name */
|
|
55
|
-
static name = "elevenlabs";
|
|
56
|
-
/* internal state */
|
|
57
|
-
elevenlabs = null;
|
|
58
|
-
static speexInitialized = false;
|
|
59
|
-
/* construct node */
|
|
60
|
-
constructor(id, cfg, opts, args) {
|
|
61
|
-
super(id, cfg, opts, args);
|
|
62
|
-
/* declare node configuration parameters */
|
|
63
|
-
this.configure({
|
|
64
|
-
key: { type: "string", val: process.env.SPEECHFLOW_ELEVENLABS_KEY },
|
|
65
|
-
voice: { type: "string", val: "Brian", pos: 0, match: /^(?:Brittney|Cassidy|Leonie|Mark|Brian)$/ },
|
|
66
|
-
language: { type: "string", val: "en", pos: 1, match: /^(?:de|en)$/ },
|
|
67
|
-
speed: { type: "number", val: 1.00, pos: 2, match: (n) => n >= 0.7 && n <= 1.2 },
|
|
68
|
-
stability: { type: "number", val: 0.5, pos: 3, match: (n) => n >= 0.0 && n <= 1.0 },
|
|
69
|
-
similarity: { type: "number", val: 0.75, pos: 4, match: (n) => n >= 0.0 && n <= 1.0 },
|
|
70
|
-
optimize: { type: "string", val: "latency", pos: 5, match: /^(?:latency|quality)$/ }
|
|
71
|
-
});
|
|
72
|
-
/* declare node input/output format */
|
|
73
|
-
this.input = "text";
|
|
74
|
-
this.output = "audio";
|
|
75
|
-
}
|
|
76
|
-
/* one-time status of node */
|
|
77
|
-
async status() {
|
|
78
|
-
const elevenlabs = new ElevenLabs.ElevenLabsClient({ apiKey: this.params.key });
|
|
79
|
-
const subscription = await elevenlabs.user.subscription.get();
|
|
80
|
-
const percent = subscription.characterCount / subscription.characterLimit;
|
|
81
|
-
return { usage: `${percent.toFixed(2)}%` };
|
|
82
|
-
}
|
|
83
|
-
/* open node */
|
|
84
|
-
async open() {
|
|
85
|
-
/* establish ElevenLabs API connection */
|
|
86
|
-
this.elevenlabs = new ElevenLabs.ElevenLabsClient({
|
|
87
|
-
apiKey: this.params.key
|
|
88
|
-
});
|
|
89
|
-
/* determine maximum sample rate of ElevenLabs tier */
|
|
90
|
-
const maxSampleRates = {
|
|
91
|
-
"free": 16000,
|
|
92
|
-
"starter": 22050,
|
|
93
|
-
"creator": 24000,
|
|
94
|
-
"independent_publisher": 44100,
|
|
95
|
-
"growing_business": 44100,
|
|
96
|
-
"enterprise": 44100
|
|
97
|
-
};
|
|
98
|
-
const sub = await this.elevenlabs.user.subscription.get();
|
|
99
|
-
const tier = (sub.tier ?? "free");
|
|
100
|
-
this.log("info", `determined ElevenLabs tier: "${tier}"`);
|
|
101
|
-
let maxSampleRate = 16000;
|
|
102
|
-
if (maxSampleRates[tier] !== undefined)
|
|
103
|
-
maxSampleRate = maxSampleRates[tier];
|
|
104
|
-
this.log("info", `determined maximum audio sample rate: ${maxSampleRate}`);
|
|
105
|
-
/* determine voice for text-to-speech operation
|
|
106
|
-
(for details see https://elevenlabs.io/text-to-speech) */
|
|
107
|
-
const voices = await this.elevenlabs.voices.getAll();
|
|
108
|
-
let voice = voices.voices.find((voice) => voice.name === this.params.voice);
|
|
109
|
-
if (voice === undefined) {
|
|
110
|
-
voice = voices.voices.find((voice) => voice.name.startsWith(this.params.voice));
|
|
111
|
-
if (voice === undefined)
|
|
112
|
-
throw new Error(`invalid ElevenLabs voice "${this.params.voice}"`);
|
|
113
|
-
}
|
|
114
|
-
const info = Object.keys(voice.labels ?? {}).length > 0 ?
|
|
115
|
-
(", " + Object.entries(voice.labels)
|
|
116
|
-
.map(([key, val]) => `${key}: "${val}"`).join(", ")) : "";
|
|
117
|
-
this.log("info", `selected voice: name: "${voice.name}"${info}`);
|
|
118
|
-
/* perform text-to-speech operation with Elevenlabs API */
|
|
119
|
-
const model = this.params.optimize === "quality" ?
|
|
120
|
-
"eleven_turbo_v2_5" :
|
|
121
|
-
"eleven_flash_v2_5";
|
|
122
|
-
const speechStream = (text) => {
|
|
123
|
-
this.log("info", `ElevenLabs: send text "${text}"`);
|
|
124
|
-
return this.elevenlabs.textToSpeech.convert(voice.voiceId, {
|
|
125
|
-
text,
|
|
126
|
-
modelId: model,
|
|
127
|
-
languageCode: this.params.language,
|
|
128
|
-
outputFormat: `pcm_${maxSampleRate}`,
|
|
129
|
-
seed: 815, /* arbitrary, but fixated by us */
|
|
130
|
-
voiceSettings: {
|
|
131
|
-
speed: this.params.speed,
|
|
132
|
-
stability: this.params.stability,
|
|
133
|
-
similarityBoost: this.params.similarity
|
|
134
|
-
}
|
|
135
|
-
}, {
|
|
136
|
-
timeoutInSeconds: 30,
|
|
137
|
-
maxRetries: 10
|
|
138
|
-
});
|
|
139
|
-
};
|
|
140
|
-
/* establish resampler from ElevenLabs's maximum 24Khz
|
|
141
|
-
output to our standard audio sample rate (48KHz) */
|
|
142
|
-
if (!SpeechFlowNodeElevenlabs.speexInitialized) {
|
|
143
|
-
/* at least once initialize resampler */
|
|
144
|
-
await speex_resampler_1.default.initPromise;
|
|
145
|
-
SpeechFlowNodeElevenlabs.speexInitialized = true;
|
|
146
|
-
}
|
|
147
|
-
const resampler = new speex_resampler_1.default(1, maxSampleRate, this.config.audioSampleRate, 7);
|
|
148
|
-
/* create transform stream and connect it to the ElevenLabs API */
|
|
149
|
-
const log = (level, msg) => { this.log(level, msg); };
|
|
150
|
-
this.stream = new node_stream_1.default.Transform({
|
|
151
|
-
writableObjectMode: true,
|
|
152
|
-
readableObjectMode: true,
|
|
153
|
-
decodeStrings: false,
|
|
154
|
-
highWaterMark: 1,
|
|
155
|
-
transform(chunk, encoding, callback) {
|
|
156
|
-
if (Buffer.isBuffer(chunk.payload))
|
|
157
|
-
callback(new Error("invalid chunk payload type"));
|
|
158
|
-
else {
|
|
159
|
-
speechStream(chunk.payload).then((stream) => {
|
|
160
|
-
(0, get_stream_1.getStreamAsBuffer)(stream).then((buffer) => {
|
|
161
|
-
const bufferResampled = resampler.processChunk(buffer);
|
|
162
|
-
log("info", `ElevenLabs: received audio (buffer length: ${buffer.byteLength})`);
|
|
163
|
-
const chunkNew = chunk.clone();
|
|
164
|
-
chunkNew.type = "audio";
|
|
165
|
-
chunkNew.payload = bufferResampled;
|
|
166
|
-
this.push(chunkNew);
|
|
167
|
-
callback();
|
|
168
|
-
}).catch((error) => {
|
|
169
|
-
callback(error);
|
|
170
|
-
});
|
|
171
|
-
}).catch((error) => {
|
|
172
|
-
callback(error);
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
final(callback) {
|
|
177
|
-
this.push(null);
|
|
178
|
-
callback();
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
/* close node */
|
|
183
|
-
async close() {
|
|
184
|
-
/* destroy stream */
|
|
185
|
-
if (this.stream !== null) {
|
|
186
|
-
this.stream.destroy();
|
|
187
|
-
this.stream = null;
|
|
188
|
-
}
|
|
189
|
-
/* destroy ElevenLabs API */
|
|
190
|
-
if (this.elevenlabs !== null)
|
|
191
|
-
this.elevenlabs = null;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
exports.default = SpeechFlowNodeElevenlabs;
|
|
195
|
-
//# sourceMappingURL=speechflow-node-t2a-elevenlabs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-t2a-elevenlabs.js","sourceRoot":"","sources":["../src/speechflow-node-t2a-elevenlabs.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,6BAA6B;AAC7B,8DAAgC;AAEhC,6BAA6B;AAC7B,sEAA6D;AAC7D,2CAA8C;AAC9C,sEAAmD;AAEnD,6BAA6B;AAC7B,wEAAmE;AAEnE,gEAAgE;AAChE,MAAqB,wBAAyB,SAAQ,yBAAc;IAChE,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,YAAY,CAAA;IAEjC,sBAAsB;IACd,UAAU,GAAuC,IAAI,CAAA;IACrD,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAA;IAEvC,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,GAAG,EAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE;YAC1E,KAAK,EAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAI,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,0CAA0C,EAAE;YACzG,QAAQ,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAO,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE;YAC5E,KAAK,EAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAO,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;YAClG,SAAS,EAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAQ,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;YAClG,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAO,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;YAClG,QAAQ,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE;SACzF,CAAC,CAAA;QAEF,wCAAwC;QACxC,IAAI,CAAC,KAAK,GAAI,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAA;IACzB,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,MAAM;QACR,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;QAC/E,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAA;QAC7D,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAA;QACzE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC9C,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,IAAI;QACN,2CAA2C;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC;YAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;SAC1B,CAAC,CAAA;QAEF,wDAAwD;QACxD,MAAM,cAAc,GAAG;YACnB,MAAM,EAAmB,KAAK;YAC9B,SAAS,EAAgB,KAAK;YAC9B,SAAS,EAAgB,KAAK;YAC9B,uBAAuB,EAAE,KAAK;YAC9B,kBAAkB,EAAO,KAAK;YAC9B,YAAY,EAAa,KAAK;SACjC,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAA;QACzD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAgC,CAAA;QAChE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gCAAgC,IAAI,GAAG,CAAC,CAAA;QACzD,IAAI,aAAa,GAAG,KAAK,CAAA;QACzB,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,SAAS;YAClC,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,yCAAyC,aAAa,EAAE,CAAC,CAAA;QAE1E;sEAC8D;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QACpD,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAChF,IAAI,KAAK,KAAK,SAAS;gBACnB,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA;QAC1E,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrD,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAO,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAE,GAAG,EAAE,GAAG,CAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,0BAA0B,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;QAEhE,4DAA4D;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;YAC9C,mBAAmB,CAAC,CAAC;YACrB,mBAAmB,CAAA;QACvB,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;YAClC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,0BAA0B,IAAI,GAAG,CAAC,CAAA;YACnD,OAAO,IAAI,CAAC,UAAW,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;gBACxD,IAAI;gBACJ,OAAO,EAAW,KAAK;gBACvB,YAAY,EAAM,IAAI,CAAC,MAAM,CAAC,QAAQ;gBACtC,YAAY,EAAM,OAAO,aAAa,EAAwC;gBAC9E,IAAI,EAAc,GAAG,EAAE,kCAAkC;gBACzD,aAAa,EAAE;oBACX,KAAK,EAAY,IAAI,CAAC,MAAM,CAAC,KAAK;oBAClC,SAAS,EAAQ,IAAI,CAAC,MAAM,CAAC,SAAS;oBACtC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;iBAC1C;aACJ,EAAE;gBACC,gBAAgB,EAAE,EAAE;gBACpB,UAAU,EAAQ,EAAE;aACvB,CAAC,CAAA;QACN,CAAC,CAAA;QAED;gEACwD;QACxD,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,CAAC;YAC7C,0CAA0C;YAC1C,MAAM,yBAAc,CAAC,WAAW,CAAA;YAChC,wBAAwB,CAAC,gBAAgB,GAAG,IAAI,CAAA;QACpD,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,yBAAc,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAA;QAEtF,oEAAoE;QACpE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAA;QACpE,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAM,CAAC,SAAS,CAAC;YAC/B,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAO,KAAK;YACzB,aAAa,EAAO,CAAC;YACrB,SAAS,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;gBACjD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC9B,QAAQ,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;qBAChD,CAAC;oBACF,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;wBACxC,IAAA,8BAAiB,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;4BACtC,MAAM,eAAe,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;4BACtD,GAAG,CAAC,MAAM,EAAE,8CAA8C,MAAM,CAAC,UAAU,GAAG,CAAC,CAAA;4BAC/E,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;4BAC9B,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAA;4BACvB,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAA;4BAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;4BACnB,QAAQ,EAAE,CAAA;wBACd,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;4BACf,QAAQ,CAAC,KAAK,CAAC,CAAA;wBACnB,CAAC,CAAC,CAAA;oBACN,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBACf,QAAQ,CAAC,KAAK,CAAC,CAAA;oBACnB,CAAC,CAAC,CAAA;gBACN,CAAC;YACL,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,sBAAsB;QACtB,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,8BAA8B;QAC9B,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IAC9B,CAAC;;AAxJL,2CAyJC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import SpeechFlowNode from "./speechflow-node";
|
|
2
|
-
export default class SpeechFlowNodeKokoro extends SpeechFlowNode {
|
|
3
|
-
static name: string;
|
|
4
|
-
private kokoro;
|
|
5
|
-
private static speexInitialized;
|
|
6
|
-
constructor(id: string, cfg: {
|
|
7
|
-
[id: string]: any;
|
|
8
|
-
}, opts: {
|
|
9
|
-
[id: string]: any;
|
|
10
|
-
}, args: any[]);
|
|
11
|
-
open(): Promise<void>;
|
|
12
|
-
close(): Promise<void>;
|
|
13
|
-
}
|
|
@@ -1,149 +0,0 @@
|
|
|
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
|
-
/* standard dependencies */
|
|
12
|
-
const node_stream_1 = __importDefault(require("node:stream"));
|
|
13
|
-
/* external dependencies */
|
|
14
|
-
const kokoro_js_1 = require("kokoro-js");
|
|
15
|
-
const speex_resampler_1 = __importDefault(require("speex-resampler"));
|
|
16
|
-
/* internal dependencies */
|
|
17
|
-
const speechflow_node_1 = __importDefault(require("./speechflow-node"));
|
|
18
|
-
/* SpeechFlow node for Kokoro text-to-speech conversion */
|
|
19
|
-
class SpeechFlowNodeKokoro extends speechflow_node_1.default {
|
|
20
|
-
/* declare official node name */
|
|
21
|
-
static name = "kokoro";
|
|
22
|
-
/* internal state */
|
|
23
|
-
kokoro = null;
|
|
24
|
-
static speexInitialized = false;
|
|
25
|
-
/* construct node */
|
|
26
|
-
constructor(id, cfg, opts, args) {
|
|
27
|
-
super(id, cfg, opts, args);
|
|
28
|
-
/* declare node configuration parameters */
|
|
29
|
-
this.configure({
|
|
30
|
-
voice: { type: "string", val: "Aoede", pos: 0, match: /^(?:Aoede|Heart|Puck|Fenrir)$/ },
|
|
31
|
-
language: { type: "string", val: "en", pos: 1, match: /^(?:en)$/ },
|
|
32
|
-
speed: { type: "number", val: 1.25, pos: 2, match: (n) => n >= 1.0 && n <= 1.30 },
|
|
33
|
-
});
|
|
34
|
-
/* declare node input/output format */
|
|
35
|
-
this.input = "text";
|
|
36
|
-
this.output = "audio";
|
|
37
|
-
}
|
|
38
|
-
/* open node */
|
|
39
|
-
async open() {
|
|
40
|
-
/* establish Kokoro */
|
|
41
|
-
const model = "onnx-community/Kokoro-82M-v1.0-ONNX";
|
|
42
|
-
const progressState = new Map();
|
|
43
|
-
const progressCallback = (progress) => {
|
|
44
|
-
let artifact = model;
|
|
45
|
-
if (typeof progress.file === "string")
|
|
46
|
-
artifact += `:${progress.file}`;
|
|
47
|
-
let percent = 0;
|
|
48
|
-
if (typeof progress.loaded === "number" && typeof progress.total === "number")
|
|
49
|
-
percent = progress.loaded / progress.total * 100;
|
|
50
|
-
else if (typeof progress.progress === "number")
|
|
51
|
-
percent = progress.progress;
|
|
52
|
-
if (percent > 0)
|
|
53
|
-
progressState.set(artifact, percent);
|
|
54
|
-
};
|
|
55
|
-
const interval = setInterval(() => {
|
|
56
|
-
for (const [artifact, percent] of progressState) {
|
|
57
|
-
this.log("info", `downloaded ${percent.toFixed(2)}% of artifact "${artifact}"`);
|
|
58
|
-
if (percent >= 1.0)
|
|
59
|
-
progressState.delete(artifact);
|
|
60
|
-
}
|
|
61
|
-
}, 1000);
|
|
62
|
-
this.kokoro = await kokoro_js_1.KokoroTTS.from_pretrained(model, {
|
|
63
|
-
dtype: "q4f16",
|
|
64
|
-
progress_callback: progressCallback
|
|
65
|
-
});
|
|
66
|
-
clearInterval(interval);
|
|
67
|
-
if (this.kokoro === null)
|
|
68
|
-
throw new Error("failed to instantiate Kokoro");
|
|
69
|
-
/* establish resampler from Kokoro's maximum 24Khz
|
|
70
|
-
output to our standard audio sample rate (48KHz) */
|
|
71
|
-
if (!SpeechFlowNodeKokoro.speexInitialized) {
|
|
72
|
-
/* at least once initialize resampler */
|
|
73
|
-
await speex_resampler_1.default.initPromise;
|
|
74
|
-
SpeechFlowNodeKokoro.speexInitialized = true;
|
|
75
|
-
}
|
|
76
|
-
const resampler = new speex_resampler_1.default(1, 24000, this.config.audioSampleRate, 7);
|
|
77
|
-
/* determine voice for text-to-speech operation */
|
|
78
|
-
const voices = {
|
|
79
|
-
"Aoede": "af_aoede",
|
|
80
|
-
"Heart": "af_heart",
|
|
81
|
-
"Puck": "am_puck",
|
|
82
|
-
"Fenrir": "am_fenrir"
|
|
83
|
-
};
|
|
84
|
-
const voice = (voices[this.params.voice]);
|
|
85
|
-
if (voice === undefined)
|
|
86
|
-
throw new Error(`invalid Kokoro voice "${this.params.voice}"`);
|
|
87
|
-
/* perform text-to-speech operation with Elevenlabs API */
|
|
88
|
-
const text2speech = async (text) => {
|
|
89
|
-
this.log("info", `Kokoro: input: "${text}"`);
|
|
90
|
-
const audio = await this.kokoro.generate(text, {
|
|
91
|
-
speed: this.params.speed,
|
|
92
|
-
voice: voice
|
|
93
|
-
});
|
|
94
|
-
if (audio.sampling_rate !== 24000)
|
|
95
|
-
throw new Error("expected 24KHz sampling rate in Kokoro output");
|
|
96
|
-
/* convert audio samples from PCM/F32/24Khz to PCM/I16/24KHz */
|
|
97
|
-
const samples = audio.audio;
|
|
98
|
-
const buffer1 = Buffer.alloc(samples.length * 2);
|
|
99
|
-
for (let i = 0; i < samples.length; i++) {
|
|
100
|
-
const sample = Math.max(-1, Math.min(1, samples[i]));
|
|
101
|
-
buffer1.writeInt16LE(sample * 0x7FFF, i * 2);
|
|
102
|
-
}
|
|
103
|
-
/* resample audio samples from PCM/I16/24Khz to PCM/I16/48KHz */
|
|
104
|
-
const buffer2 = resampler.processChunk(buffer1);
|
|
105
|
-
return buffer2;
|
|
106
|
-
};
|
|
107
|
-
/* create transform stream and connect it to the Kokoro API */
|
|
108
|
-
const log = (level, msg) => { this.log(level, msg); };
|
|
109
|
-
this.stream = new node_stream_1.default.Transform({
|
|
110
|
-
writableObjectMode: true,
|
|
111
|
-
readableObjectMode: true,
|
|
112
|
-
decodeStrings: false,
|
|
113
|
-
highWaterMark: 1,
|
|
114
|
-
transform(chunk, encoding, callback) {
|
|
115
|
-
if (Buffer.isBuffer(chunk.payload))
|
|
116
|
-
callback(new Error("invalid chunk payload type"));
|
|
117
|
-
else {
|
|
118
|
-
text2speech(chunk.payload).then((buffer) => {
|
|
119
|
-
log("info", `Kokoro: received audio (buffer length: ${buffer.byteLength})`);
|
|
120
|
-
chunk = chunk.clone();
|
|
121
|
-
chunk.type = "audio";
|
|
122
|
-
chunk.payload = buffer;
|
|
123
|
-
this.push(chunk);
|
|
124
|
-
callback();
|
|
125
|
-
}).catch((err) => {
|
|
126
|
-
callback(err);
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
final(callback) {
|
|
131
|
-
this.push(null);
|
|
132
|
-
callback();
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
/* close node */
|
|
137
|
-
async close() {
|
|
138
|
-
/* destroy stream */
|
|
139
|
-
if (this.stream !== null) {
|
|
140
|
-
this.stream.destroy();
|
|
141
|
-
this.stream = null;
|
|
142
|
-
}
|
|
143
|
-
/* destroy Kokoro API */
|
|
144
|
-
if (this.kokoro !== null)
|
|
145
|
-
this.kokoro = null;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
exports.default = SpeechFlowNodeKokoro;
|
|
149
|
-
//# sourceMappingURL=speechflow-node-t2a-kokoro.js.map
|