vidspotai-shared 1.0.30 → 1.0.32

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 (70) hide show
  1. package/lib/globals/aiModels/enums.d.ts +40 -0
  2. package/lib/globals/aiModels/enums.d.ts.map +1 -0
  3. package/lib/globals/aiModels/enums.js +46 -0
  4. package/lib/globals/aiModels/index.d.ts +6 -0
  5. package/lib/globals/aiModels/index.d.ts.map +1 -0
  6. package/lib/globals/aiModels/index.js +35 -0
  7. package/lib/globals/aiModels/providers/bytedance.d.ts +4 -0
  8. package/lib/globals/aiModels/providers/bytedance.d.ts.map +1 -0
  9. package/lib/globals/aiModels/providers/bytedance.js +65 -0
  10. package/lib/globals/aiModels/providers/google.d.ts +4 -0
  11. package/lib/globals/aiModels/providers/google.d.ts.map +1 -0
  12. package/lib/globals/aiModels/providers/google.js +111 -0
  13. package/lib/globals/aiModels/providers/kling.d.ts +4 -0
  14. package/lib/globals/aiModels/providers/kling.d.ts.map +1 -0
  15. package/lib/globals/aiModels/providers/kling.js +129 -0
  16. package/lib/globals/aiModels/providers/minimax.d.ts +4 -0
  17. package/lib/globals/aiModels/providers/minimax.d.ts.map +1 -0
  18. package/lib/globals/aiModels/providers/minimax.js +66 -0
  19. package/lib/globals/aiModels/providers/openai.d.ts +4 -0
  20. package/lib/globals/aiModels/providers/openai.d.ts.map +1 -0
  21. package/lib/globals/aiModels/providers/openai.js +82 -0
  22. package/lib/globals/aiModels/providers/pixverse.d.ts +4 -0
  23. package/lib/globals/aiModels/providers/pixverse.d.ts.map +1 -0
  24. package/lib/globals/aiModels/providers/pixverse.js +108 -0
  25. package/lib/globals/aiModels/providers/runway.d.ts +4 -0
  26. package/lib/globals/aiModels/providers/runway.d.ts.map +1 -0
  27. package/lib/globals/aiModels/providers/runway.js +52 -0
  28. package/lib/globals/aiModels/types.d.ts +45 -0
  29. package/lib/globals/aiModels/types.d.ts.map +1 -0
  30. package/lib/globals/aiModels/types.js +2 -0
  31. package/lib/globals/aiModels.d.ts +9 -14
  32. package/lib/globals/aiModels.d.ts.map +1 -1
  33. package/lib/globals/aiModels.js +187 -495
  34. package/lib/globals/ttsModels/index.d.ts +6 -0
  35. package/lib/globals/ttsModels/index.d.ts.map +1 -0
  36. package/lib/globals/ttsModels/index.js +25 -0
  37. package/lib/globals/ttsModels/providers/elevenlabs.d.ts +3 -0
  38. package/lib/globals/ttsModels/providers/elevenlabs.d.ts.map +1 -0
  39. package/lib/globals/ttsModels/providers/elevenlabs.js +13 -0
  40. package/lib/globals/ttsModels/types.d.ts +15 -0
  41. package/lib/globals/ttsModels/types.d.ts.map +1 -0
  42. package/lib/globals/ttsModels/types.js +2 -0
  43. package/lib/globals/ttsModels/voices.d.ts +21 -0
  44. package/lib/globals/ttsModels/voices.d.ts.map +1 -0
  45. package/lib/globals/ttsModels/voices.js +135 -0
  46. package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
  47. package/lib/services/aiGen/providers/bytedance/bytedance.service.js +36 -7
  48. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts +9 -0
  49. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -0
  50. package/lib/services/aiGen/providers/pixverse/pixverse.service.js +188 -0
  51. package/lib/services/tts/index.d.ts +4 -0
  52. package/lib/services/tts/index.d.ts.map +1 -0
  53. package/lib/services/tts/index.js +19 -0
  54. package/lib/services/tts/providers/elevenlabs.service.d.ts +7 -0
  55. package/lib/services/tts/providers/elevenlabs.service.d.ts.map +1 -0
  56. package/lib/services/tts/providers/elevenlabs.service.js +44 -0
  57. package/lib/services/tts/ttsFactory.service.d.ts +4 -0
  58. package/lib/services/tts/ttsFactory.service.d.ts.map +1 -0
  59. package/lib/services/tts/ttsFactory.service.js +12 -0
  60. package/lib/services/tts/types.d.ts +14 -0
  61. package/lib/services/tts/types.d.ts.map +1 -0
  62. package/lib/services/tts/types.js +6 -0
  63. package/lib/utils/helpers.js +2 -2
  64. package/lib/utils/logger.d.ts +1 -2
  65. package/lib/utils/logger.d.ts.map +1 -1
  66. package/lib/utils/logger.js +0 -2
  67. package/lib/utils/ttsUtils.d.ts +11 -0
  68. package/lib/utils/ttsUtils.d.ts.map +1 -0
  69. package/lib/utils/ttsUtils.js +16 -0
  70. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ export * from "./types";
