@loonylabs/tts-middleware 0.8.0 → 0.10.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 (41) hide show
  1. package/README.md +36 -2
  2. package/dist/middleware/services/tts/index.d.ts +4 -3
  3. package/dist/middleware/services/tts/index.d.ts.map +1 -1
  4. package/dist/middleware/services/tts/index.js +3 -1
  5. package/dist/middleware/services/tts/index.js.map +1 -1
  6. package/dist/middleware/services/tts/providers/gemini-provider.d.ts +142 -0
  7. package/dist/middleware/services/tts/providers/gemini-provider.d.ts.map +1 -0
  8. package/dist/middleware/services/tts/providers/gemini-provider.js +358 -0
  9. package/dist/middleware/services/tts/providers/gemini-provider.js.map +1 -0
  10. package/dist/middleware/services/tts/providers/index.d.ts +2 -0
  11. package/dist/middleware/services/tts/providers/index.d.ts.map +1 -1
  12. package/dist/middleware/services/tts/providers/index.js +3 -1
  13. package/dist/middleware/services/tts/providers/index.js.map +1 -1
  14. package/dist/middleware/services/tts/providers/vertex-ai-tts-provider.d.ts +168 -0
  15. package/dist/middleware/services/tts/providers/vertex-ai-tts-provider.d.ts.map +1 -0
  16. package/dist/middleware/services/tts/providers/vertex-ai-tts-provider.js +416 -0
  17. package/dist/middleware/services/tts/providers/vertex-ai-tts-provider.js.map +1 -0
  18. package/dist/middleware/services/tts/tts.service.d.ts.map +1 -1
  19. package/dist/middleware/services/tts/tts.service.js +13 -0
  20. package/dist/middleware/services/tts/tts.service.js.map +1 -1
  21. package/dist/middleware/services/tts/types/common.types.d.ts +12 -1
  22. package/dist/middleware/services/tts/types/common.types.d.ts.map +1 -1
  23. package/dist/middleware/services/tts/types/common.types.js +1 -0
  24. package/dist/middleware/services/tts/types/common.types.js.map +1 -1
  25. package/dist/middleware/services/tts/types/index.d.ts +2 -2
  26. package/dist/middleware/services/tts/types/index.d.ts.map +1 -1
  27. package/dist/middleware/services/tts/types/index.js +2 -1
  28. package/dist/middleware/services/tts/types/index.js.map +1 -1
  29. package/dist/middleware/services/tts/types/provider-options.types.d.ts +85 -1
  30. package/dist/middleware/services/tts/types/provider-options.types.d.ts.map +1 -1
  31. package/dist/middleware/services/tts/types/provider-options.types.js +13 -0
  32. package/dist/middleware/services/tts/types/provider-options.types.js.map +1 -1
  33. package/dist/middleware/services/tts/utils/retry.utils.d.ts +11 -0
  34. package/dist/middleware/services/tts/utils/retry.utils.d.ts.map +1 -1
  35. package/dist/middleware/services/tts/utils/retry.utils.js +23 -0
  36. package/dist/middleware/services/tts/utils/retry.utils.js.map +1 -1
  37. package/dist/middleware/shared/config/tts.config.d.ts +17 -0
  38. package/dist/middleware/shared/config/tts.config.d.ts.map +1 -1
  39. package/dist/middleware/shared/config/tts.config.js +14 -0
  40. package/dist/middleware/shared/config/tts.config.js.map +1 -1
  41. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-provider.js","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/gemini-provider.ts"],"names":[],"mappings":"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"}
@@ -10,4 +10,6 @@ export { GoogleCloudTTSProvider } from './google-cloud-tts-provider';
10
10
  export type { GoogleCloudTTSRegion, GoogleCloudTTSConfig } from './google-cloud-tts-provider';
11
11
  export { FishAudioProvider } from './fish-audio-provider';
12
12
  export { InworldProvider } from './inworld-provider';
