modular-voice-agent-sdk 1.2.0 → 1.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.
- package/README.md +6 -4
- package/dist/backends/transformers/llm.d.ts +8 -1
- package/dist/backends/transformers/llm.d.ts.map +1 -1
- package/dist/backends/transformers/llm.js +15 -7
- package/dist/backends/transformers/llm.js.map +1 -1
- package/dist/backends/transformers/stt.d.ts +8 -1
- package/dist/backends/transformers/stt.d.ts.map +1 -1
- package/dist/backends/transformers/stt.js +15 -7
- package/dist/backends/transformers/stt.js.map +1 -1
- package/dist/backends/transformers/tts.d.ts +8 -1
- package/dist/backends/transformers/tts.d.ts.map +1 -1
- package/dist/backends/transformers/tts.js +15 -7
- package/dist/backends/transformers/tts.js.map +1 -1
- package/dist/cache-runtime.d.ts +29 -0
- package/dist/cache-runtime.d.ts.map +1 -0
- package/dist/cache-runtime.js +43 -0
- package/dist/cache-runtime.js.map +1 -0
- package/dist/cache.d.ts +3 -19
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +3 -39
- package/dist/cache.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/voice-client.d.ts +76 -13
- package/dist/client/voice-client.d.ts.map +1 -1
- package/dist/client/voice-client.js +54 -30
- package/dist/client/voice-client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/voice-pipeline.d.ts +122 -20
- package/dist/voice-pipeline.d.ts.map +1 -1
- package/dist/voice-pipeline.js +106 -64
- package/dist/voice-pipeline.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,10 +9,12 @@ import { createVoiceClient, WebSpeechSTT, WebSpeechTTS } from 'modular-voice-age
|
|
|
9
9
|
import { TransformersLLM } from 'modular-voice-agent-sdk';
|
|
10
10
|
|
|
11
11
|
const client = createVoiceClient({
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
create: (modelStore) => ({
|
|
13
|
+
stt: new WebSpeechSTT(),
|
|
14
|
+
llm: new TransformersLLM({ model: 'HuggingFaceTB/SmolLM2-360M-Instruct' }, modelStore),
|
|
15
|
+
tts: new WebSpeechTTS(),
|
|
16
|
+
systemPrompt: 'You are a helpful assistant.',
|
|
17
|
+
}),
|
|
16
18
|
});
|
|
17
19
|
|
|
18
20
|
await client.connect();
|
|
@@ -10,12 +10,19 @@
|
|
|
10
10
|
* for JSON-based tool calling, parsed by VoicePipeline.
|
|
11
11
|
*/
|
|
12
12
|
import type { LLMPipeline, TransformersLLMConfig, ProgressCallback, Message, LLMGenerateOptions, LLMGenerateResult } from '../../types';
|
|
13
|
+
import type { ModelStore } from '../../voice-pipeline';
|
|
13
14
|
export declare class TransformersLLM implements LLMPipeline {
|
|
14
15
|
private config;
|
|
16
|
+
private modelStore;
|
|
15
17
|
private pipe;
|
|
16
18
|
private ready;
|
|
17
19
|
private tracker;
|
|
18
|
-
|
|
20
|
+
/**
|
|
21
|
+
* @param config - LLM configuration
|
|
22
|
+
* @param modelStore - Pipeline-scoped model store for caching.
|
|
23
|
+
* Models are cached here and shared across sessions within the same pipeline.
|
|
24
|
+
*/
|
|
25
|
+
constructor(config: TransformersLLMConfig, modelStore: ModelStore);
|
|
19
26
|
initialize(onProgress?: ProgressCallback): Promise<void>;
|
|
20
27
|
supportsTools(): boolean;
|
|
21
28
|
generate(messages: Message[], options?: LLMGenerateOptions): Promise<LLMGenerateResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAyB;IAExC;;;;OAIG;gBACS,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU;IAM3D,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9D,aAAa,IAAI,OAAO;IAMlB,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkC7F;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,IAAI,OAAO;CAGnB"}
|
|
@@ -11,29 +11,37 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { pipeline } from '@huggingface/transformers';
|
|
13
13
|
import { LLMLogger, LLMConversationTracker } from '../../services';
|
|
14
|
-
import { getCachedOrLoad } from '../../cache';
|
|
15
14
|
export class TransformersLLM {
|
|
16
15
|
config;
|
|
16
|
+
modelStore;
|
|
17
17
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
18
|
pipe = null;
|
|
19
19
|
ready = false;
|
|
20
20
|
tracker;
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* @param config - LLM configuration
|
|
23
|
+
* @param modelStore - Pipeline-scoped model store for caching.
|
|
24
|
+
* Models are cached here and shared across sessions within the same pipeline.
|
|
25
|
+
*/
|
|
26
|
+
constructor(config, modelStore) {
|
|
22
27
|
this.config = config;
|
|
28
|
+
this.modelStore = modelStore;
|
|
23
29
|
this.tracker = new LLMConversationTracker(new LLMLogger());
|
|
24
30
|
}
|
|
25
31
|
async initialize(onProgress) {
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
if (this.modelStore.has('llm')) {
|
|
33
|
+
this.pipe = this.modelStore.get('llm');
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
28
36
|
console.log(`Loading LLM model (${this.config.model})...`);
|
|
29
|
-
|
|
37
|
+
this.pipe = await pipeline('text-generation', this.config.model, {
|
|
30
38
|
dtype: this.config.dtype,
|
|
31
39
|
device: this.config.device,
|
|
32
40
|
progress_callback: onProgress,
|
|
33
41
|
});
|
|
34
42
|
console.log('LLM model loaded.');
|
|
35
|
-
|
|
36
|
-
}
|
|
43
|
+
this.modelStore.set('llm', this.pipe);
|
|
44
|
+
}
|
|
37
45
|
this.ready = true;
|
|
38
46
|
}
|
|
39
47
|
supportsTools() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAWrD,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAuB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAWrD,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAuB,MAAM,gBAAgB,CAAC;AAGxF,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwB;IAC9B,UAAU,CAAa;IAC/B,8DAA8D;IACtD,IAAI,GAAQ,IAAI,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IACd,OAAO,CAAyB;IAExC;;;;OAIG;IACH,YAAY,MAA6B,EAAE,UAAsB;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC/D,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAsC;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,aAAa;QACX,6DAA6D;QAC7D,oEAAoE;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAmB,EAAE,OAA4B;QAC9D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAA4B,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACrC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACxC,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE3D,mBAAmB;QACnB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEjC,gCAAgC;QAChC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,YAAY,EAAE,MAAM;SACrB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,KAAuB;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,EACH,IAAI,EACJ,CAAC,CACF,CAAC;QAEF,OAAO;;;;;;EAMT,SAAS;;;;;yEAK8D,CAAC;IACxE,CAAC;IAEO,gBAAgB,CAAC,QAAmB,EAAE,KAAwB;QACpE,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,qEAAqE;gBACrE,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBACvC,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;oBACjD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;gBAChB,MAAM,IAAI,uBAAuB,OAAO,cAAc,CAAC;YACzD,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,MAAM,IAAI,qBAAqB,GAAG,CAAC,OAAO,cAAc,CAAC;YAC3D,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,MAAM,IAAI,0BAA0B,GAAG,CAAC,OAAO,cAAc,CAAC;YAChE,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,GAAkB,CAAC;gBACnC,MAAM,IAAI,mCAAmC,OAAO,CAAC,UAAU,MAAM,GAAG,CAAC,OAAO,cAAc,CAAC;YACjG,CAAC;QACH,CAAC;QAED,MAAM,IAAI,yBAAyB,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -5,11 +5,18 @@
|
|
|
5
5
|
* Supports Whisper, Moonshine, Wav2Vec2, and other ASR models from Hugging Face.
|
|
6
6
|
*/
|
|
7
7
|
import type { STTPipeline, TransformersSTTConfig, ProgressCallback, TurnContext } from '../../types';
|
|
8
|
+
import type { ModelStore } from '../../voice-pipeline';
|
|
8
9
|
export declare class TransformersSTT implements STTPipeline {
|
|
9
10
|
private config;
|
|
11
|
+
private modelStore;
|
|
10
12
|
private pipe;
|
|
11
13
|
private ready;
|
|
12
|
-
|
|
14
|
+
/**
|
|
15
|
+
* @param config - STT configuration
|
|
16
|
+
* @param modelStore - Pipeline-scoped model store for caching.
|
|
17
|
+
* Models are cached here and shared across sessions within the same pipeline.
|
|
18
|
+
*/
|
|
19
|
+
constructor(config: TransformersSTTConfig, modelStore: ModelStore);
|
|
13
20
|
initialize(onProgress?: ProgressCallback): Promise<void>;
|
|
14
21
|
transcribe(audio: Float32Array, _turn?: TurnContext): Promise<string>;
|
|
15
22
|
isReady(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;OAIG;gBACS,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU;IAK3D,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB3E,OAAO,IAAI,OAAO;CAGnB"}
|
|
@@ -5,27 +5,35 @@
|
|
|
5
5
|
* Supports Whisper, Moonshine, Wav2Vec2, and other ASR models from Hugging Face.
|
|
6
6
|
*/
|
|
7
7
|
import { pipeline } from '@huggingface/transformers';
|
|
8
|
-
import { getCachedOrLoad } from '../../cache';
|
|
9
8
|
export class TransformersSTT {
|
|
10
9
|
config;
|
|
10
|
+
modelStore;
|
|
11
11
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
12
|
pipe = null;
|
|
13
13
|
ready = false;
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* @param config - STT configuration
|
|
16
|
+
* @param modelStore - Pipeline-scoped model store for caching.
|
|
17
|
+
* Models are cached here and shared across sessions within the same pipeline.
|
|
18
|
+
*/
|
|
19
|
+
constructor(config, modelStore) {
|
|
15
20
|
this.config = config;
|
|
21
|
+
this.modelStore = modelStore;
|
|
16
22
|
}
|
|
17
23
|
async initialize(onProgress) {
|
|
18
|
-
|
|
19
|
-
|
|
24
|
+
if (this.modelStore.has('stt')) {
|
|
25
|
+
this.pipe = this.modelStore.get('stt');
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
20
28
|
console.log(`Loading STT model (${this.config.model})...`);
|
|
21
|
-
|
|
29
|
+
this.pipe = await pipeline('automatic-speech-recognition', this.config.model, {
|
|
22
30
|
dtype: this.config.dtype,
|
|
23
31
|
device: this.config.device,
|
|
24
32
|
progress_callback: onProgress,
|
|
25
33
|
});
|
|
26
34
|
console.log('STT model loaded.');
|
|
27
|
-
|
|
28
|
-
}
|
|
35
|
+
this.modelStore.set('stt', this.pipe);
|
|
36
|
+
}
|
|
29
37
|
this.ready = true;
|
|
30
38
|
}
|
|
31
39
|
async transcribe(audio, _turn) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stt.js","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"stt.js","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAIrD,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwB;IAC9B,UAAU,CAAa;IAC/B,8DAA8D;IACtD,IAAI,GAAQ,IAAI,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IAEtB;;;;OAIG;IACH,YAAY,MAA6B,EAAE,UAAsB;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,8BAA8B,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC5E,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAsC;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAmB,EAAE,KAAmB;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;YAClC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAqB,EAAE;YACjE,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE/C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QACD,OAAQ,MAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -5,11 +5,18 @@
|
|
|
5
5
|
* Supports SpeechT5 and other TTS models from Hugging Face.
|
|
6
6
|
*/
|
|
7
7
|
import type { TTSPipeline, TransformersTTSConfig, ProgressCallback, AudioPlayable } from '../../types';
|
|
8
|
+
import type { ModelStore } from '../../voice-pipeline';
|
|
8
9
|
export declare class TransformersTTS implements TTSPipeline {
|
|
9
10
|
private config;
|
|
11
|
+
private modelStore;
|
|
10
12
|
private pipe;
|
|
11
13
|
private ready;
|
|
12
|
-
|
|
14
|
+
/**
|
|
15
|
+
* @param config - TTS configuration
|
|
16
|
+
* @param modelStore - Pipeline-scoped model store for caching.
|
|
17
|
+
* Models are cached here and shared across sessions within the same pipeline.
|
|
18
|
+
*/
|
|
19
|
+
constructor(config: TransformersTTSConfig, modelStore: ModelStore);
|
|
13
20
|
initialize(onProgress?: ProgressCallback): Promise<void>;
|
|
14
21
|
synthesize(text: string): Promise<AudioPlayable>;
|
|
15
22
|
isReady(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;OAIG;gBACS,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU;IAK3D,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAYtD,OAAO,IAAI,OAAO;CAGnB"}
|
|
@@ -6,27 +6,35 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { pipeline } from '@huggingface/transformers';
|
|
8
8
|
import { BufferedAudioPlayable } from '../../types';
|
|
9
|
-
import { getCachedOrLoad } from '../../cache';
|
|
10
9
|
export class TransformersTTS {
|
|
11
10
|
config;
|
|
11
|
+
modelStore;
|
|
12
12
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
13
|
pipe = null;
|
|
14
14
|
ready = false;
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* @param config - TTS configuration
|
|
17
|
+
* @param modelStore - Pipeline-scoped model store for caching.
|
|
18
|
+
* Models are cached here and shared across sessions within the same pipeline.
|
|
19
|
+
*/
|
|
20
|
+
constructor(config, modelStore) {
|
|
16
21
|
this.config = config;
|
|
22
|
+
this.modelStore = modelStore;
|
|
17
23
|
}
|
|
18
24
|
async initialize(onProgress) {
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
if (this.modelStore.has('tts')) {
|
|
26
|
+
this.pipe = this.modelStore.get('tts');
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
21
29
|
console.log(`Loading TTS model (${this.config.model})...`);
|
|
22
|
-
|
|
30
|
+
this.pipe = await pipeline('text-to-speech', this.config.model, {
|
|
23
31
|
dtype: this.config.dtype,
|
|
24
32
|
device: this.config.device,
|
|
25
33
|
progress_callback: onProgress,
|
|
26
34
|
});
|
|
27
35
|
console.log('TTS model loaded.');
|
|
28
|
-
|
|
29
|
-
}
|
|
36
|
+
this.modelStore.set('tts', this.pipe);
|
|
37
|
+
}
|
|
30
38
|
this.ready = true;
|
|
31
39
|
}
|
|
32
40
|
async synthesize(text) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwB;IAC9B,UAAU,CAAa;IAC/B,8DAA8D;IACtD,IAAI,GAAQ,IAAI,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IAEtB;;;;OAIG;IACH,YAAY,MAA6B,EAAE,UAAsB;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC9D,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAsC;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACnC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;SAClD,CAAC,CAAC;QAEH,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Model Cache - Browser-safe
|
|
3
|
+
*
|
|
4
|
+
* In-memory cache for loaded models/resources.
|
|
5
|
+
* Backends use this to share heavy resources (models, tokenizers) across sessions.
|
|
6
|
+
* The cache is keyed by a unique string identifier (e.g., "transformers-llm:model-name:dtype").
|
|
7
|
+
*
|
|
8
|
+
* This module has NO Node.js dependencies and works in both browser and server.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Get a cached resource, or load it if not cached.
|
|
12
|
+
* @param key - Unique cache key
|
|
13
|
+
* @param loader - Async function to load the resource if not cached
|
|
14
|
+
* @returns The cached or newly loaded resource
|
|
15
|
+
*/
|
|
16
|
+
export declare function getCachedOrLoad<T>(key: string, loader: () => Promise<T>): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Check if a resource is in the cache.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isCached(key: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Clear a specific cached resource.
|
|
23
|
+
*/
|
|
24
|
+
export declare function clearCached(key: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Clear all cached resources.
|
|
27
|
+
*/
|
|
28
|
+
export declare function clearAllCached(): void;
|
|
29
|
+
//# sourceMappingURL=cache-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-runtime.d.ts","sourceRoot":"","sources":["../src/cache-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO1F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Model Cache - Browser-safe
|
|
3
|
+
*
|
|
4
|
+
* In-memory cache for loaded models/resources.
|
|
5
|
+
* Backends use this to share heavy resources (models, tokenizers) across sessions.
|
|
6
|
+
* The cache is keyed by a unique string identifier (e.g., "transformers-llm:model-name:dtype").
|
|
7
|
+
*
|
|
8
|
+
* This module has NO Node.js dependencies and works in both browser and server.
|
|
9
|
+
*/
|
|
10
|
+
const runtimeCache = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Get a cached resource, or load it if not cached.
|
|
13
|
+
* @param key - Unique cache key
|
|
14
|
+
* @param loader - Async function to load the resource if not cached
|
|
15
|
+
* @returns The cached or newly loaded resource
|
|
16
|
+
*/
|
|
17
|
+
export async function getCachedOrLoad(key, loader) {
|
|
18
|
+
if (runtimeCache.has(key)) {
|
|
19
|
+
return runtimeCache.get(key);
|
|
20
|
+
}
|
|
21
|
+
const resource = await loader();
|
|
22
|
+
runtimeCache.set(key, resource);
|
|
23
|
+
return resource;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a resource is in the cache.
|
|
27
|
+
*/
|
|
28
|
+
export function isCached(key) {
|
|
29
|
+
return runtimeCache.has(key);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Clear a specific cached resource.
|
|
33
|
+
*/
|
|
34
|
+
export function clearCached(key) {
|
|
35
|
+
runtimeCache.delete(key);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Clear all cached resources.
|
|
39
|
+
*/
|
|
40
|
+
export function clearAllCached() {
|
|
41
|
+
runtimeCache.clear();
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=cache-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-runtime.js","sourceRoot":"","sources":["../src/cache-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,GAAW,EAAE,MAAwB;IAC5E,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;IACpC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
package/dist/cache.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Cache utilities for modular-voice-agent-sdk
|
|
3
3
|
* Models and binaries are stored in ~/.cache/mvas/ by default
|
|
4
|
+
*
|
|
5
|
+
* NOTE: This module uses Node.js APIs (os, path) and is SERVER-ONLY.
|
|
6
|
+
* For browser model caching, use the ModelStore passed to backend constructors.
|
|
4
7
|
*/
|
|
5
8
|
/**
|
|
6
9
|
* Get the cache directory for mvas assets.
|
|
@@ -34,23 +37,4 @@ export declare const defaultBinaries: {
|
|
|
34
37
|
llamaCompletion: string;
|
|
35
38
|
sherpaOnnxTts: string;
|
|
36
39
|
};
|
|
37
|
-
/**
|
|
38
|
-
* Get a cached resource, or load it if not cached.
|
|
39
|
-
* @param key - Unique cache key
|
|
40
|
-
* @param loader - Async function to load the resource if not cached
|
|
41
|
-
* @returns The cached or newly loaded resource
|
|
42
|
-
*/
|
|
43
|
-
export declare function getCachedOrLoad<T>(key: string, loader: () => Promise<T>): Promise<T>;
|
|
44
|
-
/**
|
|
45
|
-
* Check if a resource is in the cache.
|
|
46
|
-
*/
|
|
47
|
-
export declare function isCached(key: string): boolean;
|
|
48
|
-
/**
|
|
49
|
-
* Clear a specific cached resource.
|
|
50
|
-
*/
|
|
51
|
-
export declare function clearCached(key: string): void;
|
|
52
|
-
/**
|
|
53
|
-
* Clear all cached resources.
|
|
54
|
-
*/
|
|
55
|
-
export declare function clearAllCached(): void;
|
|
56
40
|
//# sourceMappingURL=cache.d.ts.map
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;;;;CAI3B,CAAC"}
|
package/dist/cache.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Cache utilities for modular-voice-agent-sdk
|
|
3
3
|
* Models and binaries are stored in ~/.cache/mvas/ by default
|
|
4
|
+
*
|
|
5
|
+
* NOTE: This module uses Node.js APIs (os, path) and is SERVER-ONLY.
|
|
6
|
+
* For browser model caching, use the ModelStore passed to backend constructors.
|
|
4
7
|
*/
|
|
5
8
|
import { homedir } from 'os';
|
|
6
9
|
import { join } from 'path';
|
|
@@ -46,43 +49,4 @@ export const defaultBinaries = {
|
|
|
46
49
|
llamaCompletion: 'llama-completion',
|
|
47
50
|
sherpaOnnxTts: 'sherpa-onnx-offline-tts',
|
|
48
51
|
};
|
|
49
|
-
// ============ Runtime Model Cache ============
|
|
50
|
-
/**
|
|
51
|
-
* Runtime cache for loaded models/resources.
|
|
52
|
-
* Backends use this to share heavy resources (models, tokenizers) across sessions.
|
|
53
|
-
* The cache is keyed by a unique string identifier (e.g., "transformers-llm:model-name:dtype").
|
|
54
|
-
*/
|
|
55
|
-
const runtimeCache = new Map();
|
|
56
|
-
/**
|
|
57
|
-
* Get a cached resource, or load it if not cached.
|
|
58
|
-
* @param key - Unique cache key
|
|
59
|
-
* @param loader - Async function to load the resource if not cached
|
|
60
|
-
* @returns The cached or newly loaded resource
|
|
61
|
-
*/
|
|
62
|
-
export async function getCachedOrLoad(key, loader) {
|
|
63
|
-
if (runtimeCache.has(key)) {
|
|
64
|
-
return runtimeCache.get(key);
|
|
65
|
-
}
|
|
66
|
-
const resource = await loader();
|
|
67
|
-
runtimeCache.set(key, resource);
|
|
68
|
-
return resource;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Check if a resource is in the cache.
|
|
72
|
-
*/
|
|
73
|
-
export function isCached(key) {
|
|
74
|
-
return runtimeCache.has(key);
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Clear a specific cached resource.
|
|
78
|
-
*/
|
|
79
|
-
export function clearCached(key) {
|
|
80
|
-
runtimeCache.delete(key);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Clear all cached resources.
|
|
84
|
-
*/
|
|
85
|
-
export function clearAllCached() {
|
|
86
|
-
runtimeCache.clear();
|
|
87
|
-
}
|
|
88
52
|
//# sourceMappingURL=cache.js.map
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,kBAAkB;IACnC,aAAa,EAAE,yBAAyB;CACzC,CAAC"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
export { VoiceClient, createVoiceClient } from './voice-client';
|
|
24
|
-
export type { VoiceClientConfig, VoiceClientEvents, VoiceClientStatus, BrowserSupport } from './voice-client';
|
|
24
|
+
export type { VoiceClientConfig, VoiceClientEvents, VoiceClientStatus, BrowserSupport, ClientComponents, ClientComponentFactory, } from './voice-client';
|
|
25
|
+
export type { ModelStore } from '../voice-pipeline';
|
|
25
26
|
export { WebSpeechSTT } from './web-speech-stt';
|
|
26
27
|
export type { WebSpeechSTTConfig, WebSpeechSTTResult } from './web-speech-stt';
|
|
27
28
|
export { WebSpeechTTS } from './web-speech-tts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC"}
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAahE,0CAA0C;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,qDAAqD;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,+BAA+B;AAC/B,OAAO,EACL,eAAe,EACf,eAAe,GAYhB,MAAM,YAAY,CAAC"}
|
|
@@ -34,28 +34,31 @@ export interface BrowserSupport {
|
|
|
34
34
|
webSpeechSTTUsable: boolean;
|
|
35
35
|
}
|
|
36
36
|
export type VoiceClientStatus = 'disconnected' | 'connecting' | 'initializing' | 'ready' | 'listening' | 'processing' | 'speaking';
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Components returned by the client factory
|
|
39
|
+
*/
|
|
40
|
+
export interface ClientComponents {
|
|
38
41
|
/**
|
|
39
42
|
* STT backend - runs locally in browser
|
|
40
43
|
* - Provide an STTPipeline (e.g., TransformersSTT) or WebSpeechSTT for local STT
|
|
41
44
|
* - Set to null to use server-side STT (requires serverUrl)
|
|
42
45
|
* @default null (server handles)
|
|
43
46
|
*/
|
|
44
|
-
stt
|
|
47
|
+
stt: STTPipeline | WebSpeechSTT | null;
|
|
45
48
|
/**
|
|
46
49
|
* LLM backend - runs locally in browser
|
|
47
50
|
* - Provide an LLMPipeline (e.g., TransformersLLM) for local LLM
|
|
48
51
|
* - Set to null to use server-side LLM (requires serverUrl)
|
|
49
52
|
* @default null (server handles)
|
|
50
53
|
*/
|
|
51
|
-
llm
|
|
54
|
+
llm: LLMPipeline | null;
|
|
52
55
|
/**
|
|
53
56
|
* TTS backend - runs locally in browser
|
|
54
57
|
* - Provide a TTSPipeline (e.g., TransformersTTS) or WebSpeechTTS for local TTS
|
|
55
58
|
* - Set to null to use server-side TTS (requires serverUrl)
|
|
56
59
|
* @default null (server handles)
|
|
57
60
|
*/
|
|
58
|
-
tts
|
|
61
|
+
tts: TTSPipeline | WebSpeechTTS | null;
|
|
59
62
|
/**
|
|
60
63
|
* System prompt for the LLM (required if llm is provided)
|
|
61
64
|
*/
|
|
@@ -64,6 +67,48 @@ export interface VoiceClientConfig {
|
|
|
64
67
|
* WebSocket server URL (required if any component is null)
|
|
65
68
|
*/
|
|
66
69
|
serverUrl?: string;
|
|
70
|
+
}
|
|
71
|
+
import type { ModelStore } from '../voice-pipeline';
|
|
72
|
+
/**
|
|
73
|
+
* Factory function that creates client components.
|
|
74
|
+
*
|
|
75
|
+
* @param modelStore - Pipeline-scoped cache for heavy resources.
|
|
76
|
+
* Backends can use this to cache models across sessions (for fully-local mode).
|
|
77
|
+
* Typically not needed for client-side backends like WebSpeechTTS.
|
|
78
|
+
*/
|
|
79
|
+
export type ClientComponentFactory = (modelStore: ModelStore) => ClientComponents;
|
|
80
|
+
export interface VoiceClientConfig {
|
|
81
|
+
/**
|
|
82
|
+
* Factory that creates components.
|
|
83
|
+
* Called once during client construction.
|
|
84
|
+
*
|
|
85
|
+
* The factory receives a `modelStore` for caching heavy resources.
|
|
86
|
+
* This is mainly useful for fully-local mode with Transformers backends.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* // Simple: server handles heavy lifting
|
|
91
|
+
* createVoiceClient({
|
|
92
|
+
* create: (modelStore) => ({
|
|
93
|
+
* stt: null,
|
|
94
|
+
* llm: null,
|
|
95
|
+
* tts: new WebSpeechTTS(),
|
|
96
|
+
* serverUrl: 'ws://localhost:3100',
|
|
97
|
+
* }),
|
|
98
|
+
* });
|
|
99
|
+
*
|
|
100
|
+
* // Fully local with Transformers (uses modelStore for caching)
|
|
101
|
+
* createVoiceClient({
|
|
102
|
+
* create: (modelStore) => ({
|
|
103
|
+
* stt: new TransformersSTT(sttConfig, modelStore),
|
|
104
|
+
* llm: new TransformersLLM(llmConfig, modelStore),
|
|
105
|
+
* tts: new TransformersTTS(ttsConfig, modelStore),
|
|
106
|
+
* systemPrompt: 'You are a helpful assistant.',
|
|
107
|
+
* }),
|
|
108
|
+
* });
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
create: ClientComponentFactory;
|
|
67
112
|
/**
|
|
68
113
|
* Audio sample rate for recording (default: 16000)
|
|
69
114
|
*/
|
|
@@ -125,6 +170,7 @@ export declare class VoiceClient {
|
|
|
125
170
|
private config;
|
|
126
171
|
private mode;
|
|
127
172
|
private needsServer;
|
|
173
|
+
private modelStore;
|
|
128
174
|
private localSTT;
|
|
129
175
|
private localLLM;
|
|
130
176
|
private localTTS;
|
|
@@ -223,28 +269,45 @@ export declare class VoiceClient {
|
|
|
223
269
|
}
|
|
224
270
|
/**
|
|
225
271
|
* Create a VoiceClient instance
|
|
272
|
+
*
|
|
226
273
|
* @example
|
|
274
|
+
* ```typescript
|
|
227
275
|
* // Fully local
|
|
228
276
|
* const client = createVoiceClient({
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
277
|
+
* create: () => ({
|
|
278
|
+
* stt: new TransformersSTT({ model: '...' }),
|
|
279
|
+
* llm: new TransformersLLM({ model: '...' }),
|
|
280
|
+
* tts: new WebSpeechTTS(),
|
|
281
|
+
* systemPrompt: 'You are a helpful assistant.',
|
|
282
|
+
* }),
|
|
233
283
|
* });
|
|
284
|
+
* ```
|
|
234
285
|
*
|
|
235
286
|
* @example
|
|
287
|
+
* ```typescript
|
|
236
288
|
* // Fully remote
|
|
237
289
|
* const client = createVoiceClient({
|
|
238
|
-
*
|
|
290
|
+
* create: () => ({
|
|
291
|
+
* stt: null,
|
|
292
|
+
* llm: null,
|
|
293
|
+
* tts: null,
|
|
294
|
+
* serverUrl: 'ws://localhost:3000',
|
|
295
|
+
* }),
|
|
239
296
|
* });
|
|
297
|
+
* ```
|
|
240
298
|
*
|
|
241
299
|
* @example
|
|
242
|
-
*
|
|
300
|
+
* ```typescript
|
|
301
|
+
* // Hybrid: local TTS, server STT/LLM
|
|
243
302
|
* const client = createVoiceClient({
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
303
|
+
* create: () => ({
|
|
304
|
+
* stt: null,
|
|
305
|
+
* llm: null,
|
|
306
|
+
* tts: new WebSpeechTTS(),
|
|
307
|
+
* serverUrl: 'ws://localhost:3000',
|
|
308
|
+
* }),
|
|
247
309
|
* });
|
|
310
|
+
* ```
|
|
248
311
|
*/
|
|
249
312
|
export declare function createVoiceClient(config: VoiceClientConfig): VoiceClient;
|
|
250
313
|
export {};
|