@leiboss/dsh-tts 0.0.0-stage → 0.3.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.
Files changed (89) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/LICENSE +21 -0
  3. package/README.md +374 -2
  4. package/cordis.patch.yml +4 -0
  5. package/dist/audio/mp3-duration.d.ts +23 -0
  6. package/dist/audio/mp3-duration.d.ts.map +1 -0
  7. package/dist/audio/mp3-duration.js +140 -0
  8. package/dist/audio/mp3-duration.js.map +1 -0
  9. package/dist/audio-route.d.ts +122 -0
  10. package/dist/audio-route.d.ts.map +1 -0
  11. package/dist/audio-route.js +408 -0
  12. package/dist/audio-route.js.map +1 -0
  13. package/dist/cache.d.ts +50 -0
  14. package/dist/cache.d.ts.map +1 -0
  15. package/dist/cache.js +105 -0
  16. package/dist/cache.js.map +1 -0
  17. package/dist/chunked-tts.d.ts +34 -0
  18. package/dist/chunked-tts.d.ts.map +1 -0
  19. package/dist/chunked-tts.js +121 -0
  20. package/dist/chunked-tts.js.map +1 -0
  21. package/dist/chunker.d.ts +19 -0
  22. package/dist/chunker.d.ts.map +1 -0
  23. package/dist/chunker.js +98 -0
  24. package/dist/chunker.js.map +1 -0
  25. package/dist/client.js +90 -0
  26. package/dist/concurrency.d.ts +33 -0
  27. package/dist/concurrency.d.ts.map +1 -0
  28. package/dist/concurrency.js +95 -0
  29. package/dist/concurrency.js.map +1 -0
  30. package/dist/config.d.ts +174 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +186 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/edge-tts.d.ts +74 -0
  35. package/dist/edge-tts.d.ts.map +1 -0
  36. package/dist/edge-tts.js +161 -0
  37. package/dist/edge-tts.js.map +1 -0
  38. package/dist/engine-health.d.ts +108 -0
  39. package/dist/engine-health.d.ts.map +1 -0
  40. package/dist/engine-health.js +170 -0
  41. package/dist/engine-health.js.map +1 -0
  42. package/dist/engines/edge-js.d.ts +51 -0
  43. package/dist/engines/edge-js.d.ts.map +1 -0
  44. package/dist/engines/edge-js.js +98 -0
  45. package/dist/engines/edge-js.js.map +1 -0
  46. package/dist/errors.d.ts +66 -0
  47. package/dist/errors.d.ts.map +1 -0
  48. package/dist/errors.js +110 -0
  49. package/dist/errors.js.map +1 -0
  50. package/dist/fallback.d.ts +69 -0
  51. package/dist/fallback.d.ts.map +1 -0
  52. package/dist/fallback.js +89 -0
  53. package/dist/fallback.js.map +1 -0
  54. package/dist/index.d.ts +72 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +723 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/probe.d.ts +42 -0
  59. package/dist/probe.d.ts.map +1 -0
  60. package/dist/probe.js +63 -0
  61. package/dist/probe.js.map +1 -0
  62. package/dist/provider.d.ts +33 -0
  63. package/dist/provider.d.ts.map +1 -0
  64. package/dist/provider.js +7 -0
  65. package/dist/provider.js.map +1 -0
  66. package/dist/register-service.d.ts +25 -0
  67. package/dist/register-service.d.ts.map +1 -0
  68. package/dist/register-service.js +33 -0
  69. package/dist/register-service.js.map +1 -0
  70. package/dist/sapi-tts.d.ts +29 -0
  71. package/dist/sapi-tts.d.ts.map +1 -0
  72. package/dist/sapi-tts.js +131 -0
  73. package/dist/sapi-tts.js.map +1 -0
  74. package/dist/self-check.d.ts +32 -0
  75. package/dist/self-check.d.ts.map +1 -0
  76. package/dist/self-check.js +75 -0
  77. package/dist/self-check.js.map +1 -0
  78. package/dist/service.d.ts +119 -0
  79. package/dist/service.d.ts.map +1 -0
  80. package/dist/service.js +404 -0
  81. package/dist/service.js.map +1 -0
  82. package/dist/voices.d.ts +21 -0
  83. package/dist/voices.d.ts.map +1 -0
  84. package/dist/voices.js +74 -0
  85. package/dist/voices.js.map +1 -0
  86. package/icon.svg +6 -0
  87. package/locale/en.json +6 -0
  88. package/locale/zh.json +6 -0
  89. package/package.json +93 -3