13
+ export { VertexAITTSProvider } from './vertex-ai-tts-provider';
14
+ export type { VertexAITTSConfig } from './vertex-ai-tts-provider';
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * Export all provider classes and error types
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.InworldProvider = exports.FishAudioProvider = exports.GoogleCloudTTSProvider = exports.EdenAIProvider = exports.AzureProvider = exports.NetworkError = exports.SynthesisFailedError = exports.ProviderUnavailableError = exports.QuotaExceededError = exports.InvalidVoiceError = exports.InvalidConfigError = exports.TTSError = exports.BaseTTSProvider = void 0;
8
+ exports.VertexAITTSProvider = exports.InworldProvider = exports.FishAudioProvider = exports.GoogleCloudTTSProvider = exports.EdenAIProvider = exports.AzureProvider = exports.NetworkError = exports.SynthesisFailedError = exports.ProviderUnavailableError = exports.QuotaExceededError = exports.InvalidVoiceError = exports.InvalidConfigError = exports.TTSError = exports.BaseTTSProvider = void 0;
9
9
  // Base provider and errors
10
10
  var base_tts_provider_1 = require("./base-tts-provider");
11
11
  Object.defineProperty(exports, "BaseTTSProvider", { enumerable: true, get: function () { return base_tts_provider_1.BaseTTSProvider; } });
@@ -27,6 +27,8 @@ var fish_audio_provider_1 = require("./fish-audio-provider");
27
27
  Object.defineProperty(exports, "FishAudioProvider", { enumerable: true, get: function () { return fish_audio_provider_1.FishAudioProvider; } });
28
28
  var inworld_provider_1 = require("./inworld-provider");
29
29
  Object.defineProperty(exports, "InworldProvider", { enumerable: true, get: function () { return inworld_provider_1.InworldProvider; } });
30
+ var vertex_ai_tts_provider_1 = require("./vertex-ai-tts-provider");
31
+ Object.defineProperty(exports, "VertexAITTSProvider", { enumerable: true, get: function () { return vertex_ai_tts_provider_1.VertexAITTSProvider; } });
30
32
  // Future provider implementations will be exported here:
31
33
  // export { OpenAIProvider } from './openai-provider';
32
34
  // export { ElevenLabsProvider } from './elevenlabs-provider';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,2BAA2B;AAC3B,yDAS6B;AAR3B,oHAAA,eAAe,OAAA;AACf,6GAAA,QAAQ,OAAA;AACR,uHAAA,kBAAkB,OAAA;AAClB,sHAAA,iBAAiB,OAAA;AACjB,uHAAA,kBAAkB,OAAA;AAClB,6HAAA,wBAAwB,OAAA;AACxB,yHAAA,oBAAoB,OAAA;AACpB,iHAAA,YAAY,OAAA;AAGd,2BAA2B;AAC3B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,yEAAqE;AAA5D,mIAAA,sBAAsB,OAAA;AAE/B,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA;AAC1B,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAExB,yDAAyD;AACzD,sDAAsD;AACtD,8DAA8D;AAC9D,0DAA0D"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,2BAA2B;AAC3B,yDAS6B;AAR3B,oHAAA,eAAe,OAAA;AACf,6GAAA,QAAQ,OAAA;AACR,uHAAA,kBAAkB,OAAA;AAClB,sHAAA,iBAAiB,OAAA;AACjB,uHAAA,kBAAkB,OAAA;AAClB,6HAAA,wBAAwB,OAAA;AACxB,yHAAA,oBAAoB,OAAA;AACpB,iHAAA,YAAY,OAAA;AAGd,2BAA2B;AAC3B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,yEAAqE;AAA5D,mIAAA,sBAAsB,OAAA;AAE/B,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA;AAC1B,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,mEAA+D;AAAtD,6HAAA,mBAAmB,OAAA;AAG5B,yDAAyD;AACzD,sDAAsD;AACtD,8DAA8D;AAC9D,0DAA0D"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Vertex AI TTS Provider
