electron-native-speech 0.1.3 → 0.1.5

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 ADDED
@@ -0,0 +1,139 @@
1
+ # electron-native-speech
2
+
3
+ Core TypeScript API for native speech transcription in Electron.
4
+
5
+ This package provides the shared types and high-level API:
6
+
7
+ - `getSpeechAvailability()`
8
+ - `transcribeFile()`
9
+ - `createSpeechSession()`
10
+
11
+ On macOS, it installs and auto-loads the bundled backend at runtime.
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npm install electron-native-speech
17
+ ```
18
+
19
+ That single package install is the supported path for normal users.
20
+
21
+ ## When to use this package
22
+
23
+ Use this package when you want:
24
+
25
+ - the core speech API and types
26
+ - direct access from Node or the Electron main process
27
+ - a shared abstraction for custom backends or tests
28
+
29
+ For Electron preload and main-process wiring, import the helpers from this package:
30
+
31
+ - `electron-native-speech/preload`
32
+ - `electron-native-speech/main-handlers`
33
+
34
+ ## Usage
35
+
36
+ ### File transcription
37
+
38
+ ```ts
39
+ import { getSpeechAvailability, transcribeFile } from "electron-native-speech"
40
+
41
+ const availability = await getSpeechAvailability()
42
+ if (!availability.available) {
43
+ throw new Error(availability.reason ?? "Speech recognition unavailable")
44
+ }
45
+
46
+ const result = await transcribeFile({
47
+ filePath: "/absolute/path/to/recording.mp3",
48
+ locale: "en-US",
49
+ })
50
+
51
+ for (const segment of result.segments) {
52
+ console.log(`[${segment.startMs}ms - ${segment.endMs}ms] ${segment.text}`)
53
+ }
54
+ ```
55
+
56
+ ### Live microphone
57
+
58
+ ```ts
59
+ import { createSpeechSession } from "electron-native-speech"
60
+
61
+ const session = await createSpeechSession()
62
+
63
+ const offResult = session.on("result", (result) => {
64
+ console.log(result.text, result.isFinal ? "(final)" : "(interim)")
65
+ })
66
+
67
+ const offError = session.on("error", (error) => {
68
+ console.error(error.code, error.message)
69
+ })
70
+
71
+ await session.start({
72
+ locale: "en-US",
73
+ interimResults: true,
74
+ continuous: true,
75
+ })
76
+
77
+ // later
78
+ await session.stop()
79
+ await session.dispose()
80
+ offResult()
81
+ offError()
82
+ ```
83
+
84
+ ## API
85
+
86
+ ### `getSpeechAvailability()`
87
+
88
+ ```ts
89
+ getSpeechAvailability(): Promise<SpeechAvailability>
90
+ ```
91
+
92
+ Checks whether a supported backend is present and speech recognition is available.
93
+
94
+ ### `transcribeFile(options)`
95
+
96
+ ```ts
97
+ transcribeFile(options: FileTranscriptionOptions): Promise<FileTranscriptionResult>
98
+ ```
99
+
100
+ Recognizes speech from a local audio or video file.
101
+
102
+ ### `createSpeechSession()`
103
+
104
+ ```ts
105
+ createSpeechSession(): Promise<SpeechSession>
106
+ ```
107
+
108
+ Creates a live microphone recognition session.
109
+
110
+ ## Custom backends and tests
111
+
112
+ This package also exports:
113
+
114
+ - `setBackend()`
115
+ - `resetBackend()`
116
+ - `SpeechRecognitionError`
117
+ - all public speech types
118
+
119
+ That is useful if you want to inject a mock backend in tests or provide your own implementation.
120
+
121
+ ## Platform support
122
+
123
+ - macOS 13+
124
+ - Electron 28+
125
+ - Node.js 18+
126
+
127
+ Windows and Linux backends are not published yet.
128
+
129
+ ## Electron apps
130
+
131
+ For a complete Electron integration with `contextIsolation: true`, use:
132
+
133
+ - `electron-native-speech` for the shared API and runtime
134
+ - `electron-native-speech/preload` for the preload bridge
135
+ - `electron-native-speech/main-handlers` for IPC wiring in the main process
136
+
137
+ Full documentation and examples:
138
+
139
+ - https://github.com/varaprasadreddy9676/electron-native-speech
@@ -22,7 +22,7 @@ function getBackend() {
22
22
  return _backend;
23
23
  }
24
24
  catch {
25
- (0, errors_1.throwSpeechError)("unavailable", "macOS speech backend not found. Run: npm install electron-native-speech-backend-macos");
25
+ (0, errors_1.throwSpeechError)("unavailable", "macOS speech backend not found. Reinstall electron-native-speech and verify dependencies were installed.");
26
26
  }
27
27
  }
28
28
  (0, errors_1.throwSpeechError)("unavailable", `Platform "${platform}" is not yet supported. electron-native-speech currently supports macOS.`);
@@ -1 +1 @@
1
- {"version":3,"file":"backend-loader.js","sourceRoot":"","sources":["../src/backend-loader.ts"],"names":[],"mappings":";;AAUA,gCAuBC;AAGD,gCAEC;AAED,oCAKC;AA5CD,qCAA2C;AAE3C,IAAI,QAAQ,GAA0B,IAAI,CAAA;AAE1C;;;;GAIG;AACH,SAAgB,UAAU;IACxB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IAEjC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,GAAG,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAA;YAC3D,QAAQ,GAAG,IAAI,GAAG,CAAC,kBAAkB,EAAoB,CAAA;YACzD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,IAAA,yBAAgB,EACd,aAAa,EACb,uFAAuF,CACxF,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAA,yBAAgB,EACd,aAAa,EACb,aAAa,QAAQ,0EAA0E,CAChG,CAAA;AACH,CAAC;AAED,+CAA+C;AAC/C,SAAgB,UAAU,CAAC,OAAuB;IAChD,QAAQ,GAAG,OAAO,CAAA;AACpB,CAAC;AAED,SAAgB,YAAY;IAC1B,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACpC,CAAC;IACD,QAAQ,GAAG,IAAI,CAAA;AACjB,CAAC"}
1
+ {"version":3,"file":"backend-loader.js","sourceRoot":"","sources":["../src/backend-loader.ts"],"names":[],"mappings":";;AAUA,gCAuBC;AAGD,gCAEC;AAED,oCAKC;AA5CD,qCAA2C;AAE3C,IAAI,QAAQ,GAA0B,IAAI,CAAA;AAE1C;;;;GAIG;AACH,SAAgB,UAAU;IACxB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IAEjC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,GAAG,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAA;YAC3D,QAAQ,GAAG,IAAI,GAAG,CAAC,kBAAkB,EAAoB,CAAA;YACzD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,IAAA,yBAAgB,EACd,aAAa,EACb,0GAA0G,CAC3G,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAA,yBAAgB,EACd,aAAa,EACb,aAAa,QAAQ,0EAA0E,CAChG,CAAA;AACH,CAAC;AAED,+CAA+C;AAC/C,SAAgB,UAAU,CAAC,OAAuB;IAChD,QAAQ,GAAG,OAAO,CAAA;AACpB,CAAC;AAED,SAAgB,YAAY;IAC1B,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACpC,CAAC;IACD,QAAQ,GAAG,IAAI,CAAA;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { IpcMain, WebContents } from "electron";
2
+ export declare function registerSpeechHandlers(ipcMain: IpcMain, webContents: WebContents): () => void;
3
+ //# sourceMappingURL=main-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-handlers.d.ts","sourceRoot":"","sources":["../src/main-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEpD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,IAAI,CAO7F"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerSpeechHandlers = registerSpeechHandlers;
4
+ function registerSpeechHandlers(ipcMain, webContents) {
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
6
+ const mod = require("electron-native-speech-preload/main-handlers");
7
+ return mod.registerSpeechHandlers(ipcMain, webContents);
8
+ }
9
+ //# sourceMappingURL=main-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-handlers.js","sourceRoot":"","sources":["../src/main-handlers.ts"],"names":[],"mappings":";;AAEA,wDAOC;AAPD,SAAgB,sBAAsB,CAAC,OAAgB,EAAE,WAAwB;IAC/E,iEAAiE;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,8CAA8C,CAEjE,CAAA;IAED,OAAO,GAAG,CAAC,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;AACzD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { FileTranscriptionOptions, FileTranscriptionResult, LiveSpeechResult, SpeechAvailability, SpeechError, SpeechSessionStartOptions, SpeechSessionState } from "./types";
2
+ type SessionEventType = "result" | "error" | "state";
3
+ type SessionListener<T extends SessionEventType> = T extends "result" ? (result: LiveSpeechResult) => void : T extends "error" ? (error: SpeechError) => void : T extends "state" ? (state: SpeechSessionState) => void : never;
4
+ export interface RendererSpeechSession {
5
+ on<T extends SessionEventType>(event: T, listener: SessionListener<T>): () => void;
6
+ start(options?: SpeechSessionStartOptions): Promise<void>;
7
+ stop(): Promise<void>;
8
+ abort(): Promise<void>;
9
+ dispose(): Promise<void>;
10
+ }
11
+ export interface ElectronSpeechAPI {
12
+ getSpeechAvailability(): Promise<SpeechAvailability>;
13
+ transcribeFile(options: FileTranscriptionOptions): Promise<FileTranscriptionResult>;
14
+ createSpeechSession(): RendererSpeechSession;
15
+ }
16
+ export declare function exposeElectronSpeech(key?: string): void;
17
+ export {};
18
+ //# sourceMappingURL=preload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAEhB,KAAK,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AACpD,KAAK,eAAe,CAAC,CAAC,SAAS,gBAAgB,IAC7C,CAAC,SAAS,QAAQ,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GACrD,CAAC,SAAS,OAAO,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAChD,CAAC,SAAS,OAAO,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GACvD,KAAK,CAAA;AAET,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAA;IAClF,KAAK,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACpD,cAAc,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACnF,mBAAmB,IAAI,qBAAqB,CAAA;CAC7C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,SAAmB,GAAG,IAAI,CAOjE"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exposeElectronSpeech = exposeElectronSpeech;
4
+ function exposeElectronSpeech(key = "electronSpeech") {
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
6
+ const mod = require("electron-native-speech-preload");
7
+ mod.exposeElectronSpeech(key);
8
+ }
9
+ //# sourceMappingURL=preload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.js","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":";;AA+BA,oDAOC;AAPD,SAAgB,oBAAoB,CAAC,GAAG,GAAG,gBAAgB;IACzD,iEAAiE;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,gCAAgC,CAEnD,CAAA;IAED,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;AAC/B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-native-speech",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Native OS speech transcription for Electron apps — fast, local, no cloud required",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -8,6 +8,24 @@
8
8
  ".": {
9
9
  "require": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts"
11
+ },
12
+ "./preload": {
13
+ "require": "./dist/preload.js",
14
+ "types": "./dist/preload.d.ts"
15
+ },
16
+ "./main-handlers": {
17
+ "require": "./dist/main-handlers.js",
18
+ "types": "./dist/main-handlers.d.ts"
19
+ }
20
+ },
21
+ "typesVersions": {
22
+ "*": {
23
+ "preload": [
24
+ "dist/preload.d.ts"
25
+ ],
26
+ "main-handlers": [
27
+ "dist/main-handlers.d.ts"
28
+ ]
11
29
  }
12
30
  },
13
31
  "files": [
@@ -40,8 +58,8 @@
40
58
  "optional": true
41
59
  }
42
60
  },
43
- "optionalDependencies": {
44
- "electron-native-speech-backend-macos": ">=0.1.5",
45
- "electron-native-speech-preload": ">=0.1.3"
61
+ "dependencies": {
62
+ "electron-native-speech-backend-macos": "^0.1.6",
63
+ "electron-native-speech-preload": "^0.1.4"
46
64
  }
47
65
  }