@@ -0,0 +1,89 @@
1
+ import { ErrorCode, TtsError } from "./errors.js";
2
+ import { isSapiSupported, synthesizeSapi, } from "./sapi-tts.js";
3
+ /** Codes that mean "the engine failed", not "the request is invalid". */
4
+ const FALLBACK_ELIGIBLE = new Set([
5
+ ErrorCode.EdgeTtsNotFound,
6
+ ErrorCode.SpawnEperm,
7
+ ErrorCode.SpawnFailed,
8
+ ErrorCode.EdgeTtsFailed,
9
+ ErrorCode.SynthesisTimeout,
10
+ ErrorCode.EmptyAudio,
11
+ ]);
12
+ /** Whether a failed Edge-TTS attempt is worth retrying with another engine. */
13
+ export function isFallbackEligible(error) {
14
+ return error instanceof TtsError && FALLBACK_ELIGIBLE.has(error.code);
15
+ }
16
+ /** Reason recorded when the health circuit skips an engine. */
17
+ export const SKIPPED_BY_HEALTH = 'skipped: circuit open (cooldown)';
18
+ function describe(error) {
19
+ if (error instanceof TtsError)
20
+ return `${error.code}: ${error.detail}`;
21
+ return error instanceof Error ? error.message : String(error);
22
+ }
23
+ function allFailed(order, attempts, primaryError) {
24
+ const reasons = attempts
25
+ .map((attempt) => `${attempt.engine} (${attempt.reason})`)
26
+ .join('; ');
27
+ return new TtsError(ErrorCode.AllFallbacksFailed, `All configured TTS fallbacks failed. Chain: ${order.join(' -> ')}. Tried: ${reasons}. Engines: ${JSON.stringify(order)}.`, 'Install edge-tts and restore network access, or include `speechSynthesis` in `fallbackOrder`.', { cause: primaryError });
28
+ }
29
+ /**
30
+ * Run the configured engines after Edge-TTS already failed. `edge-tts` in
31
+ * `fallbackOrder` marks the primary attempt rather than a retry.
32
+ */
33
+ export async function runFallback(options, deps = {}) {
34
+ const platform = deps.platform ?? process.platform;
35
+ const sapiImpl = deps.synthesizeSapiImpl ?? synthesizeSapi;
36
+ const attempts = [
37
+ {
38
+ engine: 'edge-tts',
39
+ reason: options.primaryReason ??
40
+ `primary engine failed: ${describe(options.primaryError)}`,
41
+ },
42
+ ];
43
+ // Local array narrowing keeps the literal union readable in the loop.
44
+ const order = options.fallbackOrder;
45
+ for (const engine of order) {
46
+ if (engine === 'edge-tts')
47
+ continue;
48
+ if (options.skip?.has(engine)) {
49
+ attempts.push({ engine, reason: SKIPPED_BY_HEALTH });
50
+ continue;
51
+ }
52
+ if (engine === 'sapi') {
53
+ if (!isSapiSupported(platform)) {
54
+ attempts.push({ engine, reason: `skipped: SAPI is Windows-only (${platform})` });
55
+ continue;
56
+ }
57
+ try {
58
+ const audio = await sapiImpl(options.text, {
59
+ rate: options.rate,
60
+ outputDir: options.outputDir,
61
+ hash: options.hash,
62
+ timeoutMs: options.timeoutMs,
63
+ signal: options.signal,
64
+ spawnImpl: deps.spawnImpl,
65
+ now: options.now,
66
+ platform,
67
+ powershellBinary: deps.powershellBinary,
68
+ ffmpegBinary: deps.ffmpegBinary,
69
+ });
70
+ const engineState = deps.health?.stateOf(engine) ?? 'healthy';
71
+ deps.health?.recordSuccess(engine);
72
+ attempts.push({ engine, reason: 'succeeded' });
73
+ return { kind: 'audio', audio, engine, engineState, attempts };
74
+ }
75
+ catch (error) {
76
+ if (error instanceof TtsError && error.code === ErrorCode.Aborted)
77
+ throw error;
78
+ deps.health?.recordFailure(engine, error);
79
+ attempts.push({ engine, reason: describe(error) });
80
+ continue;
81
+ }
82
+ }
83
+ if (engine === 'speechSynthesis') {
84
+ return { kind: 'speechSynthesis', engine: 'speechSynthesis', attempts };
85
+ }
86
+ }
87
+ throw allFailed(order, attempts, options.primaryError);
88
+ }
89
+ //# sourceMappingURL=fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * DSH tool plugin: text in, a durable audio file out.
3
+ *
4
+ * The plugin owns exactly one capability — Edge-TTS synthesis into
5
+ * `$DSH_HOME/tts-output` — and exposes it through `tts_generate` plus a
6
+ * side-effect-free `tts_self_check`. It deliberately implements no playback,
7
+ * transcription, voice cloning, or multi-provider routing.
8
+ */
9
+ import type { Context } from '@deepseek-ai/cordis';
10
+ import { type ToolDefinition } from '@deepseek-ai/dsh-tools';
11
+ import { type AudioUrlProvider } from './audio-route.ts';
12
+ import { ConcurrencyLimiter } from './concurrency.ts';
13
+ import { type ResolvedConfig, type TtsConfig } from './config.ts';
14
+ import { type SpawnFunction, type SynthesizedAudio } from './edge-tts.ts';
15
+ import type { SapiOptions } from './sapi-tts.ts';
16
+ import { type ProbeConnector } from './probe.ts';
17
+ export { Config } from './config.ts';
18
+ export type { TtsConfig } from './config.ts';
19
+ export { resolveConfig, DEFAULT_ENGINE, type TtsEngineKind } from './config.ts';
20
+ export { TtsService } from './service.ts';
21
+ export type { TtsAudioResult, TtsCapabilities, TtsDoctorReport, TtsProbeReport, TtsRequest, TtsResult, TtsServiceDeps, TtsSpeechResult, } from './service.ts';
22
+ export type { TTSProvider, SynthesizeOptions, SynthesizeResult, } from './provider.ts';
23
+ export { ErrorCode, TtsError } from './errors.ts';
24
+ export { cacheKey, findCachedFile } from './cache.ts';
25
+ export { runProcess, synthesize } from './edge-tts.ts';
26
+ export { selfCheck } from './self-check.ts';
27
+ export { AUDIO_ROUTE_PREFIX, AudioRoute } from './audio-route.ts';
28
+ export { DEFAULT_CHUNK_SIZE, splitText } from './chunker.ts';
29
+ export { synthesizeChunked } from './chunked-tts.ts';
30
+ export { ConcurrencyLimiter, type ConcurrencyLimits } from './concurrency.ts';
31
+ export { isFallbackEligible, runFallback } from './fallback.ts';
32
+ export { isSapiSupported, sapiRate, synthesizeSapi } from './sapi-tts.ts';
33
+ export { AVAILABLE_VOICES, VOICES, type VoiceInfo } from './voices.ts';
34
+ export declare const name = "dsh-tts";
35
+ /** The registry must exist before `apply` runs. */
36
+ export declare const inject: string[];
37
+ /** Pitch Edge-TTS uses when the call omits one. */
38
+ export declare const DEFAULT_PITCH = "+0Hz";
39
+ /** Volume Edge-TTS uses when the call omits one. */
40
+ export declare const DEFAULT_VOLUME = "+0%";
41
+ /** Injection points used by tests; production always uses the defaults. */
42
+ export interface TtsDependencies {
43
+ spawnImpl?: SpawnFunction;
44
+ now?: () => Date;
45
+ /** Present when a web route was registered; enables `browserUrl`. */
46
+ audioRoute?: AudioUrlProvider;
47
+ /** Override the pause between chunk subprocesses (tests use 0). */
48
+ chunkDelayMs?: number;
49
+ /** Platform override, so non-Windows tests can exercise the SAPI branch. */
50
+ platform?: NodeJS.Platform;
51
+ /** Injected SAPI implementation; defaults to the real PowerShell path. */
52
+ sapiSynthesize?: (text: string, options: SapiOptions) => Promise<SynthesizedAudio>;
53
+ powershellBinary?: string;
54
+ ffmpegBinary?: string;
55
+ /** Inject a limiter to share one capacity pool across tool instances. */
56
+ limiter?: ConcurrencyLimiter;
57
+ /** Debug sink for fallback timing; never receives call arguments. */
58
+ log?: (message: string) => void;
59
+ /** Injected TCP connector for `tts_probe_network`; tests use a local server. */
60
+ probeConnect?: ProbeConnector;
61
+ }
62
+ /**
63
+ * Build both tool definitions from one resolved config. Exported so tests can
64
+ * exercise the real `execute` bodies with an injected spawn implementation.
65
+ */
66
+ export declare function createTtsTools(config: ResolvedConfig, deps?: TtsDependencies): ToolDefinition[];
67
+ /**
68
+ * Mount both tools. Registration is fiber-owned, so unloading the plugin
69
+ * unregisters them without explicit cleanup.
70
+ */
71
+ export declare function apply(ctx: Context, config?: Partial<TtsConfig>): void;
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}