@aituber-onair/core 0.14.0 → 0.16.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/dist/constants/gemini.d.ts +1 -0
- package/dist/constants/gemini.js +2 -0
- package/dist/constants/gemini.js.map +1 -1
- package/dist/constants/index.d.ts +0 -1
- package/dist/constants/index.js +0 -1
- package/dist/constants/index.js.map +1 -1
- package/dist/core/AITuberOnAirCore.d.ts +1 -1
- package/dist/core/AITuberOnAirCore.js +1 -1
- package/dist/core/AITuberOnAirCore.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/services/chat/providers/claude/ClaudeChatService.js +2 -7
- package/dist/services/chat/providers/claude/ClaudeChatService.js.map +1 -1
- package/dist/services/chat/providers/gemini/GeminiChatService.js +5 -10
- package/dist/services/chat/providers/gemini/GeminiChatService.js.map +1 -1
- package/dist/services/chat/providers/openai/OpenAIChatService.js +8 -27
- package/dist/services/chat/providers/openai/OpenAIChatService.js.map +1 -1
- package/dist/types/index.d.ts +1 -8
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +1 -1
- package/dist/utils/chatServiceHttpClient.d.ts +46 -0
- package/dist/utils/chatServiceHttpClient.js +126 -0
- package/dist/utils/chatServiceHttpClient.js.map +1 -0
- package/dist/utils/emotionParser.d.ts +45 -0
- package/dist/utils/emotionParser.js +55 -0
- package/dist/utils/emotionParser.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/screenplay.js +5 -13
- package/dist/utils/screenplay.js.map +1 -1
- package/dist/utils/streamTextAccumulator.d.ts +24 -0
- package/dist/utils/streamTextAccumulator.js +43 -0
- package/dist/utils/streamTextAccumulator.js.map +1 -0
- package/package.json +4 -1
- package/dist/constants/voiceEngine.d.ts +0 -9
- package/dist/constants/voiceEngine.js +0 -12
- package/dist/constants/voiceEngine.js.map +0 -1
- package/dist/services/voice/VoiceEngineAdapter.d.ts +0 -46
- package/dist/services/voice/VoiceEngineAdapter.js +0 -205
- package/dist/services/voice/VoiceEngineAdapter.js.map +0 -1
- package/dist/services/voice/VoiceService.d.ts +0 -65
- package/dist/services/voice/VoiceService.js +0 -2
- package/dist/services/voice/VoiceService.js.map +0 -1
- package/dist/services/voice/engines/AivisSpeechEngine.d.ts +0 -16
- package/dist/services/voice/engines/AivisSpeechEngine.js +0 -80
- package/dist/services/voice/engines/AivisSpeechEngine.js.map +0 -1
- package/dist/services/voice/engines/MinimaxEngine.d.ts +0 -131
- package/dist/services/voice/engines/MinimaxEngine.js +0 -372
- package/dist/services/voice/engines/MinimaxEngine.js.map +0 -1
- package/dist/services/voice/engines/NijiVoiceEngine.d.ts +0 -11
- package/dist/services/voice/engines/NijiVoiceEngine.js +0 -105
- package/dist/services/voice/engines/NijiVoiceEngine.js.map +0 -1
- package/dist/services/voice/engines/NoneEngine.d.ts +0 -28
- package/dist/services/voice/engines/NoneEngine.js +0 -34
- package/dist/services/voice/engines/NoneEngine.js.map +0 -1
- package/dist/services/voice/engines/OpenAiEngine.d.ts +0 -9
- package/dist/services/voice/engines/OpenAiEngine.js +0 -35
- package/dist/services/voice/engines/OpenAiEngine.js.map +0 -1
- package/dist/services/voice/engines/VoiceEngine.d.ts +0 -25
- package/dist/services/voice/engines/VoiceEngine.js +0 -2
- package/dist/services/voice/engines/VoiceEngine.js.map +0 -1
- package/dist/services/voice/engines/VoiceEngineFactory.d.ts +0 -15
- package/dist/services/voice/engines/VoiceEngineFactory.js +0 -40
- package/dist/services/voice/engines/VoiceEngineFactory.js.map +0 -1
- package/dist/services/voice/engines/VoicePeakEngine.d.ts +0 -19
- package/dist/services/voice/engines/VoicePeakEngine.js +0 -58
- package/dist/services/voice/engines/VoicePeakEngine.js.map +0 -1
- package/dist/services/voice/engines/VoiceVoxEngine.d.ts +0 -19
- package/dist/services/voice/engines/VoiceVoxEngine.js +0 -77
- package/dist/services/voice/engines/VoiceVoxEngine.js.map +0 -1
- package/dist/services/voice/engines/index.d.ts +0 -8
- package/dist/services/voice/engines/index.js +0 -8
- package/dist/services/voice/engines/index.js.map +0 -1
- package/dist/services/voice/messages.d.ts +0 -3
- package/dist/services/voice/messages.js +0 -43
- package/dist/services/voice/messages.js.map +0 -1
- package/dist/types/nijiVoice.d.ts +0 -27
- package/dist/types/nijiVoice.js +0 -2
- package/dist/types/nijiVoice.js.map +0 -1
- package/dist/types/voice.d.ts +0 -35
- package/dist/types/voice.js +0 -19
- package/dist/types/voice.js.map +0 -1
- package/dist/types/voiceEngine.d.ts +0 -1
- package/dist/types/voiceEngine.js +0 -2
- package/dist/types/voiceEngine.js.map +0 -1
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
import { MINIMAX_GLOBAL_API_URL, MINIMAX_CHINA_API_URL, MINIMAX_GLOBAL_VOICE_LIST_URL, MINIMAX_CHINA_VOICE_LIST_URL, } from '../../../constants';
|
|
2
|
-
/**
|
|
3
|
-
* MiniMax TTS voice synthesis engine
|
|
4
|
-
*/
|
|
5
|
-
export class MinimaxEngine {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.model = 'speech-02-hd';
|
|
8
|
-
this.defaultVoiceId = 'male-qn-qingse';
|
|
9
|
-
this.language = 'Japanese';
|
|
10
|
-
this.endpoint = 'global';
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Set GroupId for MiniMax API
|
|
14
|
-
*
|
|
15
|
-
* GroupId is a unique identifier for the user group in MiniMax's system.
|
|
16
|
-
* Unlike other TTS engines that only require an API key, MiniMax requires both
|
|
17
|
-
* an API key and a GroupId for authentication and usage tracking.
|
|
18
|
-
*
|
|
19
|
-
* This GroupId is used by MiniMax for:
|
|
20
|
-
* - User group management
|
|
21
|
-
* - Usage statistics tracking
|
|
22
|
-
* - Billing and quota management
|
|
23
|
-
*
|
|
24
|
-
* You must obtain this pre-generated value from your MiniMax account dashboard.
|
|
25
|
-
*
|
|
26
|
-
* @param groupId GroupId for MiniMax API (required for production synthesis)
|
|
27
|
-
*/
|
|
28
|
-
setGroupId(groupId) {
|
|
29
|
-
this.groupId = groupId;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Set endpoint region for MiniMax API
|
|
33
|
-
* @param endpoint Endpoint region ('global' or 'china')
|
|
34
|
-
*/
|
|
35
|
-
setEndpoint(endpoint) {
|
|
36
|
-
this.endpoint = endpoint;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Set model for MiniMax TTS
|
|
40
|
-
* @param model Model name (speech-02-hd, speech-02-turbo, speech-01-hd, speech-01-turbo)
|
|
41
|
-
*/
|
|
42
|
-
setModel(model) {
|
|
43
|
-
this.model = model;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Set language boost
|
|
47
|
-
* @param language Language to boost recognition
|
|
48
|
-
*/
|
|
49
|
-
setLanguage(language) {
|
|
50
|
-
this.language = language;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Get current API endpoint URL based on selected endpoint
|
|
54
|
-
* @returns API endpoint URL
|
|
55
|
-
*/
|
|
56
|
-
getTtsApiUrl() {
|
|
57
|
-
return this.endpoint === 'china'
|
|
58
|
-
? MINIMAX_CHINA_API_URL
|
|
59
|
-
: MINIMAX_GLOBAL_API_URL;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Get current voice list API endpoint URL based on selected endpoint
|
|
63
|
-
* @returns Voice list API endpoint URL
|
|
64
|
-
*/
|
|
65
|
-
getVoiceListApiUrl() {
|
|
66
|
-
return this.endpoint === 'china'
|
|
67
|
-
? MINIMAX_CHINA_VOICE_LIST_URL
|
|
68
|
-
: MINIMAX_GLOBAL_VOICE_LIST_URL;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Get available voice speakers list
|
|
72
|
-
* Requires only API key
|
|
73
|
-
* @param apiKey MiniMax API key
|
|
74
|
-
* @returns Promise<MinimaxVoiceSpeaker[]>
|
|
75
|
-
*/
|
|
76
|
-
async getVoiceList(apiKey) {
|
|
77
|
-
if (!apiKey) {
|
|
78
|
-
throw new Error('MiniMax API key is required');
|
|
79
|
-
}
|
|
80
|
-
const response = await fetch(this.getVoiceListApiUrl(), {
|
|
81
|
-
method: 'GET',
|
|
82
|
-
headers: {
|
|
83
|
-
Authorization: `Bearer ${apiKey}`,
|
|
84
|
-
'Content-Type': 'application/json',
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
if (!response.ok) {
|
|
88
|
-
let errorMessage = `Failed to fetch voice list: ${response.status}`;
|
|
89
|
-
try {
|
|
90
|
-
const errorText = await response.text();
|
|
91
|
-
console.error('Failed to fetch voice list from MiniMax:', response.status, errorText);
|
|
92
|
-
errorMessage = `Failed to fetch voice list: ${response.status} - ${errorText}`;
|
|
93
|
-
}
|
|
94
|
-
catch (e) {
|
|
95
|
-
console.error('Failed to fetch voice list from MiniMax:', response.status, response.statusText);
|
|
96
|
-
errorMessage = `Failed to fetch voice list: ${response.status} - ${response.statusText}`;
|
|
97
|
-
}
|
|
98
|
-
throw new Error(errorMessage);
|
|
99
|
-
}
|
|
100
|
-
const result = await response.json();
|
|
101
|
-
// Check base_resp for API errors
|
|
102
|
-
if (result.base_resp && result.base_resp.status_code !== 0) {
|
|
103
|
-
const errorMsg = result.base_resp.status_msg || 'Unknown error';
|
|
104
|
-
throw new Error(`MiniMax API error: ${result.base_resp.status_code} - ${errorMsg}`);
|
|
105
|
-
}
|
|
106
|
-
// Return voice speakers data
|
|
107
|
-
return result.data?.speakers || [];
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Test voice synthesis with minimal requirements
|
|
111
|
-
* Requires API key and voice ID, but not GroupId
|
|
112
|
-
* @param text Text to synthesize (shorter text recommended for testing)
|
|
113
|
-
* @param voiceId Voice ID to test
|
|
114
|
-
* @param apiKey MiniMax API key
|
|
115
|
-
* @returns Promise<ArrayBuffer>
|
|
116
|
-
*/
|
|
117
|
-
async testVoice(text, voiceId, apiKey) {
|
|
118
|
-
if (!apiKey) {
|
|
119
|
-
throw new Error('MiniMax API key is required');
|
|
120
|
-
}
|
|
121
|
-
if (!voiceId) {
|
|
122
|
-
throw new Error('Voice ID is required');
|
|
123
|
-
}
|
|
124
|
-
// Limit test text length to avoid quota waste
|
|
125
|
-
const testText = text.length > 100 ? text.substring(0, 100) + '...' : text;
|
|
126
|
-
// Use a temporary GroupId for testing or make it optional
|
|
127
|
-
const tempGroupId = this.groupId || '1';
|
|
128
|
-
const requestBody = {
|
|
129
|
-
model: this.model,
|
|
130
|
-
text: testText,
|
|
131
|
-
stream: false,
|
|
132
|
-
voice_setting: {
|
|
133
|
-
voice_id: voiceId,
|
|
134
|
-
speed: 1.0,
|
|
135
|
-
vol: 1.0,
|
|
136
|
-
pitch: 0,
|
|
137
|
-
},
|
|
138
|
-
audio_setting: {
|
|
139
|
-
sample_rate: 32000,
|
|
140
|
-
bitrate: 128000,
|
|
141
|
-
format: 'mp3',
|
|
142
|
-
channel: 1,
|
|
143
|
-
},
|
|
144
|
-
language_boost: this.language,
|
|
145
|
-
};
|
|
146
|
-
const response = await fetch(`${this.getTtsApiUrl()}?GroupId=${tempGroupId}`, {
|
|
147
|
-
method: 'POST',
|
|
148
|
-
headers: {
|
|
149
|
-
'Content-Type': 'application/json',
|
|
150
|
-
Authorization: `Bearer ${apiKey}`,
|
|
151
|
-
},
|
|
152
|
-
body: JSON.stringify(requestBody),
|
|
153
|
-
});
|
|
154
|
-
if (!response.ok) {
|
|
155
|
-
let errorMessage = `HTTP error ${response.status}`;
|
|
156
|
-
try {
|
|
157
|
-
const errorText = await response.text();
|
|
158
|
-
console.error('Failed to test voice from MiniMax:', response.status, errorText);
|
|
159
|
-
errorMessage = `Failed to test voice: ${response.status} - ${errorText}`;
|
|
160
|
-
}
|
|
161
|
-
catch (e) {
|
|
162
|
-
console.error('Failed to test voice from MiniMax:', response.status, response.statusText);
|
|
163
|
-
errorMessage = `Failed to test voice: ${response.status} - ${response.statusText}`;
|
|
164
|
-
}
|
|
165
|
-
throw new Error(errorMessage);
|
|
166
|
-
}
|
|
167
|
-
const result = await response.json();
|
|
168
|
-
// Check base_resp for API errors
|
|
169
|
-
if (result.base_resp && result.base_resp.status_code !== 0) {
|
|
170
|
-
const errorMsg = result.base_resp.status_msg || 'Unknown error';
|
|
171
|
-
throw new Error(`MiniMax API error: ${result.base_resp.status_code} - ${errorMsg}`);
|
|
172
|
-
}
|
|
173
|
-
// Get audio data from response
|
|
174
|
-
if (!result.data || !result.data.audio) {
|
|
175
|
-
console.error('Invalid response structure:', result);
|
|
176
|
-
throw new Error('Audio data not found in MiniMax response');
|
|
177
|
-
}
|
|
178
|
-
// Convert hex string to ArrayBuffer
|
|
179
|
-
try {
|
|
180
|
-
return this.hexToArrayBuffer(result.data.audio);
|
|
181
|
-
}
|
|
182
|
-
catch (error) {
|
|
183
|
-
console.error('Failed to convert hex audio data:', error);
|
|
184
|
-
throw new Error(`Failed to process audio data: ${error}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Full production audio synthesis
|
|
189
|
-
* Requires API key, voice ID, and GroupId
|
|
190
|
-
* @param input Talk object
|
|
191
|
-
* @param speaker Voice ID
|
|
192
|
-
* @param apiKey MiniMax API key
|
|
193
|
-
* @param voiceActor Not used for MiniMax (for interface compatibility)
|
|
194
|
-
* @returns Promise<ArrayBuffer>
|
|
195
|
-
*/
|
|
196
|
-
async fetchAudio(input, speaker, apiKey, voiceActor) {
|
|
197
|
-
return this.fetchAudioWithOptions(input, speaker, apiKey, true);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Audio synthesis with flexible GroupId requirement
|
|
201
|
-
* @param input Talk object
|
|
202
|
-
* @param speaker Voice ID
|
|
203
|
-
* @param apiKey MiniMax API key
|
|
204
|
-
* @param requireGroupId Whether to require GroupId (default: true)
|
|
205
|
-
* @returns Promise<ArrayBuffer>
|
|
206
|
-
*/
|
|
207
|
-
async fetchAudioWithOptions(input, speaker, apiKey, requireGroupId = true) {
|
|
208
|
-
if (!apiKey) {
|
|
209
|
-
throw new Error('MiniMax API key is required');
|
|
210
|
-
}
|
|
211
|
-
if (requireGroupId && !this.groupId) {
|
|
212
|
-
throw new Error('MiniMax GroupId is required for production synthesis. Please set it using setGroupId(), or use testVoice() for testing.');
|
|
213
|
-
}
|
|
214
|
-
const talk = input;
|
|
215
|
-
const text = talk.message.trim();
|
|
216
|
-
// Validate text length (max 5000 characters)
|
|
217
|
-
if (text.length > 5000) {
|
|
218
|
-
throw new Error('Text exceeds maximum length of 5000 characters');
|
|
219
|
-
}
|
|
220
|
-
// Get emotion from talk.style and adjust voice settings
|
|
221
|
-
const voiceSettings = this.getVoiceSettings(talk.style || 'talk');
|
|
222
|
-
const requestBody = {
|
|
223
|
-
model: this.model,
|
|
224
|
-
text: text,
|
|
225
|
-
stream: false,
|
|
226
|
-
voice_setting: {
|
|
227
|
-
voice_id: speaker || this.defaultVoiceId,
|
|
228
|
-
speed: voiceSettings.speed,
|
|
229
|
-
vol: voiceSettings.vol,
|
|
230
|
-
pitch: voiceSettings.pitch,
|
|
231
|
-
},
|
|
232
|
-
audio_setting: {
|
|
233
|
-
sample_rate: 32000,
|
|
234
|
-
bitrate: 128000,
|
|
235
|
-
format: 'mp3',
|
|
236
|
-
channel: 1,
|
|
237
|
-
},
|
|
238
|
-
language_boost: this.language,
|
|
239
|
-
};
|
|
240
|
-
// Use provided GroupId or temporary one for testing
|
|
241
|
-
const groupIdToUse = this.groupId || '1';
|
|
242
|
-
const response = await fetch(`${this.getTtsApiUrl()}?GroupId=${groupIdToUse}`, {
|
|
243
|
-
method: 'POST',
|
|
244
|
-
headers: {
|
|
245
|
-
'Content-Type': 'application/json',
|
|
246
|
-
Authorization: `Bearer ${apiKey}`,
|
|
247
|
-
},
|
|
248
|
-
body: JSON.stringify(requestBody),
|
|
249
|
-
});
|
|
250
|
-
if (!response.ok) {
|
|
251
|
-
let errorMessage = `HTTP error ${response.status}`;
|
|
252
|
-
try {
|
|
253
|
-
const errorText = await response.text();
|
|
254
|
-
console.error('Failed to fetch TTS from MiniMax:', response.status, errorText);
|
|
255
|
-
errorMessage = `Failed to fetch TTS from MiniMax: ${response.status} - ${errorText}`;
|
|
256
|
-
}
|
|
257
|
-
catch (e) {
|
|
258
|
-
console.error('Failed to fetch TTS from MiniMax:', response.status, response.statusText);
|
|
259
|
-
errorMessage = `Failed to fetch TTS from MiniMax: ${response.status} - ${response.statusText}`;
|
|
260
|
-
}
|
|
261
|
-
throw new Error(errorMessage);
|
|
262
|
-
}
|
|
263
|
-
const result = await response.json();
|
|
264
|
-
// Check base_resp for API errors
|
|
265
|
-
if (result.base_resp && result.base_resp.status_code !== 0) {
|
|
266
|
-
const errorMsg = result.base_resp.status_msg || 'Unknown error';
|
|
267
|
-
throw new Error(`MiniMax API error: ${result.base_resp.status_code} - ${errorMsg}`);
|
|
268
|
-
}
|
|
269
|
-
// Get audio data from response
|
|
270
|
-
if (!result.data || !result.data.audio) {
|
|
271
|
-
console.error('Invalid response structure:', result);
|
|
272
|
-
throw new Error('Audio data not found in MiniMax response');
|
|
273
|
-
}
|
|
274
|
-
// Convert hex string to ArrayBuffer
|
|
275
|
-
try {
|
|
276
|
-
return this.hexToArrayBuffer(result.data.audio);
|
|
277
|
-
}
|
|
278
|
-
catch (error) {
|
|
279
|
-
console.error('Failed to convert hex audio data:', error);
|
|
280
|
-
throw new Error(`Failed to process audio data: ${error}`);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Check if GroupId is configured
|
|
285
|
-
* @returns boolean
|
|
286
|
-
*/
|
|
287
|
-
hasGroupId() {
|
|
288
|
-
return !!this.groupId;
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Get current endpoint setting
|
|
292
|
-
* @returns MinimaxEndpoint
|
|
293
|
-
*/
|
|
294
|
-
getEndpoint() {
|
|
295
|
-
return this.endpoint;
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Set custom API endpoint URL (VoiceEngine interface compatibility)
|
|
299
|
-
* @param apiUrl custom API endpoint URL
|
|
300
|
-
*/
|
|
301
|
-
setApiEndpoint(apiUrl) {
|
|
302
|
-
// For MiniMax, we override the endpoint URLs directly
|
|
303
|
-
if (apiUrl.includes('minimaxi.com')) {
|
|
304
|
-
this.endpoint = 'china';
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
this.endpoint = 'global';
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Get voice settings based on emotion
|
|
312
|
-
* @param emotion Emotion type
|
|
313
|
-
* @returns Voice settings
|
|
314
|
-
*/
|
|
315
|
-
getVoiceSettings(emotion) {
|
|
316
|
-
// Default settings
|
|
317
|
-
let speed = 1.0;
|
|
318
|
-
let vol = 1.0;
|
|
319
|
-
let pitch = 0;
|
|
320
|
-
// Adjust settings based on emotion
|
|
321
|
-
switch (emotion.toLowerCase()) {
|
|
322
|
-
case 'happy':
|
|
323
|
-
speed = 1.1;
|
|
324
|
-
pitch = 1;
|
|
325
|
-
break;
|
|
326
|
-
case 'sad':
|
|
327
|
-
speed = 0.9;
|
|
328
|
-
pitch = -1;
|
|
329
|
-
break;
|
|
330
|
-
case 'angry':
|
|
331
|
-
speed = 1.0;
|
|
332
|
-
vol = 1.1;
|
|
333
|
-
pitch = 0;
|
|
334
|
-
break;
|
|
335
|
-
case 'surprised':
|
|
336
|
-
speed = 1.2;
|
|
337
|
-
pitch = 2;
|
|
338
|
-
break;
|
|
339
|
-
default:
|
|
340
|
-
// Keep default values
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
return { speed, vol, pitch };
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Convert hex string to ArrayBuffer
|
|
347
|
-
* @param hex Hex string
|
|
348
|
-
* @returns ArrayBuffer
|
|
349
|
-
*/
|
|
350
|
-
hexToArrayBuffer(hex) {
|
|
351
|
-
// Remove any whitespace or newlines
|
|
352
|
-
const cleanHex = hex.replace(/[\s\n]/g, '');
|
|
353
|
-
// Ensure even number of characters
|
|
354
|
-
if (cleanHex.length % 2 !== 0) {
|
|
355
|
-
throw new Error('Invalid hex string: odd number of characters');
|
|
356
|
-
}
|
|
357
|
-
// Validate hex string
|
|
358
|
-
if (!/^[0-9a-fA-F]*$/.test(cleanHex)) {
|
|
359
|
-
throw new Error('Invalid hex string: contains non-hex characters');
|
|
360
|
-
}
|
|
361
|
-
const buffer = new ArrayBuffer(cleanHex.length / 2);
|
|
362
|
-
const view = new Uint8Array(buffer);
|
|
363
|
-
for (let i = 0; i < cleanHex.length; i += 2) {
|
|
364
|
-
view[i / 2] = Number.parseInt(cleanHex.substr(i, 2), 16);
|
|
365
|
-
}
|
|
366
|
-
return buffer;
|
|
367
|
-
}
|
|
368
|
-
getTestMessage(textVoiceText) {
|
|
369
|
-
return textVoiceText || 'MiniMax Audioを使用します';
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
//# sourceMappingURL=MinimaxEngine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MinimaxEngine.js","sourceRoot":"","sources":["../../../../src/services/voice/engines/MinimaxEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { VoiceActor, Talk } from '../../../types';
|
|
2
|
-
import { VoiceEngine } from './VoiceEngine';
|
|
3
|
-
/**
|
|
4
|
-
* NijiVoice voice synthesis engine
|
|
5
|
-
*/
|
|
6
|
-
export declare class NijiVoiceEngine implements VoiceEngine {
|
|
7
|
-
fetchAudio(input: Talk, speaker: string, apiKey?: string, voiceActor?: VoiceActor): Promise<ArrayBuffer>;
|
|
8
|
-
private processEmotionParams;
|
|
9
|
-
private base64ToArrayBuffer;
|
|
10
|
-
getTestMessage(textVoiceText?: string): string;
|
|
11
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { NIJI_VOICE_API_URL } from '../../../constants';
|
|
2
|
-
/**
|
|
3
|
-
* NijiVoice voice synthesis engine
|
|
4
|
-
*/
|
|
5
|
-
export class NijiVoiceEngine {
|
|
6
|
-
async fetchAudio(input, speaker, apiKey, voiceActor) {
|
|
7
|
-
if (!apiKey) {
|
|
8
|
-
throw new Error('NijiVoice API key is required');
|
|
9
|
-
}
|
|
10
|
-
const talk = input;
|
|
11
|
-
const script = talk.message.trim();
|
|
12
|
-
// get emotion from talk.style and process parameters
|
|
13
|
-
const emotion = talk.style || 'neutral';
|
|
14
|
-
const emotionParams = this.processEmotionParams(emotion, script, voiceActor);
|
|
15
|
-
const generateResponse = await fetch(`${NIJI_VOICE_API_URL}/voice-actors/${speaker}/generate-encoded-voice`, {
|
|
16
|
-
method: 'POST',
|
|
17
|
-
headers: {
|
|
18
|
-
'x-api-key': apiKey,
|
|
19
|
-
'Content-Type': 'application/json',
|
|
20
|
-
accept: 'application/json',
|
|
21
|
-
},
|
|
22
|
-
body: JSON.stringify({
|
|
23
|
-
script: emotionParams.script,
|
|
24
|
-
speed: emotionParams.speed,
|
|
25
|
-
emotionalLevel: emotionParams.emotionalLevel,
|
|
26
|
-
format: 'mp3',
|
|
27
|
-
}),
|
|
28
|
-
});
|
|
29
|
-
if (!generateResponse.ok) {
|
|
30
|
-
const errorBody = await generateResponse.text();
|
|
31
|
-
console.error('NijiVoice generate-encoded-voice error:', errorBody);
|
|
32
|
-
throw new Error('Failed to generate voice from NijiVoice');
|
|
33
|
-
}
|
|
34
|
-
const generateResult = (await generateResponse.json());
|
|
35
|
-
const base64Audio = generateResult.generatedVoice?.base64Audio;
|
|
36
|
-
if (!base64Audio) {
|
|
37
|
-
throw new Error('Base64 audio not found in NijiVoice response');
|
|
38
|
-
}
|
|
39
|
-
return this.base64ToArrayBuffer(base64Audio);
|
|
40
|
-
}
|
|
41
|
-
processEmotionParams(emotion, script, voiceActor) {
|
|
42
|
-
// set default values
|
|
43
|
-
const defaultEmotionalLevel = 0.7; // default emotional level
|
|
44
|
-
const defaultSpeed = 1.0; // default speed
|
|
45
|
-
let emotionalLevel;
|
|
46
|
-
// if voiceActor does not exist, use default values
|
|
47
|
-
let speed = voiceActor?.recommendedVoiceSpeed
|
|
48
|
-
? String(voiceActor.recommendedVoiceSpeed)
|
|
49
|
-
: String(defaultSpeed);
|
|
50
|
-
// base emotional level (use voiceActor's recommendedEmotionalLevel or default values)
|
|
51
|
-
const baseEmotionalLevel = voiceActor?.recommendedEmotionalLevel
|
|
52
|
-
? Number(voiceActor.recommendedEmotionalLevel)
|
|
53
|
-
: defaultEmotionalLevel;
|
|
54
|
-
// base speed (use voiceActor's recommendedVoiceSpeed or default values)
|
|
55
|
-
let baseSpeed = voiceActor?.recommendedVoiceSpeed
|
|
56
|
-
? Number(voiceActor.recommendedVoiceSpeed)
|
|
57
|
-
: defaultSpeed;
|
|
58
|
-
// adjust according to emotion
|
|
59
|
-
let adjustment = '0.0';
|
|
60
|
-
switch (emotion.toLowerCase()) {
|
|
61
|
-
case 'happy':
|
|
62
|
-
adjustment = '0.2';
|
|
63
|
-
baseSpeed *= 1.1;
|
|
64
|
-
break;
|
|
65
|
-
case 'sad':
|
|
66
|
-
adjustment = '-0.4';
|
|
67
|
-
baseSpeed *= 0.9;
|
|
68
|
-
break;
|
|
69
|
-
case 'angry':
|
|
70
|
-
adjustment = '0.4';
|
|
71
|
-
baseSpeed *= 1.0;
|
|
72
|
-
break;
|
|
73
|
-
case 'surprised':
|
|
74
|
-
adjustment = '0.3';
|
|
75
|
-
baseSpeed *= 1.2;
|
|
76
|
-
break;
|
|
77
|
-
default:
|
|
78
|
-
// if default, set emotional level
|
|
79
|
-
emotionalLevel = String(baseEmotionalLevel);
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
if (adjustment !== '0.0') {
|
|
83
|
-
emotionalLevel = (Math.round(Math.min(Math.max(baseEmotionalLevel + Number(adjustment), 0), 1.5) *
|
|
84
|
-
10) / 10).toString();
|
|
85
|
-
}
|
|
86
|
-
// ensure speed is always between 0.4 and 3.0
|
|
87
|
-
speed = (Math.round(Math.min(Math.max(baseSpeed, 0.4), 3.0) * 10) / 10).toString();
|
|
88
|
-
return { script, emotionalLevel, speed };
|
|
89
|
-
}
|
|
90
|
-
base64ToArrayBuffer(base64) {
|
|
91
|
-
const sanitizedBase64 = base64.replace(/[\r\n\s]/g, '');
|
|
92
|
-
const binaryString = atob(sanitizedBase64);
|
|
93
|
-
const len = binaryString.length;
|
|
94
|
-
const buffer = new ArrayBuffer(len);
|
|
95
|
-
const view = new Uint8Array(buffer);
|
|
96
|
-
for (let i = 0; i < len; i++) {
|
|
97
|
-
view[i] = binaryString.charCodeAt(i);
|
|
98
|
-
}
|
|
99
|
-
return buffer;
|
|
100
|
-
}
|
|
101
|
-
getTestMessage(textVoiceText) {
|
|
102
|
-
return textVoiceText || 'にじボイスを使用します';
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=NijiVoiceEngine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NijiVoiceEngine.js","sourceRoot":"","sources":["../../../../src/services/voice/engines/NijiVoiceEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { VoiceActor, Talk } from '../../../types';
|
|
2
|
-
import { VoiceEngine } from './VoiceEngine';
|
|
3
|
-
/**
|
|
4
|
-
* None (no voice) engine
|
|
5
|
-
* Implementation using Null Object pattern that performs no voice processing
|
|
6
|
-
*/
|
|
7
|
-
export declare class NoneEngine implements VoiceEngine {
|
|
8
|
-
/**
|
|
9
|
-
* Get voice data (performs no processing)
|
|
10
|
-
* @param input script
|
|
11
|
-
* @param speaker speaker ID
|
|
12
|
-
* @param apiKey API key (not used)
|
|
13
|
-
* @param voiceActor voice actor information (not used)
|
|
14
|
-
* @returns empty ArrayBuffer
|
|
15
|
-
*/
|
|
16
|
-
fetchAudio(input: Talk, speaker: string, apiKey?: string, voiceActor?: VoiceActor): Promise<ArrayBuffer>;
|
|
17
|
-
/**
|
|
18
|
-
* Get test message
|
|
19
|
-
* @param textVoiceText custom text
|
|
20
|
-
* @returns test message
|
|
21
|
-
*/
|
|
22
|
-
getTestMessage(textVoiceText?: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* Set custom API endpoint URL (performs no processing)
|
|
25
|
-
* @param apiUrl custom API endpoint URL
|
|
26
|
-
*/
|
|
27
|
-
setApiEndpoint?(apiUrl: string): void;
|
|
28
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* None (no voice) engine
|
|
3
|
-
* Implementation using Null Object pattern that performs no voice processing
|
|
4
|
-
*/
|
|
5
|
-
export class NoneEngine {
|
|
6
|
-
/**
|
|
7
|
-
* Get voice data (performs no processing)
|
|
8
|
-
* @param input script
|
|
9
|
-
* @param speaker speaker ID
|
|
10
|
-
* @param apiKey API key (not used)
|
|
11
|
-
* @param voiceActor voice actor information (not used)
|
|
12
|
-
* @returns empty ArrayBuffer
|
|
13
|
-
*/
|
|
14
|
-
async fetchAudio(input, speaker, apiKey, voiceActor) {
|
|
15
|
-
// Return empty ArrayBuffer since no voice is needed
|
|
16
|
-
return new ArrayBuffer(0);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Get test message
|
|
20
|
-
* @param textVoiceText custom text
|
|
21
|
-
* @returns test message
|
|
22
|
-
*/
|
|
23
|
-
getTestMessage(textVoiceText) {
|
|
24
|
-
return textVoiceText || 'No voice mode is active';
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Set custom API endpoint URL (performs no processing)
|
|
28
|
-
* @param apiUrl custom API endpoint URL
|
|
29
|
-
*/
|
|
30
|
-
setApiEndpoint(apiUrl) {
|
|
31
|
-
// No processing needed in no voice mode
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=NoneEngine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NoneEngine.js","sourceRoot":"","sources":["../../../../src/services/voice/engines/NoneEngine.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,UAAU;IACrB;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CACd,KAAW,EACX,OAAe,EACf,MAAe,EACf,UAAuB;QAEvB,oDAAoD;QACpD,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,aAAsB;QACnC,OAAO,aAAa,IAAI,yBAAyB,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,cAAc,CAAE,MAAc;QAC5B,wCAAwC;IAC1C,CAAC;CACF"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Talk } from '../../../types';
|
|
2
|
-
import { VoiceEngine } from './VoiceEngine';
|
|
3
|
-
/**
|
|
4
|
-
* OpenAI TTS voice synthesis engine
|
|
5
|
-
*/
|
|
6
|
-
export declare class OpenAiEngine implements VoiceEngine {
|
|
7
|
-
fetchAudio(input: Talk, speaker: string, apiKey?: string): Promise<ArrayBuffer>;
|
|
8
|
-
getTestMessage(textVoiceText?: string): string;
|
|
9
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { OPENAI_TTS_API_URL } from '../../../constants';
|
|
2
|
-
/**
|
|
3
|
-
* OpenAI TTS voice synthesis engine
|
|
4
|
-
*/
|
|
5
|
-
export class OpenAiEngine {
|
|
6
|
-
async fetchAudio(input, speaker, apiKey) {
|
|
7
|
-
if (!apiKey) {
|
|
8
|
-
throw new Error('OpenAI API key is required');
|
|
9
|
-
}
|
|
10
|
-
const talk = input;
|
|
11
|
-
const text = talk.message.trim();
|
|
12
|
-
const response = await fetch(OPENAI_TTS_API_URL, {
|
|
13
|
-
method: 'POST',
|
|
14
|
-
headers: {
|
|
15
|
-
'Content-Type': 'application/json',
|
|
16
|
-
Authorization: `Bearer ${apiKey}`,
|
|
17
|
-
},
|
|
18
|
-
body: JSON.stringify({
|
|
19
|
-
model: 'tts-1',
|
|
20
|
-
voice: speaker,
|
|
21
|
-
input: text,
|
|
22
|
-
}),
|
|
23
|
-
});
|
|
24
|
-
if (!response.ok) {
|
|
25
|
-
console.error('Failed to fetch TTS from OpenAI TTS:', response.status);
|
|
26
|
-
throw new Error('Failed to fetch TTS from OpenAI TTS.');
|
|
27
|
-
}
|
|
28
|
-
const blob = await response.blob();
|
|
29
|
-
return await blob.arrayBuffer();
|
|
30
|
-
}
|
|
31
|
-
getTestMessage(textVoiceText) {
|
|
32
|
-
return textVoiceText || 'OpenAI TTSを使用します';
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=OpenAiEngine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAiEngine.js","sourceRoot":"","sources":["../../../../src/services/voice/engines/OpenAiEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD;;GAEG;AACH,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,UAAU,CACd,KAAW,EACX,OAAe,EACf,MAAe;QAEf,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,KAAa,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,IAAI;aACZ,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IAED,cAAc,CAAC,aAAsB;QACnC,OAAO,aAAa,IAAI,kBAAkB,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { VoiceActor, Talk } from '../../../types';
|
|
2
|
-
/**
|
|
3
|
-
* Common interface for voice engines
|
|
4
|
-
*/
|
|
5
|
-
export interface VoiceEngine {
|
|
6
|
-
/**
|
|
7
|
-
* Get voice data
|
|
8
|
-
* @param input script
|
|
9
|
-
* @param speaker speaker ID
|
|
10
|
-
* @param apiKey API key (if needed)
|
|
11
|
-
* @param voiceActor voice actor information (for NijiVoice)
|
|
12
|
-
* @returns ArrayBuffer of voice data
|
|
13
|
-
*/
|
|
14
|
-
fetchAudio(input: Talk, speaker: string, apiKey?: string, voiceActor?: VoiceActor): Promise<ArrayBuffer>;
|
|
15
|
-
/**
|
|
16
|
-
* Get a test message
|
|
17
|
-
* @returns test message
|
|
18
|
-
*/
|
|
19
|
-
getTestMessage(textVoiceText?: string): string;
|
|
20
|
-
/**
|
|
21
|
-
* Set custom API endpoint URL
|
|
22
|
-
* @param apiUrl custom API endpoint URL
|
|
23
|
-
*/
|
|
24
|
-
setApiEndpoint?(apiUrl: string): void;
|
|
25
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceEngine.js","sourceRoot":"","sources":["../../../../src/services/voice/engines/VoiceEngine.ts"],"names":[],"mappings":""}
|