claude-voice 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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +395 -0
  3. package/bin/claude-voice +29 -0
  4. package/config/default.json +109 -0
  5. package/config/voice-prompt.md +27 -0
  6. package/dist/cli.d.ts +8 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +1103 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +140 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +179 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/env.d.ts +40 -0
  15. package/dist/env.d.ts.map +1 -0
  16. package/dist/env.js +175 -0
  17. package/dist/env.js.map +1 -0
  18. package/dist/index.d.ts +10 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +140 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/platform/index.d.ts +35 -0
  23. package/dist/platform/index.d.ts.map +1 -0
  24. package/dist/platform/index.js +170 -0
  25. package/dist/platform/index.js.map +1 -0
  26. package/dist/server.d.ts +5 -0
  27. package/dist/server.d.ts.map +1 -0
  28. package/dist/server.js +185 -0
  29. package/dist/server.js.map +1 -0
  30. package/dist/stt/index.d.ts +15 -0
  31. package/dist/stt/index.d.ts.map +1 -0
  32. package/dist/stt/index.js +54 -0
  33. package/dist/stt/index.js.map +1 -0
  34. package/dist/stt/providers/openai.d.ts +15 -0
  35. package/dist/stt/providers/openai.d.ts.map +1 -0
  36. package/dist/stt/providers/openai.js +74 -0
  37. package/dist/stt/providers/openai.js.map +1 -0
  38. package/dist/stt/providers/sherpa-onnx.d.ts +50 -0
  39. package/dist/stt/providers/sherpa-onnx.d.ts.map +1 -0
  40. package/dist/stt/providers/sherpa-onnx.js +237 -0
  41. package/dist/stt/providers/sherpa-onnx.js.map +1 -0
  42. package/dist/stt/providers/whisper-local.d.ts +19 -0
  43. package/dist/stt/providers/whisper-local.d.ts.map +1 -0
  44. package/dist/stt/providers/whisper-local.js +141 -0
  45. package/dist/stt/providers/whisper-local.js.map +1 -0
  46. package/dist/terminal/input-injector.d.ts +55 -0
  47. package/dist/terminal/input-injector.d.ts.map +1 -0
  48. package/dist/terminal/input-injector.js +189 -0
  49. package/dist/terminal/input-injector.js.map +1 -0
  50. package/dist/tts/index.d.ts +20 -0
  51. package/dist/tts/index.d.ts.map +1 -0
  52. package/dist/tts/index.js +72 -0
  53. package/dist/tts/index.js.map +1 -0
  54. package/dist/tts/providers/elevenlabs.d.ts +23 -0
  55. package/dist/tts/providers/elevenlabs.d.ts.map +1 -0
  56. package/dist/tts/providers/elevenlabs.js +142 -0
  57. package/dist/tts/providers/elevenlabs.js.map +1 -0
  58. package/dist/tts/providers/macos-say.d.ts +17 -0
  59. package/dist/tts/providers/macos-say.d.ts.map +1 -0
  60. package/dist/tts/providers/macos-say.js +72 -0
  61. package/dist/tts/providers/macos-say.js.map +1 -0
  62. package/dist/tts/providers/openai.d.ts +19 -0
  63. package/dist/tts/providers/openai.d.ts.map +1 -0
  64. package/dist/tts/providers/openai.js +118 -0
  65. package/dist/tts/providers/openai.js.map +1 -0
  66. package/dist/tts/providers/piper.d.ts +48 -0
  67. package/dist/tts/providers/piper.d.ts.map +1 -0
  68. package/dist/tts/providers/piper.js +417 -0
  69. package/dist/tts/providers/piper.js.map +1 -0
  70. package/dist/voice-input.d.ts +9 -0
  71. package/dist/voice-input.d.ts.map +1 -0
  72. package/dist/voice-input.js +137 -0
  73. package/dist/voice-input.js.map +1 -0
  74. package/dist/wake-word/index.d.ts +19 -0
  75. package/dist/wake-word/index.d.ts.map +1 -0
  76. package/dist/wake-word/index.js +200 -0
  77. package/dist/wake-word/index.js.map +1 -0
  78. package/dist/wake-word/recorder.d.ts +19 -0
  79. package/dist/wake-word/recorder.d.ts.map +1 -0
  80. package/dist/wake-word/recorder.js +145 -0
  81. package/dist/wake-word/recorder.js.map +1 -0
  82. package/hooks/notification.js +125 -0
  83. package/hooks/post-tool-use.js +374 -0
  84. package/hooks/session-start.js +212 -0
  85. package/hooks/stop.js +254 -0
  86. package/models/.gitkeep +0 -0
  87. package/package.json +80 -0
  88. package/python/stt_service.py +59 -0
  89. package/python/voice_input.py +154 -0
  90. package/scripts/install.sh +147 -0
  91. package/scripts/listen.py +161 -0
  92. package/scripts/postinstall.js +57 -0
  93. package/scripts/record.sh +79 -0
  94. package/scripts/setup-hooks.sh +22 -0
  95. package/scripts/voice-input.sh +66 -0
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.OpenAITTSProvider = void 0;
40
+ const openai_1 = __importDefault(require("openai"));
41
+ const child_process_1 = require("child_process");
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const os = __importStar(require("os"));
45
+ class OpenAITTSProvider {
46
+ name = 'openai-tts';
47
+ config;
48
+ client;
49
+ currentProcess = null;
50
+ ready = false;
51
+ constructor(config) {
52
+ this.config = config;
53
+ const apiKey = process.env.OPENAI_API_KEY;
54
+ if (!apiKey) {
55
+ console.warn('OPENAI_API_KEY not set. OpenAI TTS will not work.');
56
+ this.client = null;
57
+ return;
58
+ }
59
+ this.client = new openai_1.default({ apiKey });
60
+ this.ready = true;
61
+ }
62
+ async speak(text) {
63
+ if (!this.client) {
64
+ throw new Error('OpenAI client not initialized. Set OPENAI_API_KEY environment variable.');
65
+ }
66
+ // Generate speech
67
+ const response = await this.client.audio.speech.create({
68
+ model: this.config.model,
69
+ voice: this.config.voice,
70
+ input: text,
71
+ });
72
+ // Save to temporary file
73
+ const tempFile = path.join(os.tmpdir(), `tts-${Date.now()}.mp3`);
74
+ const buffer = Buffer.from(await response.arrayBuffer());
75
+ fs.writeFileSync(tempFile, buffer);
76
+ // Play the audio file
77
+ await this.playAudio(tempFile);
78
+ // Cleanup
79
+ try {
80
+ fs.unlinkSync(tempFile);
81
+ }
82
+ catch {
83
+ // Ignore cleanup errors
84
+ }
85
+ }
86
+ playAudio(filePath) {
87
+ return new Promise((resolve, reject) => {
88
+ // Use afplay on macOS, ffplay on Linux
89
+ const player = process.platform === 'darwin' ? 'afplay' : 'ffplay';
90
+ const args = process.platform === 'darwin' ? [filePath] : ['-nodisp', '-autoexit', '-loglevel', 'quiet', filePath];
91
+ this.currentProcess = (0, child_process_1.spawn)(player, args);
92
+ this.currentProcess.on('close', (code) => {
93
+ this.currentProcess = null;
94
+ if (code === 0) {
95
+ resolve();
96
+ }
97
+ else {
98
+ reject(new Error(`Audio player exited with code ${code}`));
99
+ }
100
+ });
101
+ this.currentProcess.on('error', (error) => {
102
+ this.currentProcess = null;
103
+ reject(error);
104
+ });
105
+ });
106
+ }
107
+ stop() {
108
+ if (this.currentProcess) {
109
+ this.currentProcess.kill('SIGTERM');
110
+ this.currentProcess = null;
111
+ }
112
+ }
113
+ isReady() {
114
+ return this.ready;
115
+ }
116
+ }
117
+ exports.OpenAITTSProvider = OpenAITTSProvider;
118
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/tts/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { TTSProvider } from '../index';
2
+ export declare const PIPER_VOICES: Record<string, {
3
+ name: string;
4
+ language: string;
5
+ quality: string;
6
+ sampleRate: number;
7
+ }>;
8
+ export interface PiperConfig {
9
+ voice: string;
10
+ speaker?: number;
11
+ }
12
+ export declare class PiperProvider implements TTSProvider {
13
+ name: string;
14
+ private config;
15
+ private currentProcess;
16
+ private ready;
17
+ constructor(config: PiperConfig);
18
+ private initialize;
19
+ speak(text: string): Promise<void>;
20
+ stop(): void;
21
+ isReady(): boolean;
22
+ }
23
+ /**
24
+ * Check if Piper is installed via pip in venv
25
+ */
26
+ export declare function isPiperInstalled(): boolean;
27
+ /**
28
+ * Install Piper via pip in a virtual environment
29
+ */
30
+ export declare function installPiper(): Promise<void>;
31
+ /**
32
+ * Download a Piper voice
33
+ */
34
+ export declare function downloadVoice(voiceId: string): Promise<void>;
35
+ /**
36
+ * Remove a Piper voice
37
+ */
38
+ export declare function removeVoice(voiceId: string): void;
39
+ /**
40
+ * List available and installed voices
41
+ */
42
+ export declare function listVoices(): {
43
+ id: string;
44
+ name: string;
45
+ language: string;
46
+ installed: boolean;
47
+ }[];
48
+ //# sourceMappingURL=piper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piper.d.ts","sourceRoot":"","sources":["../../../src/tts/providers/piper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQvC,eAAO,MAAM,YAAY,EAAE,MAAM,CAC/B,MAAM,EACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAoExE,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,YAAW,WAAW;IAC/C,IAAI,SAAW;IACf,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,WAAW;YAKjB,UAAU;IAoBlB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmFxC,IAAI,IAAI,IAAI;IAOZ,OAAO,IAAI,OAAO;CAGnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAqCD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8BlD;AA0BD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDlE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAqBjD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAAE,CA+BjG"}
@@ -0,0 +1,417 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PiperProvider = exports.PIPER_VOICES = void 0;
37
+ exports.isPiperInstalled = isPiperInstalled;
38
+ exports.installPiper = installPiper;
39
+ exports.downloadVoice = downloadVoice;
40
+ exports.removeVoice = removeVoice;
41
+ exports.listVoices = listVoices;
42
+ const child_process_1 = require("child_process");
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const os = __importStar(require("os"));
46
+ const PIPER_DIR = path.join(os.homedir(), '.claude-voice', 'piper');
47
+ const PIPER_VENV = path.join(PIPER_DIR, 'venv');
48
+ const PIPER_BIN = path.join(PIPER_VENV, 'bin', 'piper');
49
+ const VOICES_DIR = path.join(os.homedir(), '.claude-voice', 'voices');
50
+ // Voice catalog with popular voices
51
+ exports.PIPER_VOICES = {
52
+ 'en_US-lessac-medium': {
53
+ name: 'Lessac (US English)',
54
+ language: 'en_US',
55
+ quality: 'medium',
56
+ sampleRate: 22050,
57
+ },
58
+ 'en_US-lessac-high': {
59
+ name: 'Lessac High Quality (US English)',
60
+ language: 'en_US',
61
+ quality: 'high',
62
+ sampleRate: 22050,
63
+ },
64
+ 'en_US-amy-medium': {
65
+ name: 'Amy (US English)',
66
+ language: 'en_US',
67
+ quality: 'medium',
68
+ sampleRate: 22050,
69
+ },
70
+ 'en_US-ryan-medium': {
71
+ name: 'Ryan (US English)',
72
+ language: 'en_US',
73
+ quality: 'medium',
74
+ sampleRate: 22050,
75
+ },
76
+ 'en_US-joe-medium': {
77
+ name: 'Joe (US English)',
78
+ language: 'en_US',
79
+ quality: 'medium',
80
+ sampleRate: 22050,
81
+ },
82
+ 'en_GB-alba-medium': {
83
+ name: 'Alba (UK English)',
84
+ language: 'en_GB',
85
+ quality: 'medium',
86
+ sampleRate: 22050,
87
+ },
88
+ 'en_GB-aru-medium': {
89
+ name: 'Aru (UK English)',
90
+ language: 'en_GB',
91
+ quality: 'medium',
92
+ sampleRate: 22050,
93
+ },
94
+ 'de_DE-thorsten-medium': {
95
+ name: 'Thorsten (German)',
96
+ language: 'de_DE',
97
+ quality: 'medium',
98
+ sampleRate: 22050,
99
+ },
100
+ 'fr_FR-siwis-medium': {
101
+ name: 'Siwis (French)',
102
+ language: 'fr_FR',
103
+ quality: 'medium',
104
+ sampleRate: 22050,
105
+ },
106
+ 'es_ES-davefx-medium': {
107
+ name: 'Davefx (Spanish)',
108
+ language: 'es_ES',
109
+ quality: 'medium',
110
+ sampleRate: 22050,
111
+ },
112
+ 'tr_TR-dfki-medium': {
113
+ name: 'DFKI (Turkish)',
114
+ language: 'tr_TR',
115
+ quality: 'medium',
116
+ sampleRate: 22050,
117
+ },
118
+ };
119
+ class PiperProvider {
120
+ name = 'piper';
121
+ config;
122
+ currentProcess = null;
123
+ ready = false;
124
+ constructor(config) {
125
+ this.config = config;
126
+ this.initialize();
127
+ }
128
+ async initialize() {
129
+ // Check if piper is installed
130
+ if (!fs.existsSync(PIPER_BIN)) {
131
+ console.warn('Piper not installed. Run: claude-voice voice download <voice-id>');
132
+ console.warn('This will automatically install Piper via pip.');
133
+ return;
134
+ }
135
+ // Check if voice exists
136
+ const voicePath = path.join(VOICES_DIR, `${this.config.voice}.onnx`);
137
+ if (!fs.existsSync(voicePath)) {
138
+ console.warn(`Voice not found: ${this.config.voice}`);
139
+ console.warn(`Run: claude-voice voice download ${this.config.voice}`);
140
+ return;
141
+ }
142
+ this.ready = true;
143
+ console.log(`Piper TTS initialized with voice: ${this.config.voice}`);
144
+ }
145
+ async speak(text) {
146
+ if (!this.ready) {
147
+ throw new Error('Piper not initialized. Download a voice first.');
148
+ }
149
+ const voicePath = path.join(VOICES_DIR, `${this.config.voice}.onnx`);
150
+ const platform = os.platform();
151
+ const tempFile = path.join(os.tmpdir(), `piper-${Date.now()}.wav`);
152
+ // Build piper command
153
+ const piperArgs = ['--model', voicePath, '--output_file', tempFile];
154
+ if (this.config.speaker !== undefined) {
155
+ piperArgs.push('--speaker', String(this.config.speaker));
156
+ }
157
+ return new Promise((resolve, reject) => {
158
+ // Run piper to generate audio
159
+ const piper = (0, child_process_1.spawn)(PIPER_BIN, piperArgs, {
160
+ stdio: ['pipe', 'pipe', 'pipe'],
161
+ });
162
+ // Send text to piper
163
+ if (piper.stdin) {
164
+ piper.stdin.write(text);
165
+ piper.stdin.end();
166
+ }
167
+ let errorOutput = '';
168
+ if (piper.stderr) {
169
+ piper.stderr.on('data', (data) => {
170
+ errorOutput += data.toString();
171
+ });
172
+ }
173
+ piper.on('error', (error) => {
174
+ reject(new Error(`Piper error: ${error.message}`));
175
+ });
176
+ piper.on('close', (code) => {
177
+ if (code !== 0) {
178
+ console.error('Piper stderr:', errorOutput);
179
+ reject(new Error(`Piper failed with code ${code}`));
180
+ return;
181
+ }
182
+ // Play the generated file
183
+ const playerCmd = platform === 'darwin' ? 'afplay' : 'aplay';
184
+ const player = (0, child_process_1.spawn)(playerCmd, [tempFile], {
185
+ stdio: ['ignore', 'ignore', 'ignore'],
186
+ });
187
+ this.currentProcess = player;
188
+ player.on('close', (playerCode) => {
189
+ this.currentProcess = null;
190
+ // Clean up temp file
191
+ try {
192
+ fs.unlinkSync(tempFile);
193
+ }
194
+ catch {
195
+ // Ignore cleanup errors
196
+ }
197
+ if (playerCode === 0 || playerCode === null) {
198
+ resolve();
199
+ }
200
+ else {
201
+ reject(new Error(`Audio playback failed with code ${playerCode}`));
202
+ }
203
+ });
204
+ player.on('error', (error) => {
205
+ this.currentProcess = null;
206
+ try {
207
+ fs.unlinkSync(tempFile);
208
+ }
209
+ catch {
210
+ // Ignore cleanup errors
211
+ }
212
+ reject(error);
213
+ });
214
+ });
215
+ });
216
+ }
217
+ stop() {
218
+ if (this.currentProcess) {
219
+ this.currentProcess.kill('SIGTERM');
220
+ this.currentProcess = null;
221
+ }
222
+ }
223
+ isReady() {
224
+ return this.ready;
225
+ }
226
+ }
227
+ exports.PiperProvider = PiperProvider;
228
+ /**
229
+ * Check if Piper is installed via pip in venv
230
+ */
231
+ function isPiperInstalled() {
232
+ return fs.existsSync(PIPER_BIN);
233
+ }
234
+ /**
235
+ * Find Python 3.12 or compatible version
236
+ */
237
+ function findPython() {
238
+ const candidates = [
239
+ '/opt/homebrew/bin/python3.12',
240
+ '/usr/local/bin/python3.12',
241
+ '/opt/homebrew/bin/python3.11',
242
+ '/usr/local/bin/python3.11',
243
+ '/opt/homebrew/bin/python3',
244
+ '/usr/local/bin/python3',
245
+ 'python3.12',
246
+ 'python3.11',
247
+ 'python3',
248
+ ];
249
+ for (const python of candidates) {
250
+ try {
251
+ const version = (0, child_process_1.execSync)(`${python} --version 2>&1`, { encoding: 'utf-8' });
252
+ const match = version.match(/Python 3\.(\d+)/);
253
+ if (match) {
254
+ const minor = parseInt(match[1], 10);
255
+ // piper-tts 1.3.0 requires Python 3.9-3.13
256
+ if (minor >= 9 && minor <= 13) {
257
+ return python;
258
+ }
259
+ }
260
+ }
261
+ catch {
262
+ // Continue to next candidate
263
+ }
264
+ }
265
+ return null;
266
+ }
267
+ /**
268
+ * Install Piper via pip in a virtual environment
269
+ */
270
+ async function installPiper() {
271
+ if (isPiperInstalled()) {
272
+ console.log('Piper is already installed.');
273
+ return;
274
+ }
275
+ const python = findPython();
276
+ if (!python) {
277
+ throw new Error('Python 3.9-3.13 not found. Install with: brew install python@3.12');
278
+ }
279
+ console.log(`Using Python: ${python}`);
280
+ // Create piper directory
281
+ if (!fs.existsSync(PIPER_DIR)) {
282
+ fs.mkdirSync(PIPER_DIR, { recursive: true });
283
+ }
284
+ // Create virtual environment
285
+ console.log('Creating virtual environment...');
286
+ (0, child_process_1.execSync)(`${python} -m venv "${PIPER_VENV}"`, { stdio: 'inherit' });
287
+ // Install piper-tts
288
+ console.log('Installing piper-tts (this may take a minute)...');
289
+ const pip = path.join(PIPER_VENV, 'bin', 'pip');
290
+ (0, child_process_1.execSync)(`"${pip}" install piper-tts`, { stdio: 'inherit' });
291
+ console.log('Piper installed successfully!');
292
+ }
293
+ /**
294
+ * Get voice download URLs from HuggingFace
295
+ */
296
+ function getVoiceUrls(voiceId) {
297
+ // Parse voice ID: en_US-lessac-medium -> en/en_US/lessac/medium/en_US-lessac-medium
298
+ const parts = voiceId.split('-');
299
+ if (parts.length < 3) {
300
+ throw new Error(`Invalid voice ID format: ${voiceId}`);
301
+ }
302
+ const langCode = parts[0]; // en_US
303
+ const lang = langCode.split('_')[0]; // en
304
+ const voiceName = parts[1]; // lessac
305
+ const quality = parts[2]; // medium
306
+ const baseUrl = 'https://huggingface.co/rhasspy/piper-voices/resolve/main';
307
+ const voicePath = `${lang}/${langCode}/${voiceName}/${quality}`;
308
+ return {
309
+ onnx: `${baseUrl}/${voicePath}/${voiceId}.onnx`,
310
+ json: `${baseUrl}/${voicePath}/${voiceId}.onnx.json`,
311
+ };
312
+ }
313
+ /**
314
+ * Download a Piper voice
315
+ */
316
+ async function downloadVoice(voiceId) {
317
+ // First ensure Piper is installed
318
+ if (!isPiperInstalled()) {
319
+ console.log('Piper not installed. Installing...');
320
+ await installPiper();
321
+ }
322
+ // Check if voice is in our catalog
323
+ const voiceInfo = exports.PIPER_VOICES[voiceId];
324
+ if (!voiceInfo) {
325
+ console.warn(`Voice "${voiceId}" not in catalog. Attempting download anyway...`);
326
+ }
327
+ else {
328
+ console.log(`Downloading voice: ${voiceInfo.name}`);
329
+ }
330
+ // Create voices directory
331
+ if (!fs.existsSync(VOICES_DIR)) {
332
+ fs.mkdirSync(VOICES_DIR, { recursive: true });
333
+ }
334
+ const onnxPath = path.join(VOICES_DIR, `${voiceId}.onnx`);
335
+ const jsonPath = path.join(VOICES_DIR, `${voiceId}.onnx.json`);
336
+ if (fs.existsSync(onnxPath) && fs.existsSync(jsonPath)) {
337
+ console.log(`Voice already installed: ${voiceId}`);
338
+ return;
339
+ }
340
+ const urls = getVoiceUrls(voiceId);
341
+ try {
342
+ // Download ONNX model
343
+ console.log('Downloading model file...');
344
+ (0, child_process_1.execSync)(`curl -L -o "${onnxPath}" "${urls.onnx}"`, { stdio: 'inherit' });
345
+ // Download JSON config
346
+ console.log('Downloading config file...');
347
+ (0, child_process_1.execSync)(`curl -L -o "${jsonPath}" "${urls.json}"`, { stdio: 'inherit' });
348
+ console.log(`\nVoice installed: ${voiceId}`);
349
+ console.log('\nTo use this voice:');
350
+ console.log(` claude-voice config set tts.provider piper`);
351
+ console.log(` claude-voice config set tts.piper.voice ${voiceId}`);
352
+ }
353
+ catch (error) {
354
+ // Cleanup partial downloads
355
+ if (fs.existsSync(onnxPath))
356
+ fs.unlinkSync(onnxPath);
357
+ if (fs.existsSync(jsonPath))
358
+ fs.unlinkSync(jsonPath);
359
+ console.error('Failed to download voice:', error);
360
+ throw error;
361
+ }
362
+ }
363
+ /**
364
+ * Remove a Piper voice
365
+ */
366
+ function removeVoice(voiceId) {
367
+ const onnxPath = path.join(VOICES_DIR, `${voiceId}.onnx`);
368
+ const jsonPath = path.join(VOICES_DIR, `${voiceId}.onnx.json`);
369
+ let removed = false;
370
+ if (fs.existsSync(onnxPath)) {
371
+ fs.unlinkSync(onnxPath);
372
+ removed = true;
373
+ }
374
+ if (fs.existsSync(jsonPath)) {
375
+ fs.unlinkSync(jsonPath);
376
+ removed = true;
377
+ }
378
+ if (removed) {
379
+ console.log(`Voice removed: ${voiceId}`);
380
+ }
381
+ else {
382
+ console.log(`Voice not found: ${voiceId}`);
383
+ }
384
+ }
385
+ /**
386
+ * List available and installed voices
387
+ */
388
+ function listVoices() {
389
+ const result = Object.entries(exports.PIPER_VOICES).map(([id, info]) => {
390
+ const onnxPath = path.join(VOICES_DIR, `${id}.onnx`);
391
+ return {
392
+ id,
393
+ name: info.name,
394
+ language: info.language,
395
+ installed: fs.existsSync(onnxPath),
396
+ };
397
+ });
398
+ // Also check for any installed voices not in our catalog
399
+ if (fs.existsSync(VOICES_DIR)) {
400
+ const files = fs.readdirSync(VOICES_DIR);
401
+ const installedIds = files
402
+ .filter((f) => f.endsWith('.onnx'))
403
+ .map((f) => f.replace('.onnx', ''));
404
+ for (const id of installedIds) {
405
+ if (!exports.PIPER_VOICES[id]) {
406
+ result.push({
407
+ id,
408
+ name: id,
409
+ language: id.split('-')[0] || 'unknown',
410
+ installed: true,
411
+ });
412
+ }
413
+ }
414
+ }
415
+ return result;
416
+ }
417
+ //# sourceMappingURL=piper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piper.js","sourceRoot":"","sources":["../../../src/tts/providers/piper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0NA,4CAEC;AAwCD,oCA8BC;AA6BD,sCAkDC;AAKD,kCAqBC;AAKD,gCA+BC;AA/aD,iDAA8D;AAC9D,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAGzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;AAEtE,oCAAoC;AACvB,QAAA,YAAY,GAGrB;IACF,qBAAqB,EAAE;QACrB,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,kCAAkC;QACxC,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,KAAK;KAClB;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,KAAK;KAClB;CACF,CAAC;AAOF,MAAa,aAAa;IACxB,IAAI,GAAG,OAAO,CAAC;IACP,MAAM,CAAc;IACpB,cAAc,GAAwB,IAAI,CAAC;IAC3C,KAAK,GAAG,KAAK,CAAC;IAEtB,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,8BAA8B;QAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEnE,sBAAsB;QACtB,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACtC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,8BAA8B;YAC9B,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,SAAS,EAAE,SAAS,EAAE;gBACxC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,qBAAqB;YACrB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACpB,CAAC;YAED,IAAI,WAAW,GAAG,EAAE,CAAC;YACrB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC/B,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjC,CAAC,CAAC,CAAC;YACL,CAAC;YAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;oBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;oBACpD,OAAO;gBACT,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,SAAS,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAA,qBAAK,EAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;oBAC1C,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;iBACtC,CAAC,CAAC;gBAEH,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;gBAE7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE;oBAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC3B,qBAAqB;oBACrB,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC1B,CAAC;oBAAC,MAAM,CAAC;wBACP,wBAAwB;oBAC1B,CAAC;oBAED,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;wBAC5C,OAAO,EAAE,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC,CAAC;oBACrE,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC3B,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC1B,CAAC;oBAAC,MAAM,CAAC;wBACP,wBAAwB;oBAC1B,CAAC;oBACD,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AA5HD,sCA4HC;AAED;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,OAAO,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,UAAU;IACjB,MAAM,UAAU,GAAG;QACjB,8BAA8B;QAC9B,2BAA2B;QAC3B,8BAA8B;QAC9B,2BAA2B;QAC3B,2BAA2B;QAC3B,wBAAwB;QACxB,YAAY;QACZ,YAAY;QACZ,SAAS;KACV,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,wBAAQ,EAAC,GAAG,MAAM,iBAAiB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC/C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,2CAA2C;gBAC3C,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;oBAC9B,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY;IAChC,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;IAEvC,yBAAyB;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,IAAA,wBAAQ,EAAC,GAAG,MAAM,aAAa,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEpE,oBAAoB;IACpB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,IAAA,wBAAQ,EAAC,IAAI,GAAG,qBAAqB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,oFAAoF;IACpF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;IACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IAEnC,MAAM,OAAO,GAAG,0DAA0D,CAAC;IAC3E,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,QAAQ,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;IAEhE,OAAO;QACL,IAAI,EAAE,GAAG,OAAO,IAAI,SAAS,IAAI,OAAO,OAAO;QAC/C,IAAI,EAAE,GAAG,OAAO,IAAI,SAAS,IAAI,OAAO,YAAY;KACrD,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,kCAAkC;IAClC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;IAED,mCAAmC;IACnC,MAAM,SAAS,GAAG,oBAAY,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,iDAAiD,CAAC,CAAC;IACnF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,YAAY,CAAC,CAAC;IAE/D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,sBAAsB;QACtB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAA,wBAAQ,EAAC,eAAe,QAAQ,MAAM,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1E,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,IAAA,wBAAQ,EAAC,eAAe,QAAQ,MAAM,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1E,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4BAA4B;QAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,YAAY,CAAC,CAAC;IAE/D,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO;YACL,EAAE;YACF,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;SACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,KAAK;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAEtC,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,oBAAY,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE;oBACF,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS;oBACvC,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Voice Input - Record and transcribe speech with a keypress
4
+ *
5
+ * Usage: node voice-input.js
6
+ * Press SPACE to start recording, SPACE again to stop and transcribe.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=voice-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-input.d.ts","sourceRoot":"","sources":["../src/voice-input.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}