2
+ export * from "./voices";
3
+ import { TtsProvider, ITtsProviderConfig } from "./types";
4
+ export { elevenlabsConfig } from "./providers/elevenlabs";
5
+ export declare const ttsProviderConfigs: Record<TtsProvider, ITtsProviderConfig>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/globals/ttsModels/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAG1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAEtE,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ttsProviderConfigs = exports.elevenlabsConfig = void 0;
18
+ __exportStar(require("./types"), exports);
19
+ __exportStar(require("./voices"), exports);
20
+ const elevenlabs_1 = require("./providers/elevenlabs");
21
+ var elevenlabs_2 = require("./providers/elevenlabs");
22
+ Object.defineProperty(exports, "elevenlabsConfig", { enumerable: true, get: function () { return elevenlabs_2.elevenlabsConfig; } });
23
+ exports.ttsProviderConfigs = {
24
+ elevenlabs: elevenlabs_1.elevenlabsConfig,
25
+ };
@@ -0,0 +1,3 @@
1
+ import { ITtsProviderConfig } from "../types";
2
+ export declare const elevenlabsConfig: ITtsProviderConfig;
3
+ //# sourceMappingURL=elevenlabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs.d.ts","sourceRoot":"","sources":["../../../../src/globals/ttsModels/providers/elevenlabs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,gBAAgB,EAAE,kBAS9B,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.elevenlabsConfig = void 0;
4
+ exports.elevenlabsConfig = {
5
+ name: "ElevenLabs",
6
+ /** eleven_multilingual_v2 pay-as-you-go rate */
7
+ costPer1KChars: 0.3,
8
+ /** Sarah — neutral, clear default voice */
9
+ defaultVoiceId: "EXAVITQu4vr4xnSDxMaL",
10
+ modelId: "eleven_multilingual_v2",
11
+ /** ~150 words/min = 2.5 words/sec */
12
+ wordsPerSecond: 2.5,
13
+ };
@@ -0,0 +1,15 @@
1
+ /** Union of all supported TTS provider keys. Extend as new providers are added. */
2
+ export type TtsProvider = "elevenlabs";
3
+ export interface ITtsProviderConfig {
4
+ /** Human-readable provider name */
5
+ name: string;
6
+ /** Cost in USD per 1,000 characters (pay-as-you-go rate) */
7
+ costPer1KChars: number;
8
+ /** Default voice ID sent to the provider API */
9
+ defaultVoiceId: string;
10
+ /** Model/engine identifier used by the provider */
11
+ modelId: string;
12
+ /** Average spoken words per second for duration estimation (~150 wpm = 2.5 wps) */
13
+ wordsPerSecond: number;
14
+ }
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/globals/ttsModels/types.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,cAAc,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,21 @@
1
+ export interface ITtsVoice {
2
+ id: string;
3
+ name: string;
4
+ gender: "male" | "female";
5
+ accent: string;
6
+ /** Public preview MP3 hosted by ElevenLabs */
7
+ previewUrl: string;
8
+ }
9
+ /**
10
+ * Curated list of ElevenLabs voices compatible with eleven_multilingual_v2.
11
+ * Any voice can speak any supported language via the language_code parameter.
12
+ */
13
+ export declare const ELEVENLABS_VOICES: ITtsVoice[];
14
+ /** Default voice ID — Sarah (female, American) */
15
+ export declare const DEFAULT_ELEVENLABS_VOICE_ID = "EXAVITQu4vr4xnSDxMaL";
16
+ /**
17
+ * Maps frontend language keys → ElevenLabs language_code (ISO 639-1).
18
+ * Used to improve pronunciation when eleven_multilingual_v2 is the model.
19
+ */
20
+ export declare const LANG_TO_ELEVENLABS_CODE: Record<string, string>;
21
+ //# sourceMappingURL=voices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voices.d.ts","sourceRoot":"","sources":["../../../src/globals/ttsModels/voices.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,EAuFxC,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiC1D,CAAC"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LANG_TO_ELEVENLABS_CODE = exports.DEFAULT_ELEVENLABS_VOICE_ID = exports.ELEVENLABS_VOICES = void 0;
4
+ /**
5
+ * Curated list of ElevenLabs voices compatible with eleven_multilingual_v2.
6
+ * Any voice can speak any supported language via the language_code parameter.
7
+ */
8
+ exports.ELEVENLABS_VOICES = [
9
+ // ── Female ──────────────────────────────────────────────────────────────
10
+ {
11
+ id: "EXAVITQu4vr4xnSDxMaL",
12
+ name: "Sarah",
13
+ gender: "female",
14
+ accent: "American",
15
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/EXAVITQu4vr4xnSDxMaL/preview.mp3",
16
+ },
17
+ {
18
+ id: "21m00Tcm4TlvDq8ikWAM",
19
+ name: "Rachel",
20
+ gender: "female",
21
+ accent: "American",
22
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/21m00Tcm4TlvDq8ikWAM/preview.mp3",
23
+ },
24
+ {
25
+ id: "XrExE9yKIg1WjnnlVkGX",
26
+ name: "Matilda",
27
+ gender: "female",
28
+ accent: "American",
29
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/XrExE9yKIg1WjnnlVkGX/preview.mp3",
30
+ },
31
+ {
32
+ id: "9BWtsMINqrJLrRacOk9x",
33
+ name: "Aria",
34
+ gender: "female",
35
+ accent: "American",
36
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/9BWtsMINqrJLrRacOk9x/preview.mp3",
37
+ },
38
+ {
39
+ id: "XB0fDUnXU5powFXDhCwa",
40
+ name: "Charlotte",
41
+ gender: "female",
42
+ accent: "Swedish",
43
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/XB0fDUnXU5powFXDhCwa/preview.mp3",
44
+ },
45
+ {
46
+ id: "ThT5KcBeYPX3keUQqHPh",
47
+ name: "Dorothy",
48
+ gender: "female",
49
+ accent: "British",
50
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/ThT5KcBeYPX3keUQqHPh/preview.mp3",
51
+ },
52
+ // ── Male ────────────────────────────────────────────────────────────────
53
+ {
54
+ id: "pNInz6obpgDQGcFmaJgB",
55
+ name: "Adam",
56
+ gender: "male",
57
+ accent: "American",
58
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/pNInz6obpgDQGcFmaJgB/preview.mp3",
59
+ },
60
+ {
61
+ id: "IKne3meq5aSn9XLyUdCD",
62
+ name: "Charlie",
63
+ gender: "male",
64
+ accent: "Australian",
65
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/IKne3meq5aSn9XLyUdCD/preview.mp3",
66
+ },
67
+ {
68
+ id: "JBFqnCBsd6RMkjVDRZzb",
69
+ name: "George",
70
+ gender: "male",
71
+ accent: "British",
72
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/JBFqnCBsd6RMkjVDRZzb/preview.mp3",
73
+ },
74
+ {
75
+ id: "N2lVS1w4EtoT3dr4eOWO",
76
+ name: "Callum",
77
+ gender: "male",
78
+ accent: "American",
79
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/N2lVS1w4EtoT3dr4eOWO/preview.mp3",
80
+ },
81
+ {
82
+ id: "TX3LPaxmHKxFdv7VOQHJ",
83
+ name: "Liam",
84
+ gender: "male",
85
+ accent: "American",
86
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/TX3LPaxmHKxFdv7VOQHJ/preview.mp3",
87
+ },
88
+ {
89
+ id: "onwK4e9ZLuTAKqWW03F9",
90
+ name: "Daniel",
91
+ gender: "male",
92
+ accent: "British",
93
+ previewUrl: "https://storage.googleapis.com/eleven-public-prod/premade/voices/onwK4e9ZLuTAKqWW03F9/preview.mp3",
94
+ },
95
+ ];
96
+ /** Default voice ID — Sarah (female, American) */
97
+ exports.DEFAULT_ELEVENLABS_VOICE_ID = "EXAVITQu4vr4xnSDxMaL";
98
+ /**
99
+ * Maps frontend language keys → ElevenLabs language_code (ISO 639-1).
100
+ * Used to improve pronunciation when eleven_multilingual_v2 is the model.
101
+ */
102
+ exports.LANG_TO_ELEVENLABS_CODE = {
103
+ en: "en",
104
+ ar: "ar",
105
+ bg: "bg",
106
+ ca: "ca",
107
+ "zh-cn": "zh",
108
+ hr: "hr",
109
+ cs: "cs",
110
+ da: "da",
111
+ nl: "nl",
112
+ tl: "fil",
113
+ fi: "fi",
114
+ fr: "fr",
115
+ de: "de",
116
+ el: "el",
117
+ iw: "he",
118
+ hu: "hu",
119
+ id: "id",
120
+ it: "it",
121
+ ja: "ja",
122
+ ko: "ko",
123
+ ms: "ms",
124
+ no: "no",
125
+ pl: "pl",
126
+ pt: "pt",
127
+ ro: "ro",
128
+ sk: "sk",
129
+ es: "es",
130
+ sv: "sv",
131
+ th: "th",
132
+ tr: "tr",
133
+ uk: "uk",
134
+ vi: "vi",
135
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"bytedance.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/bytedance/bytedance.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AASlB,qBAAa,gBAAiB,SAAQ,wBAAwB;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CACsD;IAExE,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA4D3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4FjD,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;CAoCjD"}
1
+ {"version":3,"file":"bytedance.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/bytedance/bytedance.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AASlB,qBAAa,gBAAiB,SAAQ,wBAAwB;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CACsD;IAExE,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6D3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8FjD,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;CAoCjD"}
@@ -38,6 +38,7 @@ class ByteDanceService extends baseAiGenProvider_service_1.BaseAiGenProviderServ
38
38
  const body = {
39
39
  model: modelId,
40
40
  content,
41
+ generate_audio: params.audio || false,
41
42
  ratio: params.aspectRatio, // e.g. 16:9
42
43
  resolution: params.resolution, // e.g. 720p
43
44
  duration: params.duration, // seconds
@@ -125,8 +126,10 @@ class ByteDanceService extends baseAiGenProvider_service_1.BaseAiGenProviderServ
125
126
  contentType: "video/mp4",
126
127
  resumable: false,
127
128
  metadata: {
128
- firebaseStorageDownloadTokens: downloadToken,
129
129
  cacheControl: "public, max-age=31536000",
130
+ metadata: {
131
+ firebaseStorageDownloadTokens: downloadToken,
132
+ },
130
133
  },
131
134
  });
