@sudocode-ai/local-server 0.1.17 → 0.1.18-dev.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/dist/better-sqlite3-loader.d.ts +9 -0
- package/dist/better-sqlite3-loader.d.ts.map +1 -0
- package/dist/better-sqlite3-loader.js +24 -0
- package/dist/better-sqlite3-loader.js.map +1 -0
- package/dist/execution/executors/agent-executor-wrapper.d.ts +6 -0
- package/dist/execution/executors/agent-executor-wrapper.d.ts.map +1 -1
- package/dist/execution/executors/agent-executor-wrapper.js +75 -4
- package/dist/execution/executors/agent-executor-wrapper.js.map +1 -1
- package/dist/execution/executors/executor-factory.d.ts +9 -6
- package/dist/execution/executors/executor-factory.d.ts.map +1 -1
- package/dist/execution/executors/executor-factory.js +6 -5
- package/dist/execution/executors/executor-factory.js.map +1 -1
- package/dist/execution/worktree/config.js +1 -1
- package/dist/execution/worktree/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/public/assets/index-B1p5HV93.css +1 -0
- package/dist/public/assets/index-qqIsBBjJ.js +3836 -0
- package/dist/public/assets/index-qqIsBBjJ.js.map +1 -0
- package/dist/public/assets/ort-wasm-simd-threaded.jsep-B0T3yYHD.wasm +0 -0
- package/dist/public/index.html +2 -2
- package/dist/public/kokoro-test.html +197 -0
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +39 -0
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/executions.d.ts.map +1 -1
- package/dist/routes/executions.js +9 -0
- package/dist/routes/executions.js.map +1 -1
- package/dist/routes/voice.d.ts +12 -0
- package/dist/routes/voice.d.ts.map +1 -0
- package/dist/routes/voice.js +387 -0
- package/dist/routes/voice.js.map +1 -0
- package/dist/routes/workflows.d.ts.map +1 -1
- package/dist/routes/workflows.js +2 -1
- package/dist/routes/workflows.js.map +1 -1
- package/dist/services/db.d.ts +1 -1
- package/dist/services/db.d.ts.map +1 -1
- package/dist/services/db.js +2 -2
- package/dist/services/db.js.map +1 -1
- package/dist/services/execution-service.d.ts +8 -0
- package/dist/services/execution-service.d.ts.map +1 -1
- package/dist/services/execution-service.js +27 -2
- package/dist/services/execution-service.js.map +1 -1
- package/dist/services/narration-service.d.ts +304 -0
- package/dist/services/narration-service.d.ts.map +1 -0
- package/dist/services/narration-service.js +729 -0
- package/dist/services/narration-service.js.map +1 -0
- package/dist/services/stt-providers/index.d.ts +21 -0
- package/dist/services/stt-providers/index.d.ts.map +1 -0
- package/dist/services/stt-providers/index.js +32 -0
- package/dist/services/stt-providers/index.js.map +1 -0
- package/dist/services/stt-providers/openai-whisper.d.ts +66 -0
- package/dist/services/stt-providers/openai-whisper.d.ts.map +1 -0
- package/dist/services/stt-providers/openai-whisper.js +137 -0
- package/dist/services/stt-providers/openai-whisper.js.map +1 -0
- package/dist/services/stt-providers/whisper-local.d.ts +64 -0
- package/dist/services/stt-providers/whisper-local.d.ts.map +1 -0
- package/dist/services/stt-providers/whisper-local.js +166 -0
- package/dist/services/stt-providers/whisper-local.js.map +1 -0
- package/dist/services/stt-service.d.ts +160 -0
- package/dist/services/stt-service.d.ts.map +1 -0
- package/dist/services/stt-service.js +246 -0
- package/dist/services/stt-service.js.map +1 -0
- package/dist/services/tts-providers/browser-tts.d.ts +64 -0
- package/dist/services/tts-providers/browser-tts.d.ts.map +1 -0
- package/dist/services/tts-providers/browser-tts.js +89 -0
- package/dist/services/tts-providers/browser-tts.js.map +1 -0
- package/dist/services/tts-providers/index.d.ts +20 -0
- package/dist/services/tts-providers/index.d.ts.map +1 -0
- package/dist/services/tts-providers/index.js +31 -0
- package/dist/services/tts-providers/index.js.map +1 -0
- package/dist/services/tts-service.d.ts +190 -0
- package/dist/services/tts-service.d.ts.map +1 -0
- package/dist/services/tts-service.js +296 -0
- package/dist/services/tts-service.js.map +1 -0
- package/dist/services/tts-sidecar-manager.d.ts +276 -0
- package/dist/services/tts-sidecar-manager.d.ts.map +1 -0
- package/dist/services/tts-sidecar-manager.js +665 -0
- package/dist/services/tts-sidecar-manager.js.map +1 -0
- package/dist/services/websocket.d.ts +31 -1
- package/dist/services/websocket.d.ts.map +1 -1
- package/dist/services/websocket.js +149 -0
- package/dist/services/websocket.js.map +1 -1
- package/dist/services/worktree-sync-service.d.ts +17 -2
- package/dist/services/worktree-sync-service.d.ts.map +1 -1
- package/dist/services/worktree-sync-service.js +103 -6
- package/dist/services/worktree-sync-service.js.map +1 -1
- package/dist/utils/voice-config.d.ts +26 -0
- package/dist/utils/voice-config.d.ts.map +1 -0
- package/dist/utils/voice-config.js +48 -0
- package/dist/utils/voice-config.js.map +1 -0
- package/dist/workers/execution-worker.js +12 -4
- package/dist/workers/execution-worker.js.map +1 -1
- package/dist/workflow/base-workflow-engine.d.ts +3 -1
- package/dist/workflow/base-workflow-engine.d.ts.map +1 -1
- package/dist/workflow/base-workflow-engine.js.map +1 -1
- package/dist/workflow/engines/orchestrator-engine.d.ts +5 -1
- package/dist/workflow/engines/orchestrator-engine.d.ts.map +1 -1
- package/dist/workflow/engines/orchestrator-engine.js +4 -1
- package/dist/workflow/engines/orchestrator-engine.js.map +1 -1
- package/dist/workflow/engines/sequential-engine.d.ts +9 -2
- package/dist/workflow/engines/sequential-engine.d.ts.map +1 -1
- package/dist/workflow/engines/sequential-engine.js +102 -22
- package/dist/workflow/engines/sequential-engine.js.map +1 -1
- package/dist/workflow/workflow-engine.d.ts +8 -1
- package/dist/workflow/workflow-engine.d.ts.map +1 -1
- package/package.json +13 -4
- package/dist/public/assets/index-D4AKx6EO.css +0 -1
- package/dist/public/assets/index-DorQqwGV.js +0 -927
- package/dist/public/assets/index-DorQqwGV.js.map +0 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Speech-to-Text Service
|
|
3
|
+
*
|
|
4
|
+
* Provides a pluggable STT abstraction with multiple provider support.
|
|
5
|
+
* Handles provider selection, fallback, and availability checking.
|
|
6
|
+
*/
|
|
7
|
+
import type { STTProvider as STTProviderType, STTOptions, TranscriptionResult, VoiceSettingsConfig } from "@sudocode-ai/types/voice";
|
|
8
|
+
/**
|
|
9
|
+
* Interface for STT providers
|
|
10
|
+
*/
|
|
11
|
+
export interface STTProvider {
|
|
12
|
+
/** Provider name */
|
|
13
|
+
readonly name: STTProviderType;
|
|
14
|
+
/**
|
|
15
|
+
* Transcribe audio buffer to text
|
|
16
|
+
*
|
|
17
|
+
* @param audio - Audio buffer to transcribe
|
|
18
|
+
* @param options - Optional transcription options
|
|
19
|
+
* @returns Promise resolving to transcription result
|
|
20
|
+
*/
|
|
21
|
+
transcribe(audio: Buffer, options?: STTOptions): Promise<TranscriptionResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if this provider is currently available
|
|
24
|
+
* (e.g., service is running, API key is configured)
|
|
25
|
+
*
|
|
26
|
+
* @returns Promise resolving to true if provider is available
|
|
27
|
+
*/
|
|
28
|
+
isAvailable(): Promise<boolean>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Configuration for the STT service
|
|
32
|
+
*/
|
|
33
|
+
export interface STTServiceConfig {
|
|
34
|
+
/** Default provider to use when none specified */
|
|
35
|
+
defaultProvider: STTProviderType;
|
|
36
|
+
/** Whisper server URL for local provider */
|
|
37
|
+
whisperUrl: string;
|
|
38
|
+
/** Whisper model to use */
|
|
39
|
+
whisperModel: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get STT configuration from project config.
|
|
43
|
+
*
|
|
44
|
+
* All settings come from .sudocode/config.json voice.stt.* with defaults:
|
|
45
|
+
* - provider: "whisper-local"
|
|
46
|
+
* - whisperUrl: "http://localhost:2022/v1"
|
|
47
|
+
* - whisperModel: "base"
|
|
48
|
+
*
|
|
49
|
+
* @param projectVoiceConfig - Optional project voice settings from config.json
|
|
50
|
+
*/
|
|
51
|
+
export declare function getSTTConfig(projectVoiceConfig?: VoiceSettingsConfig): STTServiceConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Error thrown when no STT providers are available
|
|
54
|
+
*/
|
|
55
|
+
export declare class NoSTTProviderError extends Error {
|
|
56
|
+
constructor();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Error thrown when a specific provider is not found
|
|
60
|
+
*/
|
|
61
|
+
export declare class STTProviderNotFoundError extends Error {
|
|
62
|
+
constructor(providerName: string);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Error thrown when transcription fails
|
|
66
|
+
*/
|
|
67
|
+
export declare class TranscriptionError extends Error {
|
|
68
|
+
readonly provider: string;
|
|
69
|
+
readonly cause?: Error | undefined;
|
|
70
|
+
constructor(message: string, provider: string, cause?: Error | undefined);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Speech-to-Text Service
|
|
74
|
+
*
|
|
75
|
+
* Manages multiple STT providers with automatic fallback support.
|
|
76
|
+
*/
|
|
77
|
+
export declare class STTService {
|
|
78
|
+
private providers;
|
|
79
|
+
private config;
|
|
80
|
+
private availabilityCache;
|
|
81
|
+
private availabilityCacheTime;
|
|
82
|
+
private readonly CACHE_TTL_MS;
|
|
83
|
+
constructor(config?: Partial<STTServiceConfig>);
|
|
84
|
+
/**
|
|
85
|
+
* Register an STT provider
|
|
86
|
+
*
|
|
87
|
+
* @param provider - The provider to register
|
|
88
|
+
*/
|
|
89
|
+
registerProvider(provider: STTProvider): void;
|
|
90
|
+
/**
|
|
91
|
+
* Unregister an STT provider
|
|
92
|
+
*
|
|
93
|
+
* @param providerName - Name of the provider to unregister
|
|
94
|
+
*/
|
|
95
|
+
unregisterProvider(providerName: STTProviderType): void;
|
|
96
|
+
/**
|
|
97
|
+
* Get a provider by name
|
|
98
|
+
*
|
|
99
|
+
* @param providerName - Name of the provider
|
|
100
|
+
* @returns The provider if found
|
|
101
|
+
*/
|
|
102
|
+
getProvider(providerName: STTProviderType): STTProvider | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Check if a provider's availability is cached and still valid
|
|
105
|
+
*/
|
|
106
|
+
private isCacheValid;
|
|
107
|
+
/**
|
|
108
|
+
* Check if a provider is available (with caching)
|
|
109
|
+
*
|
|
110
|
+
* @param providerName - Name of the provider to check
|
|
111
|
+
* @returns Promise resolving to true if available
|
|
112
|
+
*/
|
|
113
|
+
isProviderAvailable(providerName: STTProviderType): Promise<boolean>;
|
|
114
|
+
/**
|
|
115
|
+
* Get all available providers (those that are registered and currently available)
|
|
116
|
+
*
|
|
117
|
+
* @returns Promise resolving to array of available provider names
|
|
118
|
+
*/
|
|
119
|
+
getAvailableProviders(): Promise<STTProviderType[]>;
|
|
120
|
+
/**
|
|
121
|
+
* Get the default provider name from configuration
|
|
122
|
+
*
|
|
123
|
+
* @returns The default provider name
|
|
124
|
+
*/
|
|
125
|
+
getDefaultProvider(): STTProviderType;
|
|
126
|
+
/**
|
|
127
|
+
* Get the configuration
|
|
128
|
+
*
|
|
129
|
+
* @returns The current configuration
|
|
130
|
+
*/
|
|
131
|
+
getConfig(): STTServiceConfig;
|
|
132
|
+
/**
|
|
133
|
+
* Clear the availability cache
|
|
134
|
+
*/
|
|
135
|
+
clearAvailabilityCache(): void;
|
|
136
|
+
/**
|
|
137
|
+
* Transcribe audio using the specified or default provider
|
|
138
|
+
*
|
|
139
|
+
* Falls back to other available providers if the preferred one fails.
|
|
140
|
+
*
|
|
141
|
+
* @param audio - Audio buffer to transcribe
|
|
142
|
+
* @param options - Optional transcription options (can include preferred provider)
|
|
143
|
+
* @returns Promise resolving to transcription result
|
|
144
|
+
* @throws {NoSTTProviderError} If no providers are available
|
|
145
|
+
* @throws {TranscriptionError} If transcription fails on all providers
|
|
146
|
+
*/
|
|
147
|
+
transcribe(audio: Buffer, options?: STTOptions): Promise<TranscriptionResult>;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get or create the global STT service instance
|
|
151
|
+
*
|
|
152
|
+
* @param config - Optional configuration override
|
|
153
|
+
* @returns The STT service instance
|
|
154
|
+
*/
|
|
155
|
+
export declare function getSTTService(config?: Partial<STTServiceConfig>): STTService;
|
|
156
|
+
/**
|
|
157
|
+
* Reset the global STT service instance (for testing)
|
|
158
|
+
*/
|
|
159
|
+
export declare function resetSTTService(): void;
|
|
160
|
+
//# sourceMappingURL=stt-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stt-service.d.ts","sourceRoot":"","sources":["../../src/services/stt-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAE/B;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE9E;;;;;OAKG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,eAAe,EAAE,eAAe,CAAC;IACjC,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,kBAAkB,CAAC,EAAE,mBAAmB,GACvC,gBAAgB,CAQlB;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;;CAK5C;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,YAAY,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,QAAQ,EAAE,MAAM;aAChB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAgD;IACjE,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,iBAAiB,CAA4C;IACrE,OAAO,CAAC,qBAAqB,CAA2C;IACxE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAI9C;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAO7C;;;;OAIG;IACH,kBAAkB,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI;IAMvD;;;;;OAKG;IACH,WAAW,CAAC,YAAY,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS;IAInE;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;;;;OAKG;IACG,mBAAmB,CAAC,YAAY,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB1E;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAYzD;;;;OAIG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;;;OAIG;IACH,SAAS,IAAI,gBAAgB;IAI7B;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAK9B;;;;;;;;;;OAUG;IACG,UAAU,CACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,mBAAmB,CAAC;CA+ChC;AAQD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAK5E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Speech-to-Text Service
|
|
3
|
+
*
|
|
4
|
+
* Provides a pluggable STT abstraction with multiple provider support.
|
|
5
|
+
* Handles provider selection, fallback, and availability checking.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get STT configuration from project config.
|
|
9
|
+
*
|
|
10
|
+
* All settings come from .sudocode/config.json voice.stt.* with defaults:
|
|
11
|
+
* - provider: "whisper-local"
|
|
12
|
+
* - whisperUrl: "http://localhost:2022/v1"
|
|
13
|
+
* - whisperModel: "base"
|
|
14
|
+
*
|
|
15
|
+
* @param projectVoiceConfig - Optional project voice settings from config.json
|
|
16
|
+
*/
|
|
17
|
+
export function getSTTConfig(projectVoiceConfig) {
|
|
18
|
+
const sttSettings = projectVoiceConfig?.stt;
|
|
19
|
+
return {
|
|
20
|
+
defaultProvider: sttSettings?.provider || "whisper-local",
|
|
21
|
+
whisperUrl: sttSettings?.whisperUrl || "http://localhost:2022/v1",
|
|
22
|
+
whisperModel: sttSettings?.whisperModel || "base",
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Error thrown when no STT providers are available
|
|
27
|
+
*/
|
|
28
|
+
export class NoSTTProviderError extends Error {
|
|
29
|
+
constructor() {
|
|
30
|
+
super("No STT providers are available");
|
|
31
|
+
this.name = "NoSTTProviderError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Error thrown when a specific provider is not found
|
|
36
|
+
*/
|
|
37
|
+
export class STTProviderNotFoundError extends Error {
|
|
38
|
+
constructor(providerName) {
|
|
39
|
+
super(`STT provider '${providerName}' not found`);
|
|
40
|
+
this.name = "STTProviderNotFoundError";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Error thrown when transcription fails
|
|
45
|
+
*/
|
|
46
|
+
export class TranscriptionError extends Error {
|
|
47
|
+
provider;
|
|
48
|
+
cause;
|
|
49
|
+
constructor(message, provider, cause) {
|
|
50
|
+
super(message);
|
|
51
|
+
this.provider = provider;
|
|
52
|
+
this.cause = cause;
|
|
53
|
+
this.name = "TranscriptionError";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Speech-to-Text Service
|
|
58
|
+
*
|
|
59
|
+
* Manages multiple STT providers with automatic fallback support.
|
|
60
|
+
*/
|
|
61
|
+
export class STTService {
|
|
62
|
+
providers = new Map();
|
|
63
|
+
config;
|
|
64
|
+
availabilityCache = new Map();
|
|
65
|
+
availabilityCacheTime = new Map();
|
|
66
|
+
CACHE_TTL_MS = 30000; // 30 seconds
|
|
67
|
+
constructor(config) {
|
|
68
|
+
this.config = { ...getSTTConfig(), ...config };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Register an STT provider
|
|
72
|
+
*
|
|
73
|
+
* @param provider - The provider to register
|
|
74
|
+
*/
|
|
75
|
+
registerProvider(provider) {
|
|
76
|
+
this.providers.set(provider.name, provider);
|
|
77
|
+
// Invalidate availability cache when a new provider is registered
|
|
78
|
+
this.availabilityCache.delete(provider.name);
|
|
79
|
+
this.availabilityCacheTime.delete(provider.name);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Unregister an STT provider
|
|
83
|
+
*
|
|
84
|
+
* @param providerName - Name of the provider to unregister
|
|
85
|
+
*/
|
|
86
|
+
unregisterProvider(providerName) {
|
|
87
|
+
this.providers.delete(providerName);
|
|
88
|
+
this.availabilityCache.delete(providerName);
|
|
89
|
+
this.availabilityCacheTime.delete(providerName);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get a provider by name
|
|
93
|
+
*
|
|
94
|
+
* @param providerName - Name of the provider
|
|
95
|
+
* @returns The provider if found
|
|
96
|
+
*/
|
|
97
|
+
getProvider(providerName) {
|
|
98
|
+
return this.providers.get(providerName);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if a provider's availability is cached and still valid
|
|
102
|
+
*/
|
|
103
|
+
isCacheValid(providerName) {
|
|
104
|
+
const cacheTime = this.availabilityCacheTime.get(providerName);
|
|
105
|
+
if (!cacheTime)
|
|
106
|
+
return false;
|
|
107
|
+
return Date.now() - cacheTime < this.CACHE_TTL_MS;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if a provider is available (with caching)
|
|
111
|
+
*
|
|
112
|
+
* @param providerName - Name of the provider to check
|
|
113
|
+
* @returns Promise resolving to true if available
|
|
114
|
+
*/
|
|
115
|
+
async isProviderAvailable(providerName) {
|
|
116
|
+
const provider = this.providers.get(providerName);
|
|
117
|
+
if (!provider)
|
|
118
|
+
return false;
|
|
119
|
+
// Check cache first
|
|
120
|
+
if (this.isCacheValid(providerName)) {
|
|
121
|
+
return this.availabilityCache.get(providerName) ?? false;
|
|
122
|
+
}
|
|
123
|
+
// Check actual availability
|
|
124
|
+
try {
|
|
125
|
+
const available = await provider.isAvailable();
|
|
126
|
+
this.availabilityCache.set(providerName, available);
|
|
127
|
+
this.availabilityCacheTime.set(providerName, Date.now());
|
|
128
|
+
return available;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
this.availabilityCache.set(providerName, false);
|
|
132
|
+
this.availabilityCacheTime.set(providerName, Date.now());
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all available providers (those that are registered and currently available)
|
|
138
|
+
*
|
|
139
|
+
* @returns Promise resolving to array of available provider names
|
|
140
|
+
*/
|
|
141
|
+
async getAvailableProviders() {
|
|
142
|
+
const availableProviders = [];
|
|
143
|
+
for (const providerName of this.providers.keys()) {
|
|
144
|
+
if (await this.isProviderAvailable(providerName)) {
|
|
145
|
+
availableProviders.push(providerName);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return availableProviders;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the default provider name from configuration
|
|
152
|
+
*
|
|
153
|
+
* @returns The default provider name
|
|
154
|
+
*/
|
|
155
|
+
getDefaultProvider() {
|
|
156
|
+
return this.config.defaultProvider;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get the configuration
|
|
160
|
+
*
|
|
161
|
+
* @returns The current configuration
|
|
162
|
+
*/
|
|
163
|
+
getConfig() {
|
|
164
|
+
return { ...this.config };
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Clear the availability cache
|
|
168
|
+
*/
|
|
169
|
+
clearAvailabilityCache() {
|
|
170
|
+
this.availabilityCache.clear();
|
|
171
|
+
this.availabilityCacheTime.clear();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Transcribe audio using the specified or default provider
|
|
175
|
+
*
|
|
176
|
+
* Falls back to other available providers if the preferred one fails.
|
|
177
|
+
*
|
|
178
|
+
* @param audio - Audio buffer to transcribe
|
|
179
|
+
* @param options - Optional transcription options (can include preferred provider)
|
|
180
|
+
* @returns Promise resolving to transcription result
|
|
181
|
+
* @throws {NoSTTProviderError} If no providers are available
|
|
182
|
+
* @throws {TranscriptionError} If transcription fails on all providers
|
|
183
|
+
*/
|
|
184
|
+
async transcribe(audio, options) {
|
|
185
|
+
const preferredProvider = options?.provider || this.config.defaultProvider;
|
|
186
|
+
// Build provider order: preferred first, then others
|
|
187
|
+
const providerOrder = [preferredProvider];
|
|
188
|
+
for (const providerName of this.providers.keys()) {
|
|
189
|
+
if (providerName !== preferredProvider) {
|
|
190
|
+
providerOrder.push(providerName);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const errors = [];
|
|
194
|
+
for (const providerName of providerOrder) {
|
|
195
|
+
const provider = this.providers.get(providerName);
|
|
196
|
+
if (!provider)
|
|
197
|
+
continue;
|
|
198
|
+
// Check availability
|
|
199
|
+
if (!(await this.isProviderAvailable(providerName))) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const result = await provider.transcribe(audio, options);
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
208
|
+
errors.push({ provider: providerName, error: err });
|
|
209
|
+
// Invalidate cache for this provider since it failed
|
|
210
|
+
this.availabilityCache.delete(providerName);
|
|
211
|
+
this.availabilityCacheTime.delete(providerName);
|
|
212
|
+
// Continue to next provider
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// If we get here, all providers failed
|
|
216
|
+
if (errors.length === 0) {
|
|
217
|
+
throw new NoSTTProviderError();
|
|
218
|
+
}
|
|
219
|
+
const lastError = errors[errors.length - 1];
|
|
220
|
+
throw new TranscriptionError(`Transcription failed on all providers. Last error: ${lastError.error.message}`, lastError.provider, lastError.error);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Global STT service instance
|
|
225
|
+
* Lazy-initialized on first use
|
|
226
|
+
*/
|
|
227
|
+
let sttServiceInstance = null;
|
|
228
|
+
/**
|
|
229
|
+
* Get or create the global STT service instance
|
|
230
|
+
*
|
|
231
|
+
* @param config - Optional configuration override
|
|
232
|
+
* @returns The STT service instance
|
|
233
|
+
*/
|
|
234
|
+
export function getSTTService(config) {
|
|
235
|
+
if (!sttServiceInstance) {
|
|
236
|
+
sttServiceInstance = new STTService(config);
|
|
237
|
+
}
|
|
238
|
+
return sttServiceInstance;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Reset the global STT service instance (for testing)
|
|
242
|
+
*/
|
|
243
|
+
export function resetSTTService() {
|
|
244
|
+
sttServiceInstance = null;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=stt-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stt-service.js","sourceRoot":"","sources":["../../src/services/stt-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser TTS Provider
|
|
3
|
+
*
|
|
4
|
+
* A placeholder provider for browser-based TTS using the Web Speech API.
|
|
5
|
+
* This provider doesn't actually synthesize audio server-side - instead it
|
|
6
|
+
* returns the text for the client to synthesize using the Web Speech API.
|
|
7
|
+
*
|
|
8
|
+
* This approach has several advantages:
|
|
9
|
+
* - Zero server-side cost
|
|
10
|
+
* - Instant response (no audio to generate/stream)
|
|
11
|
+
* - Works offline (no network latency)
|
|
12
|
+
* - Uses system voices already installed on user's device
|
|
13
|
+
*/
|
|
14
|
+
import type { TTSProvider as TTSProviderType, TTSProviderOptions, TTSProviderResult, TTSVoice } from "@sudocode-ai/types/voice";
|
|
15
|
+
import { type TTSProvider } from "../tts-service.js";
|
|
16
|
+
/**
|
|
17
|
+
* Configuration for the Browser TTS provider
|
|
18
|
+
*/
|
|
19
|
+
export interface BrowserTTSConfig {
|
|
20
|
+
/** Default language code for voice listing */
|
|
21
|
+
defaultLanguage: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Browser TTS Provider
|
|
25
|
+
*
|
|
26
|
+
* Returns text for client-side Web Speech API synthesis.
|
|
27
|
+
* The actual speech synthesis happens in the browser.
|
|
28
|
+
*/
|
|
29
|
+
export declare class BrowserTTSProvider implements TTSProvider {
|
|
30
|
+
readonly id: TTSProviderType;
|
|
31
|
+
readonly name: string;
|
|
32
|
+
private config;
|
|
33
|
+
constructor(config?: Partial<BrowserTTSConfig>);
|
|
34
|
+
/**
|
|
35
|
+
* Browser TTS is always available on the server side
|
|
36
|
+
* (actual availability depends on client browser support)
|
|
37
|
+
*/
|
|
38
|
+
isAvailable(): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Return text for client-side synthesis
|
|
41
|
+
*
|
|
42
|
+
* @param text - Text to synthesize
|
|
43
|
+
* @param _options - Synthesis options (used client-side)
|
|
44
|
+
* @returns Result with text for client synthesis
|
|
45
|
+
*/
|
|
46
|
+
synthesize(text: string, _options?: TTSProviderOptions): Promise<TTSProviderResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Get available voices
|
|
49
|
+
*
|
|
50
|
+
* Since voices are determined by the client's browser, we return
|
|
51
|
+
* a generic placeholder. The frontend should query actual voices
|
|
52
|
+
* from window.speechSynthesis.getVoices() directly.
|
|
53
|
+
*/
|
|
54
|
+
getVoices(): Promise<TTSVoice[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Get the current configuration
|
|
57
|
+
*/
|
|
58
|
+
getConfig(): BrowserTTSConfig;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create a new Browser TTS provider instance
|
|
62
|
+
*/
|
|
63
|
+
export declare function createBrowserTTSProvider(config?: Partial<BrowserTTSConfig>): BrowserTTSProvider;
|
|
64
|
+
//# sourceMappingURL=browser-tts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-tts.d.ts","sourceRoot":"","sources":["../../../src/services/tts-providers/browser-tts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAa;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAM9C;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAOrC;;;;;;OAMG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAW7B;;;;;;OAMG;IACG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IActC;;OAEG;IACH,SAAS,IAAI,gBAAgB;CAG9B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACjC,kBAAkB,CAEpB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser TTS Provider
|
|
3
|
+
*
|
|
4
|
+
* A placeholder provider for browser-based TTS using the Web Speech API.
|
|
5
|
+
* This provider doesn't actually synthesize audio server-side - instead it
|
|
6
|
+
* returns the text for the client to synthesize using the Web Speech API.
|
|
7
|
+
*
|
|
8
|
+
* This approach has several advantages:
|
|
9
|
+
* - Zero server-side cost
|
|
10
|
+
* - Instant response (no audio to generate/stream)
|
|
11
|
+
* - Works offline (no network latency)
|
|
12
|
+
* - Uses system voices already installed on user's device
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Browser TTS Provider
|
|
16
|
+
*
|
|
17
|
+
* Returns text for client-side Web Speech API synthesis.
|
|
18
|
+
* The actual speech synthesis happens in the browser.
|
|
19
|
+
*/
|
|
20
|
+
export class BrowserTTSProvider {
|
|
21
|
+
id = "browser";
|
|
22
|
+
name = "Browser (Web Speech API)";
|
|
23
|
+
config;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.config = {
|
|
26
|
+
defaultLanguage: config?.defaultLanguage ?? "en-US",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Browser TTS is always available on the server side
|
|
31
|
+
* (actual availability depends on client browser support)
|
|
32
|
+
*/
|
|
33
|
+
async isAvailable() {
|
|
34
|
+
// Browser TTS is always "available" server-side since we just
|
|
35
|
+
// return text for the client to handle. The client determines
|
|
36
|
+
// actual availability based on Web Speech API support.
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Return text for client-side synthesis
|
|
41
|
+
*
|
|
42
|
+
* @param text - Text to synthesize
|
|
43
|
+
* @param _options - Synthesis options (used client-side)
|
|
44
|
+
* @returns Result with text for client synthesis
|
|
45
|
+
*/
|
|
46
|
+
async synthesize(text, _options) {
|
|
47
|
+
// For browser TTS, we simply return the text.
|
|
48
|
+
// The client will use the Web Speech API to synthesize it.
|
|
49
|
+
// Options (voice, speed, pitch) are handled client-side.
|
|
50
|
+
return {
|
|
51
|
+
text,
|
|
52
|
+
// No audio buffer - client synthesizes
|
|
53
|
+
// No SSML - Web Speech API has limited SSML support
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get available voices
|
|
58
|
+
*
|
|
59
|
+
* Since voices are determined by the client's browser, we return
|
|
60
|
+
* a generic placeholder. The frontend should query actual voices
|
|
61
|
+
* from window.speechSynthesis.getVoices() directly.
|
|
62
|
+
*/
|
|
63
|
+
async getVoices() {
|
|
64
|
+
// Return a placeholder voice indicating client-side determination
|
|
65
|
+
// The actual voice list is populated by the frontend from the
|
|
66
|
+
// browser's speechSynthesis.getVoices() API
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
id: "default",
|
|
70
|
+
name: "System Default",
|
|
71
|
+
language: this.config.defaultLanguage,
|
|
72
|
+
provider: "browser",
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the current configuration
|
|
78
|
+
*/
|
|
79
|
+
getConfig() {
|
|
80
|
+
return { ...this.config };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create a new Browser TTS provider instance
|
|
85
|
+
*/
|
|
86
|
+
export function createBrowserTTSProvider(config) {
|
|
87
|
+
return new BrowserTTSProvider(config);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=browser-tts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-tts.js","sourceRoot":"","sources":["../../../src/services/tts-providers/browser-tts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACpB,EAAE,GAAoB,SAAS,CAAC;IAChC,IAAI,GAAW,0BAA0B,CAAC;IAC3C,MAAM,CAAmB;IAEjC,YAAY,MAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG;YACZ,eAAe,EAAE,MAAM,EAAE,eAAe,IAAI,OAAO;SACpD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,8DAA8D;QAC9D,8DAA8D;QAC9D,uDAAuD;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CACd,IAAY,EACZ,QAA6B;QAE7B,8CAA8C;QAC9C,2DAA2D;QAC3D,yDAAyD;QACzD,OAAO;YACL,IAAI;YACJ,uCAAuC;YACvC,oDAAoD;SACrD,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAS;QACb,kEAAkE;QAClE,8DAA8D;QAC9D,4CAA4C;QAC5C,OAAO;YACL;gBACE,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;gBACrC,QAAQ,EAAE,SAAS;aACpB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAkC;IAElC,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS Providers Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all TTS provider implementations and factory functions.
|
|
5
|
+
*/
|
|
6
|
+
export { BrowserTTSProvider, createBrowserTTSProvider, type BrowserTTSConfig, } from "./browser-tts.js";
|
|
7
|
+
import { TTSService } from "../tts-service.js";
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the TTS service with all available providers
|
|
10
|
+
*
|
|
11
|
+
* @param service - The TTS service to initialize
|
|
12
|
+
*/
|
|
13
|
+
export declare function initializeTTSProviders(service: TTSService): void;
|
|
14
|
+
/**
|
|
15
|
+
* Create a fully initialized TTS service with all providers registered
|
|
16
|
+
*
|
|
17
|
+
* @returns Initialized TTS service
|
|
18
|
+
*/
|
|
19
|
+
export declare function createInitializedTTSService(): TTSService;
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/tts-providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAOhE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,UAAU,CAIxD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS Providers Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all TTS provider implementations and factory functions.
|
|
5
|
+
*/
|
|
6
|
+
export { BrowserTTSProvider, createBrowserTTSProvider, } from "./browser-tts.js";
|
|
7
|
+
import { BrowserTTSProvider } from "./browser-tts.js";
|
|
8
|
+
import { TTSService } from "../tts-service.js";
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the TTS service with all available providers
|
|
11
|
+
*
|
|
12
|
+
* @param service - The TTS service to initialize
|
|
13
|
+
*/
|
|
14
|
+
export function initializeTTSProviders(service) {
|
|
15
|
+
// Register Browser TTS provider (default, always available)
|
|
16
|
+
service.registerProvider(new BrowserTTSProvider());
|
|
17
|
+
// Future providers will be registered here:
|
|
18
|
+
// - KokoroTTSProvider (local high-quality TTS)
|
|
19
|
+
// - OpenAITTSProvider (cloud TTS)
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a fully initialized TTS service with all providers registered
|
|
23
|
+
*
|
|
24
|
+
* @returns Initialized TTS service
|
|
25
|
+
*/
|
|
26
|
+
export function createInitializedTTSService() {
|
|
27
|
+
const service = new TTSService();
|
|
28
|
+
initializeTTSProviders(service);
|
|
29
|
+
return service;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/tts-providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAmB;IACxD,4DAA4D;IAC5D,OAAO,CAAC,gBAAgB,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAEnD,4CAA4C;IAC5C,+CAA+C;IAC/C,kCAAkC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACzC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;IACjC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|