@moxxy/plugin-tts-local 0.31.0 → 0.33.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.
@@ -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;KACf,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,CAmC/E"}
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"}
@@ -40,10 +40,17 @@ export function createMessageHandler(loadSherpa) {
40
40
  }
41
41
  }
42
42
  try {
43
- const out = await tts.generateAsync({ text: req.text, sid: req.sid, speed: req.speed });
44
- const samples = out.samples instanceof Float32Array
45
- ? out.samples
46
- : Float32Array.from(out.samples);
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;AAsEH;;;;;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,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACxF,MAAM,OAAO,GACX,GAAG,CAAC,OAAO,YAAY,YAAY;gBACjC,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAA4B,CAAC,CAAC;YAC1D,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,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"}
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.31.0",
3
+ "version": "0.33.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.31.0"
52
+ "@moxxy/sdk": "0.33.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,
@@ -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({ text: req.text, sid: req.sid, speed: req.speed });
114
- const samples =
115
- out.samples instanceof Float32Array
116
- ? out.samples
117
- : Float32Array.from(out.samples as ArrayLike<number>);
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
  }