speechflow 1.2.8 → 1.3.1
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 +18 -0
- package/README.md +201 -43
- package/dst/speechflow-node-a2a-gender.d.ts +1 -0
- package/dst/speechflow-node-a2a-gender.js +7 -2
- package/dst/speechflow-node-a2a-gender.js.map +1 -1
- package/dst/speechflow-node-a2a-meter.js +5 -2
- package/dst/speechflow-node-a2a-meter.js.map +1 -1
- package/dst/speechflow-node-a2t-deepgram.js +22 -14
- package/dst/speechflow-node-a2t-deepgram.js.map +1 -1
- package/dst/speechflow-node-t2t-sentence.d.ts +17 -0
- package/dst/speechflow-node-t2t-sentence.js +234 -0
- package/dst/speechflow-node-t2t-sentence.js.map +1 -0
- package/dst/speechflow-node-t2t-subtitle.d.ts +1 -0
- package/dst/speechflow-node-t2t-subtitle.js +231 -51
- package/dst/speechflow-node-t2t-subtitle.js.map +1 -1
- package/dst/speechflow-node-x2x-trace.js +14 -7
- package/dst/speechflow-node-x2x-trace.js.map +1 -1
- package/dst/speechflow-node-xio-device.js +10 -2
- package/dst/speechflow-node-xio-device.js.map +1 -1
- package/dst/speechflow-node.d.ts +2 -0
- package/dst/speechflow-node.js +3 -0
- package/dst/speechflow-node.js.map +1 -1
- package/dst/speechflow-utils.js +1 -1
- package/dst/speechflow-utils.js.map +1 -1
- package/dst/speechflow.js +64 -2
- package/dst/speechflow.js.map +1 -1
- package/etc/speechflow.yaml +39 -26
- package/package.json +18 -17
- package/src/speechflow-node-a2a-gender.ts +8 -2
- package/src/speechflow-node-a2a-meter.ts +1 -1
- package/src/speechflow-node-a2t-deepgram.ts +18 -11
- package/src/speechflow-node-t2t-sentence.ts +224 -0
- package/src/speechflow-node-t2t-subtitle.ts +62 -15
- package/src/speechflow-node-xio-device.ts +10 -2
- package/src/speechflow-utils.ts +1 -1
- package/src/speechflow.ts +15 -2
|
@@ -64,7 +64,8 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
64
64
|
keyAdm: { type: "string", val: process.env.SPEECHFLOW_DEEPGRAM_KEY_ADM },
|
|
65
65
|
model: { type: "string", val: "nova-3", pos: 0 },
|
|
66
66
|
version: { type: "string", val: "latest", pos: 1 },
|
|
67
|
-
language: { type: "string", val: "multi", pos: 2 }
|
|
67
|
+
language: { type: "string", val: "multi", pos: 2 },
|
|
68
|
+
interim: { type: "boolean", val: false, pos: 3 }
|
|
68
69
|
});
|
|
69
70
|
/* declare node input/output format */
|
|
70
71
|
this.input = "audio";
|
|
@@ -110,7 +111,7 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
110
111
|
encoding: "linear16",
|
|
111
112
|
multichannel: false,
|
|
112
113
|
endpointing: 10,
|
|
113
|
-
interim_results:
|
|
114
|
+
interim_results: this.params.interim,
|
|
114
115
|
smart_format: true,
|
|
115
116
|
punctuate: true,
|
|
116
117
|
filler_words: true,
|
|
@@ -120,11 +121,13 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
120
121
|
});
|
|
121
122
|
/* hook onto Deepgram API events */
|
|
122
123
|
this.dg.on(Deepgram.LiveTranscriptionEvents.Transcript, async (data) => {
|
|
123
|
-
const text = data.channel?.alternatives[0]?.transcript ?? "";
|
|
124
|
+
const text = (data.channel?.alternatives[0]?.transcript ?? "");
|
|
125
|
+
const words = (data.channel?.alternatives[0]?.words ?? []);
|
|
126
|
+
const isFinal = (data.is_final ?? false);
|
|
124
127
|
if (text === "")
|
|
125
|
-
this.log("info", `
|
|
128
|
+
this.log("info", `empty/dummy text received (start: ${data.start}s, duration: ${data.duration.toFixed(2)}s)`);
|
|
126
129
|
else {
|
|
127
|
-
this.log("info", `
|
|
130
|
+
this.log("info", `text received (start: ${data.start}s, duration: ${data.duration.toFixed(2)}s): "${text}"`);
|
|
128
131
|
const start = luxon_1.Duration.fromMillis(data.start * 1000).plus(this.timeZeroOffset);
|
|
129
132
|
const end = start.plus({ seconds: data.duration });
|
|
130
133
|
const metas = metastore.fetch(start, end);
|
|
@@ -133,18 +136,23 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
133
136
|
return prev;
|
|
134
137
|
}, new Map());
|
|
135
138
|
metastore.prune(start);
|
|
136
|
-
|
|
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);
|
|
137
145
|
queue.write(chunk);
|
|
138
146
|
}
|
|
139
147
|
});
|
|
140
148
|
this.dg.on(Deepgram.LiveTranscriptionEvents.Metadata, (data) => {
|
|
141
|
-
this.log("info", "
|
|
149
|
+
this.log("info", "metadata received");
|
|
142
150
|
});
|
|
143
151
|
this.dg.on(Deepgram.LiveTranscriptionEvents.Close, () => {
|
|
144
|
-
this.log("info", "
|
|
152
|
+
this.log("info", "connection close");
|
|
145
153
|
});
|
|
146
154
|
this.dg.on(Deepgram.LiveTranscriptionEvents.Error, (error) => {
|
|
147
|
-
this.log("error", `
|
|
155
|
+
this.log("error", `error: ${error.message}`);
|
|
148
156
|
this.emit("error");
|
|
149
157
|
});
|
|
150
158
|
/* wait for Deepgram API to be available */
|
|
@@ -154,9 +162,9 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
154
162
|
timer = null;
|
|
155
163
|
reject(new Error("Deepgram: timeout waiting for connection open"));
|
|
156
164
|
}
|
|
157
|
-
},
|
|
165
|
+
}, 8000);
|
|
158
166
|
this.dg.once(Deepgram.LiveTranscriptionEvents.Open, () => {
|
|
159
|
-
this.log("info", "
|
|
167
|
+
this.log("info", "connection open");
|
|
160
168
|
if (timer !== null) {
|
|
161
169
|
clearTimeout(timer);
|
|
162
170
|
timer = null;
|
|
@@ -176,7 +184,7 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
176
184
|
if (initTimeout === null)
|
|
177
185
|
return;
|
|
178
186
|
initTimeout = null;
|
|
179
|
-
this.log("warning", "
|
|
187
|
+
this.log("warning", "initialization timeout -- restarting service usage");
|
|
180
188
|
await this.close();
|
|
181
189
|
this.open();
|
|
182
190
|
}, 3000);
|
|
@@ -208,7 +216,7 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
208
216
|
callback(new Error("expected Buffer input chunk"));
|
|
209
217
|
else {
|
|
210
218
|
if (chunk.payload.byteLength > 0) {
|
|
211
|
-
log("
|
|
219
|
+
log("debug", `send data (${chunk.payload.byteLength} bytes)`);
|
|
212
220
|
initTimeoutStart();
|
|
213
221
|
if (chunk.meta.size > 0)
|
|
214
222
|
metastore.store(chunk.timestampStart, chunk.timestampEnd, chunk.meta);
|
|
@@ -219,7 +227,7 @@ class SpeechFlowNodeDeepgram extends speechflow_node_1.default {
|
|
|
219
227
|
},
|
|
220
228
|
read(size) {
|
|
221
229
|
queue.read().then((chunk) => {
|
|
222
|
-
log("info", `
|
|
230
|
+
log("info", `receive data (${chunk.payload.length} bytes)`);
|
|
223
231
|
initTimeoutStop();
|
|
224
232
|
this.push(chunk, encoding);
|
|
225
233
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speechflow-node-a2t-deepgram.js","sourceRoot":"","sources":["../src/speechflow-node-a2t-deepgram.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,6BAA6B;AAC7B,8DAAgC;AAEhC,6BAA6B;AAC7B,wDAAkD;AAClD,iCAA0C;AAE1C,6BAA6B;AAC7B,qEAAmE;AACnE,0DAAoE;AAEpE,8DAA8D;AAC9D,MAAqB,sBAAuB,SAAQ,yBAAc;IAC9D,kCAAkC;IAC3B,MAAM,CAAC,IAAI,GAAG,UAAU,CAAA;IAE/B,sBAAsB;IACd,EAAE,GAA+B,IAAI,CAAA;IAE7C,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,EAAO,EAAE,IAAI,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"speechflow-node-a2t-deepgram.js","sourceRoot":"","sources":["../src/speechflow-node-a2t-deepgram.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import SpeechFlowNode from "./speechflow-node";
|
|
2
|
+
export default class SpeechFlowNodeSentence extends SpeechFlowNode {
|
|
3
|
+
static name: string;
|
|
4
|
+
private static speexInitialized;
|
|
5
|
+
private queue;
|
|
6
|
+
private queueRecv;
|
|
7
|
+
private queueSplit;
|
|
8
|
+
private queueSend;
|
|
9
|
+
private destroyed;
|
|
10
|
+
constructor(id: string, cfg: {
|
|
11
|
+
[id: string]: any;
|
|
12
|
+
}, opts: {
|
|
13
|
+
[id: string]: any;
|
|
14
|
+
}, args: any[]);
|
|
15
|
+
open(): Promise<void>;
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
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 luxon_1 = require("luxon");
|
|
48
|
+
/* internal dependencies */
|
|
49
|
+
const speechflow_node_1 = __importDefault(require("./speechflow-node"));
|
|
50
|
+
const utils = __importStar(require("./speechflow-utils"));
|
|
51
|
+
/* SpeechFlow node for sentence splitting */
|
|
52
|
+
class SpeechFlowNodeSentence extends speechflow_node_1.default {
|
|
53
|
+
/* declare official node name */
|
|
54
|
+
static name = "sentence";
|
|
55
|
+
/* internal state */
|
|
56
|
+
static speexInitialized = false;
|
|
57
|
+
queue = new utils.Queue();
|
|
58
|
+
queueRecv = this.queue.pointerUse("recv");
|
|
59
|
+
queueSplit = this.queue.pointerUse("split");
|
|
60
|
+
queueSend = this.queue.pointerUse("send");
|
|
61
|
+
destroyed = false;
|
|
62
|
+
/* construct node */
|
|
63
|
+
constructor(id, cfg, opts, args) {
|
|
64
|
+
super(id, cfg, opts, args);
|
|
65
|
+
/* declare node configuration parameters */
|
|
66
|
+
this.configure({});
|
|
67
|
+
/* declare node input/output format */
|
|
68
|
+
this.input = "text";
|
|
69
|
+
this.output = "text";
|
|
70
|
+
}
|
|
71
|
+
/* open node */
|
|
72
|
+
async open() {
|
|
73
|
+
/* clear destruction flag */
|
|
74
|
+
this.destroyed = false;
|
|
75
|
+
/* pass-through logging */
|
|
76
|
+
const log = (level, msg) => { this.log(level, msg); };
|
|
77
|
+
/* work off queued audio frames */
|
|
78
|
+
let workingOffTimer = null;
|
|
79
|
+
let workingOff = false;
|
|
80
|
+
const workOffQueue = async () => {
|
|
81
|
+
if (this.destroyed)
|
|
82
|
+
return;
|
|
83
|
+
/* control working off round */
|
|
84
|
+
if (workingOff)
|
|
85
|
+
return;
|
|
86
|
+
workingOff = true;
|
|
87
|
+
if (workingOffTimer !== null) {
|
|
88
|
+
clearTimeout(workingOffTimer);
|
|
89
|
+
workingOffTimer = null;
|
|
90
|
+
}
|
|
91
|
+
this.queue.off("write", workOffQueue);
|
|
92
|
+
/* try to work off one or more chunks */
|
|
93
|
+
while (true) {
|
|
94
|
+
const element = this.queueSplit.peek();
|
|
95
|
+
if (element === undefined)
|
|
96
|
+
break;
|
|
97
|
+
if (element.type === "text-eof") {
|
|
98
|
+
this.queueSplit.walk(+1);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
const chunk = element.chunk;
|
|
102
|
+
const payload = chunk.payload;
|
|
103
|
+
const m = payload.match(/^((?:.|\r?\n)+?[.;?!])\s*((?:.|\r?\n)*)$/);
|
|
104
|
+
if (m !== null) {
|
|
105
|
+
/* contains a sentence */
|
|
106
|
+
const [, sentence, rest] = m;
|
|
107
|
+
if (rest !== "") {
|
|
108
|
+
/* contains more than a sentence */
|
|
109
|
+
const chunk2 = chunk.clone();
|
|
110
|
+
const duration = luxon_1.Duration.fromMillis(chunk.timestampEnd.minus(chunk.timestampStart).toMillis() *
|
|
111
|
+
(sentence.length / payload.length));
|
|
112
|
+
chunk2.timestampStart = chunk.timestampStart.plus(duration);
|
|
113
|
+
chunk.timestampEnd = chunk2.timestampStart;
|
|
114
|
+
chunk.payload = sentence;
|
|
115
|
+
chunk2.payload = rest;
|
|
116
|
+
element.complete = true;
|
|
117
|
+
this.queueSplit.touch();
|
|
118
|
+
this.queueSplit.walk(+1);
|
|
119
|
+
this.queueSplit.insert({ type: "text-frame", chunk: chunk2 });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
/* contains just the sentence */
|
|
123
|
+
element.complete = true;
|
|
124
|
+
this.queueSplit.touch();
|
|
125
|
+
this.queueSplit.walk(+1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
/* contains less than a sentence */
|
|
130
|
+
const position = this.queueSplit.position();
|
|
131
|
+
if (position < this.queueSplit.maxPosition() - 1) {
|
|
132
|
+
/* merge into following chunk */
|
|
133
|
+
const element2 = this.queueSplit.peek(position + 1);
|
|
134
|
+
if (element2 === undefined)
|
|
135
|
+
break;
|
|
136
|
+
if (element2.type === "text-eof") {
|
|
137
|
+
element.complete = true;
|
|
138
|
+
this.queueSplit.touch();
|
|
139
|
+
this.queueSplit.walk(+1);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
element2.chunk.timestampStart = element.chunk.timestampStart;
|
|
143
|
+
element2.chunk.payload =
|
|
144
|
+
element.chunk.payload + " " +
|
|
145
|
+
element2.chunk.payload;
|
|
146
|
+
this.queueSplit.delete();
|
|
147
|
+
this.queueSplit.touch();
|
|
148
|
+
}
|
|
149
|
+
else
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/* re-initiate working off round */
|
|
154
|
+
workingOff = false;
|
|
155
|
+
workingOffTimer = setTimeout(workOffQueue, 100);
|
|
156
|
+
this.queue.once("write", workOffQueue);
|
|
157
|
+
};
|
|
158
|
+
this.queue.once("write", workOffQueue);
|
|
159
|
+
/* provide Duplex stream and internally attach to classifier */
|
|
160
|
+
const self = this;
|
|
161
|
+
this.stream = new node_stream_1.default.Duplex({
|
|
162
|
+
writableObjectMode: true,
|
|
163
|
+
readableObjectMode: true,
|
|
164
|
+
decodeStrings: false,
|
|
165
|
+
highWaterMark: 1,
|
|
166
|
+
/* receive text chunk (writable side of stream) */
|
|
167
|
+
write(chunk, encoding, callback) {
|
|
168
|
+
if (Buffer.isBuffer(chunk.payload))
|
|
169
|
+
callback(new Error("expected text input as string chunks"));
|
|
170
|
+
else if (chunk.payload.length === 0)
|
|
171
|
+
callback();
|
|
172
|
+
else {
|
|
173
|
+
log("info", `received text: ${JSON.stringify(chunk.payload)}`);
|
|
174
|
+
self.queueRecv.append({ type: "text-frame", chunk });
|
|
175
|
+
callback();
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
/* receive no more text chunks (writable side of stream) */
|
|
179
|
+
final(callback) {
|
|
180
|
+
/* signal end of file */
|
|
181
|
+
self.queueRecv.append({ type: "text-eof" });
|
|
182
|
+
callback();
|
|
183
|
+
},
|
|
184
|
+
/* send text chunk(s) (readable side of stream) */
|
|
185
|
+
read(_size) {
|
|
186
|
+
/* flush pending audio chunks */
|
|
187
|
+
const flushPendingChunks = () => {
|
|
188
|
+
const element = self.queueSend.peek();
|
|
189
|
+
if (element !== undefined
|
|
190
|
+
&& element.type === "text-eof") {
|
|
191
|
+
this.push(null);
|
|
192
|
+
self.queueSend.walk(+1);
|
|
193
|
+
}
|
|
194
|
+
else if (element !== undefined
|
|
195
|
+
&& element.type === "text-frame"
|
|
196
|
+
&& element.complete === true) {
|
|
197
|
+
while (true) {
|
|
198
|
+
const element = self.queueSend.peek();
|
|
199
|
+
if (element === undefined)
|
|
200
|
+
break;
|
|
201
|
+
else if (element.type === "text-eof") {
|
|
202
|
+
this.push(null);
|
|
203
|
+
self.queueSend.walk(+1);
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
else if (element.type === "text-frame"
|
|
207
|
+
&& element.complete !== true)
|
|
208
|
+
break;
|
|
209
|
+
log("info", `send text: ${JSON.stringify(element.chunk.payload)}`);
|
|
210
|
+
this.push(element.chunk);
|
|
211
|
+
self.queueSend.walk(+1);
|
|
212
|
+
self.queue.trim();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else
|
|
216
|
+
self.queue.once("write", flushPendingChunks);
|
|
217
|
+
};
|
|
218
|
+
flushPendingChunks();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/* close node */
|
|
223
|
+
async close() {
|
|
224
|
+
/* close stream */
|
|
225
|
+
if (this.stream !== null) {
|
|
226
|
+
this.stream.destroy();
|
|
227
|
+
this.stream = null;
|
|
228
|
+
}
|
|
229
|
+
/* indicate destruction */
|
|
230
|
+
this.destroyed = true;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.default = SpeechFlowNodeSentence;
|
|
234
|
+
//# sourceMappingURL=speechflow-node-t2t-sentence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechflow-node-t2t-sentence.js","sourceRoot":"","sources":["../src/speechflow-node-t2t-sentence.ts"],"names":[],"mappings":"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"}
|