meldivo 2.0.5 → 2.1.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.
@@ -0,0 +1,506 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { KOKORO_VOICES } from "./speech.js";
4
+ export const TTS_ENGINES = [
5
+ { id: "local", label: "On this device", note: "Kokoro, no server needed", hasModels: false },
6
+ { id: "vllm-omni", label: "vLLM-Omni", note: "Fish S2 Pro, Voxtral TTS, Qwen3-TTS, Higgs Audio, Breeze TTS 2, CosyVoice, IndexTTS2", defaultUrl: "http://localhost:8091", hasModels: true },
7
+ { id: "kokoro-fastapi", label: "Kokoro-FastAPI", note: "Kokoro on a GPU", defaultUrl: "http://localhost:8880", hasModels: false },
8
+ { id: "chatterbox", label: "Chatterbox TTS Server", note: "Chatterbox, Turbo, Multilingual", defaultUrl: "http://localhost:8004", hasModels: false },
9
+ { id: "fish-speech", label: "Fish Speech", note: "OpenAudio S1 and Fish S2 native server", defaultUrl: "http://localhost:8080", hasModels: false },
10
+ { id: "orpheus", label: "Orpheus-FastAPI", note: "Orpheus", defaultUrl: "http://localhost:5005", hasModels: false },
11
+ { id: "speaches", label: "Speaches", note: "Kokoro, Piper", defaultUrl: "http://localhost:8000", hasModels: true },
12
+ { id: "openai", label: "Other OpenAI-compatible server", note: "anything serving /v1/audio/speech", hasModels: true },
13
+ ];
14
+ export const STT_ENGINES = [
15
+ { id: "local", label: "On this device", note: "Parakeet, no server needed", hasModels: false },
16
+ { id: "vllm", label: "vLLM", note: "Whisper, Voxtral, Qwen3-ASR, Granite Speech, Cohere Transcribe", defaultUrl: "http://localhost:8000", hasModels: true },
17
+ { id: "speaches", label: "Speaches", note: "faster-whisper, Parakeet", defaultUrl: "http://localhost:8000", hasModels: true },
18
+ { id: "whisper-cpp", label: "whisper.cpp server", note: "Whisper", defaultUrl: "http://localhost:8080", hasModels: false },
19
+ { id: "openai", label: "Other OpenAI-compatible server", note: "anything serving /v1/audio/transcriptions", hasModels: true },
20
+ ];
21
+ // Speaches' registry lists hundreds of community fine-tunes; offer these (when it has them) next to
22
+ // whatever is already installed. Order is the default preference.
23
+ const SPEACHES_TTS_PICKS = ["speaches-ai/Kokoro-82M-v1.0-ONNX", "speaches-ai/Kokoro-82M-v1.0-ONNX-fp16", "speaches-ai/Kokoro-82M-v1.0-ONNX-int8"];
24
+ const SPEACHES_STT_PICKS = [
25
+ "istupakov/parakeet-tdt-0.6b-v3-onnx", // fastest, 25 European languages
26
+ "deepdml/faster-whisper-large-v3-turbo-ct2", // fast and accurate, multilingual
27
+ "Systran/faster-whisper-large-v3", // most accurate Whisper
28
+ "Systran/faster-distil-whisper-small.en", // lightest, English only
29
+ ];
30
+ const ORPHEUS_VOICES = ["tara", "leah", "jess", "leo", "dan", "mia", "zac", "zoe"];
31
+ const OPENAI_VOICES = ["alloy", "ash", "ballad", "coral", "echo", "fable", "nova", "onyx", "sage", "shimmer", "verse", "marin", "cedar"];
32
+ const DISCOVER_TIMEOUT_MS = 8_000;
33
+ const SPEECH_TIMEOUT_MS = 90_000;
34
+ const MAX_AUDIO_BYTES = 50 * 1024 * 1024;
35
+ const VOICE_ID = /^[A-Za-z0-9._-]{1,100}$/;
36
+ export function engineList(kind) {
37
+ return kind === "tts" ? TTS_ENGINES : STT_ENGINES;
38
+ }
39
+ function knownEngine(kind, id) {
40
+ return typeof id === "string" && engineList(kind).some((engine) => engine.id === id) ? id : undefined;
41
+ }
42
+ /** Accepts "host:port", "http://host:port", or a URL ending in /v1, and returns the server root. */
43
+ export function normalizeBaseUrl(raw) {
44
+ if (typeof raw !== "string" || !raw.trim() || raw.length > 500)
45
+ return undefined;
46
+ let text = raw.trim();
47
+ if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(text))
48
+ text = `http://${text}`;
49
+ let url;
50
+ try {
51
+ url = new URL(text);
52
+ }
53
+ catch {
54
+ return undefined;
55
+ }
56
+ if (url.protocol !== "http:" && url.protocol !== "https:")
57
+ return undefined;
58
+ if (url.username || url.password)
59
+ return undefined;
60
+ url.search = "";
61
+ url.hash = "";
62
+ return url.toString().replace(/\/+$/, "").replace(/\/v1$/, "");
63
+ }
64
+ function str(value, max = 300) {
65
+ return typeof value === "string" && value.trim() && value.length <= max ? value.trim() : undefined;
66
+ }
67
+ /** Validates one engine setting from a request or the settings file; undefined when unusable. */
68
+ export function readEngineSetting(kind, value) {
69
+ if (!value || typeof value !== "object")
70
+ return undefined;
71
+ const raw = value;
72
+ const engine = knownEngine(kind, raw.engine);
73
+ if (!engine)
74
+ return undefined;
75
+ if (engine === "local") {
76
+ const voice = kind === "tts" ? str(raw.voice, 100) : undefined;
77
+ return { engine, ...(voice && VOICE_ID.test(voice) ? { voice } : {}) };
78
+ }
79
+ const url = normalizeBaseUrl(raw.url);
80
+ if (!url)
81
+ return undefined;
82
+ const apiKey = str(raw.apiKey, 1000);
83
+ const model = str(raw.model);
84
+ const voice = kind === "tts" ? str(raw.voice, 100) : undefined;
85
+ return { engine, url, ...(apiKey ? { apiKey } : {}), ...(model ? { model } : {}), ...(voice && VOICE_ID.test(voice) ? { voice } : {}) };
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Settings file
89
+ // ---------------------------------------------------------------------------
90
+ export class SpeechSettingsStore {
91
+ settings;
92
+ file;
93
+ constructor(configDir) {
94
+ this.file = path.join(configDir, "speech.json");
95
+ this.settings = this.read();
96
+ }
97
+ read() {
98
+ const fallback = { tts: { engine: "local" }, stt: { engine: "local" } };
99
+ if (!existsSync(this.file))
100
+ return fallback;
101
+ try {
102
+ const value = JSON.parse(readFileSync(this.file, "utf8"));
103
+ return {
104
+ tts: readEngineSetting("tts", value.tts) ?? fallback.tts,
105
+ stt: readEngineSetting("stt", value.stt) ?? fallback.stt,
106
+ };
107
+ }
108
+ catch {
109
+ return fallback;
110
+ }
111
+ }
112
+ get() {
113
+ return this.settings;
114
+ }
115
+ set(next) {
116
+ mkdirSync(path.dirname(this.file), { recursive: true, mode: 0o700 });
117
+ const tmp = `${this.file}.tmp-${process.pid}`;
118
+ writeFileSync(tmp, JSON.stringify(next, null, 2), { mode: 0o600 });
119
+ renameSync(tmp, this.file);
120
+ chmodSync(this.file, 0o600);
121
+ this.settings = next;
122
+ }
123
+ }
124
+ /** What the browser may see: everything except the API key itself. */
125
+ export function publicSetting(setting) {
126
+ const { apiKey, ...rest } = setting;
127
+ return { ...rest, hasKey: Boolean(apiKey) };
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // HTTP helpers
131
+ // ---------------------------------------------------------------------------
132
+ function timeoutSignal(ms, signal) {
133
+ const timeout = AbortSignal.timeout(ms);
134
+ return signal ? AbortSignal.any([signal, timeout]) : timeout;
135
+ }
136
+ function headers(setting, extra = {}) {
137
+ return { ...extra, ...(setting.apiKey ? { Authorization: `Bearer ${setting.apiKey}` } : {}) };
138
+ }
139
+ async function describeFailure(response) {
140
+ let detail = "";
141
+ try {
142
+ const text = (await response.text()).slice(0, 2000);
143
+ try {
144
+ const body = JSON.parse(text);
145
+ const error = body.error;
146
+ const detailField = body.detail;
147
+ detail = (typeof error === "string" ? error : str(error?.message, 300))
148
+ ?? (typeof detailField === "string" ? detailField : str(detailField?.message, 300))
149
+ ?? str(body.message, 300) ?? "";
150
+ }
151
+ catch {
152
+ detail = /<html/i.test(text) ? "" : text.trim().slice(0, 200);
153
+ }
154
+ }
155
+ catch {
156
+ // body unreadable; the status is enough
157
+ }
158
+ if (response.status === 401 || response.status === 403)
159
+ return "The server refused the API key";
160
+ return `The speech server answered ${response.status}${detail ? `: ${detail}` : ""}`;
161
+ }
162
+ function connectionError(error, url) {
163
+ if (error instanceof DOMException && error.name === "TimeoutError")
164
+ return new Error("The speech server took too long to answer");
165
+ if (error instanceof DOMException && error.name === "AbortError")
166
+ return error;
167
+ const cause = error?.cause?.code;
168
+ const host = (() => { try {
169
+ return new URL(url).host;
170
+ }
171
+ catch {
172
+ return "the server";
173
+ } })();
174
+ if (cause === "ECONNREFUSED")
175
+ return new Error(`Nothing is listening at ${host}`);
176
+ if (cause === "ENOTFOUND" || cause === "EAI_AGAIN")
177
+ return new Error(`Could not find ${host}`);
178
+ return new Error(`Could not reach ${host}`);
179
+ }
180
+ async function request(setting, pathName, init = {}) {
181
+ const url = `${setting.url}${pathName}`;
182
+ try {
183
+ return await fetch(url, {
184
+ ...init,
185
+ redirect: "error",
186
+ headers: headers(setting, init.headers ?? {}),
187
+ signal: timeoutSignal(init.timeoutMs ?? DISCOVER_TIMEOUT_MS, init.signal ?? undefined),
188
+ });
189
+ }
190
+ catch (error) {
191
+ throw connectionError(error, url);
192
+ }
193
+ }
194
+ async function getJson(setting, pathName) {
195
+ const response = await request(setting, pathName, { headers: { Accept: "application/json" } });
196
+ if (!response.ok)
197
+ throw new Error(await describeFailure(response));
198
+ return response.json();
199
+ }
200
+ async function tryJson(setting, pathName) {
201
+ try {
202
+ return await getJson(setting, pathName);
203
+ }
204
+ catch {
205
+ return undefined;
206
+ }
207
+ }
208
+ /** Reads a voice list in any of the shapes servers use: strings, {id}/{name} objects, reference ids. */
209
+ export function voiceNames(body) {
210
+ const out = [];
211
+ const add = (items) => {
212
+ if (!Array.isArray(items))
213
+ return;
214
+ for (const item of items) {
215
+ const name = typeof item === "string" ? item
216
+ : item && typeof item === "object"
217
+ ? str(item.id, 100) ?? str(item.name, 100) ?? str(item.filename, 100) ?? str(item.voice_id, 100)
218
+ : undefined;
219
+ if (name && VOICE_ID.test(name) && !out.includes(name))
220
+ out.push(name);
221
+ }
222
+ };
223
+ if (Array.isArray(body))
224
+ add(body);
225
+ else if (body && typeof body === "object") {
226
+ const record = body;
227
+ add(record.voices);
228
+ add(record.uploaded_voices);
229
+ add(record.reference_ids);
230
+ add(record.data);
231
+ }
232
+ return out;
233
+ }
234
+ function modelIds(body) {
235
+ const data = body && typeof body === "object" ? body.data ?? body.models : undefined;
236
+ if (!Array.isArray(data))
237
+ return [];
238
+ const out = [];
239
+ for (const item of data) {
240
+ const id = typeof item === "string" ? item : str(item?.id);
241
+ if (!id)
242
+ continue;
243
+ const voices = item && typeof item === "object" && Array.isArray(item.voices) ? voiceNames(item.voices) : undefined;
244
+ out.push({ id, ...(voices ? { voices } : {}) });
245
+ }
246
+ return out;
247
+ }
248
+ // ---------------------------------------------------------------------------
249
+ // Discovery: models and voices for an engine at a URL
250
+ // ---------------------------------------------------------------------------
251
+ export async function discover(kind, setting) {
252
+ if (setting.engine === "local") {
253
+ return kind === "tts" ? { models: [], voices: [...KOKORO_VOICES], voice: "af_heart" } : { models: [], voices: [] };
254
+ }
255
+ return kind === "tts" ? discoverTts(setting) : discoverStt(setting);
256
+ }
257
+ async function discoverTts(setting) {
258
+ switch (setting.engine) {
259
+ case "kokoro-fastapi": {
260
+ const body = await getJson(setting, "/v1/audio/voices");
261
+ const record = body;
262
+ return { models: [{ id: "kokoro" }], model: "kokoro", voices: voiceNames(body), voice: str(record?.default_voice, 100) ?? "af_heart" };
263
+ }
264
+ case "speaches": {
265
+ const { installed, registry, models } = await speachesModels(setting, "text-to-speech", SPEACHES_TTS_PICKS);
266
+ const model = setting.model && models.some((m) => m.id === setting.model) ? setting.model : installed[0]?.id ?? models[0]?.id;
267
+ const chosen = [...installed, ...registry].find((m) => m.id === model);
268
+ const voices = chosen?.voices?.length ? chosen.voices : voiceNames(await tryJson(setting, `/v1/audio/voices${model ? `?model_id=${encodeURIComponent(model)}` : ""}`));
269
+ return { models, model, voices, voice: voices.includes("af_heart") ? "af_heart" : voices[0] };
270
+ }
271
+ case "vllm-omni": {
272
+ const models = modelIds(await getJson(setting, "/v1/models")).map((m) => ({ id: m.id }));
273
+ const voices = voiceNames(await getJson(setting, "/v1/audio/voices"));
274
+ return { models, model: models[0]?.id, voices, voice: voices[0] };
275
+ }
276
+ case "chatterbox": {
277
+ let voices = voiceNames(await tryJson(setting, "/v1/audio/voices"));
278
+ if (!voices.length)
279
+ voices = voiceNames(await tryJson(setting, "/get_predefined_voices"));
280
+ if (!voices.length)
281
+ await getJson(setting, "/api/model-info"); // surface "unreachable" instead of "no voices"
282
+ return { models: [{ id: "chatterbox" }], model: "chatterbox", voices, voice: voices[0] };
283
+ }
284
+ case "orpheus": {
285
+ // No voice list endpoint: probe the server, then offer Orpheus's built-in English voices.
286
+ const response = await request(setting, "/", { headers: { Accept: "text/html,application/json" } });
287
+ if (response.status >= 500)
288
+ throw new Error(await describeFailure(response));
289
+ await response.body?.cancel();
290
+ return { models: [{ id: "orpheus" }], model: "orpheus", voices: ORPHEUS_VOICES, voice: "tara" };
291
+ }
292
+ case "fish-speech": {
293
+ const body = await getJson(setting, "/v1/references/list");
294
+ return { models: [], voices: ["default", ...voiceNames(body).filter((v) => v !== "default")], voice: "default" };
295
+ }
296
+ default: {
297
+ const models = modelIds(await getJson(setting, "/v1/models")).map((m) => ({ id: m.id }));
298
+ const speechModels = models.filter((m) => /tts|speech|voice|kokoro|audio/i.test(m.id));
299
+ const listed = voiceNames(await tryJson(setting, "/v1/audio/voices"));
300
+ const voices = listed.length ? listed : OPENAI_VOICES;
301
+ const model = (speechModels[0] ?? models[0])?.id;
302
+ return { models: speechModels.length ? speechModels : models, model, voices, voice: voices[0] };
303
+ }
304
+ }
305
+ }
306
+ async function speachesModels(setting, task, picks) {
307
+ const installed = modelIds(await getJson(setting, `/v1/models?task=${task}`));
308
+ const available = modelIds(await tryJson(setting, `/v1/registry?task=${task}`));
309
+ const registry = picks
310
+ .map((id) => available.find((m) => m.id === id))
311
+ .filter((m) => Boolean(m) && !installed.some((i) => i.id === m.id));
312
+ const models = [...installed.map((m) => ({ id: m.id })), ...registry.map((m) => ({ id: m.id, installed: false }))];
313
+ return { installed, registry, models };
314
+ }
315
+ async function discoverStt(setting) {
316
+ switch (setting.engine) {
317
+ case "whisper-cpp": {
318
+ const response = await request(setting, "/health");
319
+ if (!response.ok && response.status !== 404)
320
+ throw new Error(await describeFailure(response));
321
+ await response.body?.cancel();
322
+ return { models: [], voices: [] };
323
+ }
324
+ case "speaches": {
325
+ const { installed, models } = await speachesModels(setting, "automatic-speech-recognition", SPEACHES_STT_PICKS);
326
+ return { models, model: installed[0]?.id ?? models[0]?.id, voices: [] };
327
+ }
328
+ default: {
329
+ const models = modelIds(await getJson(setting, "/v1/models")).map((m) => ({ id: m.id }));
330
+ const speech = models.filter((m) => /whisper|voxtral|asr|parakeet|canary|granite-speech|transcribe|stt/i.test(m.id));
331
+ const list = speech.length ? speech : models;
332
+ return { models: list, model: list[0]?.id, voices: [] };
333
+ }
334
+ }
335
+ }
336
+ // ---------------------------------------------------------------------------
337
+ // Synthesis and transcription
338
+ // ---------------------------------------------------------------------------
339
+ async function readAudio(response) {
340
+ const length = Number(response.headers.get("content-length") ?? 0);
341
+ if (length > MAX_AUDIO_BYTES)
342
+ throw new Error("The speech server sent too much audio");
343
+ const bytes = Buffer.from(await response.arrayBuffer());
344
+ if (bytes.length > MAX_AUDIO_BYTES)
345
+ throw new Error("The speech server sent too much audio");
346
+ if (!bytes.length)
347
+ throw new Error("The speech server sent no audio");
348
+ return fixStreamingWav(bytes);
349
+ }
350
+ /** Streaming servers write placeholder sizes into the WAV header; browsers such as Safari reject those. */
351
+ export function fixStreamingWav(bytes) {
352
+ if (bytes.length < 12 || bytes.toString("ascii", 0, 4) !== "RIFF" || bytes.toString("ascii", 8, 12) !== "WAVE")
353
+ return bytes;
354
+ let offset = 12;
355
+ while (offset + 8 <= bytes.length) {
356
+ const id = bytes.toString("ascii", offset, offset + 4);
357
+ const size = bytes.readUInt32LE(offset + 4);
358
+ if (id === "data") {
359
+ const actual = bytes.length - offset - 8;
360
+ if (size > actual || size === 0) {
361
+ const copy = Buffer.from(bytes);
362
+ copy.writeUInt32LE(actual, offset + 4);
363
+ copy.writeUInt32LE(copy.length - 8, 4);
364
+ return copy;
365
+ }
366
+ return bytes;
367
+ }
368
+ offset += 8 + size + (size % 2);
369
+ }
370
+ return bytes;
371
+ }
372
+ async function installSpeachesModel(setting, model, signal) {
373
+ const response = await request(setting, `/v1/models/${model.split("/").map(encodeURIComponent).join("/")}`, { method: "POST", timeoutMs: 15 * 60_000, signal });
374
+ if (!response.ok && response.status !== 409)
375
+ throw new Error(await describeFailure(response));
376
+ await response.body?.cancel();
377
+ }
378
+ /** Starts downloading a Speaches model the user picked, so the first reply doesn't wait for it. */
379
+ export function prepareSetting(setting) {
380
+ if (setting.engine === "speaches" && setting.model)
381
+ void installSpeachesModel(setting, setting.model).catch(() => undefined);
382
+ }
383
+ async function withSpeachesInstall(setting, run, signal) {
384
+ const response = await run();
385
+ if (setting.engine !== "speaches" || response.status !== 404 || !setting.model)
386
+ return response;
387
+ const detail = await response.clone().text().catch(() => "");
388
+ if (!/not installed|not found locally|download/i.test(detail))
389
+ return response;
390
+ await installSpeachesModel(setting, setting.model, signal);
391
+ return run();
392
+ }
393
+ export async function synthesizeWith(setting, text, voice, signal) {
394
+ if (setting.engine === "fish-speech") {
395
+ const response = await request(setting, "/v1/tts", {
396
+ method: "POST",
397
+ headers: { "Content-Type": "application/json", Accept: "audio/wav" },
398
+ body: JSON.stringify({ text, format: "wav", ...(voice && voice !== "default" ? { reference_id: voice } : {}) }),
399
+ timeoutMs: SPEECH_TIMEOUT_MS,
400
+ signal,
401
+ });
402
+ if (!response.ok)
403
+ throw new Error(await describeFailure(response));
404
+ return readAudio(response);
405
+ }
406
+ const model = setting.model ?? (setting.engine === "kokoro-fastapi" ? "kokoro" : setting.engine === "chatterbox" ? "chatterbox" : setting.engine === "orpheus" ? "orpheus" : "tts-1");
407
+ const body = JSON.stringify({ model, input: text, ...(voice ? { voice } : {}), response_format: "wav" });
408
+ const response = await withSpeachesInstall(setting, () => request(setting, "/v1/audio/speech", {
409
+ method: "POST",
410
+ headers: { "Content-Type": "application/json", Accept: "audio/wav" },
411
+ body,
412
+ timeoutMs: SPEECH_TIMEOUT_MS,
413
+ signal,
414
+ }), signal);
415
+ if (!response.ok)
416
+ throw new Error(await describeFailure(response));
417
+ return readAudio(response);
418
+ }
419
+ export async function transcribeWith(setting, wav, signal) {
420
+ const form = () => {
421
+ const data = new FormData();
422
+ data.append("file", new Blob([new Uint8Array(wav)], { type: "audio/wav" }), "speech.wav");
423
+ data.append("response_format", "json");
424
+ data.append("temperature", "0");
425
+ if (setting.engine !== "whisper-cpp" && setting.model)
426
+ data.append("model", setting.model);
427
+ return data;
428
+ };
429
+ const pathName = setting.engine === "whisper-cpp" ? "/inference" : "/v1/audio/transcriptions";
430
+ const response = await withSpeachesInstall(setting, () => request(setting, pathName, { method: "POST", body: form(), timeoutMs: SPEECH_TIMEOUT_MS, signal }), signal);
431
+ if (!response.ok)
432
+ throw new Error(await describeFailure(response));
433
+ const type = response.headers.get("content-type") ?? "";
434
+ if (!type.includes("json"))
435
+ return (await response.text()).trim();
436
+ const body = await response.json();
437
+ return typeof body.text === "string" ? body.text.trim() : "";
438
+ }
439
+ /** Routes each direction to its configured server, or to `local` when it is set to on-device. */
440
+ export function withSpeechSettings(local, store) {
441
+ let cachedFor = "";
442
+ let cachedVoices = [];
443
+ let lastError;
444
+ const key = (setting) => `${setting.engine}|${setting.url}|${setting.model}`;
445
+ const refreshVoices = async () => {
446
+ const tts = store.get().tts;
447
+ if (tts.engine === "local")
448
+ return local.voices();
449
+ if (cachedFor !== key(tts)) {
450
+ cachedVoices = (await discover("tts", tts)).voices;
451
+ cachedFor = key(tts);
452
+ }
453
+ return cachedVoices;
454
+ };
455
+ const track = async (work) => {
456
+ try {
457
+ const value = await work;
458
+ lastError = undefined;
459
+ return value;
460
+ }
461
+ catch (error) {
462
+ if (!(error instanceof DOMException && error.name === "AbortError"))
463
+ lastError = error instanceof Error ? error.message : String(error);
464
+ throw error;
465
+ }
466
+ };
467
+ return {
468
+ get defaultVoice() {
469
+ const tts = store.get().tts;
470
+ return tts.voice ?? (tts.engine === "local" ? local.defaultVoice : cachedVoices[0] ?? local.defaultVoice);
471
+ },
472
+ voices: () => (store.get().tts.engine === "local" ? local.voices() : cachedVoices),
473
+ listVoices: () => refreshVoices(),
474
+ usesLocal: () => store.get().tts.engine === "local" || store.get().stt.engine === "local",
475
+ status: () => {
476
+ const { tts, stt } = store.get();
477
+ if (tts.engine === "local" || stt.engine === "local") {
478
+ const base = local.status();
479
+ return lastError && !base.error ? { ...base, error: lastError } : base;
480
+ }
481
+ return { ready: true, downloading: false, ...(lastError ? { error: lastError } : {}) };
482
+ },
483
+ warmup: async () => {
484
+ if (store.get().tts.engine === "local" || store.get().stt.engine === "local")
485
+ await local.warmup?.();
486
+ if (store.get().tts.engine !== "local")
487
+ await refreshVoices().catch(() => undefined);
488
+ },
489
+ transcribe: (wav, signal) => {
490
+ const stt = store.get().stt;
491
+ return stt.engine === "local" ? local.transcribe(wav, signal) : track(transcribeWith(stt, wav, signal));
492
+ },
493
+ synthesize: async (text, voice, signal) => {
494
+ const tts = store.get().tts;
495
+ if (tts.engine === "local") {
496
+ const localVoice = local.voices().includes(voice) ? voice : tts.voice && local.voices().includes(tts.voice) ? tts.voice : local.defaultVoice;
497
+ return local.synthesize(text, localVoice, signal);
498
+ }
499
+ // A browser may still remember a speaker from another engine; fall back to the hub's choice.
500
+ const voices = await refreshVoices().catch(() => cachedVoices);
501
+ const chosen = voices.includes(voice) ? voice : tts.voice ?? voices[0];
502
+ return track(synthesizeWith(tts, text, chosen, signal));
503
+ },
504
+ };
505
+ }
506
+ //# sourceMappingURL=speech-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speech-api.js","sourceRoot":"","sources":["../../server/src/speech-api.ts"],"names":[],"mappings":"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"}