132
135
  const publicVideoUrl = `https://firebasestorage.googleapis.com/v0/b/${bucket.name}` +
@@ -138,10 +141,10 @@ class ByteDanceService extends baseAiGenProvider_service_1.BaseAiGenProviderServ
138
141
  }
139
142
  getCreditUsed(params) {
140
143
  const modelConfig = aiModels_1.aiModelConfigs[params.modelKey];
141
- if (!modelConfig.cost?.per1KTokens ||
142
- !params.resolution ||
143
- !params.aspectRatio ||
144
- !params.duration) {
144
+ const per1KTokens = params.audio
145
+ ? modelConfig.cost?.audio?.per1KTokens
146
+ : modelConfig.cost?.noAudio?.per1KTokens ?? modelConfig.cost?.per1KTokens;
147
+ if (!per1KTokens || !params.resolution || !params.aspectRatio || !params.duration) {
145
148
  logger_1.logger.warn(`Missing cost or parameters for credit calculation. Returning default credits. Params: ${JSON.stringify(params)}, ModelConfig: ${JSON.stringify(modelConfig)}`);
146
149
  return 10; // default fallback
147
150
  }
@@ -151,9 +154,35 @@ class ByteDanceService extends baseAiGenProvider_service_1.BaseAiGenProviderServ
151
154
  return 10; // default fallback
152
155
  }
153
156
  const FRAME_RATE = 24;
154
- const tokensConsumed = Math.ceil((dims?.width * dims?.height * FRAME_RATE * params.duration) / 1024);
155
- const cost = (modelConfig.cost.per1KTokens * tokensConsumed) / 1000;
157
+ const tokensConsumed = Math.ceil((dims.width * dims.height * FRAME_RATE * params.duration) / 1024);
158
+ const cost = (per1KTokens * tokensConsumed) / 1000;
156
159
  return (0, helpers_2.getCreditsFromCost)(cost);
157
160
  }