3
+ *
4
+ * @description Provider for Google Vertex AI TTS via 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
+ import type { RegionRotationConfig } from '../types/provider-options.types';
19
+ /**
20
+ * Vertex AI TTS configuration
21
+ */
22
+ export interface VertexAITTSConfig {
23
+ /**
24
+ * Path to Service Account JSON file
25
+ * @env GOOGLE_APPLICATION_CREDENTIALS
26
+ */
27
+ keyFilename?: string;
28
+ /**
29
+ * Google Cloud Project ID
30
+ * @env GOOGLE_CLOUD_PROJECT
31
+ */
32
+ projectId?: string;
33
+ /**
34
+ * Vertex AI region
35
+ * @env VERTEX_AI_TTS_REGION
36
+ * @default 'us-central1'
37
+ */
38
+ region?: string;
39
+ /**
40
+ * Optional region rotation for quota management (429 / Resource Exhausted)
41
+ *
42
+ * @description When configured, the provider automatically rotates through the
43
+ * specified regions on quota errors. Same pattern as llm-middleware and tti-middleware.
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * {
48
+ * regions: ['europe-west4', 'europe-west1'],
49
+ * fallback: 'us-central1',
50
+ * }
51
+ * ```
52
+ */
53
+ regionRotation?: RegionRotationConfig;
54
+ }
55
+ /**
56
+ * Vertex AI TTS provider implementation
57
+ *
58
+ * @description Provides TTS synthesis using Google's Vertex AI generateContent API.
59
+ * Authenticates with Service Account OAuth2 (same credentials as Google Cloud TTS).
60
+ * Outputs raw PCM which is converted to MP3 (via ffmpeg) or WAV (pure Node.js fallback).
61
+ *
62
+ * Billing: Token-based ($0.50-1.00/M input + $10-20/M audio output tokens).
63
+ * For billing compatibility, reports character count like all other providers.
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const provider = new VertexAITTSProvider();
68
+ * const response = await provider.synthesize(
69
+ * "Hello World",
70
+ * "Kore",
71
+ * {
72
+ * text: "Hello World",
73
+ * voice: { id: "Kore" },
74
+ * audio: { format: "mp3" },
75
+ * providerOptions: {
76
+ * model: "gemini-2.5-flash-preview-tts",
77
+ * stylePrompt: "Say cheerfully:"
78
+ * }
79
+ * }
80
+ * );
81
+ * ```
82
+ */
83
+ export declare class VertexAITTSProvider extends BaseTTSProvider {
84
+ private config;
85
+ private authClient;
86
+ /**
87
+ * Creates a new Vertex AI TTS provider
88
+ *
89
+ * @param config - Optional configuration (uses env vars if not provided)
90
+ * @throws {InvalidConfigError} If credentials are missing
91
+ */
92
+ constructor(config?: Partial<VertexAITTSConfig>);
93
+ /**
94
+ * Validate Vertex AI configuration
95
+ *
96
+ * @private
97
+ * @throws {InvalidConfigError} If configuration is invalid
98
+ */
99
+ private validateVertexAIConfig;
100
+ /**
101
+ * Get an authenticated access token via Service Account
102
+ *
103
+ * @private
104
+ * @returns OAuth2 access token
105
+ */
106
+ private getAccessToken;
107
+ /**
108
+ * Synthesize text to speech using Vertex AI TTS
109
+ *
110
+ * @param text - The input text to synthesize
111
+ * @param voiceId - The voice name (e.g. "Kore", "Puck", "Charon")
112
+ * @param request - The full synthesis request with options
113
+ * @returns Promise resolving to the synthesis response
114
+ */
115
+ synthesize(text: string, voiceId: string, request: TTSSynthesizeRequest): Promise<TTSResponse>;
116
+ /**
117
+ * Build Vertex AI generateContent request payload
118
+ *
119
+ * @private
120
+ */
121
+ private buildRequest;
122
+ /**
123
+ * Call the Vertex AI API with optional region rotation on quota errors
124
+ *
125
+ * @private
126
+ * @param requestBody - The request payload
127
+ * @param model - The model to use
128
+ * @param regionOverride - Optional per-request region override (skips rotation)
129
+ * @returns The PCM audio buffer and the region that processed the request
130
+ */
131
+ private callAPIWithRegionRotation;
132
+ /**
133
+ * Call Vertex AI generateContent API
134
+ *
135
+ * @private
136
+ * @param requestBody - The request payload
137
+ * @param model - The model to use
138
+ * @param region - The Vertex AI region to use
139
+ * @returns Promise resolving to raw PCM audio buffer
140
+ */
141
+ private callAPI;
142
+ /**
143
+ * Convert raw PCM audio to the requested format
144
+ *
145
+ * @private
146
+ * @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
147
+ * @param requestedFormat - The desired output format ('mp3', 'wav', etc.)
148
+ * @returns The converted audio buffer and actual format used
149
+ */
150
+ private convertPcmAudio;
151
+ /**
152
+ * Convert raw PCM to MP3 using ffmpeg via child_process
153
+ *
154
+ * @private
155
+ * @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
156
+ * @returns Promise resolving to MP3 buffer
157
+ */
158
+ private pcmToMp3;
159
+ /**
160
+ * Convert raw PCM to WAV by prepending a 44-byte WAV header
161
+ *
162
+ * @private
163
+ * @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
164
+ * @returns WAV buffer
165
+ */
166
+ private pcmToWav;
167
+ }
168
+ //# sourceMappingURL=vertex-ai-tts-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertex-ai-tts-provider.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/vertex-ai-tts-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;AAC7B,OAAO,KAAK,EAA8B,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGxG;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAA6E;IAE/F;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAmB/C;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;;;;OAKG;YACW,cAAc;IAqB5B;;;;;;;OAOG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC;IA4DvB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;;;OAQG;YACW,yBAAyB;IAsDvC;;;;;;;;OAQG;YACW,OAAO;IA6CrB;;;;;;;OAOG;YACW,eAAe;IA0B7B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;IAkChB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;CAwBjB"}
@@ -0,0 +1,416 @@
1
+ "use strict";
2
+ /**
3
+ * Vertex AI TTS Provider
4
+ *
5
+ * @description Provider for Google Vertex AI TTS via the generateContent
6
+ * endpoint with responseModalities: ['AUDIO']. Authenticates via Service Account
7
+ * (same as Google Cloud TTS — reuses GOOGLE_APPLICATION_CREDENTIALS).
8
+ *
9
+ * Supports 30 multilingual voices with auto-detect language and natural language
10
+ * style control. Output is raw PCM (24kHz, 16-bit, mono) which is converted to
11
+ * MP3 via ffmpeg or WAV as fallback.
12
+ *
13
+ * Test/Admin only -- no EU data residency guarantees.
14
+ *
15
+ * @see https://cloud.google.com/vertex-ai/generative-ai/docs/text-to-speech
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.VertexAITTSProvider = void 0;
52
+ const child_process_1 = require("child_process");
53
+ const types_1 = require("../types");
54
+ const mp3_duration_utils_1 = require("../utils/mp3-duration.utils");
55
+ const base_tts_provider_1 = require("./base-tts-provider");
56
+ const retry_utils_1 = require("../utils/retry.utils");
57
+ const DEFAULT_MODEL = 'gemini-2.5-flash-preview-tts';
58
+ const DEFAULT_SAMPLE_RATE = 24000;
59
+ const DEFAULT_REGION = 'us-central1';
60
+ /**
61
+ * Vertex AI TTS provider implementation
62
+ *
63
+ * @description Provides TTS synthesis using Google's Vertex AI generateContent API.
64
+ * Authenticates with Service Account OAuth2 (same credentials as Google Cloud TTS).
65
+ * Outputs raw PCM which is converted to MP3 (via ffmpeg) or WAV (pure Node.js fallback).
66
+ *
67
+ * Billing: Token-based ($0.50-1.00/M input + $10-20/M audio output tokens).
68
+ * For billing compatibility, reports character count like all other providers.
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * const provider = new VertexAITTSProvider();
73
+ * const response = await provider.synthesize(
74
+ * "Hello World",
75
+ * "Kore",
76
+ * {
77
+ * text: "Hello World",
78
+ * voice: { id: "Kore" },
79
+ * audio: { format: "mp3" },
80
+ * providerOptions: {
81
+ * model: "gemini-2.5-flash-preview-tts",
82
+ * stylePrompt: "Say cheerfully:"
83
+ * }
84
+ * }
85
+ * );
86
+ * ```
87
+ */
88
+ class VertexAITTSProvider extends base_tts_provider_1.BaseTTSProvider {
89
+ /**
90
+ * Creates a new Vertex AI TTS provider
91
+ *
92
+ * @param config - Optional configuration (uses env vars if not provided)
93
+ * @throws {InvalidConfigError} If credentials are missing
94
+ */
95
+ constructor(config) {
96
+ super(types_1.TTSProvider.VERTEX_AI);
97
+ this.authClient = null;
98
+ this.config = {
99
+ keyFilename: config?.keyFilename || process.env.GOOGLE_APPLICATION_CREDENTIALS,
100
+ projectId: config?.projectId || process.env.GOOGLE_CLOUD_PROJECT,
101
+ region: config?.region || process.env.VERTEX_AI_TTS_REGION || DEFAULT_REGION,
102
+ regionRotation: config?.regionRotation,
103
+ };
104
+ this.validateVertexAIConfig();
105
+ this.log('info', 'Vertex AI TTS provider initialized', {
106
+ hasCredentials: !!this.config.keyFilename,
107
+ projectId: this.config.projectId ? '***' : undefined,
108
+ region: this.config.region,
109
+ });
110
+ }
111
+ /**
112
+ * Validate Vertex AI configuration
113
+ *
114
+ * @private
115
+ * @throws {InvalidConfigError} If configuration is invalid
116
+ */
117
+ validateVertexAIConfig() {
118
+ if (!this.config.keyFilename) {
119
+ throw new base_tts_provider_1.InvalidConfigError(this.providerName, 'Google Cloud credentials are required for Vertex AI TTS (GOOGLE_APPLICATION_CREDENTIALS)');
120
+ }
121
+ if (!this.config.projectId) {
122
+ throw new base_tts_provider_1.InvalidConfigError(this.providerName, 'Google Cloud Project ID is required for Vertex AI TTS (GOOGLE_CLOUD_PROJECT)');
123
+ }
124
+ }
125
+ /**
126
+ * Get an authenticated access token via Service Account
127
+ *
128
+ * @private
129
+ * @returns OAuth2 access token
130
+ */
131
+ async getAccessToken() {
132
+ if (!this.authClient) {
133
+ const { GoogleAuth } = await Promise.resolve().then(() => __importStar(require('google-auth-library')));
134
+ const auth = new GoogleAuth({
135
+ keyFilename: this.config.keyFilename,
136
+ scopes: ['https://www.googleapis.com/auth/cloud-platform'],
137
+ });
138
+ this.authClient = await auth.getClient();
139
+ }
140
+ const tokenResponse = await this.authClient.getAccessToken();
141
+ if (!tokenResponse.token) {
142
+ throw new base_tts_provider_1.InvalidConfigError(this.providerName, 'Failed to obtain access token from Service Account');
143
+ }
144
+ return tokenResponse.token;
145
+ }
146
+ /**
147
+ * Synthesize text to speech using Vertex AI TTS
148
+ *
149
+ * @param text - The input text to synthesize
150
+ * @param voiceId - The voice name (e.g. "Kore", "Puck", "Charon")
151
+ * @param request - The full synthesis request with options
152
+ * @returns Promise resolving to the synthesis response
153
+ */
154
+ async synthesize(text, voiceId, request) {
155
+ this.validateConfig(request);
156
+ const startTime = Date.now();
157
+ const options = (request.providerOptions || {});
158
+ const model = options.model || DEFAULT_MODEL;
159
+ const requestedFormat = request.audio?.format || 'mp3';
160
+ const requestBody = this.buildRequest(text, voiceId, options);
161
+ this.log('debug', 'Synthesizing with Vertex AI TTS', {
162
+ voiceId,
163
+ model,
164
+ textLength: text.length,
165
+ requestedFormat,
166
+ });
167
+ try {
168
+ const { pcmBuffer, region: usedRegion } = await this.callAPIWithRegionRotation(requestBody, model, options.region);
169
+ const { audioBuffer, audioFormat } = await this.convertPcmAudio(pcmBuffer, requestedFormat);
170
+ const duration = Date.now() - startTime;
171
+ this.log('info', 'Synthesis successful', {
172
+ voiceId,
173
+ characters: text.length,
174
+ duration,
175
+ audioSize: audioBuffer.length,
176
+ audioFormat,
177
+ region: usedRegion,
178
+ });
179
+ return {
180
+ audio: audioBuffer,
181
+ metadata: {
182
+ provider: this.providerName,
183
+ voice: voiceId,
184
+ duration,
185
+ audioDuration: audioFormat === 'mp3' ? (0, mp3_duration_utils_1.getMp3Duration)(audioBuffer) : undefined,
186
+ audioFormat,
187
+ sampleRate: DEFAULT_SAMPLE_RATE,
188
+ region: usedRegion,
189
+ },
190
+ billing: {
191
+ characters: this.countCharacters(text),
192
+ },
193
+ };
194
+ }
195
+ catch (error) {
196
+ this.log('error', 'Synthesis failed', {
197
+ voiceId,
198
+ error: error.message,
199
+ });
200
+ throw this.handleError(error, 'during Vertex AI TTS API call');
201
+ }
202
+ }
203
+ /**
204
+ * Build Vertex AI generateContent request payload
205
+ *
206
+ * @private
207
+ */
208
+ buildRequest(text, voiceId, options) {
209
+ const synthesisText = options.stylePrompt
210
+ ? `${options.stylePrompt} ${text}`
211
+ : text;
212
+ return {
213
+ contents: [
214
+ {
215
+ role: 'user',
216
+ parts: [{ text: synthesisText }],
217
+ },
218
+ ],
219
+ generationConfig: {
220
+ responseModalities: ['AUDIO'],
221
+ speechConfig: {
222
+ voiceConfig: {
223
+ prebuiltVoiceConfig: {
224
+ voiceName: voiceId,
225
+ },
226
+ },
227
+ },
228
+ },
229
+ };
230
+ }
231
+ /**
232
+ * Call the Vertex AI API with optional region rotation on quota errors
233
+ *
234
+ * @private
235
+ * @param requestBody - The request payload
236
+ * @param model - The model to use
237
+ * @param regionOverride - Optional per-request region override (skips rotation)
238
+ * @returns The PCM audio buffer and the region that processed the request
239
+ */
240
+ async callAPIWithRegionRotation(requestBody, model, regionOverride) {
241
+ // Per-request override: skip rotation entirely
242
+ if (regionOverride) {
243
+ const pcmBuffer = await this.callAPI(requestBody, model, regionOverride);
244
+ return { pcmBuffer, region: regionOverride };
245
+ }
246
+ const rotationConfig = this.config.regionRotation;
247
+ // No rotation configured: use static region from constructor config
248
+ if (!rotationConfig) {
249
+ const region = this.config.region || DEFAULT_REGION;
250
+ const pcmBuffer = await this.callAPI(requestBody, model, region);
251
+ return { pcmBuffer, region };
252
+ }
253
+ // Region rotation: try each region in order, rotate on quota errors only
254
+ const regionsToTry = [...rotationConfig.regions, rotationConfig.fallback];
255
+ let lastQuotaError = null;
256
+ for (const region of regionsToTry) {
257
+ try {
258
+ const pcmBuffer = await this.callAPI(requestBody, model, region);
259
+ return { pcmBuffer, region };
260
+ }
261
+ catch (error) {
262
+ if ((0, retry_utils_1.isQuotaError)(error)) {
263
+ this.log('warn', 'Quota exceeded, rotating to next region', {
264
+ failedRegion: region,
265
+ });
266
+ lastQuotaError = error;
267
+ continue;
268
+ }
269
+ throw error; // Non-quota errors: rethrow immediately
270
+ }
271
+ }
272
+ // Bonus attempt: try fallback one more time (alwaysTryFallback default: true)
273
+ if (rotationConfig.alwaysTryFallback !== false) {
274
+ try {
275
+ const pcmBuffer = await this.callAPI(requestBody, model, rotationConfig.fallback);
276
+ return { pcmBuffer, region: rotationConfig.fallback };
277
+ }
278
+ catch (error) {
279
+ if (!(0, retry_utils_1.isQuotaError)(error))
280
+ throw error;
281
+ lastQuotaError = error;
282
+ }
283
+ }
284
+ throw lastQuotaError ?? new Error('All Vertex AI TTS regions exhausted');
285
+ }
286
+ /**
287
+ * Call Vertex AI generateContent API
288
+ *
289
+ * @private
290
+ * @param requestBody - The request payload
291
+ * @param model - The model to use
292
+ * @param region - The Vertex AI region to use
293
+ * @returns Promise resolving to raw PCM audio buffer
294
+ */
295
+ async callAPI(requestBody, model, region) {
296
+ const accessToken = await this.getAccessToken();
297
+ const projectId = this.config.projectId;
298
+ const url = `https://${region}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${region}/publishers/google/models/${model}:generateContent`;
299
+ const response = await fetch(url, {
300
+ method: 'POST',
301
+ headers: {
302
+ 'Authorization': `Bearer ${accessToken}`,
303
+ 'Content-Type': 'application/json',
304
+ },
305
+ body: JSON.stringify(requestBody),
306
+ });
307
+ if (!response.ok) {
308
+ const errorText = await response.text();
309
+ throw new Error(`Vertex AI API error (${response.status}): ${errorText}`);
310
+ }
311
+ const responseJson = await response.json();
312
+ const inlineData = responseJson.candidates?.[0]?.content?.parts?.[0]?.inlineData;
313
+ if (!inlineData?.data) {
314
+ throw new Error('Vertex AI API returned no audio data');
315
+ }
316
+ return Buffer.from(inlineData.data, 'base64');
317
+ }
318
+ /**
319
+ * Convert raw PCM audio to the requested format
320
+ *
321
+ * @private
322
+ * @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
323
+ * @param requestedFormat - The desired output format ('mp3', 'wav', etc.)
324
+ * @returns The converted audio buffer and actual format used
325
+ */
326
+ async convertPcmAudio(pcmBuffer, requestedFormat) {
327
+ if (requestedFormat === 'wav') {
328
+ return {
329
+ audioBuffer: this.pcmToWav(pcmBuffer),
330
+ audioFormat: 'wav',
331
+ };
332
+ }
333
+ // For mp3 (and any other format), try ffmpeg first, fall back to WAV
334
+ try {
335
+ const mp3Buffer = await this.pcmToMp3(pcmBuffer);
336
+ return { audioBuffer: mp3Buffer, audioFormat: 'mp3' };
337
+ }
338
+ catch (error) {
339
+ this.log('warn', 'ffmpeg not available, falling back to WAV output', {
340
+ error: error.message,
341
+ });
342
+ return {
343
+ audioBuffer: this.pcmToWav(pcmBuffer),
344
+ audioFormat: 'wav',
345
+ };
346
+ }
347
+ }
348
+ /**
349
+ * Convert raw PCM to MP3 using ffmpeg via child_process
350
+ *
351
+ * @private
352
+ * @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
353
+ * @returns Promise resolving to MP3 buffer
354
+ */
355
+ pcmToMp3(pcmBuffer) {
356
+ return new Promise((resolve, reject) => {
357
+ const ffmpeg = (0, child_process_1.spawn)('ffmpeg', [
358
+ '-f', 's16le',
359
+ '-ar', String(DEFAULT_SAMPLE_RATE),
360
+ '-ac', '1',
361
+ '-i', 'pipe:0',
362
+ '-codec:a', 'libmp3lame',
363
+ '-b:a', '128k',
364
+ '-f', 'mp3',
365
+ 'pipe:1',
366
+ ]);
367
+ const chunks = [];
368
+ ffmpeg.stdout.on('data', (chunk) => chunks.push(chunk));
369
+ ffmpeg.stderr.on('data', () => { });
370
+ ffmpeg.on('error', (err) => {
371
+ reject(new Error(`ffmpeg spawn failed: ${err.message}`));
372
+ });
373
+ ffmpeg.on('close', (code) => {
374
+ if (code === 0) {
375
+ resolve(Buffer.concat(chunks));
376
+ }
377
+ else {
378
+ reject(new Error(`ffmpeg exited with code ${code}`));
379
+ }
380
+ });
381
+ ffmpeg.stdin.write(pcmBuffer);
382
+ ffmpeg.stdin.end();
383
+ });
384
+ }
385
+ /**
386
+ * Convert raw PCM to WAV by prepending a 44-byte WAV header
387
+ *
388
+ * @private
389
+ * @param pcmBuffer - Raw PCM buffer (24kHz, 16-bit, mono, little-endian)
390
+ * @returns WAV buffer
391
+ */
392
+ pcmToWav(pcmBuffer) {
393
+ const channels = 1;
394
+ const bitsPerSample = 16;
395
+ const byteRate = DEFAULT_SAMPLE_RATE * channels * (bitsPerSample / 8);
396
+ const blockAlign = channels * (bitsPerSample / 8);
397
+ const dataLength = pcmBuffer.length;
398
+ const header = Buffer.alloc(44);
399
+ header.write('RIFF', 0);
400
+ header.writeUInt32LE(36 + dataLength, 4);
401
+ header.write('WAVE', 8);
402
+ header.write('fmt ', 12);
403
+ header.writeUInt32LE(16, 16); // PCM chunk size
404
+ header.writeUInt16LE(1, 20); // PCM format
405
+ header.writeUInt16LE(channels, 22);
406
+ header.writeUInt32LE(DEFAULT_SAMPLE_RATE, 24);
407
+ header.writeUInt32LE(byteRate, 28);
408
+ header.writeUInt16LE(blockAlign, 32);
409
+ header.writeUInt16LE(bitsPerSample, 34);
410
+ header.write('data', 36);
411
+ header.writeUInt32LE(dataLength, 40);
412
+ return Buffer.concat([header, pcmBuffer]);
413
+ }
414
+ }
415
+ exports.VertexAITTSProvider = VertexAITTSProvider;
416
+ //# sourceMappingURL=vertex-ai-tts-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertex-ai-tts-provider.js","sourceRoot":"","sources":["../../../../../src/middleware/services/tts/providers/vertex-ai-tts-provider.ts"],"names":[],"mappings":"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"}