@vxnus/siduri 2.0.4 → 2.0.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/dist/builtin-manifests.js +2 -2
- package/dist/configurators/voice.js +3 -117
- package/dist/configurators.test.js +29 -21
- package/dist/index.js +0 -0
- package/package.json +7 -7
|
@@ -382,7 +382,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
|
|
|
382
382
|
organType: 'voice',
|
|
383
383
|
version: '2.0.2',
|
|
384
384
|
displayName: 'Voice (Speech Synthesis & Voice Conversion)',
|
|
385
|
-
description: 'Queued speech synthesis and audio rendering lifecycle adapter (
|
|
385
|
+
description: 'Queued speech synthesis and audio rendering lifecycle adapter (VOICEVOX, RVC)',
|
|
386
386
|
entrypoint: './dist/index.js',
|
|
387
387
|
factory: 'VoicevoxAdapter',
|
|
388
388
|
configKey: 'voice',
|
|
@@ -392,7 +392,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
|
|
|
392
392
|
properties: {
|
|
393
393
|
provider: {
|
|
394
394
|
type: 'string',
|
|
395
|
-
enum: ['voicevox', 'none']
|
|
395
|
+
enum: ['voicevox', 'edge-tts', 'kokoro', 'piper', 'none']
|
|
396
396
|
},
|
|
397
397
|
speakerId: {
|
|
398
398
|
type: 'number',
|
|
@@ -10,26 +10,14 @@ async function configureVoice(_context) {
|
|
|
10
10
|
const { provider } = await inquirer_1.default.prompt({
|
|
11
11
|
type: 'list',
|
|
12
12
|
name: 'provider',
|
|
13
|
-
message: 'Voice
|
|
13
|
+
message: 'Voice engine?',
|
|
14
14
|
choices: [
|
|
15
15
|
{
|
|
16
|
-
name: '
|
|
17
|
-
value: 'edge-tts',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: 'VOICEVOX (Standard VOICEVOX stock character voice banks)',
|
|
16
|
+
name: 'VOICEVOX (Pre-trained character voice banks: Zundamon, Shikoku Metan, etc.)',
|
|
21
17
|
value: 'voicevox',
|
|
22
18
|
},
|
|
23
19
|
{
|
|
24
|
-
name: '
|
|
25
|
-
value: 'kokoro',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: 'Piper TTS (Fast local neural TTS via HTTP/CLI)',
|
|
29
|
-
value: 'piper',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
name: 'RVC (Custom user-owned voice model via .pth / .index weights)',
|
|
20
|
+
name: 'RVC (Custom character voice model via .pth / .index weights + Base TTS)',
|
|
33
21
|
value: 'rvc',
|
|
34
22
|
},
|
|
35
23
|
{
|
|
@@ -44,108 +32,6 @@ async function configureVoice(_context) {
|
|
|
44
32
|
summary: { Provider: 'None (Voice disabled)' },
|
|
45
33
|
};
|
|
46
34
|
}
|
|
47
|
-
if (provider === 'edge-tts') {
|
|
48
|
-
const edgeAnswers = await inquirer_1.default.prompt([
|
|
49
|
-
{
|
|
50
|
-
type: 'input',
|
|
51
|
-
name: 'voice',
|
|
52
|
-
message: 'Edge-TTS Voice Identifier (e.g. ja-JP-NanamiNeural, en-US-AriaNeural):',
|
|
53
|
-
default: 'ja-JP-NanamiNeural',
|
|
54
|
-
},
|
|
55
|
-
]);
|
|
56
|
-
const voice = edgeAnswers.voice.trim() || 'ja-JP-NanamiNeural';
|
|
57
|
-
return {
|
|
58
|
-
config: {
|
|
59
|
-
provider: 'edge-tts',
|
|
60
|
-
voice,
|
|
61
|
-
maxQueueDepth: 50,
|
|
62
|
-
},
|
|
63
|
-
summary: {
|
|
64
|
-
Provider: 'Edge-TTS (Cloud Neural)',
|
|
65
|
-
Voice: voice,
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
if (provider === 'kokoro') {
|
|
70
|
-
const kokoroAnswers = await inquirer_1.default.prompt([
|
|
71
|
-
{
|
|
72
|
-
type: 'input',
|
|
73
|
-
name: 'baseUrl',
|
|
74
|
-
message: 'Kokoro HTTP Base URL (leave empty if using local kokoro-tts CLI):',
|
|
75
|
-
default: 'http://localhost:8880',
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
type: 'input',
|
|
79
|
-
name: 'voice',
|
|
80
|
-
message: 'Kokoro Voice Name (e.g. af_bella, af_heart):',
|
|
81
|
-
default: 'af_bella',
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
type: 'input',
|
|
85
|
-
name: 'speed',
|
|
86
|
-
message: 'Speech Speed multiplier (e.g. 1.0):',
|
|
87
|
-
default: '1.0',
|
|
88
|
-
},
|
|
89
|
-
]);
|
|
90
|
-
const baseUrl = kokoroAnswers.baseUrl.trim() || undefined;
|
|
91
|
-
const voice = kokoroAnswers.voice.trim() || 'af_bella';
|
|
92
|
-
const speed = parseFloat(kokoroAnswers.speed) || 1.0;
|
|
93
|
-
return {
|
|
94
|
-
config: {
|
|
95
|
-
provider: 'kokoro',
|
|
96
|
-
baseUrl,
|
|
97
|
-
voice,
|
|
98
|
-
speed,
|
|
99
|
-
maxQueueDepth: 50,
|
|
100
|
-
},
|
|
101
|
-
summary: {
|
|
102
|
-
Provider: 'Kokoro TTS (Local / Server)',
|
|
103
|
-
Mode: baseUrl ? `HTTP (${baseUrl})` : 'CLI (kokoro-tts)',
|
|
104
|
-
Voice: voice,
|
|
105
|
-
Speed: speed,
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
if (provider === 'piper') {
|
|
110
|
-
const piperAnswers = await inquirer_1.default.prompt([
|
|
111
|
-
{
|
|
112
|
-
type: 'input',
|
|
113
|
-
name: 'baseUrl',
|
|
114
|
-
message: 'Piper HTTP Base URL (leave empty if using local piper CLI):',
|
|
115
|
-
default: 'http://localhost:5000',
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
type: 'input',
|
|
119
|
-
name: 'model',
|
|
120
|
-
message: 'Piper Model Path or Name (.onnx, optional):',
|
|
121
|
-
default: '',
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
type: 'input',
|
|
125
|
-
name: 'speakerId',
|
|
126
|
-
message: 'Piper Speaker ID (optional):',
|
|
127
|
-
default: '',
|
|
128
|
-
},
|
|
129
|
-
]);
|
|
130
|
-
const baseUrl = piperAnswers.baseUrl.trim() || undefined;
|
|
131
|
-
const model = piperAnswers.model.trim() || undefined;
|
|
132
|
-
const speakerId = piperAnswers.speakerId.trim() ? parseInt(piperAnswers.speakerId.trim(), 10) : undefined;
|
|
133
|
-
return {
|
|
134
|
-
config: {
|
|
135
|
-
provider: 'piper',
|
|
136
|
-
baseUrl,
|
|
137
|
-
model,
|
|
138
|
-
speakerId,
|
|
139
|
-
maxQueueDepth: 50,
|
|
140
|
-
},
|
|
141
|
-
summary: {
|
|
142
|
-
Provider: 'Piper TTS (Local / Server)',
|
|
143
|
-
Mode: baseUrl ? `HTTP (${baseUrl})` : 'CLI (piper)',
|
|
144
|
-
Model: model || 'default',
|
|
145
|
-
'Speaker ID': speakerId !== undefined ? speakerId : 'default',
|
|
146
|
-
},
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
35
|
if (provider === 'rvc') {
|
|
150
36
|
const rvcAnswers = await inquirer_1.default.prompt([
|
|
151
37
|
{
|
|
@@ -247,37 +247,45 @@ describe('Guided Manifest-Driven Configuration UX Specification Tests', () => {
|
|
|
247
247
|
expect(result.config.rvc.pitchShift).toBe(12);
|
|
248
248
|
expect(result.summary?.['Base TTS']).toBe('edge-tts');
|
|
249
249
|
});
|
|
250
|
-
test('Voice configurator
|
|
250
|
+
test('Voice configurator disables voice when none is selected', async () => {
|
|
251
251
|
inquirer_1.default.prompt
|
|
252
|
-
.mockResolvedValueOnce({ provider: '
|
|
253
|
-
.mockResolvedValueOnce({ voice: 'en-US-AriaNeural' });
|
|
252
|
+
.mockResolvedValueOnce({ provider: 'none' });
|
|
254
253
|
const result = await (0, voice_1.configureVoice)({ companionName: 'Sparkle', manifest: voiceManifest });
|
|
255
|
-
expect(result.config.provider).toBe('
|
|
256
|
-
expect(result.
|
|
257
|
-
expect(result.summary?.Provider).toBe('Edge-TTS (Cloud Neural)');
|
|
258
|
-
expect(result.summary?.Voice).toBe('en-US-AriaNeural');
|
|
254
|
+
expect(result.config.provider).toBe('none');
|
|
255
|
+
expect(result.summary?.Provider).toBe('None (Voice disabled)');
|
|
259
256
|
});
|
|
260
|
-
test('Voice configurator configures
|
|
257
|
+
test('Voice configurator configures RVC with Kokoro as Base TTS Engine', async () => {
|
|
261
258
|
inquirer_1.default.prompt
|
|
262
|
-
.mockResolvedValueOnce({ provider: '
|
|
263
|
-
.mockResolvedValueOnce({
|
|
259
|
+
.mockResolvedValueOnce({ provider: 'rvc' })
|
|
260
|
+
.mockResolvedValueOnce({
|
|
261
|
+
modelPath: './assets/voice/sparkle/sparkle.pth',
|
|
262
|
+
indexPath: './assets/voice/sparkle/sparkle.index',
|
|
263
|
+
pitchShift: '0',
|
|
264
|
+
f0Method: 'pm',
|
|
265
|
+
baseTts: 'kokoro',
|
|
266
|
+
serviceUrl: 'http://localhost:50055',
|
|
267
|
+
});
|
|
264
268
|
const result = await (0, voice_1.configureVoice)({ companionName: 'Sparkle', manifest: voiceManifest });
|
|
265
269
|
expect(result.config.provider).toBe('kokoro');
|
|
266
|
-
expect(result.config.
|
|
267
|
-
expect(result.
|
|
268
|
-
expect(result.config.speed).toBe(1.2);
|
|
269
|
-
expect(result.summary?.Provider).toBe('Kokoro TTS (Local / Server)');
|
|
270
|
+
expect(result.config.rvc.enabled).toBe(true);
|
|
271
|
+
expect(result.summary?.['Base TTS']).toBe('kokoro');
|
|
270
272
|
});
|
|
271
|
-
test('Voice configurator configures
|
|
273
|
+
test('Voice configurator configures RVC with Piper as Base TTS Engine', async () => {
|
|
272
274
|
inquirer_1.default.prompt
|
|
273
|
-
.mockResolvedValueOnce({ provider: '
|
|
274
|
-
.mockResolvedValueOnce({
|
|
275
|
+
.mockResolvedValueOnce({ provider: 'rvc' })
|
|
276
|
+
.mockResolvedValueOnce({
|
|
277
|
+
modelPath: './assets/voice/sparkle/sparkle.pth',
|
|
278
|
+
indexPath: '',
|
|
279
|
+
pitchShift: '-6',
|
|
280
|
+
f0Method: 'harvest',
|
|
281
|
+
baseTts: 'piper',
|
|
282
|
+
serviceUrl: 'http://localhost:50055',
|
|
283
|
+
});
|
|
275
284
|
const result = await (0, voice_1.configureVoice)({ companionName: 'Sparkle', manifest: voiceManifest });
|
|
276
285
|
expect(result.config.provider).toBe('piper');
|
|
277
|
-
expect(result.config.
|
|
278
|
-
expect(result.config.
|
|
279
|
-
expect(result.
|
|
280
|
-
expect(result.summary?.Provider).toBe('Piper TTS (Local / Server)');
|
|
286
|
+
expect(result.config.rvc.enabled).toBe(true);
|
|
287
|
+
expect(result.config.rvc.pitchShift).toBe(-6);
|
|
288
|
+
expect(result.summary?.['Base TTS']).toBe('piper');
|
|
281
289
|
});
|
|
282
290
|
test('Body configurator configures Live2D, custom model path, and expression', async () => {
|
|
283
291
|
inquirer_1.default.prompt
|
package/dist/index.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vxnus/siduri",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"description": "Experimental CLI for installing and configuring Siduri companions",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
"siduri": "./dist/index.js"
|
|
24
24
|
},
|
|
25
25
|
"main": "dist/index.js",
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc && node ./scripts/copy-web-dist.cjs",
|
|
28
|
+
"dev": "tsc -w",
|
|
29
|
+
"test": "jest --config jest.config.json"
|
|
30
|
+
},
|
|
26
31
|
"dependencies": {
|
|
27
32
|
"@vxnus/e": "^0.1.5",
|
|
28
33
|
"@vxnus/e-knowledge": "^0.1.5",
|
|
@@ -35,10 +40,5 @@
|
|
|
35
40
|
"ts-jest": "^29.4.12",
|
|
36
41
|
"typescript": "^5.9.3",
|
|
37
42
|
"@types/inquirer": "^9.0.10"
|
|
38
|
-
},
|
|
39
|
-
"scripts": {
|
|
40
|
-
"build": "tsc && node ./scripts/copy-web-dist.cjs",
|
|
41
|
-
"dev": "tsc -w",
|
|
42
|
-
"test": "jest --config jest.config.json"
|
|
43
43
|
}
|
|
44
|
-
}
|
|
44
|
+
}
|