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.
- package/LICENSE +21 -0
- package/README.md +395 -0
- package/bin/claude-voice +29 -0
- package/config/default.json +109 -0
- package/config/voice-prompt.md +27 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1103 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +140 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +179 -0
- package/dist/config.js.map +1 -0
- package/dist/env.d.ts +40 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +175 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +140 -0
- package/dist/index.js.map +1 -0
- package/dist/platform/index.d.ts +35 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +170 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +185 -0
- package/dist/server.js.map +1 -0
- package/dist/stt/index.d.ts +15 -0
- package/dist/stt/index.d.ts.map +1 -0
- package/dist/stt/index.js +54 -0
- package/dist/stt/index.js.map +1 -0
- package/dist/stt/providers/openai.d.ts +15 -0
- package/dist/stt/providers/openai.d.ts.map +1 -0
- package/dist/stt/providers/openai.js +74 -0
- package/dist/stt/providers/openai.js.map +1 -0
- package/dist/stt/providers/sherpa-onnx.d.ts +50 -0
- package/dist/stt/providers/sherpa-onnx.d.ts.map +1 -0
- package/dist/stt/providers/sherpa-onnx.js +237 -0
- package/dist/stt/providers/sherpa-onnx.js.map +1 -0
- package/dist/stt/providers/whisper-local.d.ts +19 -0
- package/dist/stt/providers/whisper-local.d.ts.map +1 -0
- package/dist/stt/providers/whisper-local.js +141 -0
- package/dist/stt/providers/whisper-local.js.map +1 -0
- package/dist/terminal/input-injector.d.ts +55 -0
- package/dist/terminal/input-injector.d.ts.map +1 -0
- package/dist/terminal/input-injector.js +189 -0
- package/dist/terminal/input-injector.js.map +1 -0
- package/dist/tts/index.d.ts +20 -0
- package/dist/tts/index.d.ts.map +1 -0
- package/dist/tts/index.js +72 -0
- package/dist/tts/index.js.map +1 -0
- package/dist/tts/providers/elevenlabs.d.ts +23 -0
- package/dist/tts/providers/elevenlabs.d.ts.map +1 -0
- package/dist/tts/providers/elevenlabs.js +142 -0
- package/dist/tts/providers/elevenlabs.js.map +1 -0
- package/dist/tts/providers/macos-say.d.ts +17 -0
- package/dist/tts/providers/macos-say.d.ts.map +1 -0
- package/dist/tts/providers/macos-say.js +72 -0
- package/dist/tts/providers/macos-say.js.map +1 -0
- package/dist/tts/providers/openai.d.ts +19 -0
- package/dist/tts/providers/openai.d.ts.map +1 -0
- package/dist/tts/providers/openai.js +118 -0
- package/dist/tts/providers/openai.js.map +1 -0
- package/dist/tts/providers/piper.d.ts +48 -0
- package/dist/tts/providers/piper.d.ts.map +1 -0
- package/dist/tts/providers/piper.js +417 -0
- package/dist/tts/providers/piper.js.map +1 -0
- package/dist/voice-input.d.ts +9 -0
- package/dist/voice-input.d.ts.map +1 -0
- package/dist/voice-input.js +137 -0
- package/dist/voice-input.js.map +1 -0
- package/dist/wake-word/index.d.ts +19 -0
- package/dist/wake-word/index.d.ts.map +1 -0
- package/dist/wake-word/index.js +200 -0
- package/dist/wake-word/index.js.map +1 -0
- package/dist/wake-word/recorder.d.ts +19 -0
- package/dist/wake-word/recorder.d.ts.map +1 -0
- package/dist/wake-word/recorder.js +145 -0
- package/dist/wake-word/recorder.js.map +1 -0
- package/hooks/notification.js +125 -0
- package/hooks/post-tool-use.js +374 -0
- package/hooks/session-start.js +212 -0
- package/hooks/stop.js +254 -0
- package/models/.gitkeep +0 -0
- package/package.json +80 -0
- package/python/stt_service.py +59 -0
- package/python/voice_input.py +154 -0
- package/scripts/install.sh +147 -0
- package/scripts/listen.py +161 -0
- package/scripts/postinstall.js +57 -0
- package/scripts/record.sh +79 -0
- package/scripts/setup-hooks.sh +22 -0
- 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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-input.d.ts","sourceRoot":"","sources":["../src/voice-input.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|