@aituber-onair/core 0.13.0 → 0.15.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/README.md +25 -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 -7
- 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 -5
- package/dist/constants/voiceEngine.js +0 -6
- package/dist/constants/voiceEngine.js.map +0 -1
- package/dist/services/voice/VoiceEngineAdapter.d.ts +0 -46
- package/dist/services/voice/VoiceEngineAdapter.js +0 -192
- package/dist/services/voice/VoiceEngineAdapter.js.map +0 -1
- package/dist/services/voice/VoiceService.d.ts +0 -61
- 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/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 -37
- 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 -7
- package/dist/services/voice/engines/index.js +0 -7
- 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,192 +0,0 @@
|
|
|
1
|
-
import { textToScreenplay } from '../../utils/screenplay';
|
|
2
|
-
/**
|
|
3
|
-
* Adapter implementation for using existing voice engines
|
|
4
|
-
*/
|
|
5
|
-
export class VoiceEngineAdapter {
|
|
6
|
-
/**
|
|
7
|
-
* Constructor
|
|
8
|
-
* @param options Voice service options
|
|
9
|
-
*/
|
|
10
|
-
constructor(options) {
|
|
11
|
-
this.isPlayingAudio = false;
|
|
12
|
-
this.audioElement = null;
|
|
13
|
-
this.options = options;
|
|
14
|
-
// Create reusable audio element
|
|
15
|
-
if (typeof window !== 'undefined') {
|
|
16
|
-
this.audioElement = document.createElement('audio');
|
|
17
|
-
this.audioElement.addEventListener('ended', () => {
|
|
18
|
-
this.isPlayingAudio = false;
|
|
19
|
-
if (this.options.onComplete) {
|
|
20
|
-
this.options.onComplete();
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Speak the screenplay as audio
|
|
27
|
-
* @param screenplay Screenplay (text and emotion)
|
|
28
|
-
* @param options Audio playback options
|
|
29
|
-
*/
|
|
30
|
-
async speak(screenplay, options) {
|
|
31
|
-
try {
|
|
32
|
-
if (this.isPlayingAudio) {
|
|
33
|
-
this.stop();
|
|
34
|
-
}
|
|
35
|
-
this.isPlayingAudio = true;
|
|
36
|
-
// Import existing VoiceEngineFactory dynamically
|
|
37
|
-
const { VoiceEngineFactory } = await import('./engines/VoiceEngineFactory');
|
|
38
|
-
// Map emotion to style used by existing engine
|
|
39
|
-
const getStyleFromEmotion = (emotion) => {
|
|
40
|
-
switch (emotion) {
|
|
41
|
-
case 'angry':
|
|
42
|
-
return 'angry';
|
|
43
|
-
case 'happy':
|
|
44
|
-
return 'happy';
|
|
45
|
-
case 'sad':
|
|
46
|
-
return 'sad';
|
|
47
|
-
case 'surprised':
|
|
48
|
-
return 'surprised';
|
|
49
|
-
default:
|
|
50
|
-
return 'neutral';
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
// Convert to Talk type for VoiceEngine
|
|
54
|
-
const talk = {
|
|
55
|
-
style: getStyleFromEmotion(screenplay.emotion || 'neutral'),
|
|
56
|
-
message: screenplay.text,
|
|
57
|
-
};
|
|
58
|
-
const engine = VoiceEngineFactory.getEngine(this.options.engineType);
|
|
59
|
-
// カスタムエンドポイントURLの設定
|
|
60
|
-
if (engine.setApiEndpoint) {
|
|
61
|
-
// エンジンタイプに応じてカスタムエンドポイントURLを設定
|
|
62
|
-
switch (this.options.engineType) {
|
|
63
|
-
case 'voicevox':
|
|
64
|
-
if (this.options.voicevoxApiUrl) {
|
|
65
|
-
engine.setApiEndpoint(this.options.voicevoxApiUrl);
|
|
66
|
-
}
|
|
67
|
-
break;
|
|
68
|
-
case 'voicepeak':
|
|
69
|
-
if (this.options.voicepeakApiUrl) {
|
|
70
|
-
engine.setApiEndpoint(this.options.voicepeakApiUrl);
|
|
71
|
-
}
|
|
72
|
-
break;
|
|
73
|
-
case 'aivisSpeech':
|
|
74
|
-
if (this.options.aivisSpeechApiUrl) {
|
|
75
|
-
engine.setApiEndpoint(this.options.aivisSpeechApiUrl);
|
|
76
|
-
}
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// Get audio data
|
|
81
|
-
const audioBuffer = await engine.fetchAudio(talk, // Use any for type compatibility
|
|
82
|
-
this.options.speaker, this.options.apiKey);
|
|
83
|
-
// If there is a custom playback process, use it
|
|
84
|
-
if (this.options.onPlay) {
|
|
85
|
-
await this.options.onPlay(audioBuffer, options);
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
// Default playback process
|
|
89
|
-
await this.playAudioBuffer(audioBuffer, options?.audioElementId);
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
console.error('Error in speak:', error);
|
|
93
|
-
this.isPlayingAudio = false;
|
|
94
|
-
throw error;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Speak text as audio
|
|
99
|
-
* @param text Text (with emotion tags) to speak
|
|
100
|
-
* @param options Audio playback options
|
|
101
|
-
*/
|
|
102
|
-
async speakText(text, options) {
|
|
103
|
-
// Convert text to screenplay and play
|
|
104
|
-
const screenplay = textToScreenplay(text);
|
|
105
|
-
return this.speak(screenplay, options);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Get whether currently playing
|
|
109
|
-
*/
|
|
110
|
-
isPlaying() {
|
|
111
|
-
return this.isPlayingAudio;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Stop playback
|
|
115
|
-
*/
|
|
116
|
-
stop() {
|
|
117
|
-
if (this.audioElement) {
|
|
118
|
-
this.audioElement.pause();
|
|
119
|
-
this.audioElement.currentTime = 0;
|
|
120
|
-
}
|
|
121
|
-
this.isPlayingAudio = false;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Update service settings
|
|
125
|
-
* @param options New settings options
|
|
126
|
-
*/
|
|
127
|
-
updateOptions(options) {
|
|
128
|
-
this.options = { ...this.options, ...options };
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Play audio buffer
|
|
132
|
-
* @param audioBuffer Audio data ArrayBuffer
|
|
133
|
-
* @param audioElementId ID of HTML element to play audio (use internal element if omitted)
|
|
134
|
-
*/
|
|
135
|
-
async playAudioBuffer(audioBuffer, audioElementId) {
|
|
136
|
-
return new Promise((resolve, reject) => {
|
|
137
|
-
try {
|
|
138
|
-
// If not in browser environment, do nothing
|
|
139
|
-
if (typeof window === 'undefined') {
|
|
140
|
-
this.isPlayingAudio = false;
|
|
141
|
-
resolve();
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
// Create Blob from audio data
|
|
145
|
-
const blob = new Blob([audioBuffer], { type: 'audio/wav' });
|
|
146
|
-
const url = URL.createObjectURL(blob);
|
|
147
|
-
// Get/create audio element for playback
|
|
148
|
-
let audioEl = this.audioElement;
|
|
149
|
-
if (audioElementId) {
|
|
150
|
-
const customAudioEl = document.getElementById(audioElementId);
|
|
151
|
-
if (customAudioEl) {
|
|
152
|
-
audioEl = customAudioEl;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (!audioEl) {
|
|
156
|
-
reject(new Error('Audio element not available'));
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
// Set event listeners
|
|
160
|
-
const onEnded = () => {
|
|
161
|
-
this.isPlayingAudio = false;
|
|
162
|
-
URL.revokeObjectURL(url);
|
|
163
|
-
audioEl?.removeEventListener('ended', onEnded);
|
|
164
|
-
if (this.options.onComplete) {
|
|
165
|
-
this.options.onComplete();
|
|
166
|
-
}
|
|
167
|
-
resolve();
|
|
168
|
-
};
|
|
169
|
-
const onError = (e) => {
|
|
170
|
-
this.isPlayingAudio = false;
|
|
171
|
-
URL.revokeObjectURL(url);
|
|
172
|
-
audioEl?.removeEventListener('error', onError);
|
|
173
|
-
reject(new Error(`Audio playback error: ${e.message}`));
|
|
174
|
-
};
|
|
175
|
-
audioEl.addEventListener('ended', onEnded);
|
|
176
|
-
audioEl.addEventListener('error', onError);
|
|
177
|
-
// Play audio
|
|
178
|
-
audioEl.src = url;
|
|
179
|
-
audioEl.play().catch((error) => {
|
|
180
|
-
this.isPlayingAudio = false;
|
|
181
|
-
URL.revokeObjectURL(url);
|
|
182
|
-
reject(error);
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
this.isPlayingAudio = false;
|
|
187
|
-
reject(error);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=VoiceEngineAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceEngineAdapter.js","sourceRoot":"","sources":["../../../src/services/voice/VoiceEngineAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { ChatScreenplay, VoiceEngineType } from '../../types';
|
|
2
|
-
/**
|
|
3
|
-
* Voice service settings options
|
|
4
|
-
*/
|
|
5
|
-
export interface VoiceServiceOptions {
|
|
6
|
-
/** Speaker ID */
|
|
7
|
-
speaker: string;
|
|
8
|
-
/** Engine type (voicevox, voicepeak, openai, nijivoice, aivisSpeech) */
|
|
9
|
-
engineType: VoiceEngineType;
|
|
10
|
-
/** API key (if needed) */
|
|
11
|
-
apiKey?: string;
|
|
12
|
-
/** Audio playback callback */
|
|
13
|
-
onPlay?: (audioBuffer: ArrayBuffer, options?: AudioPlayOptions) => Promise<void>;
|
|
14
|
-
/** Audio playback complete callback */
|
|
15
|
-
onComplete?: () => void;
|
|
16
|
-
/** Custom VOICEVOX API endpoint URL */
|
|
17
|
-
voicevoxApiUrl?: string;
|
|
18
|
-
/** Custom VOICEPEAK API endpoint URL */
|
|
19
|
-
voicepeakApiUrl?: string;
|
|
20
|
-
/** Custom AIVIS SPEECH API endpoint URL */
|
|
21
|
-
aivisSpeechApiUrl?: string;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Audio playback options
|
|
25
|
-
*/
|
|
26
|
-
export interface AudioPlayOptions {
|
|
27
|
-
/** ID of HTML element to play audio */
|
|
28
|
-
audioElementId?: string;
|
|
29
|
-
/** Enable animation processing */
|
|
30
|
-
enableAnimation?: boolean;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Voice service interface
|
|
34
|
-
*/
|
|
35
|
-
export interface VoiceService {
|
|
36
|
-
/**
|
|
37
|
-
* Speak screenplay as audio
|
|
38
|
-
* @param screenplay Screenplay (text and emotion)
|
|
39
|
-
* @param options Audio playback options (default settings if omitted)
|
|
40
|
-
*/
|
|
41
|
-
speak(screenplay: ChatScreenplay, options?: AudioPlayOptions): Promise<void>;
|
|
42
|
-
/**
|
|
43
|
-
* Speak text as audio
|
|
44
|
-
* @param text Text (with emotion tags) to speak
|
|
45
|
-
* @param options Audio playback options (default settings if omitted)
|
|
46
|
-
*/
|
|
47
|
-
speakText(text: string, options?: AudioPlayOptions): Promise<void>;
|
|
48
|
-
/**
|
|
49
|
-
* Get whether currently playing
|
|
50
|
-
*/
|
|
51
|
-
isPlaying(): boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Stop playback
|
|
54
|
-
*/
|
|
55
|
-
stop(): void;
|
|
56
|
-
/**
|
|
57
|
-
* Update service settings
|
|
58
|
-
* @param options New settings options
|
|
59
|
-
*/
|
|
60
|
-
updateOptions(options: Partial<VoiceServiceOptions>): void;
|
|
61
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceService.js","sourceRoot":"","sources":["../../../src/services/voice/VoiceService.ts"],"names":[],"mappings":""}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Talk } from '../../../types';
|
|
2
|
-
import { VoiceEngine } from './VoiceEngine';
|
|
3
|
-
/**
|
|
4
|
-
* AivisSpeech voice synthesis engine
|
|
5
|
-
*/
|
|
6
|
-
export declare class AivisSpeechEngine implements VoiceEngine {
|
|
7
|
-
private apiEndpoint;
|
|
8
|
-
fetchAudio(input: Talk, speaker: string): Promise<ArrayBuffer>;
|
|
9
|
-
private adjustEmotionParameters;
|
|
10
|
-
getTestMessage(textVoiceText?: string): string;
|
|
11
|
-
/**
|
|
12
|
-
* Set custom API endpoint URL
|
|
13
|
-
* @param apiUrl custom API endpoint URL
|
|
14
|
-
*/
|
|
15
|
-
setApiEndpoint(apiUrl: string): void;
|
|
16
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { AIVIS_SPEECH_API_URL } from '../../../constants';
|
|
2
|
-
/**
|
|
3
|
-
* AivisSpeech voice synthesis engine
|
|
4
|
-
*/
|
|
5
|
-
export class AivisSpeechEngine {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.apiEndpoint = AIVIS_SPEECH_API_URL;
|
|
8
|
-
}
|
|
9
|
-
async fetchAudio(input, speaker) {
|
|
10
|
-
const talk = input;
|
|
11
|
-
// talk.styleから感情を取得
|
|
12
|
-
const emotion = talk.style || 'neutral';
|
|
13
|
-
const text = talk.message.trim();
|
|
14
|
-
const ttsQueryResponse = await fetch(`${this.apiEndpoint}/audio_query?speaker=${speaker}&text=${encodeURIComponent(text)}`, { method: 'POST' });
|
|
15
|
-
if (!ttsQueryResponse.ok) {
|
|
16
|
-
throw new Error('Failed to fetch TTS query from AivisSpeech Engine.');
|
|
17
|
-
}
|
|
18
|
-
const ttsQueryJson = await ttsQueryResponse.json();
|
|
19
|
-
// adjust parameters according to emotion
|
|
20
|
-
this.adjustEmotionParameters(ttsQueryJson, emotion);
|
|
21
|
-
const synthesisResponse = await fetch(`${this.apiEndpoint}/synthesis?speaker=${speaker}`, {
|
|
22
|
-
method: 'POST',
|
|
23
|
-
headers: {
|
|
24
|
-
'Content-Type': 'application/json',
|
|
25
|
-
'Transfer-Encoding': 'chunked',
|
|
26
|
-
},
|
|
27
|
-
body: JSON.stringify(ttsQueryJson),
|
|
28
|
-
});
|
|
29
|
-
if (!synthesisResponse.ok) {
|
|
30
|
-
throw new Error('Failed to fetch TTS synthesis result from AivisSpeech Engine.');
|
|
31
|
-
}
|
|
32
|
-
const blob = await synthesisResponse.blob();
|
|
33
|
-
return await blob.arrayBuffer();
|
|
34
|
-
}
|
|
35
|
-
adjustEmotionParameters(ttsQueryJson, emotion) {
|
|
36
|
-
// default values
|
|
37
|
-
ttsQueryJson.speedScale = 1.0;
|
|
38
|
-
ttsQueryJson.pitchScale = 0.0;
|
|
39
|
-
ttsQueryJson.intonationScale = 1.0;
|
|
40
|
-
ttsQueryJson.tempoDynamicsScale = 1.0;
|
|
41
|
-
switch (emotion.toLowerCase()) {
|
|
42
|
-
case 'happy':
|
|
43
|
-
ttsQueryJson.speedScale = 1.1;
|
|
44
|
-
ttsQueryJson.pitchScale = 0.05;
|
|
45
|
-
ttsQueryJson.intonationScale = 1.2;
|
|
46
|
-
ttsQueryJson.tempoDynamicsScale = 1.1;
|
|
47
|
-
break;
|
|
48
|
-
case 'sad':
|
|
49
|
-
ttsQueryJson.speedScale = 0.9;
|
|
50
|
-
ttsQueryJson.pitchScale = -0.03;
|
|
51
|
-
ttsQueryJson.intonationScale = 0.8;
|
|
52
|
-
ttsQueryJson.tempoDynamicsScale = 0.9;
|
|
53
|
-
break;
|
|
54
|
-
case 'angry':
|
|
55
|
-
ttsQueryJson.speedScale = 1.0;
|
|
56
|
-
ttsQueryJson.pitchScale = 0.0;
|
|
57
|
-
ttsQueryJson.intonationScale = 1.4;
|
|
58
|
-
ttsQueryJson.tempoDynamicsScale = 1.2;
|
|
59
|
-
break;
|
|
60
|
-
case 'surprised':
|
|
61
|
-
ttsQueryJson.speedScale = 1.2;
|
|
62
|
-
ttsQueryJson.pitchScale = 0.07;
|
|
63
|
-
ttsQueryJson.intonationScale = 1.3;
|
|
64
|
-
ttsQueryJson.tempoDynamicsScale = 1.0;
|
|
65
|
-
break;
|
|
66
|
-
// default: "neutral" etc. other than default values
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
getTestMessage(textVoiceText) {
|
|
70
|
-
return textVoiceText || 'アイビススピーチを使用します';
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Set custom API endpoint URL
|
|
74
|
-
* @param apiUrl custom API endpoint URL
|
|
75
|
-
*/
|
|
76
|
-
setApiEndpoint(apiUrl) {
|
|
77
|
-
this.apiEndpoint = apiUrl;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=AivisSpeechEngine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AivisSpeechEngine.js","sourceRoot":"","sources":["../../../../src/services/voice/engines/AivisSpeechEngine.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":""}
|