speechflow 1.7.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +425 -146
- package/etc/claude.md +5 -5
- package/etc/speechflow.yaml +2 -2
- package/package.json +3 -3
- package/speechflow-cli/dst/speechflow-main-api.js +6 -5
- package/speechflow-cli/dst/speechflow-main-api.js.map +1 -1
- package/speechflow-cli/dst/speechflow-main-graph.d.ts +1 -0
- package/speechflow-cli/dst/speechflow-main-graph.js +35 -13
- package/speechflow-cli/dst/speechflow-main-graph.js.map +1 -1
- package/speechflow-cli/dst/speechflow-main-status.js +3 -7
- package/speechflow-cli/dst/speechflow-main-status.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js +3 -0
- package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-compressor.js +4 -2
- package/speechflow-cli/dst/speechflow-node-a2a-compressor.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-expander.js +4 -2
- package/speechflow-cli/dst/speechflow-node-a2a-expander.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-gender.js +2 -2
- package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-pitch.js +1 -2
- package/speechflow-cli/dst/speechflow-node-a2a-pitch.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2a-wav.js +32 -5
- package/speechflow-cli/dst/speechflow-node-a2a-wav.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2t-amazon.d.ts +0 -1
- package/speechflow-cli/dst/speechflow-node-a2t-amazon.js +1 -6
- package/speechflow-cli/dst/speechflow-node-a2t-amazon.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.d.ts +0 -1
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +9 -9
- package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-a2t-google.d.ts +17 -0
- package/speechflow-cli/dst/speechflow-node-a2t-google.js +320 -0
- package/speechflow-cli/dst/speechflow-node-a2t-google.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-a2t-openai.js +6 -4
- package/speechflow-cli/dst/speechflow-node-a2t-openai.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2a-amazon.js +6 -11
- package/speechflow-cli/dst/speechflow-node-t2a-amazon.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js +6 -5
- package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2a-google.d.ts +15 -0
- package/speechflow-cli/dst/speechflow-node-t2a-google.js +218 -0
- package/speechflow-cli/dst/speechflow-node-t2a-google.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.d.ts +2 -0
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +19 -6
- package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2a-openai.d.ts +15 -0
- package/speechflow-cli/dst/speechflow-node-t2a-openai.js +195 -0
- package/speechflow-cli/dst/speechflow-node-t2a-openai.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2a-supertonic.d.ts +17 -0
- package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js +608 -0
- package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-amazon.js.map +1 -1
- package/speechflow-cli/dst/{speechflow-node-t2t-transformers.d.ts → speechflow-node-t2t-opus.d.ts} +1 -3
- package/speechflow-cli/dst/speechflow-node-t2t-opus.js +159 -0
- package/speechflow-cli/dst/speechflow-node-t2t-opus.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-profanity.d.ts +11 -0
- package/speechflow-cli/dst/speechflow-node-t2t-profanity.js +118 -0
- package/speechflow-cli/dst/speechflow-node-t2t-profanity.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-punctuation.d.ts +13 -0
- package/speechflow-cli/dst/speechflow-node-t2t-punctuation.js +220 -0
- package/speechflow-cli/dst/speechflow-node-t2t-punctuation.js.map +1 -0
- package/speechflow-cli/dst/{speechflow-node-t2t-openai.d.ts → speechflow-node-t2t-spellcheck.d.ts} +2 -2
- package/speechflow-cli/dst/{speechflow-node-t2t-openai.js → speechflow-node-t2t-spellcheck.js} +47 -99
- package/speechflow-cli/dst/speechflow-node-t2t-spellcheck.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +3 -6
- package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-t2t-summary.d.ts +16 -0
- package/speechflow-cli/dst/speechflow-node-t2t-summary.js +241 -0
- package/speechflow-cli/dst/speechflow-node-t2t-summary.js.map +1 -0
- package/speechflow-cli/dst/{speechflow-node-t2t-ollama.d.ts → speechflow-node-t2t-translate.d.ts} +2 -2
- package/speechflow-cli/dst/{speechflow-node-t2t-transformers.js → speechflow-node-t2t-translate.js} +53 -115
- package/speechflow-cli/dst/speechflow-node-t2t-translate.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-x2x-filter.d.ts +1 -0
- package/speechflow-cli/dst/speechflow-node-x2x-filter.js +10 -0
- package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-x2x-trace.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-device.js +3 -3
- package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-exec.d.ts +12 -0
- package/speechflow-cli/dst/speechflow-node-xio-exec.js +223 -0
- package/speechflow-cli/dst/speechflow-node-xio-exec.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-file.d.ts +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-file.js +80 -67
- package/speechflow-cli/dst/speechflow-node-xio-file.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +2 -1
- package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -1
- package/speechflow-cli/dst/speechflow-node-xio-vban.d.ts +17 -0
- package/speechflow-cli/dst/speechflow-node-xio-vban.js +330 -0
- package/speechflow-cli/dst/speechflow-node-xio-vban.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-webrtc.d.ts +39 -0
- package/speechflow-cli/dst/speechflow-node-xio-webrtc.js +500 -0
- package/speechflow-cli/dst/speechflow-node-xio-webrtc.js.map +1 -0
- package/speechflow-cli/dst/speechflow-node-xio-websocket.js +2 -1
- package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -1
- package/speechflow-cli/dst/speechflow-util-audio.js +5 -6
- package/speechflow-cli/dst/speechflow-util-audio.js.map +1 -1
- package/speechflow-cli/dst/speechflow-util-error.d.ts +1 -1
- package/speechflow-cli/dst/speechflow-util-error.js +5 -7
- package/speechflow-cli/dst/speechflow-util-error.js.map +1 -1
- package/speechflow-cli/dst/speechflow-util-llm.d.ts +35 -0
- package/speechflow-cli/dst/speechflow-util-llm.js +363 -0
- package/speechflow-cli/dst/speechflow-util-llm.js.map +1 -0
- package/speechflow-cli/dst/speechflow-util-misc.d.ts +1 -1
- package/speechflow-cli/dst/speechflow-util-misc.js +4 -4
- package/speechflow-cli/dst/speechflow-util-misc.js.map +1 -1
- package/speechflow-cli/dst/speechflow-util-queue.js +3 -3
- package/speechflow-cli/dst/speechflow-util-queue.js.map +1 -1
- package/speechflow-cli/dst/speechflow-util-stream.js +4 -2
- package/speechflow-cli/dst/speechflow-util-stream.js.map +1 -1
- package/speechflow-cli/dst/speechflow-util.d.ts +1 -0
- package/speechflow-cli/dst/speechflow-util.js +1 -0
- package/speechflow-cli/dst/speechflow-util.js.map +1 -1
- package/speechflow-cli/etc/oxlint.jsonc +2 -1
- package/speechflow-cli/package.json +34 -17
- package/speechflow-cli/src/lib.d.ts +5 -0
- package/speechflow-cli/src/speechflow-main-api.ts +6 -5
- package/speechflow-cli/src/speechflow-main-graph.ts +40 -13
- package/speechflow-cli/src/speechflow-main-status.ts +4 -8
- package/speechflow-cli/src/speechflow-node-a2a-compressor-wt.ts +4 -0
- package/speechflow-cli/src/speechflow-node-a2a-compressor.ts +4 -2
- package/speechflow-cli/src/speechflow-node-a2a-expander-wt.ts +1 -1
- package/speechflow-cli/src/speechflow-node-a2a-expander.ts +4 -2
- package/speechflow-cli/src/speechflow-node-a2a-gender.ts +2 -2
- package/speechflow-cli/src/speechflow-node-a2a-pitch.ts +1 -2
- package/speechflow-cli/src/speechflow-node-a2a-wav.ts +33 -6
- package/speechflow-cli/src/speechflow-node-a2t-amazon.ts +6 -11
- package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +13 -12
- package/speechflow-cli/src/speechflow-node-a2t-google.ts +322 -0
- package/speechflow-cli/src/speechflow-node-a2t-openai.ts +8 -4
- package/speechflow-cli/src/speechflow-node-t2a-amazon.ts +7 -11
- package/speechflow-cli/src/speechflow-node-t2a-elevenlabs.ts +6 -5
- package/speechflow-cli/src/speechflow-node-t2a-google.ts +206 -0
- package/speechflow-cli/src/speechflow-node-t2a-kokoro.ts +22 -6
- package/speechflow-cli/src/speechflow-node-t2a-openai.ts +179 -0
- package/speechflow-cli/src/speechflow-node-t2a-supertonic.ts +701 -0
- package/speechflow-cli/src/speechflow-node-t2t-amazon.ts +2 -1
- package/speechflow-cli/src/speechflow-node-t2t-opus.ts +136 -0
- package/speechflow-cli/src/speechflow-node-t2t-profanity.ts +93 -0
- package/speechflow-cli/src/speechflow-node-t2t-punctuation.ts +201 -0
- package/speechflow-cli/src/{speechflow-node-t2t-openai.ts → speechflow-node-t2t-spellcheck.ts} +48 -107
- package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +3 -6
- package/speechflow-cli/src/speechflow-node-t2t-summary.ts +229 -0
- package/speechflow-cli/src/speechflow-node-t2t-translate.ts +181 -0
- package/speechflow-cli/src/speechflow-node-x2x-filter.ts +16 -3
- package/speechflow-cli/src/speechflow-node-x2x-trace.ts +3 -3
- package/speechflow-cli/src/speechflow-node-xio-device.ts +4 -7
- package/speechflow-cli/src/speechflow-node-xio-exec.ts +210 -0
- package/speechflow-cli/src/speechflow-node-xio-file.ts +93 -80
- package/speechflow-cli/src/speechflow-node-xio-mqtt.ts +3 -2
- package/speechflow-cli/src/speechflow-node-xio-vban.ts +325 -0
- package/speechflow-cli/src/speechflow-node-xio-webrtc.ts +533 -0
- package/speechflow-cli/src/speechflow-node-xio-websocket.ts +2 -1
- package/speechflow-cli/src/speechflow-util-audio-wt.ts +4 -4
- package/speechflow-cli/src/speechflow-util-audio.ts +10 -10
- package/speechflow-cli/src/speechflow-util-error.ts +9 -7
- package/speechflow-cli/src/speechflow-util-llm.ts +367 -0
- package/speechflow-cli/src/speechflow-util-misc.ts +4 -4
- package/speechflow-cli/src/speechflow-util-queue.ts +4 -4
- package/speechflow-cli/src/speechflow-util-stream.ts +5 -3
- package/speechflow-cli/src/speechflow-util.ts +1 -0
- package/speechflow-ui-db/package.json +9 -9
- package/speechflow-ui-st/package.json +9 -9
- package/speechflow-cli/dst/speechflow-node-t2t-ollama.js +0 -293
- package/speechflow-cli/dst/speechflow-node-t2t-ollama.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-t2t-openai.js.map +0 -1
- package/speechflow-cli/dst/speechflow-node-t2t-transformers.js.map +0 -1
- package/speechflow-cli/src/speechflow-node-t2t-ollama.ts +0 -281
- package/speechflow-cli/src/speechflow-node-t2t-transformers.ts +0 -247
|
@@ -0,0 +1,608 @@
|
|
|
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_fs_1 = __importDefault(require("node:fs"));
|
|
46
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
47
|
+
const node_stream_1 = __importDefault(require("node:stream"));
|
|
48
|
+
/* external dependencies */
|
|
49
|
+
const mkdirp_1 = require("mkdirp");
|
|
50
|
+
const HF = __importStar(require("@huggingface/hub"));
|
|
51
|
+
const speex_resampler_1 = __importDefault(require("speex-resampler"));
|
|
52
|
+
const luxon_1 = require("luxon");
|
|
53
|
+
/* @ts-expect-error no type available */
|
|
54
|
+
const ORT = __importStar(require("onnxruntime-node"));
|
|
55
|
+
/* internal dependencies */
|
|
56
|
+
const speechflow_node_1 = __importDefault(require("./speechflow-node"));
|
|
57
|
+
const util = __importStar(require("./speechflow-util"));
|
|
58
|
+
/* convert lengths to binary mask */
|
|
59
|
+
function lengthToMask(lengths, maxLen = null) {
|
|
60
|
+
/* handle empty input */
|
|
61
|
+
if (lengths.length === 0)
|
|
62
|
+
return [];
|
|
63
|
+
/* determine maximum length */
|
|
64
|
+
maxLen = maxLen ?? Math.max(...lengths);
|
|
65
|
+
/* build mask array */
|
|
66
|
+
const mask = [];
|
|
67
|
+
for (let i = 0; i < lengths.length; i++) {
|
|
68
|
+
const row = [];
|
|
69
|
+
for (let j = 0; j < maxLen; j++)
|
|
70
|
+
row.push(j < lengths[i] ? 1.0 : 0.0);
|
|
71
|
+
mask.push([row]);
|
|
72
|
+
}
|
|
73
|
+
return mask;
|
|
74
|
+
}
|
|
75
|
+
/* get latent mask from wav lengths */
|
|
76
|
+
function getLatentMask(wavLengths, baseChunkSize, chunkCompressFactor) {
|
|
77
|
+
/* calculate latent size and lengths */
|
|
78
|
+
const latentSize = baseChunkSize * chunkCompressFactor;
|
|
79
|
+
const latentLengths = wavLengths.map((len) => Math.floor((len + latentSize - 1) / latentSize));
|
|
80
|
+
/* generate mask from latent lengths */
|
|
81
|
+
return lengthToMask(latentLengths);
|
|
82
|
+
}
|
|
83
|
+
/* convert array to ONNX tensor */
|
|
84
|
+
function arrayToTensor(array, dims) {
|
|
85
|
+
/* flatten array and create float32 tensor */
|
|
86
|
+
const flat = array.flat(Infinity);
|
|
87
|
+
return new ORT.Tensor("float32", Float32Array.from(flat), dims);
|
|
88
|
+
}
|
|
89
|
+
/* convert int array to ONNX tensor */
|
|
90
|
+
function intArrayToTensor(array, dims) {
|
|
91
|
+
/* flatten array and create int64 tensor */
|
|
92
|
+
const flat = array.flat(Infinity);
|
|
93
|
+
return new ORT.Tensor("int64", BigInt64Array.from(flat.map(BigInt)), dims);
|
|
94
|
+
}
|
|
95
|
+
/* chunk text into manageable segments */
|
|
96
|
+
function chunkText(text, maxLen = 300) {
|
|
97
|
+
/* validate input type */
|
|
98
|
+
if (typeof text !== "string")
|
|
99
|
+
throw new Error(`chunkText expects a string, got ${typeof text}`);
|
|
100
|
+
/* split by paragraph (two or more newlines) */
|
|
101
|
+
const paragraphs = text.trim().split(/\n\s*\n+/).filter((p) => p.trim());
|
|
102
|
+
/* process each paragraph into chunks */
|
|
103
|
+
const chunks = [];
|
|
104
|
+
for (let paragraph of paragraphs) {
|
|
105
|
+
paragraph = paragraph.trim();
|
|
106
|
+
if (!paragraph)
|
|
107
|
+
continue;
|
|
108
|
+
/* split by sentence boundaries (period, question mark, exclamation mark followed by space)
|
|
109
|
+
but exclude common abbreviations like Mr., Mrs., Dr., etc. and single capital letters like F. */
|
|
110
|
+
const sentences = paragraph.split(/(?<!Mr\.|Mrs\.|Ms\.|Dr\.|Prof\.|Sr\.|Jr\.|Ph\.D\.|etc\.|e\.g\.|i\.e\.|vs\.|Inc\.|Ltd\.|Co\.|Corp\.|St\.|Ave\.|Blvd\.)(?<!\b[A-Z]\.)(?<=[.!?])\s+/);
|
|
111
|
+
/* accumulate sentences into chunks respecting max length */
|
|
112
|
+
let currentChunk = "";
|
|
113
|
+
for (const sentence of sentences) {
|
|
114
|
+
if (currentChunk.length + sentence.length + 1 <= maxLen)
|
|
115
|
+
currentChunk += (currentChunk ? " " : "") + sentence;
|
|
116
|
+
else {
|
|
117
|
+
if (currentChunk)
|
|
118
|
+
chunks.push(currentChunk.trim());
|
|
119
|
+
currentChunk = sentence;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/* push remaining chunk */
|
|
123
|
+
if (currentChunk)
|
|
124
|
+
chunks.push(currentChunk.trim());
|
|
125
|
+
}
|
|
126
|
+
return chunks;
|
|
127
|
+
}
|
|
128
|
+
/* unicode text processor class */
|
|
129
|
+
class SupertonicTextProcessor {
|
|
130
|
+
indexer;
|
|
131
|
+
constructor(unicodeIndexerJsonPath) {
|
|
132
|
+
/* load and parse unicode indexer JSON */
|
|
133
|
+
try {
|
|
134
|
+
this.indexer = JSON.parse(node_fs_1.default.readFileSync(unicodeIndexerJsonPath, "utf8"));
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
throw new Error(`failed to parse unicode indexer JSON "${unicodeIndexerJsonPath}"`, { cause: err });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
preprocessText(text) {
|
|
141
|
+
/* normalize text */
|
|
142
|
+
text = text.normalize("NFKD");
|
|
143
|
+
/* remove emojis (wide Unicode range) */
|
|
144
|
+
const emojiPattern = /[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F700}-\u{1F77F}\u{1F780}-\u{1F7FF}\u{1F800}-\u{1F8FF}\u{1F900}-\u{1F9FF}\u{1FA00}-\u{1FA6F}\u{1FA70}-\u{1FAFF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{1F1E6}-\u{1F1FF}]+/gu;
|
|
145
|
+
text = text.replace(emojiPattern, "");
|
|
146
|
+
/* replace various dashes and symbols */
|
|
147
|
+
const replacements = {
|
|
148
|
+
"–": "-",
|
|
149
|
+
"‑": "-",
|
|
150
|
+
"—": "-",
|
|
151
|
+
"¯": " ",
|
|
152
|
+
"_": " ",
|
|
153
|
+
"\u201C": "\"",
|
|
154
|
+
"\u201D": "\"",
|
|
155
|
+
"\u2018": "'",
|
|
156
|
+
"\u2019": "'",
|
|
157
|
+
"´": "'",
|
|
158
|
+
"`": "'",
|
|
159
|
+
"[": " ",
|
|
160
|
+
"]": " ",
|
|
161
|
+
"|": " ",
|
|
162
|
+
"/": " ",
|
|
163
|
+
"#": " ",
|
|
164
|
+
"→": " ",
|
|
165
|
+
"←": " "
|
|
166
|
+
};
|
|
167
|
+
for (const [k, v] of Object.entries(replacements))
|
|
168
|
+
text = text.replaceAll(k, v);
|
|
169
|
+
/* remove combining diacritics */
|
|
170
|
+
text = text.replace(/[\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u030A\u030B\u030C\u0327\u0328\u0329\u032A\u032B\u032C\u032D\u032E\u032F]/g, "");
|
|
171
|
+
/* remove special symbols */
|
|
172
|
+
text = text.replace(/[♥☆♡©\\]/g, "");
|
|
173
|
+
/* replace known expressions */
|
|
174
|
+
const exprReplacements = {
|
|
175
|
+
"@": " at ",
|
|
176
|
+
"e.g.,": "for example, ",
|
|
177
|
+
"i.e.,": "that is, "
|
|
178
|
+
};
|
|
179
|
+
for (const [k, v] of Object.entries(exprReplacements))
|
|
180
|
+
text = text.replaceAll(k, v);
|
|
181
|
+
/* fix spacing around punctuation */
|
|
182
|
+
text = text.replace(/ ,/g, ",");
|
|
183
|
+
text = text.replace(/ \./g, ".");
|
|
184
|
+
text = text.replace(/ !/g, "!");
|
|
185
|
+
text = text.replace(/ \?/g, "?");
|
|
186
|
+
text = text.replace(/ ;/g, ";");
|
|
187
|
+
text = text.replace(/ :/g, ":");
|
|
188
|
+
text = text.replace(/ '/g, "'");
|
|
189
|
+
/* remove duplicate quotes */
|
|
190
|
+
text = text.replace(/""+/g, "\"");
|
|
191
|
+
text = text.replace(/''+/g, "'");
|
|
192
|
+
text = text.replace(/``+/g, "`");
|
|
193
|
+
/* remove extra spaces */
|
|
194
|
+
text = text.replace(/\s+/g, " ").trim();
|
|
195
|
+
/* if text doesn't end with punctuation, add a period */
|
|
196
|
+
if (!/[.!?;:,'"')\]}…。」』】〉》›»]$/.test(text))
|
|
197
|
+
text += ".";
|
|
198
|
+
return text;
|
|
199
|
+
}
|
|
200
|
+
textToUnicodeValues(text) {
|
|
201
|
+
/* convert text characters to unicode code points */
|
|
202
|
+
return Array.from(text).map((char) => char.charCodeAt(0));
|
|
203
|
+
}
|
|
204
|
+
call(textList) {
|
|
205
|
+
/* handle empty input */
|
|
206
|
+
if (textList.length === 0)
|
|
207
|
+
return { textIds: [], textMask: [] };
|
|
208
|
+
/* preprocess all texts */
|
|
209
|
+
const processedTexts = textList.map((t) => this.preprocessText(t));
|
|
210
|
+
const textIdsLengths = processedTexts.map((t) => t.length);
|
|
211
|
+
const maxLen = Math.max(...textIdsLengths);
|
|
212
|
+
/* convert texts to indexed token arrays */
|
|
213
|
+
const textIds = [];
|
|
214
|
+
for (let i = 0; i < processedTexts.length; i++) {
|
|
215
|
+
const row = Array.from({ length: maxLen }).fill(0);
|
|
216
|
+
const unicodeVals = this.textToUnicodeValues(processedTexts[i]);
|
|
217
|
+
for (let j = 0; j < unicodeVals.length; j++)
|
|
218
|
+
row[j] = this.indexer[unicodeVals[j]] ?? 0;
|
|
219
|
+
textIds.push(row);
|
|
220
|
+
}
|
|
221
|
+
/* generate text mask from lengths */
|
|
222
|
+
const textMask = lengthToMask(textIdsLengths);
|
|
223
|
+
return { textIds, textMask };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/* Supertonic TTS engine class */
|
|
227
|
+
class SupertonicTTS {
|
|
228
|
+
sampleRate;
|
|
229
|
+
cfgs;
|
|
230
|
+
textProcessor;
|
|
231
|
+
dpOrt;
|
|
232
|
+
textEncOrt;
|
|
233
|
+
vectorEstOrt;
|
|
234
|
+
vocoderOrt;
|
|
235
|
+
baseChunkSize;
|
|
236
|
+
chunkCompressFactor;
|
|
237
|
+
latentDim;
|
|
238
|
+
constructor(cfgs, textProcessor, dpOrt, textEncOrt, vectorEstOrt, vocoderOrt) {
|
|
239
|
+
/* store configuration and dependencies */
|
|
240
|
+
this.cfgs = cfgs;
|
|
241
|
+
this.textProcessor = textProcessor;
|
|
242
|
+
this.dpOrt = dpOrt;
|
|
243
|
+
this.textEncOrt = textEncOrt;
|
|
244
|
+
this.vectorEstOrt = vectorEstOrt;
|
|
245
|
+
this.vocoderOrt = vocoderOrt;
|
|
246
|
+
/* extract configuration values */
|
|
247
|
+
this.sampleRate = cfgs.ae.sample_rate;
|
|
248
|
+
this.baseChunkSize = cfgs.ae.base_chunk_size;
|
|
249
|
+
this.chunkCompressFactor = cfgs.ttl.chunk_compress_factor;
|
|
250
|
+
this.latentDim = cfgs.ttl.latent_dim;
|
|
251
|
+
}
|
|
252
|
+
sampleNoisyLatent(duration) {
|
|
253
|
+
/* calculate dimensions for latent space */
|
|
254
|
+
const wavLenMax = Math.max(...duration) * this.sampleRate;
|
|
255
|
+
const wavLengths = duration.map((d) => Math.floor(d * this.sampleRate));
|
|
256
|
+
const chunkSize = this.baseChunkSize * this.chunkCompressFactor;
|
|
257
|
+
const latentLen = Math.floor((wavLenMax + chunkSize - 1) / chunkSize);
|
|
258
|
+
const latentDimExpanded = this.latentDim * this.chunkCompressFactor;
|
|
259
|
+
/* generate random noise (pre-allocate arrays for performance) */
|
|
260
|
+
const noisyLatent = Array.from({ length: duration.length });
|
|
261
|
+
for (let b = 0; b < duration.length; b++) {
|
|
262
|
+
const batch = Array.from({ length: latentDimExpanded });
|
|
263
|
+
for (let d = 0; d < latentDimExpanded; d++) {
|
|
264
|
+
const row = Array.from({ length: latentLen });
|
|
265
|
+
for (let t = 0; t < latentLen; t++) {
|
|
266
|
+
/* Box-Muller transform for normal distribution */
|
|
267
|
+
const eps = 1e-10;
|
|
268
|
+
const u1 = Math.max(eps, Math.random());
|
|
269
|
+
const u2 = Math.random();
|
|
270
|
+
row[t] = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math.PI * u2);
|
|
271
|
+
}
|
|
272
|
+
batch[d] = row;
|
|
273
|
+
}
|
|
274
|
+
noisyLatent[b] = batch;
|
|
275
|
+
}
|
|
276
|
+
/* apply mask */
|
|
277
|
+
const latentMask = getLatentMask(wavLengths, this.baseChunkSize, this.chunkCompressFactor);
|
|
278
|
+
for (let b = 0; b < noisyLatent.length; b++) {
|
|
279
|
+
for (let d = 0; d < noisyLatent[b].length; d++) {
|
|
280
|
+
for (let t = 0; t < noisyLatent[b][d].length; t++)
|
|
281
|
+
noisyLatent[b][d][t] *= latentMask[b][0][t];
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return { noisyLatent, latentMask };
|
|
285
|
+
}
|
|
286
|
+
async infer(textList, style, totalStep, speed) {
|
|
287
|
+
/* validate batch size matches style vectors */
|
|
288
|
+
if (textList.length !== style.ttl.dims[0])
|
|
289
|
+
throw new Error("Number of texts must match number of style vectors");
|
|
290
|
+
/* process text into token IDs and masks */
|
|
291
|
+
const batchSize = textList.length;
|
|
292
|
+
const { textIds, textMask } = this.textProcessor.call(textList);
|
|
293
|
+
const textIdsShape = [batchSize, textIds[0].length];
|
|
294
|
+
const textMaskShape = [batchSize, 1, textMask[0][0].length];
|
|
295
|
+
const textMaskTensor = arrayToTensor(textMask, textMaskShape);
|
|
296
|
+
/* run duration predictor model */
|
|
297
|
+
const dpResult = await this.dpOrt.run({
|
|
298
|
+
text_ids: intArrayToTensor(textIds, textIdsShape),
|
|
299
|
+
style_dp: style.dp,
|
|
300
|
+
text_mask: textMaskTensor
|
|
301
|
+
});
|
|
302
|
+
const predictedDurations = Array.from(dpResult.duration.data);
|
|
303
|
+
/* apply speed factor to duration */
|
|
304
|
+
for (let i = 0; i < predictedDurations.length; i++)
|
|
305
|
+
predictedDurations[i] /= speed;
|
|
306
|
+
/* run text encoder model */
|
|
307
|
+
const textEncResult = await this.textEncOrt.run({
|
|
308
|
+
text_ids: intArrayToTensor(textIds, textIdsShape),
|
|
309
|
+
style_ttl: style.ttl,
|
|
310
|
+
text_mask: textMaskTensor
|
|
311
|
+
});
|
|
312
|
+
const textEmbTensor = textEncResult.text_emb;
|
|
313
|
+
/* sample initial noisy latent vectors */
|
|
314
|
+
const { noisyLatent, latentMask } = this.sampleNoisyLatent(predictedDurations);
|
|
315
|
+
const latentShape = [batchSize, noisyLatent[0].length, noisyLatent[0][0].length];
|
|
316
|
+
const latentMaskShape = [batchSize, 1, latentMask[0][0].length];
|
|
317
|
+
const latentMaskTensor = arrayToTensor(latentMask, latentMaskShape);
|
|
318
|
+
/* prepare step tensors */
|
|
319
|
+
const totalStepArray = Array.from({ length: batchSize }).fill(totalStep);
|
|
320
|
+
const scalarShape = [batchSize];
|
|
321
|
+
const totalStepTensor = arrayToTensor(totalStepArray, scalarShape);
|
|
322
|
+
/* iteratively denoise latent vectors */
|
|
323
|
+
for (let step = 0; step < totalStep; step++) {
|
|
324
|
+
const currentStepArray = Array.from({ length: batchSize }).fill(step);
|
|
325
|
+
/* run vector estimator model */
|
|
326
|
+
const vectorEstResult = await this.vectorEstOrt.run({
|
|
327
|
+
noisy_latent: arrayToTensor(noisyLatent, latentShape),
|
|
328
|
+
text_emb: textEmbTensor,
|
|
329
|
+
style_ttl: style.ttl,
|
|
330
|
+
text_mask: textMaskTensor,
|
|
331
|
+
latent_mask: latentMaskTensor,
|
|
332
|
+
total_step: totalStepTensor,
|
|
333
|
+
current_step: arrayToTensor(currentStepArray, scalarShape)
|
|
334
|
+
});
|
|
335
|
+
const denoisedLatent = Array.from(vectorEstResult.denoised_latent.data);
|
|
336
|
+
/* update latent with the denoised output */
|
|
337
|
+
let idx = 0;
|
|
338
|
+
for (let b = 0; b < noisyLatent.length; b++)
|
|
339
|
+
for (let d = 0; d < noisyLatent[b].length; d++)
|
|
340
|
+
for (let t = 0; t < noisyLatent[b][d].length; t++)
|
|
341
|
+
noisyLatent[b][d][t] = denoisedLatent[idx++];
|
|
342
|
+
}
|
|
343
|
+
/* run vocoder to generate audio waveform */
|
|
344
|
+
const vocoderResult = await this.vocoderOrt.run({
|
|
345
|
+
latent: arrayToTensor(noisyLatent, latentShape)
|
|
346
|
+
});
|
|
347
|
+
const wav = Array.from(vocoderResult.wav_tts.data);
|
|
348
|
+
return { wav, duration: predictedDurations };
|
|
349
|
+
}
|
|
350
|
+
async synthesize(text, style, totalStep, speed, silenceDuration = 0.3) {
|
|
351
|
+
/* validate single speaker mode */
|
|
352
|
+
if (style.ttl.dims[0] !== 1)
|
|
353
|
+
throw new Error("Single speaker text to speech only supports single style");
|
|
354
|
+
/* chunk text into segments */
|
|
355
|
+
const textList = chunkText(text);
|
|
356
|
+
if (textList.length === 0)
|
|
357
|
+
return { wav: [], duration: 0 };
|
|
358
|
+
/* synthesize each chunk and concatenate with silence */
|
|
359
|
+
const wavParts = [];
|
|
360
|
+
let totalDuration = 0;
|
|
361
|
+
for (const chunk of textList) {
|
|
362
|
+
const { wav, duration } = await this.infer([chunk], style, totalStep, speed);
|
|
363
|
+
/* insert silence between chunks */
|
|
364
|
+
if (wavParts.length > 0) {
|
|
365
|
+
const silenceLen = Math.floor(silenceDuration * this.sampleRate);
|
|
366
|
+
wavParts.push(Array.from({ length: silenceLen }).fill(0));
|
|
367
|
+
totalDuration += silenceDuration;
|
|
368
|
+
}
|
|
369
|
+
wavParts.push(wav);
|
|
370
|
+
totalDuration += duration[0];
|
|
371
|
+
}
|
|
372
|
+
return { wav: wavParts.flat(), duration: totalDuration };
|
|
373
|
+
}
|
|
374
|
+
async release() {
|
|
375
|
+
/* release all ONNX inference sessions */
|
|
376
|
+
await Promise.all([
|
|
377
|
+
this.dpOrt.release(),
|
|
378
|
+
this.textEncOrt.release(),
|
|
379
|
+
this.vectorEstOrt.release(),
|
|
380
|
+
this.vocoderOrt.release()
|
|
381
|
+
]);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/* load voice style from JSON file */
|
|
385
|
+
async function loadVoiceStyle(voiceStylePath) {
|
|
386
|
+
/* read and parse voice style JSON */
|
|
387
|
+
let voiceStyle;
|
|
388
|
+
try {
|
|
389
|
+
voiceStyle = JSON.parse(await node_fs_1.default.promises.readFile(voiceStylePath, "utf8"));
|
|
390
|
+
}
|
|
391
|
+
catch (err) {
|
|
392
|
+
throw new Error(`failed to parse voice style JSON "${voiceStylePath}"`, { cause: err });
|
|
393
|
+
}
|
|
394
|
+
/* extract dimensions and data */
|
|
395
|
+
const ttlDims = voiceStyle.style_ttl.dims;
|
|
396
|
+
const dpDims = voiceStyle.style_dp.dims;
|
|
397
|
+
const ttlData = voiceStyle.style_ttl.data.flat(Infinity);
|
|
398
|
+
const dpData = voiceStyle.style_dp.data.flat(Infinity);
|
|
399
|
+
/* create ONNX tensors for style vectors */
|
|
400
|
+
const ttlStyle = new ORT.Tensor("float32", Float32Array.from(ttlData), ttlDims);
|
|
401
|
+
const dpStyle = new ORT.Tensor("float32", Float32Array.from(dpData), dpDims);
|
|
402
|
+
return { ttl: ttlStyle, dp: dpStyle };
|
|
403
|
+
}
|
|
404
|
+
/* load TTS engine from ONNX models */
|
|
405
|
+
async function loadSupertonic(assetsDir) {
|
|
406
|
+
/* load configuration */
|
|
407
|
+
const cfgPath = node_path_1.default.join(assetsDir, "onnx", "tts.json");
|
|
408
|
+
let cfgs;
|
|
409
|
+
try {
|
|
410
|
+
cfgs = JSON.parse(await node_fs_1.default.promises.readFile(cfgPath, "utf8"));
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
throw new Error(`failed to parse TTS config JSON "${cfgPath}"`, { cause: err });
|
|
414
|
+
}
|
|
415
|
+
/* load text processor */
|
|
416
|
+
const unicodeIndexerPath = node_path_1.default.join(assetsDir, "onnx", "unicode_indexer.json");
|
|
417
|
+
const textProcessor = new SupertonicTextProcessor(unicodeIndexerPath);
|
|
418
|
+
/* load ONNX models */
|
|
419
|
+
const opts = {};
|
|
420
|
+
const [dpOrt, textEncOrt, vectorEstOrt, vocoderOrt] = await Promise.all([
|
|
421
|
+
ORT.InferenceSession.create(node_path_1.default.join(assetsDir, "onnx", "duration_predictor.onnx"), opts),
|
|
422
|
+
ORT.InferenceSession.create(node_path_1.default.join(assetsDir, "onnx", "text_encoder.onnx"), opts),
|
|
423
|
+
ORT.InferenceSession.create(node_path_1.default.join(assetsDir, "onnx", "vector_estimator.onnx"), opts),
|
|
424
|
+
ORT.InferenceSession.create(node_path_1.default.join(assetsDir, "onnx", "vocoder.onnx"), opts)
|
|
425
|
+
]);
|
|
426
|
+
return new SupertonicTTS(cfgs, textProcessor, dpOrt, textEncOrt, vectorEstOrt, vocoderOrt);
|
|
427
|
+
}
|
|
428
|
+
/* ==== SPEECHFLOW NODE IMPLEMENTATION ==== */
|
|
429
|
+
/* SpeechFlow node for Supertonic text-to-speech conversion */
|
|
430
|
+
class SpeechFlowNodeT2ASupertonic extends speechflow_node_1.default {
|
|
431
|
+
/* declare official node name */
|
|
432
|
+
static name = "t2a-supertonic";
|
|
433
|
+
/* internal state */
|
|
434
|
+
supertonic = null;
|
|
435
|
+
style = null;
|
|
436
|
+
resampler = null;
|
|
437
|
+
closing = false;
|
|
438
|
+
/* construct node */
|
|
439
|
+
constructor(id, cfg, opts, args) {
|
|
440
|
+
super(id, cfg, opts, args);
|
|
441
|
+
/* declare node configuration parameters */
|
|
442
|
+
this.configure({
|
|
443
|
+
voice: { type: "string", val: "M1", pos: 0, match: /^(?:M1|M2|F1|F2)$/ },
|
|
444
|
+
speed: { type: "number", val: 1.40, pos: 1, match: (n) => n >= 0.5 && n <= 2.0 },
|
|
445
|
+
steps: { type: "number", val: 20, pos: 2, match: (n) => n >= 1 && n <= 20 }
|
|
446
|
+
});
|
|
447
|
+
/* declare node input/output format */
|
|
448
|
+
this.input = "text";
|
|
449
|
+
this.output = "audio";
|
|
450
|
+
}
|
|
451
|
+
/* one-time status of node */
|
|
452
|
+
async status() {
|
|
453
|
+
return {};
|
|
454
|
+
}
|
|
455
|
+
/* download HuggingFace assets */
|
|
456
|
+
async downloadAssets() {
|
|
457
|
+
/* define HuggingFace repository and required files */
|
|
458
|
+
const assetRepo = "Supertone/supertonic";
|
|
459
|
+
const assetFiles = [
|
|
460
|
+
"voice_styles/F1.json",
|
|
461
|
+
"voice_styles/F2.json",
|
|
462
|
+
"voice_styles/M1.json",
|
|
463
|
+
"voice_styles/M2.json",
|
|
464
|
+
"onnx/tts.json",
|
|
465
|
+
"onnx/duration_predictor.onnx",
|
|
466
|
+
"onnx/text_encoder.onnx",
|
|
467
|
+
"onnx/unicode_indexer.json",
|
|
468
|
+
"onnx/vector_estimator.onnx",
|
|
469
|
+
"onnx/vocoder.onnx",
|
|
470
|
+
];
|
|
471
|
+
/* create asset directories */
|
|
472
|
+
const assetDir = node_path_1.default.join(this.config.cacheDir, "supertonic");
|
|
473
|
+
await (0, mkdirp_1.mkdirp)(node_path_1.default.join(assetDir, "voice_styles"), { mode: 0o750 });
|
|
474
|
+
await (0, mkdirp_1.mkdirp)(node_path_1.default.join(assetDir, "onnx"), { mode: 0o750 });
|
|
475
|
+
/* download missing asset files */
|
|
476
|
+
for (const assetFile of assetFiles) {
|
|
477
|
+
const url = `${assetRepo}/${assetFile}`;
|
|
478
|
+
const file = node_path_1.default.join(assetDir, assetFile);
|
|
479
|
+
const stat = await node_fs_1.default.promises.stat(file).catch((_err) => null);
|
|
480
|
+
if (stat === null || !stat.isFile()) {
|
|
481
|
+
this.log("info", `downloading from HuggingFace "${url}"`);
|
|
482
|
+
const response = await HF.downloadFile({ repo: assetRepo, path: assetFile });
|
|
483
|
+
if (!response)
|
|
484
|
+
throw new Error(`failed to download from HuggingFace "${url}"`);
|
|
485
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
486
|
+
await node_fs_1.default.promises.writeFile(file, buffer);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return assetDir;
|
|
490
|
+
}
|
|
491
|
+
/* open node */
|
|
492
|
+
async open() {
|
|
493
|
+
this.closing = false;
|
|
494
|
+
/* download assets */
|
|
495
|
+
const assetsDir = await this.downloadAssets();
|
|
496
|
+
/* download ONNX models */
|
|
497
|
+
this.log("info", `loading ONNX models (asset dir: "${assetsDir}")`);
|
|
498
|
+
this.supertonic = await loadSupertonic(assetsDir);
|
|
499
|
+
this.log("info", `loaded ONNX models (sample rate: ${this.supertonic.sampleRate}Hz)`);
|
|
500
|
+
/* load voice style */
|
|
501
|
+
const voiceStylePath = node_path_1.default.join(assetsDir, "voice_styles", `${this.params.voice}.json`);
|
|
502
|
+
if (!node_fs_1.default.existsSync(voiceStylePath))
|
|
503
|
+
throw new Error(`voice style not found: ${voiceStylePath}`);
|
|
504
|
+
this.log("info", `loading voice style "${this.params.voice}"`);
|
|
505
|
+
this.style = await loadVoiceStyle(voiceStylePath);
|
|
506
|
+
this.log("info", `loaded voice style "${this.params.voice}"`);
|
|
507
|
+
/* establish resampler from Supertonic's output sample rate to our standard audio sample rate (48kHz) */
|
|
508
|
+
this.resampler = new speex_resampler_1.default(1, this.supertonic.sampleRate, this.config.audioSampleRate, 7);
|
|
509
|
+
/* perform text-to-speech operation with Supertonic */
|
|
510
|
+
const text2speech = async (text) => {
|
|
511
|
+
/* synthesize speech from text */
|
|
512
|
+
this.log("info", `Supertonic: input: "${text}"`);
|
|
513
|
+
const { wav, duration } = await this.supertonic.synthesize(text, this.style, this.params.steps, this.params.speed);
|
|
514
|
+
this.log("info", `Supertonic: synthesized ${duration.toFixed(2)}s of audio`);
|
|
515
|
+
/* convert audio samples from PCM/F32 to PCM/I16 */
|
|
516
|
+
const buffer1 = Buffer.alloc(wav.length * 2);
|
|
517
|
+
for (let i = 0; i < wav.length; i++) {
|
|
518
|
+
const sample = Math.max(-1, Math.min(1, wav[i]));
|
|
519
|
+
buffer1.writeInt16LE(sample * 0x7FFF, i * 2);
|
|
520
|
+
}
|
|
521
|
+
/* resample audio samples from 44.1kHz to 48kHz */
|
|
522
|
+
const buffer2 = this.resampler.processChunk(buffer1);
|
|
523
|
+
return buffer2;
|
|
524
|
+
};
|
|
525
|
+
/* create transform stream and connect it to the Supertonic TTS */
|
|
526
|
+
const self = this;
|
|
527
|
+
this.stream = new node_stream_1.default.Transform({
|
|
528
|
+
writableObjectMode: true,
|
|
529
|
+
readableObjectMode: true,
|
|
530
|
+
decodeStrings: false,
|
|
531
|
+
highWaterMark: 1,
|
|
532
|
+
async transform(chunk, encoding, callback) {
|
|
533
|
+
if (self.closing)
|
|
534
|
+
callback(new Error("stream already destroyed"));
|
|
535
|
+
else if (Buffer.isBuffer(chunk.payload))
|
|
536
|
+
callback(new Error("invalid chunk payload type"));
|
|
537
|
+
else {
|
|
538
|
+
let processTimeout = setTimeout(() => {
|
|
539
|
+
processTimeout = null;
|
|
540
|
+
callback(new Error("Supertonic TTS timeout"));
|
|
541
|
+
}, 120 * 1000);
|
|
542
|
+
const clearProcessTimeout = () => {
|
|
543
|
+
if (processTimeout !== null) {
|
|
544
|
+
clearTimeout(processTimeout);
|
|
545
|
+
processTimeout = null;
|
|
546
|
+
}
|
|
547
|
+
};
|
|
548
|
+
try {
|
|
549
|
+
if (self.closing) {
|
|
550
|
+
clearProcessTimeout();
|
|
551
|
+
callback(new Error("stream destroyed during processing"));
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
const buffer = await text2speech(chunk.payload);
|
|
555
|
+
if (self.closing) {
|
|
556
|
+
clearProcessTimeout();
|
|
557
|
+
callback(new Error("stream destroyed during processing"));
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
self.log("info", `Supertonic: received audio (buffer length: ${buffer.byteLength})`);
|
|
561
|
+
/* calculate actual audio duration from PCM buffer size */
|
|
562
|
+
const durationMs = util.audioBufferDuration(buffer, self.config.audioSampleRate, self.config.audioBitDepth) * 1000;
|
|
563
|
+
/* create new chunk with recalculated timestamps */
|
|
564
|
+
const chunkNew = chunk.clone();
|
|
565
|
+
chunkNew.type = "audio";
|
|
566
|
+
chunkNew.payload = buffer;
|
|
567
|
+
chunkNew.timestampEnd = luxon_1.Duration.fromMillis(chunkNew.timestampStart.toMillis() + durationMs);
|
|
568
|
+
/* push chunk and complete transform */
|
|
569
|
+
clearProcessTimeout();
|
|
570
|
+
this.push(chunkNew);
|
|
571
|
+
callback();
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
/* handle processing errors */
|
|
575
|
+
clearProcessTimeout();
|
|
576
|
+
callback(util.ensureError(error, "Supertonic processing failed"));
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
},
|
|
580
|
+
final(callback) {
|
|
581
|
+
callback();
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
/* close node */
|
|
586
|
+
async close() {
|
|
587
|
+
/* indicate closing */
|
|
588
|
+
this.closing = true;
|
|
589
|
+
/* shutdown stream */
|
|
590
|
+
if (this.stream !== null) {
|
|
591
|
+
await util.destroyStream(this.stream);
|
|
592
|
+
this.stream = null;
|
|
593
|
+
}
|
|
594
|
+
/* destroy voice style */
|
|
595
|
+
if (this.style !== null)
|
|
596
|
+
this.style = null;
|
|
597
|
+
/* destroy resampler */
|
|
598
|
+
if (this.resampler !== null)
|
|
599
|
+
this.resampler = null;
|
|
600
|
+
/* destroy Supertonic TTS */
|
|
601
|
+
if (this.supertonic !== null) {
|
|
602
|
+
await this.supertonic.release();
|
|
603
|
+
this.supertonic = null;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
exports.default = SpeechFlowNodeT2ASupertonic;
|
|
608
|
+
//# sourceMappingURL=speechflow-node-t2a-supertonic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-t2a-supertonic.js","sourceRoot":"","sources":["../src/speechflow-node-t2a-supertonic.ts"],"names":[],"mappings":"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"}
|