@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.
@@ -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 (Edge-TTS, Kokoro, Piper, VOICEVOX, RVC)',
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 provider?',
13
+ message: 'Voice engine?',
14
14
  choices: [
15
15
  {
16
- name: 'Edge-TTS (Zero-setup cloud TTS, no downloads/no Python required)',
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: 'Kokoro TTS (Fast lightweight neural TTS via HTTP/CLI)',
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 configures standalone Edge-TTS', async () => {
250
+ test('Voice configurator disables voice when none is selected', async () => {
251
251
  inquirer_1.default.prompt
252
- .mockResolvedValueOnce({ provider: 'edge-tts' })
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('edge-tts');
256
- expect(result.config.voice).toBe('en-US-AriaNeural');
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 standalone Kokoro TTS', async () => {
257
+ test('Voice configurator configures RVC with Kokoro as Base TTS Engine', async () => {
261
258
  inquirer_1.default.prompt
262
- .mockResolvedValueOnce({ provider: 'kokoro' })
263
- .mockResolvedValueOnce({ baseUrl: 'http://localhost:8880', voice: 'af_heart', speed: '1.2' });
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.baseUrl).toBe('http://localhost:8880');
267
- expect(result.config.voice).toBe('af_heart');
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 standalone Piper TTS', async () => {
273
+ test('Voice configurator configures RVC with Piper as Base TTS Engine', async () => {
272
274
  inquirer_1.default.prompt
273
- .mockResolvedValueOnce({ provider: 'piper' })
274
- .mockResolvedValueOnce({ baseUrl: 'http://localhost:5000', model: 'en_US-lessac', speakerId: '2' });
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.baseUrl).toBe('http://localhost:5000');
278
- expect(result.config.model).toBe('en_US-lessac');
279
- expect(result.config.speakerId).toBe(2);
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.4",
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
+ }