@clipwright/core 0.10.0 → 0.12.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/CHANGELOG.md +335 -0
- package/README.md +5 -0
- package/dist/contract-dispositions.d.ts +13 -2
- package/dist/contract-dispositions.js +17 -1
- package/dist/contract-dispositions.js.map +1 -1
- package/dist/errors.d.ts +15 -0
- package/dist/errors.js +24 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/run-preflight.d.ts +48 -0
- package/dist/run-preflight.js +45 -0
- package/dist/run-preflight.js.map +1 -0
- package/dist/run-static-warnings.d.ts +5 -3
- package/dist/run-static-warnings.js +60 -9
- package/dist/run-static-warnings.js.map +1 -1
- package/dist/skills.d.ts +65 -2
- package/dist/skills.js +12 -4
- package/dist/skills.js.map +1 -1
- package/dist/voices.d.ts +28 -10
- package/dist/voices.js +92 -14
- package/dist/voices.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ФАКТ ПРЕФЛАЙТА РАНА: невыводимое на чтении, потому что требует сети.
|
|
3
|
+
// Почему факт, а не готовая строка, — docs/18, Д41 и Д42.
|
|
4
|
+
/** Проба источника кадра; `not_probed` — сети не было (нет `image`). */
|
|
5
|
+
export const aspectProbeFact = z.discriminatedUnion("kind", [
|
|
6
|
+
z.object({ kind: z.literal("not_probed") }),
|
|
7
|
+
z.object({ kind: z.literal("failed"), error_class: z.string().min(1) }),
|
|
8
|
+
z.object({
|
|
9
|
+
kind: z.literal("ok"),
|
|
10
|
+
width: z.number().int().positive(),
|
|
11
|
+
height: z.number().int().positive(),
|
|
12
|
+
}),
|
|
13
|
+
]);
|
|
14
|
+
/** Префлайт СЫРОГО `voice_id`; пресет каталог не запрашивает (US-515). */
|
|
15
|
+
export const voicePreflightFact = z.discriminatedUnion("kind", [
|
|
16
|
+
z.object({ kind: z.literal("not_probed") }),
|
|
17
|
+
z.object({ kind: z.literal("catalog_incomplete") }),
|
|
18
|
+
z.object({ kind: z.literal("verified") }),
|
|
19
|
+
]);
|
|
20
|
+
// СЕМЬЯ БЕЗ КЛЮЧА ≠ `not_probed`: первое означает «не записано» — так выглядят
|
|
21
|
+
// раны до 0030; второе — записанное знание «пробы не было». Разбор — docs/18, Д42.
|
|
22
|
+
export const runPreflight = z.object({
|
|
23
|
+
aspect: aspectProbeFact.optional(),
|
|
24
|
+
voice: voicePreflightFact.optional(),
|
|
25
|
+
});
|
|
26
|
+
// Текст живёт рядом с фактом: его печатают оба конца — `quote` и читатель колонки.
|
|
27
|
+
export function sourceNotProbedWarning(errorClass) {
|
|
28
|
+
return `source could not be probed (${errorClass})`;
|
|
29
|
+
}
|
|
30
|
+
/** Каталог голосов усечён — сырой `voice_id` подтвердить нечем. FAIL-OPEN. */
|
|
31
|
+
export const VOICE_CATALOG_INCOMPLETE_WARNING = "voice catalog incomplete — voice_id could not be verified";
|
|
32
|
+
// СЕМЬИ РАЗБИРАЮТСЯ НЕЗАВИСИМО (довод `parseSettlementBasis`): порча одной не
|
|
33
|
+
// забирает исправную вторую. Нечитаемое значение даёт пустой набор фактов.
|
|
34
|
+
export function parseRunPreflight(stored) {
|
|
35
|
+
if (typeof stored !== "object" || stored === null)
|
|
36
|
+
return {};
|
|
37
|
+
const raw = stored;
|
|
38
|
+
const aspect = aspectProbeFact.safeParse(raw.aspect);
|
|
39
|
+
const voice = voicePreflightFact.safeParse(raw.voice);
|
|
40
|
+
return {
|
|
41
|
+
...(aspect.success ? { aspect: aspect.data } : {}),
|
|
42
|
+
...(voice.success ? { voice: voice.data } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=run-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-preflight.js","sourceRoot":"","sources":["../src/run-preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,uEAAuE;AACvE,0DAA0D;AAE1D,wEAAwE;AACxE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC1D,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC;CACH,CAAC,CAAC;AAGH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC7D,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;CAC1C,CAAC,CAAC;AAGH,+EAA+E;AAC/E,mFAAmF;AACnF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,eAAe,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAMH,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,+BAA+B,UAAU,GAAG,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gCAAgC,GAC3C,2DAA2D,CAAC;AAE9D,8EAA8E;AAC9E,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type RunPreflight } from "./run-preflight.js";
|
|
1
2
|
/** Сохранённый вход нечитаем: перечислить несоблюдённые поля нечем. */
|
|
2
3
|
export declare const UNREADABLE_RUN_INPUT_WARNING = "run input could not be read: parameters that are accepted but not honored cannot be listed for this run";
|
|
3
|
-
export declare function derivedRunWarnings(storedInput: unknown): string[];
|
|
4
|
-
/** Полный `warnings[]`
|
|
5
|
-
|
|
4
|
+
export declare function derivedRunWarnings(storedInput: unknown, preflight: RunPreflight): string[];
|
|
5
|
+
/** Полный `warnings[]` рана; порядок выводимого — как у `quote`. Третий аргумент */
|
|
6
|
+
/** ОБЯЗАТЕЛЕН И ЭТИМ СТОРОЖИТ: опциональный терял бы факт у нового читателя молча. */
|
|
7
|
+
export declare function composeRunWarnings(stored: unknown, storedInput: unknown, storedPreflight: unknown): string[];
|
|
@@ -1,20 +1,65 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolvedScript, storedUgcInput } from "./skills.js";
|
|
2
2
|
import { dispositionWarnings } from "./contract-dispositions.js";
|
|
3
|
-
import { buildVoiceWarnings } from "./voices.js";
|
|
3
|
+
import { buildSpeechModelWarnings, buildVoiceWarnings, TTS_MODELS } from "./voices.js";
|
|
4
|
+
import { resolveAspectRatio } from "./aspect.js";
|
|
5
|
+
import { parseRunPreflight, sourceNotProbedWarning, VOICE_CATALOG_INCOMPLETE_WARNING, } from "./run-preflight.js";
|
|
4
6
|
// Писатели хранят невыводимое, читатель выводит статику. Рационал — docs/18, Д41.
|
|
5
7
|
/** Сохранённый вход нечитаем: перечислить несоблюдённые поля нечем. */
|
|
6
8
|
export const UNREADABLE_RUN_INPUT_WARNING = "run input could not be read: parameters that are accepted but not honored cannot be listed for this run";
|
|
9
|
+
/** Что факт пробы даёт БЕЗ входа. `undefined` ниже — не дефолт формата: берём */
|
|
10
|
+
/** только `warnings`, а они у `source === null` от `requested` не зависят (кейс). */
|
|
11
|
+
function aspectWarningsWithoutInput(fact) {
|
|
12
|
+
if (fact?.kind !== "failed")
|
|
13
|
+
return [];
|
|
14
|
+
const resolution = resolveAspectRatio({ requested: undefined, source: null });
|
|
15
|
+
return [
|
|
16
|
+
sourceNotProbedWarning(fact.error_class),
|
|
17
|
+
...(resolution.kind === "resolved" ? resolution.warnings : []),
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
// ФОРМАТ ВЫВОДИТСЯ ИЗ ФАКТА ПРОБЫ ТЕМ ЖЕ РЕЗОЛВЕРОМ, ЧТО У `quote`
|
|
21
|
+
// (`decideAspect` → `resolveAspectRatio`), поэтому две поверхности не разойдутся.
|
|
22
|
+
function aspectFactWarnings(fact, input) {
|
|
23
|
+
if (fact === undefined || fact.kind === "not_probed")
|
|
24
|
+
return [];
|
|
25
|
+
// Провал зовёт ТУ ЖЕ функцию, что и путь без входа: равенство двух путей на этой
|
|
26
|
+
// ветке структурное, а не совпадение, которое разъедется при первой правке.
|
|
27
|
+
if (fact.kind === "failed")
|
|
28
|
+
return aspectWarningsWithoutInput(fact);
|
|
29
|
+
const source = { width: fact.width, height: fact.height, origin: "probed" };
|
|
30
|
+
const resolution = resolveAspectRatio({ requested: input.aspect_ratio, source });
|
|
31
|
+
// Отказ здесь недостижим: ран с конфликтом формата отбивается до вставки (400).
|
|
32
|
+
return resolution.kind === "resolved" ? resolution.warnings : [];
|
|
33
|
+
}
|
|
34
|
+
/** Префлайт голоса: строку восстанавливает читатель, каталог вендора ему недоступен. */
|
|
35
|
+
function voiceFactWarnings(fact) {
|
|
36
|
+
return fact?.kind === "catalog_incomplete" ? [VOICE_CATALOG_INCOMPLETE_WARNING] : [];
|
|
37
|
+
}
|
|
7
38
|
// Реестр диспозиций и языковой warning пресета. Почему без `voice_id` —
|
|
8
39
|
// docs/18, Д41.
|
|
9
|
-
export function derivedRunWarnings(storedInput) {
|
|
10
|
-
const parsed =
|
|
40
|
+
export function derivedRunWarnings(storedInput, preflight) {
|
|
41
|
+
const parsed = storedUgcInput.safeParse(storedInput);
|
|
11
42
|
if (!parsed.success) {
|
|
12
|
-
|
|
43
|
+
// НЕЧИТАЕМЫЙ ВХОД НЕ ОТМЕНЯЕТ ФАКТОВ. Мерка одна: выводится всё, что выводимо
|
|
44
|
+
// БЕЗ входа. У `ok` снап от запрошенного формата зависит — его здесь и нет.
|
|
45
|
+
return [
|
|
46
|
+
UNREADABLE_RUN_INPUT_WARNING,
|
|
47
|
+
...aspectWarningsWithoutInput(preflight.aspect),
|
|
48
|
+
...voiceFactWarnings(preflight.voice),
|
|
49
|
+
];
|
|
13
50
|
}
|
|
14
|
-
const
|
|
51
|
+
const { tts_model: storedModel, ...rest } = parsed.data;
|
|
52
|
+
const ttsModel = TTS_MODELS.find((model) => model === storedModel);
|
|
53
|
+
// Снятая модель (`eleven_multilingual_v2`) читается как умолчание: на нём о модели молчим.
|
|
54
|
+
const input = { ...rest, tts_model: ttsModel };
|
|
55
|
+
// ПОРЯДОК — ТОТ ЖЕ, ЧТО У `quote`: диспозиции, формат, голос. Иначе паритет
|
|
56
|
+
// двух поверхностей держался бы только составом списка, но не равенством.
|
|
15
57
|
return [
|
|
16
58
|
...dispositionWarnings(input),
|
|
59
|
+
...aspectFactWarnings(preflight.aspect, input),
|
|
17
60
|
...buildVoiceWarnings({ voice: input.voice, script: resolvedScript(input) }),
|
|
61
|
+
...buildSpeechModelWarnings({ ...input, script: resolvedScript(input) }),
|
|
62
|
+
...voiceFactWarnings(preflight.voice),
|
|
18
63
|
];
|
|
19
64
|
}
|
|
20
65
|
/** Строки колонки `warnings`; нечитаемое значение даёт пустой список. */
|
|
@@ -23,8 +68,14 @@ function storedStrings(stored) {
|
|
|
23
68
|
return [];
|
|
24
69
|
return stored.filter((item) => typeof item === "string");
|
|
25
70
|
}
|
|
26
|
-
/** Полный `warnings[]`
|
|
27
|
-
|
|
28
|
-
|
|
71
|
+
/** Полный `warnings[]` рана; порядок выводимого — как у `quote`. Третий аргумент */
|
|
72
|
+
/** ОБЯЗАТЕЛЕН И ЭТИМ СТОРОЖИТ: опциональный терял бы факт у нового читателя молча. */
|
|
73
|
+
export function composeRunWarnings(stored, storedInput, storedPreflight) {
|
|
74
|
+
return [
|
|
75
|
+
...new Set([
|
|
76
|
+
...derivedRunWarnings(storedInput, parseRunPreflight(storedPreflight)),
|
|
77
|
+
...storedStrings(stored),
|
|
78
|
+
]),
|
|
79
|
+
];
|
|
29
80
|
}
|
|
30
81
|
//# sourceMappingURL=run-static-warnings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-static-warnings.js","sourceRoot":"","sources":["../src/run-static-warnings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run-static-warnings.js","sourceRoot":"","sources":["../src/run-static-warnings.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.d.ts
CHANGED
|
@@ -130,7 +130,8 @@ export declare const makeUgcInputShape: {
|
|
|
130
130
|
}>>;
|
|
131
131
|
readonly voice_id: z.ZodOptional<z.ZodString>;
|
|
132
132
|
readonly tts_model: z.ZodOptional<z.ZodEnum<{
|
|
133
|
-
|
|
133
|
+
eleven_flash_v2_5: "eleven_flash_v2_5";
|
|
134
|
+
eleven_turbo_v2_5: "eleven_turbo_v2_5";
|
|
134
135
|
eleven_v3: "eleven_v3";
|
|
135
136
|
}>>;
|
|
136
137
|
readonly webhook_url: z.ZodOptional<z.ZodString>;
|
|
@@ -216,7 +217,8 @@ export declare const makeUgcInput: z.ZodObject<{
|
|
|
216
217
|
}>>;
|
|
217
218
|
voice_id: z.ZodOptional<z.ZodString>;
|
|
218
219
|
tts_model: z.ZodOptional<z.ZodEnum<{
|
|
219
|
-
|
|
220
|
+
eleven_flash_v2_5: "eleven_flash_v2_5";
|
|
221
|
+
eleven_turbo_v2_5: "eleven_turbo_v2_5";
|
|
220
222
|
eleven_v3: "eleven_v3";
|
|
221
223
|
}>>;
|
|
222
224
|
webhook_url: z.ZodOptional<z.ZodString>;
|
|
@@ -227,6 +229,62 @@ export declare const makeUgcInput: z.ZodObject<{
|
|
|
227
229
|
white: "white";
|
|
228
230
|
}>>;
|
|
229
231
|
}, z.core.$strip>;
|
|
232
|
+
/** Сохранённый вход рана: правила допуска он уже прошёл, и смена модели или */
|
|
233
|
+
/** потолка не должна делать старый ран нечитаемым (#145). */
|
|
234
|
+
export declare const storedUgcInput: z.ZodObject<{
|
|
235
|
+
script: z.ZodOptional<z.ZodString>;
|
|
236
|
+
segments: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
237
|
+
kind: z.ZodEnum<{
|
|
238
|
+
actor: "actor";
|
|
239
|
+
media: "media";
|
|
240
|
+
}>;
|
|
241
|
+
script: z.ZodOptional<z.ZodString>;
|
|
242
|
+
media_url: z.ZodOptional<z.ZodString>;
|
|
243
|
+
}, z.core.$strip>>>;
|
|
244
|
+
person: z.ZodOptional<z.ZodString>;
|
|
245
|
+
actor_id: z.ZodOptional<z.ZodString>;
|
|
246
|
+
image: z.ZodOptional<z.ZodString>;
|
|
247
|
+
character: z.ZodOptional<z.ZodString>;
|
|
248
|
+
name: z.ZodOptional<z.ZodString>;
|
|
249
|
+
broll_url: z.ZodOptional<z.ZodString>;
|
|
250
|
+
captions: z.ZodDefault<z.ZodBoolean>;
|
|
251
|
+
caption_style: z.ZodDefault<z.ZodEnum<{
|
|
252
|
+
hormozi: "hormozi";
|
|
253
|
+
minimal: "minimal";
|
|
254
|
+
tiktok: "tiktok";
|
|
255
|
+
}>>;
|
|
256
|
+
look: z.ZodDefault<z.ZodEnum<{
|
|
257
|
+
commercial: "commercial";
|
|
258
|
+
natural: "natural";
|
|
259
|
+
raw_iphone: "raw_iphone";
|
|
260
|
+
}>>;
|
|
261
|
+
aspect_ratio: z.ZodOptional<z.ZodEnum<{
|
|
262
|
+
"16:9": "16:9";
|
|
263
|
+
"1:1": "1:1";
|
|
264
|
+
"9:16": "9:16";
|
|
265
|
+
}>>;
|
|
266
|
+
resolution: z.ZodOptional<z.ZodEnum<{
|
|
267
|
+
"1080p": "1080p";
|
|
268
|
+
"4k": "4k";
|
|
269
|
+
"720p": "720p";
|
|
270
|
+
}>>;
|
|
271
|
+
voice: z.ZodOptional<z.ZodEnum<{
|
|
272
|
+
daria_ru_female: "daria_ru_female";
|
|
273
|
+
eric: "eric";
|
|
274
|
+
george: "george";
|
|
275
|
+
owner_ru_clone: "owner_ru_clone";
|
|
276
|
+
sarah: "sarah";
|
|
277
|
+
}>>;
|
|
278
|
+
voice_id: z.ZodOptional<z.ZodString>;
|
|
279
|
+
webhook_url: z.ZodOptional<z.ZodString>;
|
|
280
|
+
disclosure_overlay: z.ZodOptional<z.ZodBoolean>;
|
|
281
|
+
background: z.ZodOptional<z.ZodEnum<{
|
|
282
|
+
blur: "blur";
|
|
283
|
+
contain: "contain";
|
|
284
|
+
white: "white";
|
|
285
|
+
}>>;
|
|
286
|
+
tts_model: z.ZodOptional<z.ZodString>;
|
|
287
|
+
}, z.core.$strip>;
|
|
230
288
|
/** Минимум, из которого выводится произносимый текст: сам скрипт или сегменты. */
|
|
231
289
|
export interface SpokenTextInput {
|
|
232
290
|
script?: string | undefined;
|
|
@@ -270,5 +328,10 @@ export declare const quoteResponse: z.ZodObject<{
|
|
|
270
328
|
"1:1": "1:1";
|
|
271
329
|
"9:16": "9:16";
|
|
272
330
|
}>;
|
|
331
|
+
tts_model: z.ZodEnum<{
|
|
332
|
+
eleven_flash_v2_5: "eleven_flash_v2_5";
|
|
333
|
+
eleven_turbo_v2_5: "eleven_turbo_v2_5";
|
|
334
|
+
eleven_v3: "eleven_v3";
|
|
335
|
+
}>;
|
|
273
336
|
}, z.core.$strip>;
|
|
274
337
|
export type QuoteResponse = z.infer<typeof quoteResponse>;
|
package/dist/skills.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { countWords } from "./pacing.js";
|
|
3
|
-
import { resolveTtsModel, MAX_SCRIPT_CHARS, SCRIPT_LENGTH_DESCRIPTION, ttsScriptLimitError, TTS_MODELS, VOICE_ID_PATTERN, VOICE_PRESET_NAMES, } from "./voices.js";
|
|
3
|
+
import { resolveTtsModel, MAX_SCRIPT_CHARS, SCRIPT_LENGTH_DESCRIPTION, STRESS_MARKING_DESCRIPTION, ttsScriptLimitError, TTS_MODELS, VOICE_ID_PATTERN, VOICE_PRESET_NAMES, } from "./voices.js";
|
|
4
4
|
export const CAPTION_STYLES = ["hormozi", "tiktok", "minimal"];
|
|
5
5
|
export const LOOKS = ["natural", "commercial", "raw_iphone"];
|
|
6
6
|
/**
|
|
@@ -103,7 +103,8 @@ export const makeUgcInputShape = {
|
|
|
103
103
|
.min(1)
|
|
104
104
|
.max(MAX_SCRIPT_CHARS)
|
|
105
105
|
.optional()
|
|
106
|
-
.describe(`required unless \`segments\` is provided; \`segments\` is currently rejected. ${SCRIPT_LENGTH_DESCRIPTION}`
|
|
106
|
+
.describe(`required unless \`segments\` is provided; \`segments\` is currently rejected. ${SCRIPT_LENGTH_DESCRIPTION} ` +
|
|
107
|
+
STRESS_MARKING_DESCRIPTION),
|
|
107
108
|
segments: z.array(ugcSegment).min(1).max(MAX_SEGMENTS).optional(),
|
|
108
109
|
person: z.string().min(1).max(500).optional(),
|
|
109
110
|
actor_id: actorId.optional().describe("Saved Clipwright actor ID from list_actors. Choose actor_id, image, or person; do not combine them."),
|
|
@@ -166,8 +167,11 @@ export const makeUgcInputShape = {
|
|
|
166
167
|
.enum(TTS_MODELS)
|
|
167
168
|
.optional()
|
|
168
169
|
.describe(`Speech model: ${TTS_MODELS.join(" | ")}. Omitted means the model of the chosen preset ` +
|
|
169
|
-
"(list_voices shows it;
|
|
170
|
-
"
|
|
170
|
+
"(list_voices shows it; every preset speaks eleven_v3) or eleven_v3 for a raw voice_id. " +
|
|
171
|
+
"eleven_v3 is the most expressive and the only one that reads stress marks " +
|
|
172
|
+
"(a capital vowel inside a Russian word, \"потОм\", becomes one; see script); " +
|
|
173
|
+
"eleven_flash_v2_5 and eleven_turbo_v2_5 are cheaper alternatives for languages other than " +
|
|
174
|
+
"Russian. " + SCRIPT_LENGTH_DESCRIPTION),
|
|
171
175
|
webhook_url: z.string().url().max(MAX_URL_LENGTH).optional(),
|
|
172
176
|
/**
|
|
173
177
|
* Видимая плашка «сделано ИИ» поверх кадра — OPT-IN, а не обязательная.
|
|
@@ -252,6 +256,9 @@ export const makeUgcInput = z
|
|
|
252
256
|
.refine((v) => v.segments !== undefined || countWords(v.script ?? "") >= 1, {
|
|
253
257
|
message: "script has 0 speakable words",
|
|
254
258
|
});
|
|
259
|
+
/** Сохранённый вход рана: правила допуска он уже прошёл, и смена модели или */
|
|
260
|
+
/** потолка не должна делать старый ран нечитаемым (#145). */
|
|
261
|
+
export const storedUgcInput = z.object({ ...makeUgcInputShape, tts_model: z.string().optional() });
|
|
255
262
|
/** Склейка произносимого текста без проверок — общая база для гейтов и хелпера. */
|
|
256
263
|
function spokenTextOf(input) {
|
|
257
264
|
if (input.script !== undefined)
|
|
@@ -316,5 +323,6 @@ export const quoteResponse = z.object({
|
|
|
316
323
|
.nullable(),
|
|
317
324
|
/** Формат, который реально будет отрендерен на этом входе. */
|
|
318
325
|
resolved_aspect_ratio: z.enum(ASPECT_RATIOS),
|
|
326
|
+
tts_model: z.enum(TTS_MODELS),
|
|
319
327
|
});
|
|
320
328
|
//# sourceMappingURL=skills.js.map
|
package/dist/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AACxE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AACtE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAG9D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAU,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe,OAAO,CAAC;AACtD,MAAM,CAAC,MAAM,cAAc,GAAe,MAAM,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiC,EACjC,KAAc;IAEd,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACrD,CAAC;AAED,mFAAmF;AACnF,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,mFAAmF;AACnF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAC/B,2HAA2H;IAC3H,0FAA0F;IAC1F,2FAA2F;IAC3F,2FAA2F;IAC3F,yBAAyB,CAAC;AAE5B,gFAAgF;AAChF,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAClC,2FAA2F;IAC3F,wFAAwF;IACxF,uFAAuF;IACvF,0EAA0E,CAAC;AAG7E;;;;;;;;;GASG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,mFAAmF;IACnF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;IAC1D,oEAAoE;IACpE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;CAC3D,CAAC,CAAC;AAGH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,qEAAqE;IACrE,2EAA2E;IAC3E,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,gBAAgB,CAAC;SACrB,QAAQ,EAAE;SACV,QAAQ,CACP,iFAAiF,yBAAyB,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AACxE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AACtE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAG9D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAU,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe,OAAO,CAAC;AACtD,MAAM,CAAC,MAAM,cAAc,GAAe,MAAM,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiC,EACjC,KAAc;IAEd,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACrD,CAAC;AAED,mFAAmF;AACnF,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,mFAAmF;AACnF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAC/B,2HAA2H;IAC3H,0FAA0F;IAC1F,2FAA2F;IAC3F,2FAA2F;IAC3F,yBAAyB,CAAC;AAE5B,gFAAgF;AAChF,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAClC,2FAA2F;IAC3F,wFAAwF;IACxF,uFAAuF;IACvF,0EAA0E,CAAC;AAG7E;;;;;;;;;GASG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,mFAAmF;IACnF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;IAC1D,oEAAoE;IACpE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;CAC3D,CAAC,CAAC;AAGH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,qEAAqE;IACrE,2EAA2E;IAC3E,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,gBAAgB,CAAC;SACrB,QAAQ,EAAE;SACV,QAAQ,CACP,iFAAiF,yBAAyB,GAAG;QAC3G,0BAA0B,CAC7B;IACH,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;IACjE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qGAAqG,CAAC;IAC5I,oEAAoE;IACpE,4EAA4E;IAC5E,8EAA8E;IAC9E,gDAAgD;IAChD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,UAAU,CAAC,UAAU,CAAC;SACtB,GAAG,CAAC,cAAc,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CACP,8FAA8F;QAC5F,+FAA+F;QAC/F,oEAAoE,CACvE;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;IAC7D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;IAC1D,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACxD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACtC,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,8EAA8E;IAC9E,2EAA2E;IAC3E,uDAAuD;IACvD,YAAY,EAAE,CAAC;SACZ,IAAI,CAAC,aAAa,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CACP,kBAAkB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,sDAAsD;QAC/F,6FAA6F;QAC7F,8FAA8F,CACjG;IACH,wEAAwE;IACxE,uEAAuE;IACvE,qEAAqE;IACrE,UAAU,EAAE,CAAC;SACV,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CACP,sBAAsB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,0DAA0D,CACxG;IACH,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,+EAA+E;IAC/E,gFAAgF;IAChF,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,kBAAkB,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CACP,yBAAyB,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC;QACrF,8FAA8F;QAC9F,mCAAmC,CACtC;IACH,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,KAAK,CAAC,gBAAgB,CAAC;SACvB,QAAQ,EAAE;SACV,QAAQ,CACP,0FAA0F;QACxF,sFAAsF,CACzF;IACH,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,UAAU,CAAC;SAChB,QAAQ,EAAE;SACV,QAAQ,CACP,iBAAiB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,iDAAiD;QACtF,yFAAyF;QACzF,4EAA4E;QAC5E,+EAA+E;QAC/E,4FAA4F;QAC5F,WAAW,GAAG,yBAAyB,CAC1C;IACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;IAC5D;;;;;;;;OAQG;IACH,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1C;;;;;;;;;;;OAWG;IACH,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAW,CAAC;AAExF,sEAAsE;AACtE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC,iBAAiB,CAAC;IAC1B,uEAAuE;IACvE,4EAA4E;IAC5E,sBAAsB;KACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE;IACtE,OAAO,EAAE,uCAAuC;CACjD,CAAC;IACF,8FAA8F;KAC7F,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;IACrF,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,KAAK,CAAC,KAAgE,CAAC;QACrF,OAAO,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAE,CAAC;IAC3E,CAAC;CACF,CAAC;KACD,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,EAClE,EAAE,OAAO,EAAE,wFAAwF,EAAE,CACtG;IACD,6EAA6E;IAC7E,8EAA8E;IAC9E,6EAA6E;IAC7E,uEAAuE;IACvE,EAAE;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,4BAA4B;KAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE;IACrF,OAAO,EAAE,2EAA2E;CACrF,CAAC;KACD,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,KAAK,SAAS;IACxB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,kBAAkB,EAC3E;IACE,yEAAyE;IACzE,kEAAkE;IAClE,oDAAoD;IACpD,OAAO,EAAE,WAAW,kBAAkB,0BAA0B;CACjE,CACF;KACA,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,KAAK,SAAS;IACxB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,EACvE,EAAE,OAAO,EAAE,8DAA8D,EAAE,CAC5E;KACA,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,KAAK,SAAS;IACxB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAC1E,EAAE,OAAO,EAAE,2EAA2E,EAAE,CACzF;KACA,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,KAAK,SAAS;IACxB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAC1E,EAAE,OAAO,EAAE,2EAA2E,EAAE,CACzF;IACD,wEAAwE;IACxE,yEAAyE;IACzE,qEAAqE;IACrE,qEAAqE;IACrE,wEAAwE;KACvE,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,EAC3D,EAAE,OAAO,EAAE,sCAAsC,EAAE,CACpD;IACD,0EAA0E;KACzE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE;IAC1E,OAAO,EAAE,8BAA8B;CACxC,CAAC,CAAC;AAEL,+EAA+E;AAC/E,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAQnG,mFAAmF;AACnF,SAAS,YAAY,CAAC,KAAsB;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC;SAC7C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;SACtC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAID,kFAAkF;AAClF,8EAA8E;AAC9E,sEAAsE;AAEtE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAChD,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,uEAAuE;IACvE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,4EAA4E;IAC5E,4DAA4D;IAC5D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B;;;;;;OAMG;IACH,MAAM,EAAE,CAAC;SACN,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC;SACD,QAAQ,EAAE;IACb,yEAAyE;IACzE,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;KAChD,CAAC;SACD,QAAQ,EAAE;IACb,8DAA8D;IAC9D,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;CAC9B,CAAC,CAAC"}
|
package/dist/voices.d.ts
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { Gender } from "./default-actor.js";
|
|
3
|
-
/** Модели синтеза ElevenLabs, которые контракт разрешает назвать (clipwright#101). */
|
|
4
|
-
|
|
3
|
+
/** Модели синтеза ElevenLabs, которые контракт разрешает назвать (clipwright#101, #145). */
|
|
4
|
+
/** `multilingual_v2` снята: по замеру #145 она не отвечает ни на один приём ударения. */
|
|
5
|
+
export declare const TTS_MODELS: readonly ["eleven_v3", "eleven_flash_v2_5", "eleven_turbo_v2_5"];
|
|
5
6
|
export type TtsModelId = (typeof TTS_MODELS)[number];
|
|
6
7
|
export declare const DEFAULT_TTS_MODEL: TtsModelId;
|
|
7
|
-
/**
|
|
8
|
+
/** У v3 потолок вендорский. У 2.5 вендор даёт 40 000; 10 000 — наш потолок длины рана. */
|
|
8
9
|
export declare const TTS_MODEL_CHAR_CAP: Readonly<Record<TtsModelId, number>>;
|
|
10
|
+
/** Знак ударения U+0301 читает только v3; flash тем же знаком ошибается втрое чаще (#145). */
|
|
11
|
+
export declare const STRESS_MARK: string;
|
|
12
|
+
export declare const STRESS_MARK_MODELS: ReadonlySet<TtsModelId>;
|
|
13
|
+
/** «потОм» → «пото́м». Заглавная в начале слова — обычная заглавная; знак не удваивается. */
|
|
14
|
+
export declare function stressMarksFromCapitals(text: string): string;
|
|
15
|
+
/** Текст, который уходит вендору: разметка ударения — только для модели, которая её читает. */
|
|
16
|
+
export declare function speechTextFor(text: string, modelId: TtsModelId): string;
|
|
9
17
|
export declare const MAX_SCRIPT_CHARS: number;
|
|
10
18
|
export declare const SCRIPT_LENGTH_DESCRIPTION: string;
|
|
11
|
-
|
|
19
|
+
export declare const STRESS_MARKING_DESCRIPTION: string;
|
|
20
|
+
/** Длина считается по тексту, который уйдёт вендору, — со знаками ударения. */
|
|
12
21
|
export declare function ttsScriptLimitError(text: string, modelId: string): string | undefined;
|
|
13
22
|
/** Каталог голосовых пресетов — НАШИ имена и метадата, БЕЗ вендорских id: имена */
|
|
14
23
|
/** порождают `tools/list` и типы SDK, id живут только в адаптере воркера. */
|
|
@@ -38,25 +47,25 @@ export declare const VOICE_PRESETS: {
|
|
|
38
47
|
readonly language: "en";
|
|
39
48
|
readonly gender: "female";
|
|
40
49
|
readonly description: "Soft, natural female voice (English)";
|
|
41
|
-
readonly model: "
|
|
50
|
+
readonly model: "eleven_v3";
|
|
42
51
|
};
|
|
43
52
|
readonly george: {
|
|
44
53
|
readonly language: "en";
|
|
45
54
|
readonly gender: "male";
|
|
46
55
|
readonly description: "Warm British storyteller, narrative pacing (English)";
|
|
47
|
-
readonly model: "
|
|
56
|
+
readonly model: "eleven_v3";
|
|
48
57
|
};
|
|
49
58
|
readonly eric: {
|
|
50
59
|
readonly language: "en";
|
|
51
60
|
readonly gender: "male";
|
|
52
61
|
readonly description: "Smooth American, conversational tone (English)";
|
|
53
|
-
readonly model: "
|
|
62
|
+
readonly model: "eleven_v3";
|
|
54
63
|
};
|
|
55
64
|
readonly daria_ru_female: {
|
|
56
65
|
readonly language: "ru";
|
|
57
66
|
readonly gender: "female";
|
|
58
67
|
readonly description: "Женский повествовательный голос (русский)";
|
|
59
|
-
readonly model: "
|
|
68
|
+
readonly model: "eleven_v3";
|
|
60
69
|
};
|
|
61
70
|
};
|
|
62
71
|
/**
|
|
@@ -82,7 +91,8 @@ export declare const voiceCatalogEntry: z.ZodObject<{
|
|
|
82
91
|
}>>;
|
|
83
92
|
description: z.ZodString;
|
|
84
93
|
model: z.ZodEnum<{
|
|
85
|
-
|
|
94
|
+
eleven_flash_v2_5: "eleven_flash_v2_5";
|
|
95
|
+
eleven_turbo_v2_5: "eleven_turbo_v2_5";
|
|
86
96
|
eleven_v3: "eleven_v3";
|
|
87
97
|
}>;
|
|
88
98
|
preview_url: z.ZodOptional<z.ZodURL>;
|
|
@@ -105,7 +115,8 @@ export declare const voicesResponse: z.ZodObject<{
|
|
|
105
115
|
}>>;
|
|
106
116
|
description: z.ZodString;
|
|
107
117
|
model: z.ZodEnum<{
|
|
108
|
-
|
|
118
|
+
eleven_flash_v2_5: "eleven_flash_v2_5";
|
|
119
|
+
eleven_turbo_v2_5: "eleven_turbo_v2_5";
|
|
109
120
|
eleven_v3: "eleven_v3";
|
|
110
121
|
}>;
|
|
111
122
|
preview_url: z.ZodOptional<z.ZodURL>;
|
|
@@ -221,3 +232,10 @@ export declare function buildVoiceWarnings(input: {
|
|
|
221
232
|
voice_id?: string | undefined;
|
|
222
233
|
script: string;
|
|
223
234
|
}): string[];
|
|
235
|
+
/** Модель, не читающая ударения, на тексте, где они важны. На умолчании (v3) молчит всегда. */
|
|
236
|
+
export declare function buildSpeechModelWarnings(input: {
|
|
237
|
+
voice?: VoicePresetName | undefined;
|
|
238
|
+
voice_id?: string | undefined;
|
|
239
|
+
tts_model?: TtsModelId | undefined;
|
|
240
|
+
script: string;
|
|
241
|
+
}): string[];
|
package/dist/voices.js
CHANGED
|
@@ -1,24 +1,80 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
/** Модели синтеза ElevenLabs, которые контракт разрешает назвать (clipwright#101). */
|
|
3
|
-
|
|
4
|
-
export const
|
|
5
|
-
|
|
2
|
+
/** Модели синтеза ElevenLabs, которые контракт разрешает назвать (clipwright#101, #145). */
|
|
3
|
+
/** `multilingual_v2` снята: по замеру #145 она не отвечает ни на один приём ударения. */
|
|
4
|
+
export const TTS_MODELS = ["eleven_v3", "eleven_flash_v2_5", "eleven_turbo_v2_5"];
|
|
5
|
+
export const DEFAULT_TTS_MODEL = "eleven_v3";
|
|
6
|
+
/** У v3 потолок вендорский. У 2.5 вендор даёт 40 000; 10 000 — наш потолок длины рана. */
|
|
6
7
|
export const TTS_MODEL_CHAR_CAP = {
|
|
7
|
-
eleven_multilingual_v2: 10_000,
|
|
8
8
|
eleven_v3: 5_000,
|
|
9
|
+
eleven_flash_v2_5: 10_000,
|
|
10
|
+
eleven_turbo_v2_5: 10_000,
|
|
9
11
|
};
|
|
12
|
+
/** Знак ударения U+0301 читает только v3; flash тем же знаком ошибается втрое чаще (#145). */
|
|
13
|
+
export const STRESS_MARK = String.fromCharCode(0x0301);
|
|
14
|
+
export const STRESS_MARK_MODELS = new Set(["eleven_v3"]);
|
|
15
|
+
const CYRILLIC_WORD = new RegExp(`[Ѐ-ӿ${STRESS_MARK}]+`, "g");
|
|
16
|
+
const CYRILLIC_STRESS_MARK = new RegExp(`[Ѐ-ӿ]${STRESS_MARK}`);
|
|
17
|
+
const CYRILLIC_LOWERCASE = /[а-џ]/;
|
|
18
|
+
const CYRILLIC_UPPERCASE = /[Ѐ-Я]/;
|
|
19
|
+
const CYRILLIC_UPPER_VOWELS = "АЕЁИОУЫЭЮЯ";
|
|
20
|
+
/** Позиция ударной заглавной: ровно одна заглавная после первой буквы, и она гласная. */
|
|
21
|
+
/** Вторая заглавная или согласная — аббревиатура («ВУЗы», «СУПЕРцена»), не ударение. */
|
|
22
|
+
function stressCapitalIndex(word) {
|
|
23
|
+
if (!CYRILLIC_LOWERCASE.test(word))
|
|
24
|
+
return -1;
|
|
25
|
+
let start = 0;
|
|
26
|
+
while (word[start] === STRESS_MARK)
|
|
27
|
+
start += 1;
|
|
28
|
+
let found = -1;
|
|
29
|
+
for (let i = start + 1; i < word.length; i += 1) {
|
|
30
|
+
const ch = word[i];
|
|
31
|
+
if (!CYRILLIC_UPPERCASE.test(ch))
|
|
32
|
+
continue;
|
|
33
|
+
if (found !== -1 || !CYRILLIC_UPPER_VOWELS.includes(ch))
|
|
34
|
+
return -1;
|
|
35
|
+
found = i;
|
|
36
|
+
}
|
|
37
|
+
return found;
|
|
38
|
+
}
|
|
39
|
+
/** «потОм» → «пото́м». Заглавная в начале слова — обычная заглавная; знак не удваивается. */
|
|
40
|
+
export function stressMarksFromCapitals(text) {
|
|
41
|
+
return text.replace(CYRILLIC_WORD, (word) => {
|
|
42
|
+
const i = stressCapitalIndex(word);
|
|
43
|
+
if (i === -1)
|
|
44
|
+
return word;
|
|
45
|
+
const vowel = word[i];
|
|
46
|
+
const mark = vowel === "Ё" || word[i + 1] === STRESS_MARK ? "" : STRESS_MARK;
|
|
47
|
+
return word.slice(0, i) + vowel.toLowerCase() + mark + word.slice(i + 1);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Текст, который уходит вендору: разметка ударения — только для модели, которая её читает. */
|
|
51
|
+
export function speechTextFor(text, modelId) {
|
|
52
|
+
return STRESS_MARK_MODELS.has(modelId) ? stressMarksFromCapitals(text) : text;
|
|
53
|
+
}
|
|
10
54
|
export const MAX_SCRIPT_CHARS = Math.max(...Object.values(TTS_MODEL_CHAR_CAP));
|
|
11
55
|
export const SCRIPT_LENGTH_DESCRIPTION = `Script limits by speech model: ${TTS_MODELS.map((model) => `${model}: ${TTS_MODEL_CHAR_CAP[model]} characters`).join("; ")}. ` +
|
|
12
|
-
"Count includes spaces and
|
|
56
|
+
"Count includes spaces, audio tags and stress marks; emoji may count as two characters. " +
|
|
13
57
|
"There is no word-count limit. Duration and price are estimates until measured.";
|
|
14
|
-
|
|
58
|
+
export const STRESS_MARKING_DESCRIPTION = "Russian stress: write the stressed vowel as a capital inside a lowercase word (\"потОм\", \"зАмок\") " +
|
|
59
|
+
"and eleven_v3 receives it as the stress mark U+0301 (\"пото́м\"); a mark typed directly is kept. " +
|
|
60
|
+
"A capital at the start of a word stays a capital, and a word with a second capital or a capital " +
|
|
61
|
+
"consonant inside (all caps, \"ВУЗы\") is left as it is. A single capital vowel inside a word is always " +
|
|
62
|
+
"read as stress, so write \"Яндекс Еда\", not \"ЯндексЕда\". " +
|
|
63
|
+
"Tell users writing in Russian that they can mark stress this way. eleven_flash_v2_5 and " +
|
|
64
|
+
"eleven_turbo_v2_5 cost less but misread stress marks: capitals reach them unchanged.";
|
|
65
|
+
/** Длина считается по тексту, который уйдёт вендору, — со знаками ударения. */
|
|
15
66
|
export function ttsScriptLimitError(text, modelId) {
|
|
16
67
|
const model = TTS_MODELS.find((model) => model === modelId);
|
|
17
68
|
if (!model)
|
|
18
69
|
return `unsupported speech model: ${modelId}`;
|
|
19
70
|
const limit = TTS_MODEL_CHAR_CAP[model];
|
|
20
|
-
|
|
21
|
-
|
|
71
|
+
const length = speechTextFor(text, model).length;
|
|
72
|
+
if (length > limit) {
|
|
73
|
+
const cheaperCap = TTS_MODEL_CHAR_CAP.eleven_flash_v2_5;
|
|
74
|
+
const remedy = model === "eleven_v3" && text.length <= cheaperCap
|
|
75
|
+
? `; eleven_flash_v2_5 and eleven_turbo_v2_5 allow ${cheaperCap} but do not read Russian stress`
|
|
76
|
+
: "";
|
|
77
|
+
return `script has ${length} characters; ${model} allows at most ${limit} characters (including spaces, tags and stress marks; emoji may count as two)${remedy}`;
|
|
22
78
|
}
|
|
23
79
|
return undefined;
|
|
24
80
|
}
|
|
@@ -32,32 +88,32 @@ export const VOICE_PRESETS = {
|
|
|
32
88
|
// Пол — НАШ факт о своём клоне, а не метадата вендора (docs/18, Д50).
|
|
33
89
|
gender: "male",
|
|
34
90
|
description: "Клон голоса владельца (David-Dmitry-Ru); русский — на английском даёт акцент",
|
|
35
|
-
// Клон настроен на v3: на multilingual_v2 другой тембр и ошибки в русских ударениях (#101).
|
|
36
91
|
model: "eleven_v3",
|
|
37
92
|
},
|
|
93
|
+
// Все пресеты — v3: решение владельца #145, выразительнее и единственная со знаком ударения.
|
|
38
94
|
sarah: {
|
|
39
95
|
language: "en",
|
|
40
96
|
gender: "female",
|
|
41
97
|
description: "Soft, natural female voice (English)",
|
|
42
|
-
model: "
|
|
98
|
+
model: "eleven_v3",
|
|
43
99
|
},
|
|
44
100
|
george: {
|
|
45
101
|
language: "en",
|
|
46
102
|
gender: "male",
|
|
47
103
|
description: "Warm British storyteller, narrative pacing (English)",
|
|
48
|
-
model: "
|
|
104
|
+
model: "eleven_v3",
|
|
49
105
|
},
|
|
50
106
|
eric: {
|
|
51
107
|
language: "en",
|
|
52
108
|
gender: "male",
|
|
53
109
|
description: "Smooth American, conversational tone (English)",
|
|
54
|
-
model: "
|
|
110
|
+
model: "eleven_v3",
|
|
55
111
|
},
|
|
56
112
|
daria_ru_female: {
|
|
57
113
|
language: "ru",
|
|
58
114
|
gender: "female",
|
|
59
115
|
description: "Женский повествовательный голос (русский)",
|
|
60
|
-
model: "
|
|
116
|
+
model: "eleven_v3",
|
|
61
117
|
},
|
|
62
118
|
};
|
|
63
119
|
/**
|
|
@@ -251,4 +307,26 @@ export function buildVoiceWarnings(input) {
|
|
|
251
307
|
`voice "${input.voice}" is labeled ${preset.language}, but the script looks ${scriptFamily}; it will be voiced in a ${preset.language} voice`,
|
|
252
308
|
];
|
|
253
309
|
}
|
|
310
|
+
/** Модель, не читающая ударения, на тексте, где они важны. На умолчании (v3) молчит всегда. */
|
|
311
|
+
export function buildSpeechModelWarnings(input) {
|
|
312
|
+
const model = resolveTtsModel(input);
|
|
313
|
+
if (STRESS_MARK_MODELS.has(model))
|
|
314
|
+
return [];
|
|
315
|
+
// Знак после латиницы — акцент французского или испанского текста (NFD), не ударение.
|
|
316
|
+
const marked = CYRILLIC_STRESS_MARK.test(input.script) || stressMarksFromCapitals(input.script) !== input.script;
|
|
317
|
+
if (marked) {
|
|
318
|
+
return [
|
|
319
|
+
`stress marks in the script (capital vowels or U+0301) are not read by ${model}: they are sent ` +
|
|
320
|
+
"unchanged, and a U+0301 can break the word it sits in; use eleven_v3 for Russian",
|
|
321
|
+
];
|
|
322
|
+
}
|
|
323
|
+
const letters = scriptLetterCounts(input.script);
|
|
324
|
+
if (detectScriptFamily(input.script) === "cyrillic" || (letters.cyrillic > 0 && letters.latin === 0)) {
|
|
325
|
+
return [
|
|
326
|
+
`Cyrillic script on ${model}: for Russian it places stress less reliably than eleven_v3 ` +
|
|
327
|
+
"and does not read stress marks",
|
|
328
|
+
];
|
|
329
|
+
}
|
|
330
|
+
return [];
|
|
331
|
+
}
|
|
254
332
|
//# sourceMappingURL=voices.js.map
|