@moxxy/plugin-tts-local 0.32.0 → 0.34.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/host-protocol.d.ts
CHANGED
|
@@ -62,6 +62,7 @@ export interface SherpaOfflineTts {
|
|
|
62
62
|
text: string;
|
|
63
63
|
sid: number;
|
|
64
64
|
speed: number;
|
|
65
|
+
enableExternalBuffer?: boolean;
|
|
65
66
|
}): Promise<{
|
|
66
67
|
samples: Float32Array;
|
|
67
68
|
sampleRate: number;
|
|
@@ -81,4 +82,6 @@ export type HostMessageHandler = (req: HostRequest) => Promise<HostReply>;
|
|
|
81
82
|
* nothing throws out of `handle`.
|
|
82
83
|
*/
|
|
83
84
|
export declare function createMessageHandler(loadSherpa: LoadSherpa): HostMessageHandler;
|
|
85
|
+
/** Copy native-addon samples onto a V8-owned ArrayBuffer before Electron IPC. */
|
|
86
|
+
export declare function copySamplesForIpc(samples: ArrayLike<number>): Float32Array;
|
|
84
87
|
//# sourceMappingURL=host-protocol.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-protocol.d.ts","sourceRoot":"","sources":["../src/host-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;0EAC0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAE5C,MAAM,MAAM,aAAa;AACvB,+EAA+E;AAC7E,MAAM;AACR,8BAA8B;GAC5B,SAAS,CAAC;AAEd,MAAM,MAAM,SAAS,GACjB;IACE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC;CAC5E,CAAC;AAEN;;gFAEgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"host-protocol.d.ts","sourceRoot":"","sources":["../src/host-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;0EAC0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAE5C,MAAM,MAAM,aAAa;AACvB,+EAA+E;AAC7E,MAAM;AACR,8BAA8B;GAC5B,SAAS,CAAC;AAEd,MAAM,MAAM,SAAS,GACjB;IACE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC;CAC5E,CAAC;AAEN;;gFAEgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,KAAK,MAAM,EAAE,OAAO,KAAK,gBAAgB,CAAC;CACvD;AAED;2CAC2C;AAC3C,MAAM,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAE1E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,kBAAkB,CAyC/E;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,YAAY,CAE1E"}
|
package/dist/host-protocol.js
CHANGED
|
@@ -40,10 +40,17 @@ export function createMessageHandler(loadSherpa) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
try {
|
|
43
|
-
const out = await tts.generateAsync({
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
:
|
|
43
|
+
const out = await tts.generateAsync({
|
|
44
|
+
text: req.text,
|
|
45
|
+
sid: req.sid,
|
|
46
|
+
speed: req.speed,
|
|
47
|
+
// Electron-as-Node rejects native-addon external ArrayBuffers during
|
|
48
|
+
// advanced IPC serialization. Ask sherpa for an owned buffer up front;
|
|
49
|
+
// the explicit copy below is the compatibility backstop for older
|
|
50
|
+
// sherpa builds that ignore this option.
|
|
51
|
+
enableExternalBuffer: false,
|
|
52
|
+
});
|
|
53
|
+
const samples = copySamplesForIpc(out.samples);
|
|
47
54
|
return { id: req.id, ok: true, sampleRate: out.sampleRate, samples };
|
|
48
55
|
}
|
|
49
56
|
catch (err) {
|
|
@@ -51,6 +58,10 @@ export function createMessageHandler(loadSherpa) {
|
|
|
51
58
|
}
|
|
52
59
|
};
|
|
53
60
|
}
|
|
61
|
+
/** Copy native-addon samples onto a V8-owned ArrayBuffer before Electron IPC. */
|
|
62
|
+
export function copySamplesForIpc(samples) {
|
|
63
|
+
return Float32Array.from(samples);
|
|
64
|
+
}
|
|
54
65
|
function errMsg(err) {
|
|
55
66
|
return err instanceof Error ? err.message : String(err);
|
|
56
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-protocol.js","sourceRoot":"","sources":["../src/host-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"host-protocol.js","sourceRoot":"","sources":["../src/host-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuEH;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAsB;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,IAAI,GAAG,GAAwB,IAAI,CAAC;IAEpC,OAAO,KAAK,UAAU,MAAM,CAAC,GAAgB;QAC3C,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,GAAG,KAAK,UAAU,EAAE,CAAC;gBACrB,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC;oBACvB,KAAK,EAAE;wBACL,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;wBACpE,UAAU,EAAE,GAAG,CAAC,UAAU;wBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,KAAK,EAAE,KAAK;qBACb;oBACD,eAAe,EAAE,CAAC;iBACnB,CAAC,CAAC;gBACH,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;YAClF,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;gBAClC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,qEAAqE;gBACrE,uEAAuE;gBACvE,kEAAkE;gBAClE,yCAAyC;gBACzC,oBAAoB,EAAE,KAAK;aAC5B,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/C,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;QACrF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,OAA0B;IAC1D,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,GAAY;IAC1B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/plugin-tts-local",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.0",
|
|
4
4
|
"description": "Fully local, on-device text-to-speech Synthesizer for moxxy. Runs Piper voices (English + Polish) via sherpa-onnx in a forked sidecar process; voice models download once on first use from sherpa-onnx's pinned releases (sha256-verified). No API key, no network at synthesis time. Plugs into the session SynthesizerRegistry — desktop read-aloud, the TUI, and channel voice replies consume it transparently.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"sherpa-onnx-node": "^1.13.3",
|
|
51
51
|
"@moxxy/model-fetch": "0.1.0",
|
|
52
|
-
"@moxxy/sdk": "0.
|
|
52
|
+
"@moxxy/sdk": "0.34.0"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@types/node": "^22.10.0",
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import {
|
|
3
|
+
copySamplesForIpc,
|
|
3
4
|
createMessageHandler,
|
|
4
5
|
type HostRequest,
|
|
5
6
|
type SherpaModule,
|
|
6
7
|
type SherpaOfflineTts,
|
|
7
8
|
} from './host-protocol.js';
|
|
8
9
|
|
|
10
|
+
describe('copySamplesForIpc', () => {
|
|
11
|
+
it('owns a fresh ArrayBuffer before samples cross Electron IPC', () => {
|
|
12
|
+
const nativeSamples = new Float32Array([0.25, -0.5, 1]);
|
|
13
|
+
|
|
14
|
+
const copied = copySamplesForIpc(nativeSamples);
|
|
15
|
+
|
|
16
|
+
expect(copied).not.toBe(nativeSamples);
|
|
17
|
+
expect(copied.buffer).not.toBe(nativeSamples.buffer);
|
|
18
|
+
expect(Array.from(copied)).toEqual([0.25, -0.5, 1]);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
9
22
|
function req(over: Partial<HostRequest> = {}): HostRequest {
|
|
10
23
|
return {
|
|
11
24
|
id: 1,
|
package/src/host-protocol.ts
CHANGED
|
@@ -66,6 +66,7 @@ export interface SherpaOfflineTts {
|
|
|
66
66
|
text: string;
|
|
67
67
|
sid: number;
|
|
68
68
|
speed: number;
|
|
69
|
+
enableExternalBuffer?: boolean;
|
|
69
70
|
}): Promise<{ samples: Float32Array; sampleRate: number }>;
|
|
70
71
|
}
|
|
71
72
|
|
|
@@ -110,11 +111,17 @@ export function createMessageHandler(loadSherpa: LoadSherpa): HostMessageHandler
|
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
try {
|
|
113
|
-
const out = await tts.generateAsync({
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
const out = await tts.generateAsync({
|
|
115
|
+
text: req.text,
|
|
116
|
+
sid: req.sid,
|
|
117
|
+
speed: req.speed,
|
|
118
|
+
// Electron-as-Node rejects native-addon external ArrayBuffers during
|
|
119
|
+
// advanced IPC serialization. Ask sherpa for an owned buffer up front;
|
|
120
|
+
// the explicit copy below is the compatibility backstop for older
|
|
121
|
+
// sherpa builds that ignore this option.
|
|
122
|
+
enableExternalBuffer: false,
|
|
123
|
+
});
|
|
124
|
+
const samples = copySamplesForIpc(out.samples);
|
|
118
125
|
return { id: req.id, ok: true, sampleRate: out.sampleRate, samples };
|
|
119
126
|
} catch (err) {
|
|
120
127
|
return { id: req.id, ok: false, error: { message: errMsg(err), kind: 'runtime' } };
|
|
@@ -122,6 +129,11 @@ export function createMessageHandler(loadSherpa: LoadSherpa): HostMessageHandler
|
|
|
122
129
|
};
|
|
123
130
|
}
|
|
124
131
|
|
|
132
|
+
/** Copy native-addon samples onto a V8-owned ArrayBuffer before Electron IPC. */
|
|
133
|
+
export function copySamplesForIpc(samples: ArrayLike<number>): Float32Array {
|
|
134
|
+
return Float32Array.from(samples);
|
|
135
|
+
}
|
|
136
|
+
|
|
125
137
|
function errMsg(err: unknown): string {
|
|
126
138
|
return err instanceof Error ? err.message : String(err);
|
|
127
139
|
}
|