@lumiastream/wakeword 1.0.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 +3 -0
- package/bin/wakeword +29 -0
- package/binaries/sox.exe +0 -0
- package/binaries/soxlinux +0 -0
- package/binaries/soxmac +0 -0
- package/lib/voice.mjs +88 -0
- package/models/vosk-model-small-en-us-0.15/README +9 -0
- package/models/vosk-model-small-en-us-0.15/am/final.mdl +0 -0
- package/models/vosk-model-small-en-us-0.15/conf/mfcc.conf +7 -0
- package/models/vosk-model-small-en-us-0.15/conf/model.conf +10 -0
- package/models/vosk-model-small-en-us-0.15/graph/Gr.fst +0 -0
- package/models/vosk-model-small-en-us-0.15/graph/HCLr.fst +0 -0
- package/models/vosk-model-small-en-us-0.15/graph/disambig_tid.int +17 -0
- package/models/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int +166 -0
- package/models/vosk-model-small-en-us-0.15/ivector/final.dubm +0 -0
- package/models/vosk-model-small-en-us-0.15/ivector/final.ie +0 -0
- package/models/vosk-model-small-en-us-0.15/ivector/final.mat +0 -0
- package/models/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats +3 -0
- package/models/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf +1 -0
- package/models/vosk-model-small-en-us-0.15/ivector/splice.conf +2 -0
- package/package.json +23 -0
package/Readme.md
ADDED
package/bin/wakeword
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
|
|
6
|
+
// Pick correct SoX binary for the current OS
|
|
7
|
+
const exe = {
|
|
8
|
+
win32: "sox.exe",
|
|
9
|
+
darwin: "soxmac",
|
|
10
|
+
linux: "soxlinux",
|
|
11
|
+
}[process.platform];
|
|
12
|
+
|
|
13
|
+
const soxPath = path.join(
|
|
14
|
+
path.dirname(fileURLToPath(import.meta.url)), // …/bin
|
|
15
|
+
"..",
|
|
16
|
+
"binaries",
|
|
17
|
+
exe
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
// Forward every CLI arg → voice.mjs
|
|
21
|
+
spawn(
|
|
22
|
+
process.execPath, // node executable
|
|
23
|
+
[
|
|
24
|
+
path.join(__dirname, "..", "lib", "voice.mjs"),
|
|
25
|
+
soxPath,
|
|
26
|
+
...process.argv.slice(2),
|
|
27
|
+
],
|
|
28
|
+
{ stdio: "inherit" }
|
|
29
|
+
);
|
package/binaries/sox.exe
ADDED
|
Binary file
|
|
Binary file
|
package/binaries/soxmac
ADDED
|
Binary file
|
package/lib/voice.mjs
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Model, Recognizer, setLogLevel } from "vosk";
|
|
2
|
+
import record from "@lumiastream/record";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
const binPath = join(
|
|
6
|
+
"binaries",
|
|
7
|
+
process.platform === "win32"
|
|
8
|
+
? "sox.exe"
|
|
9
|
+
: process.platform === "darwin"
|
|
10
|
+
? "soxmac"
|
|
11
|
+
: "soxlinux"
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
console.log(binPath);
|
|
15
|
+
|
|
16
|
+
let COMMANDS = [
|
|
17
|
+
"open settings",
|
|
18
|
+
"mute audio",
|
|
19
|
+
"start recording",
|
|
20
|
+
"[unk]", // always keep an [unk] fallback!
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const SAMPLE_RATE = 16_000;
|
|
24
|
+
setLogLevel(0); // silence Kaldi logs
|
|
25
|
+
|
|
26
|
+
// 1. load model once
|
|
27
|
+
const model = new Model("./models/vosk-model-small-en-us-0.15");
|
|
28
|
+
|
|
29
|
+
// 2. build a grammar recognizer
|
|
30
|
+
let rec = new Recognizer({
|
|
31
|
+
model,
|
|
32
|
+
sampleRate: SAMPLE_RATE,
|
|
33
|
+
grammar: COMMANDS,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// 3. open the mic (16-kHz, 16-bit, mono)
|
|
37
|
+
const mic = record
|
|
38
|
+
.record({
|
|
39
|
+
sampleRate: SAMPLE_RATE,
|
|
40
|
+
threshold: 0,
|
|
41
|
+
binPath,
|
|
42
|
+
})
|
|
43
|
+
.stream();
|
|
44
|
+
|
|
45
|
+
mic.on("data", (buf) => {
|
|
46
|
+
// accept 0.1-sec chunks for low latency
|
|
47
|
+
if (rec.acceptWaveform(buf)) {
|
|
48
|
+
const result = rec.result();
|
|
49
|
+
handle(result?.text?.trim());
|
|
50
|
+
} else {
|
|
51
|
+
// optional: JSON.parse(rec.partialResult()).partial for live captions
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// 4. map recognised phrase ➜ action
|
|
56
|
+
function handle(phrase) {
|
|
57
|
+
console.log(phrase);
|
|
58
|
+
if (phrase && COMMANDS.includes(phrase)) {
|
|
59
|
+
console.log("found", phrase);
|
|
60
|
+
}
|
|
61
|
+
// switch (phrase) {
|
|
62
|
+
// case "open settings":
|
|
63
|
+
// process.send?.({ hotkey: "settings" });
|
|
64
|
+
// break;
|
|
65
|
+
// case "mute audio":
|
|
66
|
+
// process.send?.({ hotkey: "mute" });
|
|
67
|
+
// break;
|
|
68
|
+
// case "start recording":
|
|
69
|
+
// process.send?.({ hotkey: "record" });
|
|
70
|
+
// break;
|
|
71
|
+
// }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const updateGrammar = (grammar) => {
|
|
75
|
+
COMMANDS = grammar;
|
|
76
|
+
rec = new Recognizer({
|
|
77
|
+
model,
|
|
78
|
+
sampleRate: SAMPLE_RATE,
|
|
79
|
+
grammar: [...COMMANDS, "[unk]"],
|
|
80
|
+
});
|
|
81
|
+
console.log(COMMANDS);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
setTimeout(() => {
|
|
85
|
+
updateGrammar(["red", "blue", "green"]);
|
|
86
|
+
}, 5000);
|
|
87
|
+
|
|
88
|
+
export { updateGrammar };
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
--min-active=200
|
|
2
|
+
--max-active=3000
|
|
3
|
+
--beam=10.0
|
|
4
|
+
--lattice-beam=2.0
|
|
5
|
+
--acoustic-scale=1.0
|
|
6
|
+
--frame-subsampling-factor=3
|
|
7
|
+
--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10
|
|
8
|
+
--endpoint.rule2.min-trailing-silence=0.5
|
|
9
|
+
--endpoint.rule3.min-trailing-silence=0.75
|
|
10
|
+
--endpoint.rule4.min-trailing-silence=1.0
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
1 nonword
|
|
2
|
+
2 begin
|
|
3
|
+
3 end
|
|
4
|
+
4 internal
|
|
5
|
+
5 singleton
|
|
6
|
+
6 nonword
|
|
7
|
+
7 begin
|
|
8
|
+
8 end
|
|
9
|
+
9 internal
|
|
10
|
+
10 singleton
|
|
11
|
+
11 begin
|
|
12
|
+
12 end
|
|
13
|
+
13 internal
|
|
14
|
+
14 singleton
|
|
15
|
+
15 begin
|
|
16
|
+
16 end
|
|
17
|
+
17 internal
|
|
18
|
+
18 singleton
|
|
19
|
+
19 begin
|
|
20
|
+
20 end
|
|
21
|
+
21 internal
|
|
22
|
+
22 singleton
|
|
23
|
+
23 begin
|
|
24
|
+
24 end
|
|
25
|
+
25 internal
|
|
26
|
+
26 singleton
|
|
27
|
+
27 begin
|
|
28
|
+
28 end
|
|
29
|
+
29 internal
|
|
30
|
+
30 singleton
|
|
31
|
+
31 begin
|
|
32
|
+
32 end
|
|
33
|
+
33 internal
|
|
34
|
+
34 singleton
|
|
35
|
+
35 begin
|
|
36
|
+
36 end
|
|
37
|
+
37 internal
|
|
38
|
+
38 singleton
|
|
39
|
+
39 begin
|
|
40
|
+
40 end
|
|
41
|
+
41 internal
|
|
42
|
+
42 singleton
|
|
43
|
+
43 begin
|
|
44
|
+
44 end
|
|
45
|
+
45 internal
|
|
46
|
+
46 singleton
|
|
47
|
+
47 begin
|
|
48
|
+
48 end
|
|
49
|
+
49 internal
|
|
50
|
+
50 singleton
|
|
51
|
+
51 begin
|
|
52
|
+
52 end
|
|
53
|
+
53 internal
|
|
54
|
+
54 singleton
|
|
55
|
+
55 begin
|
|
56
|
+
56 end
|
|
57
|
+
57 internal
|
|
58
|
+
58 singleton
|
|
59
|
+
59 begin
|
|
60
|
+
60 end
|
|
61
|
+
61 internal
|
|
62
|
+
62 singleton
|
|
63
|
+
63 begin
|
|
64
|
+
64 end
|
|
65
|
+
65 internal
|
|
66
|
+
66 singleton
|
|
67
|
+
67 begin
|
|
68
|
+
68 end
|
|
69
|
+
69 internal
|
|
70
|
+
70 singleton
|
|
71
|
+
71 begin
|
|
72
|
+
72 end
|
|
73
|
+
73 internal
|
|
74
|
+
74 singleton
|
|
75
|
+
75 begin
|
|
76
|
+
76 end
|
|
77
|
+
77 internal
|
|
78
|
+
78 singleton
|
|
79
|
+
79 begin
|
|
80
|
+
80 end
|
|
81
|
+
81 internal
|
|
82
|
+
82 singleton
|
|
83
|
+
83 begin
|
|
84
|
+
84 end
|
|
85
|
+
85 internal
|
|
86
|
+
86 singleton
|
|
87
|
+
87 begin
|
|
88
|
+
88 end
|
|
89
|
+
89 internal
|
|
90
|
+
90 singleton
|
|
91
|
+
91 begin
|
|
92
|
+
92 end
|
|
93
|
+
93 internal
|
|
94
|
+
94 singleton
|
|
95
|
+
95 begin
|
|
96
|
+
96 end
|
|
97
|
+
97 internal
|
|
98
|
+
98 singleton
|
|
99
|
+
99 begin
|
|
100
|
+
100 end
|
|
101
|
+
101 internal
|
|
102
|
+
102 singleton
|
|
103
|
+
103 begin
|
|
104
|
+
104 end
|
|
105
|
+
105 internal
|
|
106
|
+
106 singleton
|
|
107
|
+
107 begin
|
|
108
|
+
108 end
|
|
109
|
+
109 internal
|
|
110
|
+
110 singleton
|
|
111
|
+
111 begin
|
|
112
|
+
112 end
|
|
113
|
+
113 internal
|
|
114
|
+
114 singleton
|
|
115
|
+
115 begin
|
|
116
|
+
116 end
|
|
117
|
+
117 internal
|
|
118
|
+
118 singleton
|
|
119
|
+
119 begin
|
|
120
|
+
120 end
|
|
121
|
+
121 internal
|
|
122
|
+
122 singleton
|
|
123
|
+
123 begin
|
|
124
|
+
124 end
|
|
125
|
+
125 internal
|
|
126
|
+
126 singleton
|
|
127
|
+
127 begin
|
|
128
|
+
128 end
|
|
129
|
+
129 internal
|
|
130
|
+
130 singleton
|
|
131
|
+
131 begin
|
|
132
|
+
132 end
|
|
133
|
+
133 internal
|
|
134
|
+
134 singleton
|
|
135
|
+
135 begin
|
|
136
|
+
136 end
|
|
137
|
+
137 internal
|
|
138
|
+
138 singleton
|
|
139
|
+
139 begin
|
|
140
|
+
140 end
|
|
141
|
+
141 internal
|
|
142
|
+
142 singleton
|
|
143
|
+
143 begin
|
|
144
|
+
144 end
|
|
145
|
+
145 internal
|
|
146
|
+
146 singleton
|
|
147
|
+
147 begin
|
|
148
|
+
148 end
|
|
149
|
+
149 internal
|
|
150
|
+
150 singleton
|
|
151
|
+
151 begin
|
|
152
|
+
152 end
|
|
153
|
+
153 internal
|
|
154
|
+
154 singleton
|
|
155
|
+
155 begin
|
|
156
|
+
156 end
|
|
157
|
+
157 internal
|
|
158
|
+
158 singleton
|
|
159
|
+
159 begin
|
|
160
|
+
160 end
|
|
161
|
+
161 internal
|
|
162
|
+
162 singleton
|
|
163
|
+
163 begin
|
|
164
|
+
164 end
|
|
165
|
+
165 internal
|
|
166
|
+
166 singleton
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
[
|
|
2
|
+
1.682383e+11 -1.1595e+10 -1.521733e+10 4.32034e+09 -2.257938e+10 -1.969666e+10 -2.559265e+10 -1.535687e+10 -1.276854e+10 -4.494483e+09 -1.209085e+10 -5.64008e+09 -1.134847e+10 -3.419512e+09 -1.079542e+10 -4.145463e+09 -6.637486e+09 -1.11318e+09 -3.479773e+09 -1.245932e+08 -1.386961e+09 6.560655e+07 -2.436518e+08 -4.032432e+07 4.620046e+08 -7.714964e+07 9.551484e+08 -4.119761e+08 8.208582e+08 -7.117156e+08 7.457703e+08 -4.3106e+08 1.202726e+09 2.904036e+08 1.231931e+09 3.629848e+08 6.366939e+08 -4.586172e+08 -5.267629e+08 -3.507819e+08 1.679838e+09
|
|
3
|
+
1.741141e+13 8.92488e+11 8.743834e+11 8.848896e+11 1.190313e+12 1.160279e+12 1.300066e+12 1.005678e+12 9.39335e+11 8.089614e+11 7.927041e+11 6.882427e+11 6.444235e+11 5.151451e+11 4.825723e+11 3.210106e+11 2.720254e+11 1.772539e+11 1.248102e+11 6.691599e+10 3.599804e+10 1.207574e+10 1.679301e+09 4.594778e+08 5.821614e+09 1.451758e+10 2.55803e+10 3.43277e+10 4.245286e+10 4.784859e+10 4.988591e+10 4.925451e+10 5.074584e+10 4.9557e+10 4.407876e+10 3.421443e+10 3.138606e+10 2.539716e+10 1.948134e+10 1.381167e+10 0 ]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# configuration file for apply-cmvn-online, used in the script ../local/run_online_decoding.sh
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lumiastream/wakeword",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "lib/voice.mjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"wakeword": "bin/wakeword"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/",
|
|
11
|
+
"lib/",
|
|
12
|
+
"binaries/",
|
|
13
|
+
"models/"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"postinstall": "chmod +x binaries/soxmac binaries/soxlinux || true"
|
|
17
|
+
},
|
|
18
|
+
"optionalDependencies": {
|
|
19
|
+
"@lumiastream/wakeword-darwin": "file:./binaries/soxmac",
|
|
20
|
+
"@lumiastream/wakeword-linux": "file:./binaries/soxlinux",
|
|
21
|
+
"@lumiastream/wakeword-win32": "file:./binaries/sox.exe"
|
|
22
|
+
}
|
|
23
|
+
}
|