@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.
Files changed (82) hide show
  1. package/README.md +25 -1
  2. package/dist/constants/index.d.ts +0 -1
  3. package/dist/constants/index.js +0 -1
  4. package/dist/constants/index.js.map +1 -1
  5. package/dist/core/AITuberOnAirCore.d.ts +1 -1
  6. package/dist/core/AITuberOnAirCore.js +1 -1
  7. package/dist/core/AITuberOnAirCore.js.map +1 -1
  8. package/dist/index.d.ts +1 -3
  9. package/dist/index.js +10 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/services/chat/providers/claude/ClaudeChatService.js +2 -7
  12. package/dist/services/chat/providers/claude/ClaudeChatService.js.map +1 -1
  13. package/dist/services/chat/providers/gemini/GeminiChatService.js +5 -10
  14. package/dist/services/chat/providers/gemini/GeminiChatService.js.map +1 -1
  15. package/dist/services/chat/providers/openai/OpenAIChatService.js +8 -27
  16. package/dist/services/chat/providers/openai/OpenAIChatService.js.map +1 -1
  17. package/dist/types/index.d.ts +1 -7
  18. package/dist/types/index.js +0 -6
  19. package/dist/types/index.js.map +1 -1
  20. package/dist/utils/chatServiceHttpClient.d.ts +46 -0
  21. package/dist/utils/chatServiceHttpClient.js +126 -0
  22. package/dist/utils/chatServiceHttpClient.js.map +1 -0
  23. package/dist/utils/emotionParser.d.ts +45 -0
  24. package/dist/utils/emotionParser.js +55 -0
  25. package/dist/utils/emotionParser.js.map +1 -0
  26. package/dist/utils/index.d.ts +3 -0
  27. package/dist/utils/index.js +3 -0
  28. package/dist/utils/index.js.map +1 -1
  29. package/dist/utils/screenplay.js +5 -13
  30. package/dist/utils/screenplay.js.map +1 -1
  31. package/dist/utils/streamTextAccumulator.d.ts +24 -0
  32. package/dist/utils/streamTextAccumulator.js +43 -0
  33. package/dist/utils/streamTextAccumulator.js.map +1 -0
  34. package/package.json +4 -1
  35. package/dist/constants/voiceEngine.d.ts +0 -5
  36. package/dist/constants/voiceEngine.js +0 -6
  37. package/dist/constants/voiceEngine.js.map +0 -1
  38. package/dist/services/voice/VoiceEngineAdapter.d.ts +0 -46
  39. package/dist/services/voice/VoiceEngineAdapter.js +0 -192
  40. package/dist/services/voice/VoiceEngineAdapter.js.map +0 -1
  41. package/dist/services/voice/VoiceService.d.ts +0 -61
  42. package/dist/services/voice/VoiceService.js +0 -2
  43. package/dist/services/voice/VoiceService.js.map +0 -1
  44. package/dist/services/voice/engines/AivisSpeechEngine.d.ts +0 -16
  45. package/dist/services/voice/engines/AivisSpeechEngine.js +0 -80
  46. package/dist/services/voice/engines/AivisSpeechEngine.js.map +0 -1
  47. package/dist/services/voice/engines/NijiVoiceEngine.d.ts +0 -11
  48. package/dist/services/voice/engines/NijiVoiceEngine.js +0 -105
  49. package/dist/services/voice/engines/NijiVoiceEngine.js.map +0 -1
  50. package/dist/services/voice/engines/NoneEngine.d.ts +0 -28
  51. package/dist/services/voice/engines/NoneEngine.js +0 -34
  52. package/dist/services/voice/engines/NoneEngine.js.map +0 -1
  53. package/dist/services/voice/engines/OpenAiEngine.d.ts +0 -9
  54. package/dist/services/voice/engines/OpenAiEngine.js +0 -35
  55. package/dist/services/voice/engines/OpenAiEngine.js.map +0 -1
  56. package/dist/services/voice/engines/VoiceEngine.d.ts +0 -25
  57. package/dist/services/voice/engines/VoiceEngine.js +0 -2
  58. package/dist/services/voice/engines/VoiceEngine.js.map +0 -1
  59. package/dist/services/voice/engines/VoiceEngineFactory.d.ts +0 -15
  60. package/dist/services/voice/engines/VoiceEngineFactory.js +0 -37
  61. package/dist/services/voice/engines/VoiceEngineFactory.js.map +0 -1
  62. package/dist/services/voice/engines/VoicePeakEngine.d.ts +0 -19
  63. package/dist/services/voice/engines/VoicePeakEngine.js +0 -58
  64. package/dist/services/voice/engines/VoicePeakEngine.js.map +0 -1
  65. package/dist/services/voice/engines/VoiceVoxEngine.d.ts +0 -19
  66. package/dist/services/voice/engines/VoiceVoxEngine.js +0 -77
  67. package/dist/services/voice/engines/VoiceVoxEngine.js.map +0 -1
  68. package/dist/services/voice/engines/index.d.ts +0 -7
  69. package/dist/services/voice/engines/index.js +0 -7
  70. package/dist/services/voice/engines/index.js.map +0 -1
  71. package/dist/services/voice/messages.d.ts +0 -3
  72. package/dist/services/voice/messages.js +0 -43
  73. package/dist/services/voice/messages.js.map +0 -1
  74. package/dist/types/nijiVoice.d.ts +0 -27
  75. package/dist/types/nijiVoice.js +0 -2
  76. package/dist/types/nijiVoice.js.map +0 -1
  77. package/dist/types/voice.d.ts +0 -35
  78. package/dist/types/voice.js +0 -19
  79. package/dist/types/voice.js.map +0 -1
  80. package/dist/types/voiceEngine.d.ts +0 -1
  81. package/dist/types/voiceEngine.js +0 -2
  82. 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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=VoiceService.js.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=VoiceEngine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"VoiceEngine.js","sourceRoot":"","sources":["../../../../src/services/voice/engines/VoiceEngine.ts"],"names":[],"mappings":""}