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 +139 -0
- package/dist/backend-loader.js +1 -1
- package/dist/backend-loader.js.map +1 -1
- package/dist/main-handlers.d.ts +3 -0
- package/dist/main-handlers.d.ts.map +1 -0
- package/dist/main-handlers.js +9 -0
- package/dist/main-handlers.js.map +1 -0
- package/dist/preload.d.ts +18 -0
- package/dist/preload.d.ts.map +1 -0
- package/dist/preload.js +9 -0
- package/dist/preload.js.map +1 -0
- package/package.json +22 -4
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
|
package/dist/backend-loader.js
CHANGED
|
@@ -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.
|
|
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,
|
|
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 @@
|
|
|
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"}
|
package/dist/preload.js
ADDED
|
@@ -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
|
+
"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
|
-
"
|
|
44
|
-
"electron-native-speech-backend-macos": "
|
|
45
|
-
"electron-native-speech-preload": "
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"electron-native-speech-backend-macos": "^0.1.6",
|
|
63
|
+
"electron-native-speech-preload": "^0.1.4"
|
|
46
64
|
}
|
|
47
65
|
}
|