@pie-players/tts-server-sc 0.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # @pie-players/tts-server-sc
2
+
3
+ SchoolCity-backed server-side TTS provider for PIE projects.
4
+
5
+ This package uses SchoolCity as an internal Renaissance-backed reference implementation
6
+ for custom server-side TTS integrations. The intent is to demonstrate a reusable
7
+ "custom backend adapter" pattern you can apply to your own TTS service.
8
+
9
+ ## What it does
10
+
11
+ - Signs short-lived JWT credentials for SchoolCity TTS.
12
+ - Calls SchoolCity synthesis endpoint.
13
+ - Fetches and normalizes word marks.
14
+ - Rebases offsets so marks align to original request text.
15
+ - Exposes a provider API compatible with the `@pie-players/tts-server-*` pattern.
16
+
17
+ ## Positioning
18
+
19
+ - `@pie-players/tts-server-sc` is a host/server integration package.
20
+ - It is not a toolkit default option by itself.
21
+ - Toolkit defaults remain browser-backed until a host app explicitly configures server/custom TTS.
22
+
23
+ ## Install
24
+
25
+ ```bash
26
+ bun add @pie-players/tts-server-sc
27
+ ```
28
+
29
+ ## Required configuration
30
+
31
+ - `baseUrl`: SchoolCity TTS endpoint
32
+ - `apiKey`: signing key used to mint bearer JWT
33
+ - `issuer`: JWT `iss` claim
34
+
35
+ ## Basic usage
36
+
37
+ ```ts
38
+ import { SchoolCityServerProvider } from "@pie-players/tts-server-sc";
39
+
40
+ const provider = new SchoolCityServerProvider();
41
+ await provider.initialize({
42
+ baseUrl: process.env.TTS_SCHOOLCITY_URL!,
43
+ apiKey: process.env.TTS_SCHOOLCITY_API_KEY!,
44
+ issuer: process.env.TTS_SCHOOLCITY_ISS!,
45
+ defaultLanguage: "en-US",
46
+ defaultSpeedRate: "medium",
47
+ defaultCache: true,
48
+ });
49
+
50
+ const result = await provider.synthesize({
51
+ text: "Hello world",
52
+ language: "en-US",
53
+ includeSpeechMarks: true,
54
+ });
55
+ ```
56
+
57
+ ## Dogfood adapter example (section-demos shape)
58
+
59
+ If you need to keep legacy response shape (`audioContent`, `word`) while reusing provider logic:
60
+
61
+ ```ts
62
+ const assets = await provider.synthesizeWithAssets({
63
+ text,
64
+ language: lang_id,
65
+ providerOptions: { speedRate, cache },
66
+ });
67
+
68
+ return json({
69
+ audioContent: assets.audioContent,
70
+ word: assets.word,
71
+ speechMarks: assets.speechMarks,
72
+ });
73
+ ```
74
+
75
+ ## Bring-your-own backend mapping
76
+
77
+ To adapt this package pattern to another custom provider, replace:
78
+
79
+ - **Auth signer**: `toBearerToken()` strategy (JWT/API key/OAuth as needed)
80
+ - **Upstream request shape**: request payload builder (`text`, language, speed/rate fields)
81
+ - **Asset contract**: response extraction (`audioContent`, marks URL, or inline marks)
82
+ - **Marks parser**: JSONL/JSON parsing and normalization rules
83
+ - **Offset normalization**: rebasing logic if upstream marks are not indexed to original text
84
+
85
+ Keep the provider surface (`initialize`, `synthesize`, `synthesizeWithAssets`) so host
86
+ routes can stay thin and consistent.
87
+
88
+ ## Notes on SSML
89
+
90
+ - The provider accepts plain text and SSML fragments.
91
+ - If full `<speak>...</speak>` is provided, it is normalized to avoid nested `<speak>` wrappers when SC applies its own wrapping behavior.
92
+ - Mark rebasing is best-effort and intentionally deterministic to keep highlighting stable.
@@ -0,0 +1,41 @@
1
+ import { BaseTTSProvider, type GetVoicesOptions, type ServerProviderCapabilities, type SpeechMark, type SynthesizeRequest, type SynthesizeResponse, type TTSServerConfig, type Voice } from "@pie-players/tts-server-core";
2
+ type SchoolCitySpeedRate = "slow" | "medium" | "fast";
3
+ type FetchLike = typeof fetch;
4
+ export interface SchoolCityProviderConfig extends TTSServerConfig {
5
+ baseUrl: string;
6
+ apiKey: string;
7
+ issuer: string;
8
+ defaultLanguage?: string;
9
+ defaultSpeedRate?: SchoolCitySpeedRate;
10
+ defaultCache?: boolean;
11
+ requestTimeoutMs?: number;
12
+ fetchImpl?: FetchLike;
13
+ }
14
+ export interface SchoolCitySynthesizeAssetsResult {
15
+ audioContent: string;
16
+ word: string;
17
+ speechMarks: SpeechMark[];
18
+ }
19
+ export declare class SchoolCityServerProvider extends BaseTTSProvider {
20
+ readonly providerId = "schoolcity-tts";
21
+ readonly providerName = "SchoolCity TTS";
22
+ readonly version = "1.0.0";
23
+ private baseUrl;
24
+ private apiKey;
25
+ private issuer;
26
+ private defaultLanguage;
27
+ private defaultSpeedRate;
28
+ private defaultCache;
29
+ private requestTimeoutMs;
30
+ private fetchImpl;
31
+ initialize(config: SchoolCityProviderConfig): Promise<void>;
32
+ private toBearerToken;
33
+ private buildSchoolCityRequest;
34
+ private withTimeout;
35
+ synthesizeWithAssets(request: SynthesizeRequest): Promise<SchoolCitySynthesizeAssetsResult>;
36
+ synthesize(request: SynthesizeRequest): Promise<SynthesizeResponse>;
37
+ getVoices(_options?: GetVoicesOptions): Promise<Voice[]>;
38
+ getCapabilities(): ServerProviderCapabilities;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=SchoolCityServerProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchoolCityServerProvider.d.ts","sourceRoot":"","sources":["../src/SchoolCityServerProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,eAAe,EACf,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGvB,KAAK,eAAe,EACpB,KAAK,KAAK,EACV,MAAM,8BAA8B,CAAC;AAEtC,KAAK,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAiBtD,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAE9B,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,gCAAgC;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;CAC1B;AA+LD,qBAAa,wBAAyB,SAAQ,eAAe;IAC5D,QAAQ,CAAC,UAAU,oBAAoB;IACvC,QAAQ,CAAC,YAAY,oBAAoB;IACzC,QAAQ,CAAC,OAAO,WAAW;IAE3B,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,SAAS,CAAoB;IAE/B,UAAU,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;YAsCnD,aAAa;IAU3B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,WAAW;IASN,oBAAoB,CAChC,OAAO,EAAE,iBAAiB,GACxB,OAAO,CAAC,gCAAgC,CAAC;IAyEtC,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6BnE,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAK9D,eAAe,IAAI,0BAA0B;CAqB7C"}
@@ -0,0 +1,343 @@
1
+ import { SignJWT } from "jose";
2
+ import { BaseTTSProvider, TTSError, TTSErrorCode, } from "@pie-players/tts-server-core";
3
+ const DEFAULT_LANGUAGE = "en-US";
4
+ const DEFAULT_SPEED_RATE = "medium";
5
+ const DEFAULT_CACHE = true;
6
+ const DEFAULT_REQUEST_TIMEOUT_MS = 15000;
7
+ const asFiniteNumber = (value) => {
8
+ const next = Number(value);
9
+ return Number.isFinite(next) ? next : null;
10
+ };
11
+ const sortSpeechMarks = (marks) => [...marks].sort((left, right) => {
12
+ if (left.time !== right.time)
13
+ return left.time - right.time;
14
+ if (left.start !== right.start)
15
+ return left.start - right.start;
16
+ return left.end - right.end;
17
+ });
18
+ const parseResponseBody = async (response) => {
19
+ const raw = await response.text();
20
+ if (!raw)
21
+ return {};
22
+ try {
23
+ return JSON.parse(raw);
24
+ }
25
+ catch {
26
+ return { message: raw };
27
+ }
28
+ };
29
+ const normalizeEndpoint = (value) => value.replace(/\/+$/, "");
30
+ const toSpeedRate = (request, fallback) => {
31
+ const providerOptions = (request.providerOptions || {});
32
+ const explicit = providerOptions.speedRate;
33
+ if (explicit === "slow" || explicit === "medium" || explicit === "fast") {
34
+ return explicit;
35
+ }
36
+ const rate = Number(request.rate ?? 1);
37
+ if (!Number.isFinite(rate) || rate <= 0.95)
38
+ return "slow";
39
+ if (rate >= 1.5)
40
+ return "fast";
41
+ return fallback;
42
+ };
43
+ const toLanguage = (request, fallback) => {
44
+ const providerOptions = (request.providerOptions || {});
45
+ if (typeof providerOptions.lang_id === "string" && providerOptions.lang_id.trim()) {
46
+ return providerOptions.lang_id.trim();
47
+ }
48
+ if (typeof request.language === "string" && request.language.trim()) {
49
+ return request.language.trim();
50
+ }
51
+ return fallback;
52
+ };
53
+ const toCacheFlag = (request, fallback) => {
54
+ const providerOptions = (request.providerOptions || {});
55
+ if (typeof providerOptions.cache === "boolean") {
56
+ return providerOptions.cache;
57
+ }
58
+ return fallback;
59
+ };
60
+ /**
61
+ * SC wraps incoming content in its own SSML envelope.
62
+ * If caller provides full <speak>...</speak>, send only inner body to avoid nested roots.
63
+ */
64
+ const normalizeTextForSchoolCity = (input) => {
65
+ const text = String(input || "").trim();
66
+ if (!text)
67
+ return text;
68
+ const fullSpeak = /^\s*<speak[\s\S]*<\/speak>\s*$/i;
69
+ if (!fullSpeak.test(text))
70
+ return text;
71
+ const withoutOpen = text.replace(/^\s*<speak[^>]*>/i, "");
72
+ return withoutOpen.replace(/<\/speak>\s*$/i, "").trim();
73
+ };
74
+ const parseWordMarksJsonl = (raw) => {
75
+ const marks = [];
76
+ for (const line of raw.split(/\r?\n/)) {
77
+ const trimmed = line.trim();
78
+ if (!trimmed)
79
+ continue;
80
+ try {
81
+ const parsed = JSON.parse(trimmed);
82
+ if (parsed.type && parsed.type !== "word")
83
+ continue;
84
+ const time = asFiniteNumber(parsed.time);
85
+ const start = asFiniteNumber(parsed.start);
86
+ const end = asFiniteNumber(parsed.end);
87
+ if (time === null || start === null || end === null)
88
+ continue;
89
+ const value = typeof parsed.value === "string" ? parsed.value : "";
90
+ marks.push({
91
+ time,
92
+ type: "word",
93
+ start,
94
+ end,
95
+ value,
96
+ });
97
+ }
98
+ catch {
99
+ // Ignore malformed JSONL rows while preserving valid marks.
100
+ }
101
+ }
102
+ return sortSpeechMarks(marks);
103
+ };
104
+ const normalizeMarkTimeUnits = (marks) => {
105
+ if (marks.length < 2)
106
+ return marks;
107
+ const times = marks.map((mark) => mark.time).filter((time) => time >= 0);
108
+ const maxTime = times.length ? Math.max(...times) : 0;
109
+ const deltas = [];
110
+ for (let index = 1; index < times.length; index += 1) {
111
+ const delta = times[index] - times[index - 1];
112
+ if (delta > 0 && Number.isFinite(delta))
113
+ deltas.push(delta);
114
+ }
115
+ const medianDelta = deltas.length > 0
116
+ ? [...deltas].sort((a, b) => a - b)[Math.floor(deltas.length / 2)]
117
+ : 0;
118
+ const shapeSuggestsSeconds = (maxTime > 0 && maxTime < 100 && marks.length > 3) ||
119
+ (medianDelta > 0 && medianDelta < 10);
120
+ if (!shapeSuggestsSeconds)
121
+ return marks;
122
+ return marks.map((mark) => ({ ...mark, time: mark.time * 1000 }));
123
+ };
124
+ const estimateOffsetShift = (marks, requestText) => {
125
+ if (!marks.length || !requestText.length)
126
+ return 0;
127
+ const textLower = requestText.toLowerCase();
128
+ const candidates = [];
129
+ let cursor = 0;
130
+ for (const mark of marks) {
131
+ const token = mark.value.trim().toLowerCase();
132
+ if (!token)
133
+ continue;
134
+ const found = textLower.indexOf(token, cursor);
135
+ if (found < 0)
136
+ continue;
137
+ const delta = mark.start - found;
138
+ if (delta >= 0)
139
+ candidates.push(delta);
140
+ cursor = found + token.length;
141
+ if (candidates.length >= 8)
142
+ break;
143
+ }
144
+ if (candidates.length > 0) {
145
+ const ordered = [...candidates].sort((a, b) => a - b);
146
+ return ordered[Math.floor(ordered.length / 2)];
147
+ }
148
+ return Math.max(0, Math.floor(marks[0].start));
149
+ };
150
+ const rebaseOffsetsToRequestText = (marks, requestText) => {
151
+ if (!marks.length || !requestText.length)
152
+ return marks;
153
+ const textLength = requestText.length;
154
+ const maxEnd = Math.max(...marks.map((mark) => mark.end));
155
+ if (maxEnd <= textLength + 2)
156
+ return marks;
157
+ const shift = estimateOffsetShift(marks, requestText);
158
+ if (shift <= 0)
159
+ return marks;
160
+ return marks.map((mark) => ({
161
+ ...mark,
162
+ start: mark.start - shift,
163
+ end: mark.end - shift,
164
+ }));
165
+ };
166
+ const clampMarkRanges = (marks, requestText) => {
167
+ if (!requestText.length)
168
+ return marks;
169
+ const textLength = requestText.length;
170
+ return sortSpeechMarks(marks.map((mark) => {
171
+ const start = Math.max(0, Math.min(textLength, Math.floor(mark.start)));
172
+ const end = Math.max(start + 1, Math.min(textLength, Math.floor(mark.end)));
173
+ return { ...mark, start, end };
174
+ }));
175
+ };
176
+ const normalizeSpeechMarks = (raw, requestText) => {
177
+ const parsed = parseWordMarksJsonl(raw);
178
+ const withTimes = normalizeMarkTimeUnits(parsed);
179
+ const rebased = rebaseOffsetsToRequestText(withTimes, requestText);
180
+ return clampMarkRanges(rebased, requestText);
181
+ };
182
+ export class SchoolCityServerProvider extends BaseTTSProvider {
183
+ providerId = "schoolcity-tts";
184
+ providerName = "SchoolCity TTS";
185
+ version = "1.0.0";
186
+ baseUrl = "";
187
+ apiKey = "";
188
+ issuer = "";
189
+ defaultLanguage = DEFAULT_LANGUAGE;
190
+ defaultSpeedRate = DEFAULT_SPEED_RATE;
191
+ defaultCache = DEFAULT_CACHE;
192
+ requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS;
193
+ fetchImpl = fetch;
194
+ async initialize(config) {
195
+ if (!config.baseUrl?.trim()) {
196
+ throw new TTSError(TTSErrorCode.INITIALIZATION_ERROR, "SchoolCity baseUrl is required", undefined, this.providerId);
197
+ }
198
+ if (!config.apiKey?.trim()) {
199
+ throw new TTSError(TTSErrorCode.INITIALIZATION_ERROR, "SchoolCity apiKey is required", undefined, this.providerId);
200
+ }
201
+ if (!config.issuer?.trim()) {
202
+ throw new TTSError(TTSErrorCode.INITIALIZATION_ERROR, "SchoolCity issuer is required", undefined, this.providerId);
203
+ }
204
+ this.config = config;
205
+ this.baseUrl = normalizeEndpoint(config.baseUrl);
206
+ this.apiKey = config.apiKey;
207
+ this.issuer = config.issuer;
208
+ this.defaultLanguage = config.defaultLanguage || DEFAULT_LANGUAGE;
209
+ this.defaultSpeedRate = config.defaultSpeedRate || DEFAULT_SPEED_RATE;
210
+ this.defaultCache = config.defaultCache ?? DEFAULT_CACHE;
211
+ this.requestTimeoutMs = config.requestTimeoutMs || DEFAULT_REQUEST_TIMEOUT_MS;
212
+ this.fetchImpl = config.fetchImpl || fetch;
213
+ this.initialized = true;
214
+ }
215
+ async toBearerToken() {
216
+ const secret = new TextEncoder().encode(this.apiKey);
217
+ return new SignJWT({})
218
+ .setProtectedHeader({ alg: "HS256" })
219
+ .setIssuer(this.issuer)
220
+ .setIssuedAt()
221
+ .setExpirationTime("5m")
222
+ .sign(secret);
223
+ }
224
+ buildSchoolCityRequest(request) {
225
+ const text = normalizeTextForSchoolCity(request.text);
226
+ const speedRate = toSpeedRate(request, this.defaultSpeedRate);
227
+ const lang_id = toLanguage(request, this.defaultLanguage);
228
+ const cache = toCacheFlag(request, this.defaultCache);
229
+ const payload = { text, speedRate, lang_id, cache };
230
+ if (request.voice)
231
+ payload.voice = request.voice;
232
+ return payload;
233
+ }
234
+ withTimeout() {
235
+ const controller = new AbortController();
236
+ const timeout = setTimeout(() => controller.abort(), this.requestTimeoutMs);
237
+ return {
238
+ signal: controller.signal,
239
+ clear: () => clearTimeout(timeout),
240
+ };
241
+ }
242
+ async synthesizeWithAssets(request) {
243
+ this.ensureInitialized();
244
+ this.validateRequest(request, this.getCapabilities());
245
+ const payload = this.buildSchoolCityRequest(request);
246
+ const token = await this.toBearerToken();
247
+ const timeout = this.withTimeout();
248
+ try {
249
+ const response = await this.fetchImpl(this.baseUrl, {
250
+ method: "POST",
251
+ headers: {
252
+ "Content-Type": "application/json",
253
+ Authorization: `Bearer ${token}`,
254
+ },
255
+ body: JSON.stringify(payload),
256
+ signal: timeout.signal,
257
+ });
258
+ const body = (await parseResponseBody(response));
259
+ if (!response.ok) {
260
+ throw new TTSError(TTSErrorCode.PROVIDER_ERROR, typeof body.message === "string"
261
+ ? body.message
262
+ : `SchoolCity synthesis failed (${response.status})`, { status: response.status, body }, this.providerId);
263
+ }
264
+ const audioContent = typeof body.audioContent === "string" ? body.audioContent : "";
265
+ const word = typeof body.word === "string" ? body.word : "";
266
+ if (!audioContent || !word) {
267
+ throw new TTSError(TTSErrorCode.PROVIDER_ERROR, "SchoolCity response missing audioContent or word URL", { body }, this.providerId);
268
+ }
269
+ let speechMarks = [];
270
+ if (request.includeSpeechMarks !== false) {
271
+ const marksResponse = await this.fetchImpl(word, { signal: timeout.signal });
272
+ if (!marksResponse.ok) {
273
+ throw new TTSError(TTSErrorCode.PROVIDER_ERROR, `SchoolCity marks fetch failed (${marksResponse.status})`, { word, status: marksResponse.status }, this.providerId);
274
+ }
275
+ const marksRaw = await marksResponse.text();
276
+ speechMarks = normalizeSpeechMarks(marksRaw, payload.text);
277
+ }
278
+ return {
279
+ audioContent,
280
+ word,
281
+ speechMarks,
282
+ };
283
+ }
284
+ catch (error) {
285
+ if (error instanceof TTSError)
286
+ throw error;
287
+ const message = error instanceof Error ? error.message : "Unknown SchoolCity synthesis error";
288
+ throw new TTSError(TTSErrorCode.PROVIDER_ERROR, `SchoolCity synthesis failed: ${message}`, { error }, this.providerId);
289
+ }
290
+ finally {
291
+ timeout.clear();
292
+ }
293
+ }
294
+ async synthesize(request) {
295
+ const startedAt = Date.now();
296
+ const { audioContent, speechMarks } = await this.synthesizeWithAssets(request);
297
+ const audioResponse = await this.fetchImpl(audioContent);
298
+ if (!audioResponse.ok) {
299
+ throw new TTSError(TTSErrorCode.PROVIDER_ERROR, `Failed to fetch SchoolCity audio asset (${audioResponse.status})`, { audioContent, status: audioResponse.status }, this.providerId);
300
+ }
301
+ const arrayBuffer = await audioResponse.arrayBuffer();
302
+ const audio = Buffer.from(arrayBuffer);
303
+ return {
304
+ audio,
305
+ contentType: audioResponse.headers.get("content-type") || "audio/mpeg",
306
+ speechMarks,
307
+ metadata: {
308
+ providerId: this.providerId,
309
+ voice: request.voice || "default",
310
+ duration: (Date.now() - startedAt) / 1000,
311
+ charCount: request.text.length,
312
+ cached: false,
313
+ timestamp: new Date().toISOString(),
314
+ },
315
+ };
316
+ }
317
+ async getVoices(_options) {
318
+ this.ensureInitialized();
319
+ return [];
320
+ }
321
+ getCapabilities() {
322
+ return {
323
+ standard: {
324
+ supportsSSML: true,
325
+ supportsPitch: false,
326
+ supportsRate: true,
327
+ supportsVolume: false,
328
+ supportsMultipleVoices: true,
329
+ maxTextLength: 3000,
330
+ },
331
+ extensions: {
332
+ supportsSpeechMarks: true,
333
+ supportedFormats: ["mp3"],
334
+ supportsSampleRate: false,
335
+ providerSpecific: {
336
+ requestModel: "asset-urls",
337
+ requiresSignedJwt: true,
338
+ },
339
+ },
340
+ };
341
+ }
342
+ }
343
+ //# sourceMappingURL=SchoolCityServerProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchoolCityServerProvider.js","sourceRoot":"","sources":["../src/SchoolCityServerProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SchoolCity-backed server-side TTS provider.
3
+ * @module @pie-players/tts-server-sc
4
+ */
5
+ export type { SchoolCityProviderConfig, SchoolCitySynthesizeAssetsResult, } from "./SchoolCityServerProvider.js";
6
+ export { SchoolCityServerProvider } from "./SchoolCityServerProvider.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACX,wBAAwB,EACxB,gCAAgC,GAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SchoolCity-backed server-side TTS provider.
3
+ * @module @pie-players/tts-server-sc
4
+ */
5
+ export { SchoolCityServerProvider } from "./SchoolCityServerProvider.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@pie-players/tts-server-sc",
3
+ "version": "0.3.20",
4
+ "description": "SchoolCity-backed provider for server-side TTS with speech marks support",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "test": "vitest run --passWithNoTests",
21
+ "test:coverage": "vitest --coverage"
22
+ },
23
+ "keywords": [
24
+ "tts",
25
+ "text-to-speech",
26
+ "schoolcity",
27
+ "speech-marks",
28
+ "server-side"
29
+ ],
30
+ "author": "PIE Framework",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/pie-framework/pie-players.git",
35
+ "directory": "packages/tts-server-sc"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "dependencies": {
41
+ "@pie-players/tts-server-core": "workspace:*",
42
+ "jose": "^6.2.2"
43
+ },
44
+ "devDependencies": {
45
+ "typescript": "^5.9.3",
46
+ "vitest": "^1.0.4"
47
+ },
48
+ "sideEffects": false,
49
+ "homepage": "https://github.com/pie-framework/pie-players/tree/master/packages/tts-server-sc#readme",
50
+ "bugs": {
51
+ "url": "https://github.com/pie-framework/pie-players/issues"
52
+ },
53
+ "engines": {
54
+ "node": ">=20.0.0"
55
+ }
56
+ }