@loonylabs/tts-middleware 0.7.0 → 0.9.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 +61 -2
- package/dist/middleware/services/tts/index.d.ts +3 -3
- package/dist/middleware/services/tts/index.d.ts.map +1 -1
- package/dist/middleware/services/tts/index.js +7 -1
- package/dist/middleware/services/tts/index.js.map +1 -1
- package/dist/middleware/services/tts/providers/fish-audio-provider.js +2 -2
- package/dist/middleware/services/tts/providers/fish-audio-provider.js.map +1 -1
- package/dist/middleware/services/tts/providers/gemini-provider.d.ts +142 -0
- package/dist/middleware/services/tts/providers/gemini-provider.d.ts.map +1 -0
- package/dist/middleware/services/tts/providers/gemini-provider.js +358 -0
- package/dist/middleware/services/tts/providers/gemini-provider.js.map +1 -0
- package/dist/middleware/services/tts/providers/google-cloud-tts-provider.d.ts.map +1 -1
- package/dist/middleware/services/tts/providers/google-cloud-tts-provider.js +0 -9
- package/dist/middleware/services/tts/providers/google-cloud-tts-provider.js.map +1 -1
- package/dist/middleware/services/tts/providers/index.d.ts +2 -0
- package/dist/middleware/services/tts/providers/index.d.ts.map +1 -1
- package/dist/middleware/services/tts/providers/index.js +5 -1
- package/dist/middleware/services/tts/providers/index.js.map +1 -1
- package/dist/middleware/services/tts/providers/inworld-provider.d.ts +100 -0
- package/dist/middleware/services/tts/providers/inworld-provider.d.ts.map +1 -0
- package/dist/middleware/services/tts/providers/inworld-provider.js +212 -0
- package/dist/middleware/services/tts/providers/inworld-provider.js.map +1 -0
- package/dist/middleware/services/tts/tts.service.d.ts.map +1 -1
- package/dist/middleware/services/tts/tts.service.js +26 -0
- package/dist/middleware/services/tts/tts.service.js.map +1 -1
- package/dist/middleware/services/tts/types/common.types.d.ts +11 -2
- package/dist/middleware/services/tts/types/common.types.d.ts.map +1 -1
- package/dist/middleware/services/tts/types/common.types.js +2 -0
- package/dist/middleware/services/tts/types/common.types.js.map +1 -1
- package/dist/middleware/services/tts/types/index.d.ts +2 -2
- package/dist/middleware/services/tts/types/index.d.ts.map +1 -1
- package/dist/middleware/services/tts/types/index.js +3 -1
- package/dist/middleware/services/tts/types/index.js.map +1 -1
- package/dist/middleware/services/tts/types/provider-options.types.d.ts +83 -62
- package/dist/middleware/services/tts/types/provider-options.types.d.ts.map +1 -1
- package/dist/middleware/services/tts/types/provider-options.types.js +28 -7
- package/dist/middleware/services/tts/types/provider-options.types.js.map +1 -1
- package/dist/middleware/shared/config/tts.config.d.ts +33 -0
- package/dist/middleware/shared/config/tts.config.d.ts.map +1 -1
- package/dist/middleware/shared/config/tts.config.js +24 -0
- package/dist/middleware/shared/config/tts.config.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# TTS Middleware
|
|
4
4
|
|
|
5
|
-
*Provider-agnostic Text-to-Speech middleware with **GDPR compliance** support. Currently supports Azure Speech Services, EdenAI, Google Cloud TTS, and
|
|
5
|
+
*Provider-agnostic Text-to-Speech middleware with **GDPR compliance** support. Currently supports Azure Speech Services, EdenAI, Google Cloud TTS, Fish Audio, Inworld AI, and Gemini TTS. Features EU data residency via Azure and Google Cloud, pluggable logging, character-based billing, and comprehensive error handling.*
|
|
6
6
|
|
|
7
7
|
<!-- Horizontal Badge Navigation Bar -->
|
|
8
8
|
[](https://www.npmjs.com/package/@loonylabs/tts-middleware)
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
- **EdenAI**: Aggregator with access to Google, OpenAI, Amazon, IBM, ElevenLabs
|
|
43
43
|
- **Google Cloud TTS**: Neural2, WaveNet, Studio voices with EU data residency
|
|
44
44
|
- **Fish Audio**: S1 model with 13 languages & 64+ emotions (test/admin only)
|
|
45
|
+
- **Inworld AI**: TTS 1.5 Max/Mini with 15 languages & voice cloning (test/admin only)
|
|
46
|
+
- **Gemini TTS**: Flash/Pro models with 30 voices, 90+ languages & style prompts (test/admin only)
|
|
45
47
|
- **Ready for:** OpenAI, ElevenLabs, Deepgram (interfaces prepared)
|
|
46
48
|
- **GDPR/DSGVO Compliance**: Built-in EU region support for Azure and Google Cloud
|
|
47
49
|
- **SSML Abstraction**: Auto-generates provider-specific SSML from simple JSON options
|
|
@@ -128,6 +130,22 @@ const fish = await ttsService.synthesize({
|
|
|
128
130
|
voice: { id: '90042f762dbf49baa2e7776d011eee6b' },
|
|
129
131
|
providerOptions: { model: 's1' },
|
|
130
132
|
});
|
|
133
|
+
|
|
134
|
+
// Inworld AI (test/admin only)
|
|
135
|
+
const inworld = await ttsService.synthesize({
|
|
136
|
+
text: 'Hello from Inworld AI!',
|
|
137
|
+
provider: TTSProvider.INWORLD,
|
|
138
|
+
voice: { id: 'Ashley' },
|
|
139
|
+
providerOptions: { modelId: 'inworld-tts-1.5-max', temperature: 1.1 },
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Gemini TTS via Vertex AI (test/admin only)
|
|
143
|
+
const gemini = await ttsService.synthesize({
|
|
144
|
+
text: 'Have a wonderful day!',
|
|
145
|
+
provider: TTSProvider.GEMINI,
|
|
146
|
+
voice: { id: 'Kore' },
|
|
147
|
+
providerOptions: { model: 'gemini-2.5-flash-preview-tts', stylePrompt: 'Say cheerfully:' },
|
|
148
|
+
});
|
|
131
149
|
```
|
|
132
150
|
|
|
133
151
|
</details>
|
|
@@ -228,6 +246,13 @@ GOOGLE_TTS_REGION=eu
|
|
|
228
246
|
# Fish Audio (test/admin only – no EU data residency)
|
|
229
247
|
FISH_AUDIO_API_KEY=your-fish-audio-api-key
|
|
230
248
|
|
|
249
|
+
# Inworld AI (test/admin only – no EU data residency)
|
|
250
|
+
INWORLD_API_KEY=your-inworld-api-key
|
|
251
|
+
|
|
252
|
+
# Gemini TTS via Vertex AI (test/admin only – no EU data residency)
|
|
253
|
+
# Reuses GOOGLE_APPLICATION_CREDENTIALS and GOOGLE_CLOUD_PROJECT from above
|
|
254
|
+
GEMINI_REGION=us-central1
|
|
255
|
+
|
|
231
256
|
# Logging
|
|
232
257
|
TTS_DEBUG=false
|
|
233
258
|
LOG_LEVEL=info
|
|
@@ -280,6 +305,31 @@ LOG_LEVEL=info
|
|
|
280
305
|
| **Pricing** | $15/1M UTF-8 bytes |
|
|
281
306
|
| **EU Compliance** | No data residency guarantees |
|
|
282
307
|
|
|
308
|
+
### Inworld AI (Test/Admin Only)
|
|
309
|
+
|
|
310
|
+
| Feature | Details |
|
|
311
|
+
|---------|---------|
|
|
312
|
+
| **Models** | TTS 1.5 Max (~200ms latency), TTS 1.5 Mini (~120ms latency) |
|
|
313
|
+
| **Languages** | 15 languages |
|
|
314
|
+
| **Voices** | Instant voice cloning + professional voice cloning |
|
|
315
|
+
| **Audio** | MP3, LINEAR16, OGG_OPUS, ALAW, MULAW, FLAC |
|
|
316
|
+
| **Controls** | temperature, speakingRate, timestamps, text normalization |
|
|
317
|
+
| **Pricing** | $10/1M chars (Max), $5/1M chars (Mini) |
|
|
318
|
+
| **EU Compliance** | No data residency guarantees |
|
|
319
|
+
|
|
320
|
+
### Gemini TTS (Test/Admin Only)
|
|
321
|
+
|
|
322
|
+
| Feature | Details |
|
|
323
|
+
|---------|---------|
|
|
324
|
+
| **Models** | Flash (budget, fast) and Pro (premium, natural) |
|
|
325
|
+
| **Languages** | 90+ with auto-detection |
|
|
326
|
+
| **Voices** | 30 multilingual: Kore, Puck, Charon, Zephyr, Fenrir, Sulafat, etc. |
|
|
327
|
+
| **Style Control** | Natural language prompts: "Say cheerfully:", "Read in a spooky whisper:" |
|
|
328
|
+
| **Audio** | MP3 (via ffmpeg), WAV (fallback) |
|
|
329
|
+
| **Auth** | Vertex AI Service Account (reuses `GOOGLE_APPLICATION_CREDENTIALS`) |
|
|
330
|
+
| **Pricing** | $0.50-1.00/M input tokens + $10-20/M audio output tokens |
|
|
331
|
+
| **EU Compliance** | No data residency guarantees |
|
|
332
|
+
|
|
283
333
|
## GDPR / Compliance
|
|
284
334
|
|
|
285
335
|
### Provider Compliance Overview
|
|
@@ -290,6 +340,8 @@ LOG_LEVEL=info
|
|
|
290
340
|
| **Google Cloud** | Yes | Yes | Yes (EU multi-region) | Full EU endpoint support |
|
|
291
341
|
| **EdenAI** | Yes | Depends* | Depends* | Depends on underlying provider |
|
|
292
342
|
| **Fish Audio** | No | No | No | Test/admin only |
|
|
343
|
+
| **Inworld AI** | No | No | No | Test/admin only |
|
|
344
|
+
| **Gemini TTS** | No | No | No | Test/admin only |
|
|
293
345
|
|
|
294
346
|
*EdenAI is an aggregator - compliance depends on the underlying provider.
|
|
295
347
|
|
|
@@ -457,6 +509,7 @@ const PROVIDER_RATES = {
|
|
|
457
509
|
[TTSProvider.AZURE]: 16 / 1_000_000,
|
|
458
510
|
[TTSProvider.GOOGLE]: 16 / 1_000_000,
|
|
459
511
|
[TTSProvider.FISH_AUDIO]: 15 / 1_000_000,
|
|
512
|
+
[TTSProvider.INWORLD]: 10 / 1_000_000, // Max model; Mini: $5/1M
|
|
460
513
|
};
|
|
461
514
|
|
|
462
515
|
const response = await ttsService.synthesize({ /* ... */ });
|
|
@@ -476,11 +529,15 @@ graph TD
|
|
|
476
529
|
Registry -->|Select| GCloud[GoogleCloudTTSProvider]
|
|
477
530
|
Registry -->|Select| Eden[EdenAIProvider]
|
|
478
531
|
Registry -->|Select| Fish[FishAudioProvider]
|
|
532
|
+
Registry -->|Select| Inworld[InworldProvider]
|
|
533
|
+
Registry -->|Select| Gemini[GeminiProvider]
|
|
479
534
|
|
|
480
535
|
Azure -->|SSML/SDK| AzureAPI[Azure Speech API]
|
|
481
536
|
GCloud -->|gRPC/SDK| GoogleAPI[Google Cloud TTS API]
|
|
482
537
|
Eden -->|REST| EdenAPI[EdenAI API]
|
|
483
538
|
Fish -->|REST| FishAPI[Fish Audio API]
|
|
539
|
+
Inworld -->|REST| InworldAPI[Inworld AI API]
|
|
540
|
+
Gemini -->|REST/OAuth2| GeminiAPI[Vertex AI Gemini API]
|
|
484
541
|
|
|
485
542
|
GoogleAPI -->|EU Endpoint| EU[eu-texttospeech.googleapis.com]
|
|
486
543
|
EdenAPI -.-> OpenAI[OpenAI TTS]
|
|
@@ -490,7 +547,7 @@ graph TD
|
|
|
490
547
|
## Testing
|
|
491
548
|
|
|
492
549
|
```bash
|
|
493
|
-
# Run all tests (
|
|
550
|
+
# Run all tests (540+ tests, >90% coverage)
|
|
494
551
|
npm test
|
|
495
552
|
|
|
496
553
|
# Unit tests only
|
|
@@ -506,6 +563,8 @@ npm run test:coverage
|
|
|
506
563
|
npx ts-node scripts/manual-test-edenai.ts
|
|
507
564
|
npx ts-node scripts/manual-test-google-cloud-tts.ts
|
|
508
565
|
npx ts-node scripts/manual-test-fish-audio.ts [en] [de]
|
|
566
|
+
npx ts-node scripts/manual-test-inworld.ts [en] [de] [mini]
|
|
567
|
+
npx ts-node scripts/manual-test-gemini.ts [en] [de] [pro] [style]
|
|
509
568
|
|
|
510
569
|
# List available Google Cloud voices
|
|
511
570
|
npx ts-node scripts/list-google-voices.ts de-DE
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
*/
|
|
21
21
|
export { TTSService, ttsService } from './tts.service';
|
|
22
22
|
export { TTSProvider, TTSErrorCode, AudioFormat, } from './types';
|
|
23
|
-
export type { AudioOptions, VoiceConfig, TTSSynthesizeRequest, TTSResponse, TTSResponseMetadata, TTSBillingInfo, TTSVoice, TTSVoiceMetadata, AzureProviderOptions, OpenAIProviderOptions, ElevenLabsProviderOptions, GoogleCloudProviderOptions, GoogleCloudTTSProviderOptions, DeepgramProviderOptions, EdenAIProviderOptions, ProviderOptions, } from './types';
|
|
24
|
-
export { isAzureOptions, isOpenAIOptions, isElevenLabsOptions, isGoogleCloudOptions, isGoogleCloudTTSOptions, isDeepgramOptions, isEdenAIOptions, } from './types';
|
|
25
|
-
export { BaseTTSProvider, AzureProvider, EdenAIProvider, GoogleCloudTTSProvider, } from './providers';
|
|
23
|
+
export type { AudioOptions, VoiceConfig, TTSSynthesizeRequest, TTSResponse, TTSResponseMetadata, TTSBillingInfo, TTSVoice, TTSVoiceMetadata, AzureProviderOptions, OpenAIProviderOptions, ElevenLabsProviderOptions, GoogleCloudProviderOptions, GoogleCloudTTSProviderOptions, DeepgramProviderOptions, EdenAIProviderOptions, FishAudioProviderOptions, InworldProviderOptions, GeminiProviderOptions, ProviderOptions, } from './types';
|
|
24
|
+
export { isAzureOptions, isOpenAIOptions, isElevenLabsOptions, isGoogleCloudOptions, isGoogleCloudTTSOptions, isDeepgramOptions, isEdenAIOptions, isFishAudioOptions, isInworldOptions, isGeminiOptions, } from './types';
|
|
25
|
+
export { BaseTTSProvider, AzureProvider, EdenAIProvider, FishAudioProvider, GoogleCloudTTSProvider, InworldProvider, GeminiProvider, } from './providers';
|
|
26
26
|
export type { GoogleCloudTTSRegion, GoogleCloudTTSConfig, } from './providers';
|
|
27
27
|
export { TTSError, InvalidConfigError, InvalidVoiceError, QuotaExceededError, ProviderUnavailableError, SynthesisFailedError, NetworkError, } from './providers';
|
|
28
28
|
export { countCharacters, countCharactersWithoutSSML, validateCharacterCount, countBillableCharacters, estimateAudioDuration, formatCharacterCount, } from './utils';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/services/tts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,GAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,EACd,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/services/tts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,GACb,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* @module @loonylabs/tts-middleware
|
|
21
21
|
*/
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.DEFAULT_RETRY_CONFIG = exports.isRetryableError = exports.executeWithRetry = exports.silentLogger = exports.getLogLevel = exports.setLogLevel = exports.resetLogger = exports.getLogger = exports.setLogger = exports.formatCharacterCount = exports.estimateAudioDuration = exports.countBillableCharacters = exports.validateCharacterCount = exports.countCharactersWithoutSSML = exports.countCharacters = exports.NetworkError = exports.SynthesisFailedError = exports.ProviderUnavailableError = exports.QuotaExceededError = exports.InvalidVoiceError = exports.InvalidConfigError = exports.TTSError = exports.GoogleCloudTTSProvider = exports.EdenAIProvider = exports.AzureProvider = exports.BaseTTSProvider = exports.isEdenAIOptions = exports.isDeepgramOptions = exports.isGoogleCloudTTSOptions = exports.isGoogleCloudOptions = exports.isElevenLabsOptions = exports.isOpenAIOptions = exports.isAzureOptions = exports.TTSErrorCode = exports.TTSProvider = exports.ttsService = exports.TTSService = void 0;
|
|
23
|
+
exports.DEFAULT_RETRY_CONFIG = exports.isRetryableError = exports.executeWithRetry = exports.silentLogger = exports.getLogLevel = exports.setLogLevel = exports.resetLogger = exports.getLogger = exports.setLogger = exports.formatCharacterCount = exports.estimateAudioDuration = exports.countBillableCharacters = exports.validateCharacterCount = exports.countCharactersWithoutSSML = exports.countCharacters = exports.NetworkError = exports.SynthesisFailedError = exports.ProviderUnavailableError = exports.QuotaExceededError = exports.InvalidVoiceError = exports.InvalidConfigError = exports.TTSError = exports.GeminiProvider = exports.InworldProvider = exports.GoogleCloudTTSProvider = exports.FishAudioProvider = exports.EdenAIProvider = exports.AzureProvider = exports.BaseTTSProvider = exports.isGeminiOptions = exports.isInworldOptions = exports.isFishAudioOptions = exports.isEdenAIOptions = exports.isDeepgramOptions = exports.isGoogleCloudTTSOptions = exports.isGoogleCloudOptions = exports.isElevenLabsOptions = exports.isOpenAIOptions = exports.isAzureOptions = exports.TTSErrorCode = exports.TTSProvider = exports.ttsService = exports.TTSService = void 0;
|
|
24
24
|
// ===== Main Service =====
|
|
25
25
|
var tts_service_1 = require("./tts.service");
|
|
26
26
|
Object.defineProperty(exports, "TTSService", { enumerable: true, get: function () { return tts_service_1.TTSService; } });
|
|
@@ -37,12 +37,18 @@ Object.defineProperty(exports, "isGoogleCloudOptions", { enumerable: true, get:
|
|
|
37
37
|
Object.defineProperty(exports, "isGoogleCloudTTSOptions", { enumerable: true, get: function () { return types_2.isGoogleCloudTTSOptions; } });
|
|
38
38
|
Object.defineProperty(exports, "isDeepgramOptions", { enumerable: true, get: function () { return types_2.isDeepgramOptions; } });
|
|
39
39
|
Object.defineProperty(exports, "isEdenAIOptions", { enumerable: true, get: function () { return types_2.isEdenAIOptions; } });
|
|
40
|
+
Object.defineProperty(exports, "isFishAudioOptions", { enumerable: true, get: function () { return types_2.isFishAudioOptions; } });
|
|
41
|
+
Object.defineProperty(exports, "isInworldOptions", { enumerable: true, get: function () { return types_2.isInworldOptions; } });
|
|
42
|
+
Object.defineProperty(exports, "isGeminiOptions", { enumerable: true, get: function () { return types_2.isGeminiOptions; } });
|
|
40
43
|
// ===== Providers =====
|
|
41
44
|
var providers_1 = require("./providers");
|
|
42
45
|
Object.defineProperty(exports, "BaseTTSProvider", { enumerable: true, get: function () { return providers_1.BaseTTSProvider; } });
|
|
43
46
|
Object.defineProperty(exports, "AzureProvider", { enumerable: true, get: function () { return providers_1.AzureProvider; } });
|
|
44
47
|
Object.defineProperty(exports, "EdenAIProvider", { enumerable: true, get: function () { return providers_1.EdenAIProvider; } });
|
|
48
|
+
Object.defineProperty(exports, "FishAudioProvider", { enumerable: true, get: function () { return providers_1.FishAudioProvider; } });
|
|
45
49
|
Object.defineProperty(exports, "GoogleCloudTTSProvider", { enumerable: true, get: function () { return providers_1.GoogleCloudTTSProvider; } });
|
|
50
|
+
Object.defineProperty(exports, "InworldProvider", { enumerable: true, get: function () { return providers_1.InworldProvider; } });
|
|
51
|
+
Object.defineProperty(exports, "GeminiProvider", { enumerable: true, get: function () { return providers_1.GeminiProvider; } });
|
|
46
52
|
// ===== Errors =====
|
|
47
53
|
var providers_2 = require("./providers");
|
|
48
54
|
Object.defineProperty(exports, "TTSError", { enumerable: true, get: function () { return providers_2.TTSError; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/services/tts/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,2BAA2B;AAC3B,6CAAuD;AAA9C,yGAAA,UAAU,OAAA;AAAE,yGAAA,UAAU,OAAA;AAE/B,oBAAoB;AACpB,iCAIiB;AAHf,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/services/tts/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,2BAA2B;AAC3B,6CAAuD;AAA9C,yGAAA,UAAU,OAAA;AAAE,yGAAA,UAAU,OAAA;AAE/B,oBAAoB;AACpB,iCAIiB;AAHf,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA;AA0Bd,iCAWiB;AAVf,uGAAA,cAAc,OAAA;AACd,wGAAA,eAAe,OAAA;AACf,4GAAA,mBAAmB,OAAA;AACnB,6GAAA,oBAAoB,OAAA;AACpB,gHAAA,uBAAuB,OAAA;AACvB,0GAAA,iBAAiB,OAAA;AACjB,wGAAA,eAAe,OAAA;AACf,2GAAA,kBAAkB,OAAA;AAClB,yGAAA,gBAAgB,OAAA;AAChB,wGAAA,eAAe,OAAA;AAGjB,wBAAwB;AACxB,yCAQqB;AAPnB,4GAAA,eAAe,OAAA;AACf,0GAAA,aAAa,OAAA;AACb,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AACjB,mHAAA,sBAAsB,OAAA;AACtB,4GAAA,eAAe,OAAA;AACf,2GAAA,cAAc,OAAA;AAQhB,qBAAqB;AACrB,yCAQqB;AAPnB,qGAAA,QAAQ,OAAA;AACR,+GAAA,kBAAkB,OAAA;AAClB,8GAAA,iBAAiB,OAAA;AACjB,+GAAA,kBAAkB,OAAA;AAClB,qHAAA,wBAAwB,OAAA;AACxB,iHAAA,oBAAoB,OAAA;AACpB,yGAAA,YAAY,OAAA;AAGd,wBAAwB;AACxB,iCAOiB;AANf,wGAAA,eAAe,OAAA;AACf,mHAAA,0BAA0B,OAAA;AAC1B,+GAAA,sBAAsB,OAAA;AACtB,gHAAA,uBAAuB,OAAA;AACvB,8GAAA,qBAAqB,OAAA;AACrB,6GAAA,oBAAoB,OAAA;AAGtB,qBAAqB;AACrB,iCAOiB;AANf,kGAAA,SAAS,OAAA;AACT,kGAAA,SAAS,OAAA;AACT,oGAAA,WAAW,OAAA;AACX,oGAAA,WAAW,OAAA;AACX,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA;AAKd,oBAAoB;AACpB,iCAIiB;AAHf,yGAAA,gBAAgB,OAAA;AAChB,yGAAA,gBAAgB,OAAA;AAChB,6GAAA,oBAAoB,OAAA"}
|
|
@@ -140,8 +140,8 @@ class FishAudioProvider extends base_tts_provider_1.BaseTTSProvider {
|
|
|
140
140
|
body.reference_id = referenceId;
|
|
141
141
|
}
|
|
142
142
|
// Quality parameters
|
|
143
|
-
if (
|
|
144
|
-
body.temperature =
|
|
143
|
+
if (request.audio?.temperature !== undefined)
|
|
144
|
+
body.temperature = request.audio.temperature;
|
|
145
145
|
if (options.topP !== undefined)
|
|
146
146
|
body.top_p = options.topP;
|
|
147
147
|
if (options.repetitionPenalty !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fish-audio-provider.js","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/fish-audio-provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fish-audio-provider.js","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/fish-audio-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini TTS Provider
|
|
3
|
+
*
|
|
4
|
+
* @description Provider for Google Gemini TTS via Vertex AI, using the generateContent
|
|
5
|
+
* endpoint with responseModalities: ['AUDIO']. Authenticates via Service Account
|
|
6
|
+
* (same as Google Cloud TTS — reuses GOOGLE_APPLICATION_CREDENTIALS).
|
|
7
|
+
*
|
|
8
|
+
* Supports 30 multilingual voices with auto-detect language and natural language
|
|
9
|
+
* style control. Output is raw PCM (24kHz, 16-bit, mono) which is converted to
|
|
10
|
+
* MP3 via ffmpeg or WAV as fallback.
|
|
11
|
+
*
|
|
12
|
+
* Test/Admin only -- no EU data residency guarantees.
|
|
13
|
+
*
|
|
14
|
+
* @see https://cloud.google.com/vertex-ai/generative-ai/docs/text-to-speech
|
|
15
|
+
*/
|
|
16
|
+
import type { TTSSynthesizeRequest, TTSResponse } from '../types';
|
|
17
|
+
import { BaseTTSProvider } from './base-tts-provider';
|
|
18
|
+
/**
|
|
19
|
+
* Gemini TTS configuration (Vertex AI)
|
|
20
|
+
*/
|
|
21
|
+
export interface GeminiConfig {
|
|
22
|
+
/**
|
|
23
|
+
* Path to Service Account JSON file
|
|
24
|
+
* @env GOOGLE_APPLICATION_CREDENTIALS
|
|
25
|
+
*/
|
|
26
|
+
keyFilename?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Google Cloud Project ID
|
|
29
|
+
* @env GOOGLE_CLOUD_PROJECT
|
|
30
|
+
*/
|
|
31
|
+
projectId?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Vertex AI region
|
|
34
|
+
* @env GEMINI_REGION
|
|
35
|
+
* @default 'us-central1'
|
|
36
|
+
*/
|
|
37
|
+
region?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Gemini TTS provider implementation
|
|
41
|
+
*
|
|
42
|
+
* @description Provides TTS synthesis using Google's Gemini generateContent API
|
|
43
|
+
* via Vertex AI. Authenticates with Service Account OAuth2 (same credentials as
|
|
44
|
+
* Google Cloud TTS). Gemini outputs raw PCM which is converted to MP3 (via ffmpeg)
|
|
45
|
+
* or WAV (pure Node.js fallback).
|
|
46
|
+
*
|
|
47
|
+
* Billing: Token-based ($0.50-1.00/M input + $10-20/M audio output tokens).
|
|
48
|
+
* For billing compatibility, reports character count like all other providers.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const provider = new GeminiProvider();
|
|
53
|
+
* const response = await provider.synthesize(
|
|
54
|
+
* "Hello World",
|
|
55
|
+
* "Kore",
|
|
56
|
+
* {
|
|
57
|
+
* text: "Hello World",
|
|
58
|
+
* voice: { id: "Kore" },
|
|
59
|
+
* audio: { format: "mp3" },
|
|
60
|
+
* providerOptions: {
|
|
61
|
+
* model: "gemini-2.5-flash-preview-tts",
|
|
62
|
+
* stylePrompt: "Say cheerfully:"
|
|
63
|
+
* }
|
|
64
|
+
* }
|
|
65
|
+
* );
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare class GeminiProvider extends BaseTTSProvider {
|
|
69
|
+
private config;
|
|
70
|
+
private authClient;
|
|
71
|
+
/**
|
|
72
|
+
* Creates a new Gemini TTS provider
|
|
73
|
+
*
|
|
74
|
+
* @param config - Optional configuration (uses env vars if not provided)
|
|
75
|
+
* @throws {InvalidConfigError} If credentials are missing
|
|
76
|
+
*/
|
|
77
|
+
constructor(config?: Partial<GeminiConfig>);
|
|
78
|
+
/**
|
|
79
|
+
* Validate Gemini configuration
|
|
80
|
+
*
|
|
81
|
+
* @private
|
|
82
|
+
* @throws {InvalidConfigError} If configuration is invalid
|
|
83
|
+
*/
|
|
84
|
+
private validateGeminiConfig;
|
|
85
|
+
/**
|
|
86
|
+
* Get an authenticated access token via Service Account
|
|
87
|
+
*
|
|
88
|
+
* @private
|
|
89
|
+
* @returns OAuth2 access token
|
|
90
|
+
*/
|
|
91
|
+
private getAccessToken;
|
|
92
|
+
/**
|
|
93
|
+
* Synthesize text to speech using Gemini TTS
|
|
94
|
+
*
|
|
95
|
+
* @param text - The input text to synthesize
|
|
96
|
+
* @param voiceId - The voice name (e.g. "Kore", "Puck", "Charon")
|
|
97
|
+
* @param request - The full synthesis request with options
|
|
98
|
+
* @returns Promise resolving to the synthesis response
|
|
99
|
+
*/
|
|
100
|
+
synthesize(text: string, voiceId: string, request: TTSSynthesizeRequest): Promise<TTSResponse>;
|
|
101
|
+
/**
|
|
102
|
+
* Build Gemini generateContent request payload
|
|
103
|
+
*
|
|
104
|
+
* @private
|
|
105
|
+
*/
|
|
106
|
+
private buildRequest;
|
|
107
|
+
/**
|
|
108
|
+
* Call Gemini generateContent API via Vertex AI
|
|
109
|
+
*
|
|
110
|
+
* @private
|
|
111
|
+
* @param requestBody - The request payload
|
|
112
|
+
* @param model - The Gemini model to use
|
|
113
|
+
* @returns Promise resolving to raw PCM audio buffer
|
|
114
|
+
*/
|
|
115
|
+
private callAPI;
|
|
116
|
+
/**
|
|
117
|
+
* Convert raw PCM audio to the requested format
|
|
118
|
+
*
|
|
119
|
+
* @private
|
|
120
|
+
* @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
|
|
121
|
+
* @param requestedFormat - The desired output format ('mp3', 'wav', etc.)
|
|
122
|
+
* @returns The converted audio buffer and actual format used
|
|
123
|
+
*/
|
|
124
|
+
private convertPcmAudio;
|
|
125
|
+
/**
|
|
126
|
+
* Convert raw PCM to MP3 using ffmpeg via child_process
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
|
|
130
|
+
* @returns Promise resolving to MP3 buffer
|
|
131
|
+
*/
|
|
132
|
+
private pcmToMp3;
|
|
133
|
+
/**
|
|
134
|
+
* Convert raw PCM to WAV by prepending a 44-byte WAV header
|
|
135
|
+
*
|
|
136
|
+
* @private
|
|
137
|
+
* @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
|
|
138
|
+
* @returns WAV buffer
|
|
139
|
+
*/
|
|
140
|
+
private pcmToWav;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=gemini-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-provider.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/gemini-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EACL,eAAe,EAEhB,MAAM,qBAAqB,CAAC;AAG7B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAA6E;IAE/F;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAkB1C;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;;;;OAKG;YACW,cAAc;IAqB5B;;;;;;;OAOG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC;IAsDvB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;;OAOG;YACW,OAAO;IA6CrB;;;;;;;OAOG;YACW,eAAe;IA0B7B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;IAkChB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;CAwBjB"}
|