158
161
  }
159
162
  exports.ByteDanceService = ByteDanceService;
163
+ const dimensionsMap = {
164
+ "480p": {
165
+ "16:9": { width: 848, height: 480 },
166
+ "9:16": { width: 480, height: 848 },
167
+ "1:1": { width: 480, height: 480 },
168
+ "4:3": { width: 640, height: 480 },
169
+ "3:4": { width: 480, height: 640 },
170
+ "21:9": { width: 1008, height: 432 },
171
+ },
172
+ "720p": {
173
+ "16:9": { width: 1280, height: 720 },
174
+ "9:16": { width: 720, height: 1280 },
175
+ "1:1": { width: 720, height: 720 },
176
+ "4:3": { width: 960, height: 720 },
177
+ "3:4": { width: 720, height: 960 },
178
+ "21:9": { width: 1680, height: 720 },
179
+ },
180
+ "1080p": {
181
+ "16:9": { width: 1920, height: 1080 },
182
+ "9:16": { width: 1080, height: 1920 },
183
+ "1:1": { width: 1080, height: 1080 },
184
+ "4:3": { width: 1440, height: 1080 },
185
+ "3:4": { width: 1080, height: 1440 },
186
+ "21:9": { width: 2520, height: 1080 },
187
+ },
188
+ };
@@ -0,0 +1,9 @@
1
+ import { BaseAiGenProviderService } from "../baseAiGenProvider.service";
2
+ import { CreditUsageParams, VideoGenerationParams, VideoGenerationResult, VideoStatusParams, VideoStatusResult } from "../types";
3
+ export declare class PixVerseService extends BaseAiGenProviderService {
4
+ private readonly baseUrl;
5
+ generateVideo(params: VideoGenerationParams): Promise<VideoGenerationResult>;
6
+ checkVideoStatus({ task, outputFilename, outputFilePath, }: VideoStatusParams): Promise<VideoStatusResult>;
7
+ getCreditUsed(params: CreditUsageParams): number;
8
+ }
9
+ //# sourceMappingURL=pixverse.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixverse.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/pixverse/pixverse.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AASlB,qBAAa,eAAgB,SAAQ,wBAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkD;IAKpE,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAqE3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmGjD,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;CA+CjD"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ // pixverse.service.ts
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PixVerseService = void 0;
8
+ const baseAiGenProvider_service_1 = require("../baseAiGenProvider.service");
9
+ const helpers_1 = require("../../helpers");
10
+ const aiModels_1 = require("../../../../globals/aiModels");
11
+ const types_1 = require("../../../../globals/types");
12
+ const firebase_1 = require("../../../../libs/firebase");
13
+ const helpers_2 = require("../../../../utils/helpers");
14
+ const logger_1 = require("../../../../utils/logger");
15
+ const crypto_1 = __importDefault(require("crypto"));
16
+ class PixVerseService extends baseAiGenProvider_service_1.BaseAiGenProviderService {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.baseUrl = "https://app-api.pixverse.ai/openapi/v2/video";
20
+ }
21
+ // =========================================================
22
+ // GENERATE VIDEO
23
+ // =========================================================
24
+ async generateVideo(params) {
25
+ (0, helpers_1.validateParams)(params);
26
+ const modelConfig = aiModels_1.aiModelConfigs[params.modelKey];
27
+ const modelId = modelConfig.modelId;
28
+ const traceId = crypto_1.default.randomUUID();
29
+ const body = {
30
+ aspect_ratio: params.aspectRatio,
31
+ duration: params.duration,
32
+ model: modelId,
33
+ prompt: params.prompt,
34
+ quality: params.resolution,
35
+ };
36
+ // Optional negative prompt
37
+ if (params.negativePrompt) {
38
+ body.negative_prompt = params.negativePrompt;
39
+ }
40
+ // Optional audio support (v5.5 / v5.6)
41
+ if (params.audio !== undefined) {
42
+ body.generate_audio_switch = Boolean(params.audio);
43
+ }
44
+ // Multi clip (v5.5 only)
45
+ if (params.multiClip !== undefined) {
46
+ body.generate_multi_clip_switch = Boolean(params.multiClip);
47
+ }
48
+ const resp = await fetch(`${this.baseUrl}/text/generate`, {
49
+ method: "POST",
50
+ headers: {
51
+ "Content-Type": "application/json",
52
+ "API-KEY": process.env.PIXVERSE_API_KEY,
53
+ "Ai-trace-id": traceId,
54
+ },
55
+ body: JSON.stringify(body),
56
+ });
57
+ if (!resp.ok) {
58
+ const errText = await resp.text();
59
+ throw new Error(`PixVerse generateVideo failed (${resp.status}): ${errText}`);
60
+ }
61
+ const data = await resp.json();
62
+ if (data.ErrCode !== 0) {
63
+ throw new Error(`PixVerse API error: ${data.ErrMsg || "Unknown error"}`);
64
+ }
65
+ const videoId = data?.Resp?.video_id;
66
+ if (!videoId) {
67
+ throw new Error("PixVerse API did not return video_id");
68
+ }
69
+ return {
70
+ task: String(videoId),
71
+ status: types_1.EVideoSceneStatus.TRIGGERED,
72
+ };
73
+ }
74
+ // =========================================================
75
+ // CHECK STATUS
76
+ // =========================================================
77
+ async checkVideoStatus({ task, outputFilename, outputFilePath = "videos", }) {
78
+ const traceId = crypto_1.default.randomUUID();
79
+ const resp = await fetch(`${this.baseUrl}/result/${task}`, {
80
+ method: "GET",
81
+ headers: {
82
+ "API-KEY": process.env.PIXVERSE_API_KEY,
83
+ "Ai-trace-id": traceId,
84
+ },
85
+ });
86
+ if (!resp.ok) {
87
+ const errText = await resp.text();
88
+ throw new Error(`PixVerse checkVideoStatus failed (${resp.status}): ${errText}`);
89
+ }
90
+ const data = await resp.json();
91
+ if (data.ErrCode !== 0) {
92
+ throw new Error(`PixVerse API error: ${data.ErrMsg || "Unknown error"}`);
93
+ }
94
+ const status = data?.Resp?.status;
95
+ // ---- Status Mapping ----
96
+ switch (status) {
97
+ case 5: // Generating
98
+ return { status: types_1.EVideoSceneStatus.PENDING };
99
+ case 7: // moderation failed
100
+ case 8: // generation failed
101
+ return {
102
+ status: types_1.EVideoSceneStatus.FAILED,
103
+ errorMessage: "PixVerse video generation failed",
104
+ };
105
+ case 1: // success
106
+ break;
107
+ default:
108
+ return {
109
+ status: types_1.EVideoSceneStatus.FAILED,
110
+ errorMessage: `Unknown PixVerse status: ${status}`,
111
+ };
112
+ }
113
+ const sourceVideoUrl = data?.Resp?.url;
114
+ if (!sourceVideoUrl) {
115
+ return {
116
+ status: types_1.EVideoSceneStatus.FAILED,
117
+ errorMessage: "PixVerse response missing video url",
118
+ };
119
+ }
120
+ // Download generated video
121
+ const videoResp = await fetch(sourceVideoUrl);
122
+ if (!videoResp.ok) {
123
+ throw new Error(`Failed to download PixVerse video (${videoResp.status})`);
124
+ }
125
+ const buffer = Buffer.from(await videoResp.arrayBuffer());
126
+ // ---- Upload to Firebase ----
127
+ const filePath = `${outputFilePath}/${outputFilename}.mp4`;
128
+ const bucket = (0, firebase_1.getBucket)();
129
+ const file = bucket.file(filePath);
130
+ const downloadToken = crypto_1.default.randomUUID();
131
+ await file.save(buffer, {
132
+ contentType: "video/mp4",
133
+ resumable: false,
134
+ metadata: {
135
+ cacheControl: "public, max-age=31536000",
136
+ metadata: {
137
+ firebaseStorageDownloadTokens: downloadToken,
138
+ },
139
+ },
140
+ });
141
+ const publicVideoUrl = `https://firebasestorage.googleapis.com/v0/b/${bucket.name}` +
142
+ `/o/${encodeURIComponent(filePath)}?alt=media&token=${downloadToken}`;
143
+ return {
144
+ videoUrl: publicVideoUrl,
145
+ status: types_1.EVideoSceneStatus.COMPLETED,
146
+ };
147
+ }
148
+ // =========================================================
149
+ // CREDIT CALCULATION
150
+ // =========================================================
151
+ getCreditUsed(params) {
152
+ const modelConfig = aiModels_1.aiModelConfigs[params.modelKey];
153
+ if (!params.resolution || !params.duration) {
154
+ logger_1.logger.warn(`Missing resolution/duration for PixVerse credit calculation`);
155
+ return 10;
156
+ }
157
+ const hasAudio = Boolean(params.audio);
158
+ const multiClip = Boolean(params.multiClip);
159
+ try {
160
+ let cost;
161
+ if (modelConfig.cost?.audio || modelConfig.cost?.noAudio) {
162
+ const costGroup = hasAudio
163
+ ? modelConfig.cost.audio
164
+ : modelConfig.cost.noAudio;
165
+ // v5.5 structure (singleClip / multiClip)
166
+ if ("singleClip" in costGroup) {
167
+ const clipType = multiClip ? "multiClip" : "singleClip";
168
+ cost =
169
+ costGroup[clipType]?.table?.[params.resolution]?.[params.duration];
170
+ }
171
+ else {
172
+ // v5 / v5.6 structure
173
+ cost = costGroup?.table?.[params.resolution]?.[params.duration];
174
+ }
175
+ }
176
+ if (!cost) {
177
+ logger_1.logger.warn(`Unsupported combination for PixVerse credit calc: ${JSON.stringify(params)}`);
178
+ return 10;
179
+ }
180
+ return (0, helpers_2.getCreditsFromCost)(cost);
181
+ }
182
+ catch (err) {
183
+ logger_1.logger.error(`PixVerse credit calculation failed`, err);
184
+ return 10;
185
+ }
186
+ }
187
+ }
188
+ exports.PixVerseService = PixVerseService;
@@ -0,0 +1,4 @@
1
+ export * from "./types";
2
+ export * from "./providers/elevenlabs.service";
3
+ export * from "./ttsFactory.service";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/tts/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./providers/elevenlabs.service"), exports);
19
+ __exportStar(require("./ttsFactory.service"), exports);
@@ -0,0 +1,7 @@
1
+ import { BaseTtsProviderService, TtsParams, TtsResult } from "../types";
2
+ export declare class ElevenLabsService extends BaseTtsProviderService {
3
+ private readonly baseUrl;
4
+ constructor();
5
+ generate(params: TtsParams): Promise<TtsResult>;
6
+ }
7
+ //# sourceMappingURL=elevenlabs.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs.service.d.ts","sourceRoot":"","sources":["../../../../src/services/tts/providers/elevenlabs.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAExE,qBAAa,iBAAkB,SAAQ,sBAAsB;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;;IASpD,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;CA+BtD"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ElevenLabsService = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const elevenlabs_1 = require("../../../globals/ttsModels/providers/elevenlabs");
9
+ const types_1 = require("../types");
10
+ class ElevenLabsService extends types_1.BaseTtsProviderService {
11
+ constructor() {
12
+ super();
13
+ this.baseUrl = "https://api.elevenlabs.io/v1";
14
+ if (!process.env.ELEVENLABS_API_KEY) {
15
+ throw new Error("Missing ELEVENLABS_API_KEY in environment variables");
16
+ }
17
+ }
18
+ async generate(params) {
19
+ const voiceId = params.voiceId ?? elevenlabs_1.elevenlabsConfig.defaultVoiceId;
20
+ const response = await axios_1.default.post(`${this.baseUrl}/text-to-speech/${voiceId}`, {
21
+ text: params.text,
22
+ model_id: elevenlabs_1.elevenlabsConfig.modelId,
23
+ language_code: params.languageCode,
24
+ voice_settings: {
25
+ stability: 0.5,
26
+ similarity_boost: 0.75,
27
+ },
28
+ }, {
29
+ headers: {
30
+ "xi-api-key": process.env.ELEVENLABS_API_KEY,
31
+ "Content-Type": "application/json",
32
+ Accept: "audio/mpeg",
33
+ },
34
+ responseType: "arraybuffer",
35
+ timeout: 60000,
36
+ });
37
+ return {
38
+ audioBuffer: Buffer.from(response.data),
39
+ mimeType: "audio/mpeg",
40
+ extension: "mp3",
41
+ };
42
+ }
43
+ }
44
+ exports.ElevenLabsService = ElevenLabsService;
@@ -0,0 +1,4 @@
1
+ import { TtsProvider } from "../../globals/ttsModels/types";
2
+ import { BaseTtsProviderService } from "./types";
3
+ export declare function getTtsProviderService(provider?: TtsProvider): BaseTtsProviderService;
4
+ //# sourceMappingURL=ttsFactory.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttsFactory.service.d.ts","sourceRoot":"","sources":["../../../src/services/tts/ttsFactory.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,wBAAgB,qBAAqB,CAAC,QAAQ,GAAE,WAA0B,GAAG,sBAAsB,CAOlG"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTtsProviderService = getTtsProviderService;
4
+ const elevenlabs_service_1 = require("./providers/elevenlabs.service");
5
+ function getTtsProviderService(provider = "elevenlabs") {
6
+ switch (provider) {
7
+ case "elevenlabs":
8
+ return new elevenlabs_service_1.ElevenLabsService();
9
+ default:
10
+ throw new Error(`Unknown TTS provider: ${provider}`);
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ export interface TtsParams {
2
+ text: string;
3
+ voiceId?: string;
4
+ languageCode?: string;
5
+ }
6
+ export interface TtsResult {
7
+ audioBuffer: Buffer;
8
+ mimeType: string;
9
+ extension: string;
10
+ }
11
+ export declare abstract class BaseTtsProviderService {
12
+ abstract generate(params: TtsParams): Promise<TtsResult>;
13
+ }
14
+ //# sourceMappingURL=types.d.ts.map