@mcptoolshop/voice-soundboard-core 0.1.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/LICENSE +21 -0
- package/dist/ambient/emitter.d.ts +34 -0
- package/dist/ambient/emitter.d.ts.map +1 -0
- package/dist/ambient/emitter.js +125 -0
- package/dist/ambient/emitter.js.map +1 -0
- package/dist/ambient/index.d.ts +5 -0
- package/dist/ambient/index.d.ts.map +1 -0
- package/dist/ambient/index.js +5 -0
- package/dist/ambient/index.js.map +1 -0
- package/dist/ambient/redact.d.ts +11 -0
- package/dist/ambient/redact.d.ts.map +1 -0
- package/dist/ambient/redact.js +40 -0
- package/dist/ambient/redact.js.map +1 -0
- package/dist/ambient/types.d.ts +38 -0
- package/dist/ambient/types.d.ts.map +1 -0
- package/dist/ambient/types.js +8 -0
- package/dist/ambient/types.js.map +1 -0
- package/dist/artifact.d.ts +37 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +61 -0
- package/dist/artifact.js.map +1 -0
- package/dist/chunking/chunker.d.ts +15 -0
- package/dist/chunking/chunker.d.ts.map +1 -0
- package/dist/chunking/chunker.js +156 -0
- package/dist/chunking/chunker.js.map +1 -0
- package/dist/chunking/index.d.ts +5 -0
- package/dist/chunking/index.d.ts.map +1 -0
- package/dist/chunking/index.js +4 -0
- package/dist/chunking/index.js.map +1 -0
- package/dist/chunking/limits.d.ts +12 -0
- package/dist/chunking/limits.d.ts.map +1 -0
- package/dist/chunking/limits.js +12 -0
- package/dist/chunking/limits.js.map +1 -0
- package/dist/chunking/types.d.ts +26 -0
- package/dist/chunking/types.d.ts.map +1 -0
- package/dist/chunking/types.js +3 -0
- package/dist/chunking/types.js.map +1 -0
- package/dist/dialogue/index.d.ts +4 -0
- package/dist/dialogue/index.d.ts.map +1 -0
- package/dist/dialogue/index.js +3 -0
- package/dist/dialogue/index.js.map +1 -0
- package/dist/dialogue/parser.d.ts +33 -0
- package/dist/dialogue/parser.d.ts.map +1 -0
- package/dist/dialogue/parser.js +182 -0
- package/dist/dialogue/parser.js.map +1 -0
- package/dist/dialogue/types.d.ts +29 -0
- package/dist/dialogue/types.d.ts.map +1 -0
- package/dist/dialogue/types.js +3 -0
- package/dist/dialogue/types.js.map +1 -0
- package/dist/emotion/index.d.ts +5 -0
- package/dist/emotion/index.d.ts.map +1 -0
- package/dist/emotion/index.js +5 -0
- package/dist/emotion/index.js.map +1 -0
- package/dist/emotion/map.d.ts +17 -0
- package/dist/emotion/map.d.ts.map +1 -0
- package/dist/emotion/map.js +27 -0
- package/dist/emotion/map.js.map +1 -0
- package/dist/emotion/parser.d.ts +14 -0
- package/dist/emotion/parser.d.ts.map +1 -0
- package/dist/emotion/parser.js +96 -0
- package/dist/emotion/parser.js.map +1 -0
- package/dist/emotion/types.d.ts +26 -0
- package/dist/emotion/types.d.ts.map +1 -0
- package/dist/emotion/types.js +12 -0
- package/dist/emotion/types.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +44 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +65 -0
- package/dist/limits.js.map +1 -0
- package/dist/orchestrator/concat.d.ts +20 -0
- package/dist/orchestrator/concat.d.ts.map +1 -0
- package/dist/orchestrator/concat.js +139 -0
- package/dist/orchestrator/concat.js.map +1 -0
- package/dist/orchestrator/emotionRunner.d.ts +38 -0
- package/dist/orchestrator/emotionRunner.d.ts.map +1 -0
- package/dist/orchestrator/emotionRunner.js +115 -0
- package/dist/orchestrator/emotionRunner.js.map +1 -0
- package/dist/orchestrator/index.d.ts +6 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +5 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/runner.d.ts +31 -0
- package/dist/orchestrator/runner.d.ts.map +1 -0
- package/dist/orchestrator/runner.js +106 -0
- package/dist/orchestrator/runner.js.map +1 -0
- package/dist/orchestrator/types.d.ts +47 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +3 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/presets.d.ts +20 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +22 -0
- package/dist/presets.js.map +1 -0
- package/dist/request.d.ts +26 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +33 -0
- package/dist/request.js.map +1 -0
- package/dist/sandbox.d.ts +15 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +27 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schemas.d.ts +49 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +3 -0
- package/dist/schemas.js.map +1 -0
- package/dist/sfx/generator.d.ts +15 -0
- package/dist/sfx/generator.d.ts.map +1 -0
- package/dist/sfx/generator.js +114 -0
- package/dist/sfx/generator.js.map +1 -0
- package/dist/sfx/index.d.ts +7 -0
- package/dist/sfx/index.d.ts.map +1 -0
- package/dist/sfx/index.js +7 -0
- package/dist/sfx/index.js.map +1 -0
- package/dist/sfx/parser.d.ts +16 -0
- package/dist/sfx/parser.d.ts.map +1 -0
- package/dist/sfx/parser.js +100 -0
- package/dist/sfx/parser.js.map +1 -0
- package/dist/sfx/registry.d.ts +17 -0
- package/dist/sfx/registry.d.ts.map +1 -0
- package/dist/sfx/registry.js +13 -0
- package/dist/sfx/registry.js.map +1 -0
- package/dist/sfx/stitcher.d.ts +29 -0
- package/dist/sfx/stitcher.d.ts.map +1 -0
- package/dist/sfx/stitcher.js +44 -0
- package/dist/sfx/stitcher.js.map +1 -0
- package/dist/sfx/types.d.ts +22 -0
- package/dist/sfx/types.d.ts.map +1 -0
- package/dist/sfx/types.js +10 -0
- package/dist/sfx/types.js.map +1 -0
- package/dist/ssml/index.d.ts +5 -0
- package/dist/ssml/index.d.ts.map +1 -0
- package/dist/ssml/index.js +4 -0
- package/dist/ssml/index.js.map +1 -0
- package/dist/ssml/limits.d.ts +14 -0
- package/dist/ssml/limits.d.ts.map +1 -0
- package/dist/ssml/limits.js +14 -0
- package/dist/ssml/limits.js.map +1 -0
- package/dist/ssml/parser.d.ts +28 -0
- package/dist/ssml/parser.d.ts.map +1 -0
- package/dist/ssml/parser.js +348 -0
- package/dist/ssml/parser.js.map +1 -0
- package/dist/ssml/types.d.ts +46 -0
- package/dist/ssml/types.d.ts.map +1 -0
- package/dist/ssml/types.js +3 -0
- package/dist/ssml/types.js.map +1 -0
- package/dist/validate.d.ts +29 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +60 -0
- package/dist/validate.js.map +1 -0
- package/dist/voices.d.ts +22 -0
- package/dist/voices.d.ts.map +1 -0
- package/dist/voices.js +31 -0
- package/dist/voices.js.map +1 -0
- package/package.json +46 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { type VoiceInfo, DEFAULT_VOICE, VOICES, APPROVED_VOICE_IDS, getVoice, isApprovedVoice, } from "./voices.js";
|
|
2
|
+
export { type PresetConfig, PRESETS, PRESET_NAMES, getPreset, } from "./presets.js";
|
|
3
|
+
export { VoiceValidationError, type ResolvedVoice, assertApprovedVoice, resolveVoiceOrPreset, } from "./validate.js";
|
|
4
|
+
export { type BackendInfo, type VoiceStatusResponse, type VoiceSpeakResponse, type ArtifactMode, type VoiceInterruptResponse, type VoiceStreamResponse, type VoiceErrorResponse, type VoiceErrorCode, } from "./schemas.js";
|
|
5
|
+
export { LIMITS, SHIP_LIMITS, LimitError, validateText, validateSpeed, } from "./limits.js";
|
|
6
|
+
export { DEFAULT_ARTIFACT_MODE, DEFAULT_OUTPUT_FORMAT, type OutputFormat, type ArtifactConfig, buildArtifactConfig, OutputDirError, defaultOutputRoot, resolveOutputDir, } from "./artifact.js";
|
|
7
|
+
export { type SynthesisRequest, type SpeakInput, buildSynthesisRequest, errorResponse, } from "./request.js";
|
|
8
|
+
export { type BreakEvent, type ProsodyEvent, type ProsodyEndEvent, type EmphasisEvent, type EmphasisEndEvent, type SpeechEvent, type TextSegment, type EventSegment, type PlanSegment, type SsmlWarning, type SpeechPlan, SSML_LIMITS, parseSsmlLite, looksLikeSsml, SsmlParseError, } from "./ssml/index.js";
|
|
9
|
+
export { type ChunkingOptions, type ChunkResult, type ChunkWarning, CHUNK_LIMITS, chunkText, } from "./chunking/index.js";
|
|
10
|
+
export { type SynthesizeFn, type ChunkArtifact, type RunPlanOptions, type SpeechResult, type OrchestratorWarning, type RunPlanInput, runPlan, type EmotionSynthesisContext, type EmotionSynthesizeFn, type RunEmotionPlanInput, runEmotionPlan, concatWavFiles, concatWavBase64, buildWavFile, } from "./orchestrator/index.js";
|
|
11
|
+
export { type DialogueLine, type DialoguePause, type DialogueCue, type CueSheet, type DialogueWarning, type CastMap, parseDialogue, DialogueParseError, type ParseDialogueOptions, } from "./dialogue/index.js";
|
|
12
|
+
export { PUBLIC_EMOTIONS, type Emotion, type EmotionMapEntry, type EmotionSpan, type EmotionWarning, type EmotionParseResult, EMOTION_MAP, EMOTION_NAMES, EMOTION_SPEED_MIN, EMOTION_SPEED_MAX, clampEmotionSpeed, hasEmotionTags, parseEmotionSpans, } from "./emotion/index.js";
|
|
13
|
+
export { SFX_TAGS, type SfxTag, type SfxEvent, type SfxTextSegment, type SfxSegment, type SfxWarning, type SfxParseResult, type SfxGenParams, SFX_REGISTRY, SFX_MAX_EVENTS, hasSfxTags, parseSfxTags, generateSfxWav, getSfxDurationMs, type SfxStitchWarning, type SfxStitchResult, createSfxChunks, checkSfxConcatRequired, } from "./sfx/index.js";
|
|
14
|
+
export { AMBIENT_CATEGORIES, type AmbientCategory, type AmbientEntry, type AmbientConfig, type AmbientWarning, type AmbientResult, type RedactResult, redactSensitive, AmbientEmitter, } from "./ambient/index.js";
|
|
15
|
+
export { SAFE_FILE_PREFIX, generateSafeFilename, isSymlink, } from "./sandbox.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @mcptoolshop/voice-soundboard-core
|
|
2
|
+
// Backend-agnostic voice soundboard core library
|
|
3
|
+
export { DEFAULT_VOICE, VOICES, APPROVED_VOICE_IDS, getVoice, isApprovedVoice, } from "./voices.js";
|
|
4
|
+
export { PRESETS, PRESET_NAMES, getPreset, } from "./presets.js";
|
|
5
|
+
export { VoiceValidationError, assertApprovedVoice, resolveVoiceOrPreset, } from "./validate.js";
|
|
6
|
+
export { LIMITS, SHIP_LIMITS, LimitError, validateText, validateSpeed, } from "./limits.js";
|
|
7
|
+
export { DEFAULT_ARTIFACT_MODE, DEFAULT_OUTPUT_FORMAT, buildArtifactConfig, OutputDirError, defaultOutputRoot, resolveOutputDir, } from "./artifact.js";
|
|
8
|
+
export { buildSynthesisRequest, errorResponse, } from "./request.js";
|
|
9
|
+
export { SSML_LIMITS, parseSsmlLite, looksLikeSsml, SsmlParseError, } from "./ssml/index.js";
|
|
10
|
+
export { CHUNK_LIMITS, chunkText, } from "./chunking/index.js";
|
|
11
|
+
export { runPlan, runEmotionPlan, concatWavFiles, concatWavBase64, buildWavFile, } from "./orchestrator/index.js";
|
|
12
|
+
export { parseDialogue, DialogueParseError, } from "./dialogue/index.js";
|
|
13
|
+
export { PUBLIC_EMOTIONS, EMOTION_MAP, EMOTION_NAMES, EMOTION_SPEED_MIN, EMOTION_SPEED_MAX, clampEmotionSpeed, hasEmotionTags, parseEmotionSpans, } from "./emotion/index.js";
|
|
14
|
+
export { SFX_TAGS, SFX_REGISTRY, SFX_MAX_EVENTS, hasSfxTags, parseSfxTags, generateSfxWav, getSfxDurationMs, createSfxChunks, checkSfxConcatRequired, } from "./sfx/index.js";
|
|
15
|
+
export { AMBIENT_CATEGORIES, redactSensitive, AmbientEmitter, } from "./ambient/index.js";
|
|
16
|
+
export { SAFE_FILE_PREFIX, generateSafeFilename, isSymlink, } from "./sandbox.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,iDAAiD;AAEjD,OAAO,EAEL,aAAa,EACb,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,OAAO,EACP,YAAY,EACZ,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,oBAAoB,EAEpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAavB,OAAO,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EAGrB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,qBAAqB,EACrB,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAYL,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAIL,YAAY,EACZ,SAAS,GACV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAOL,OAAO,EAIP,cAAc,EACd,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAOL,aAAa,EACb,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EAMf,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,QAAQ,EAQR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAGhB,eAAe,EACf,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAOlB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,GACV,MAAM,cAAc,CAAC"}
|
package/dist/limits.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Conservative limits for synthesis requests. */
|
|
2
|
+
export declare const LIMITS: {
|
|
3
|
+
/** Maximum text length in characters. */
|
|
4
|
+
readonly maxTextLength: 12000;
|
|
5
|
+
/** Maximum speed multiplier. */
|
|
6
|
+
readonly maxSpeed: 2;
|
|
7
|
+
/** Minimum speed multiplier. */
|
|
8
|
+
readonly minSpeed: 0.5;
|
|
9
|
+
/** Default speed multiplier. */
|
|
10
|
+
readonly defaultSpeed: 1;
|
|
11
|
+
};
|
|
12
|
+
/** Consolidated ship-ready limits for the entire stack. */
|
|
13
|
+
export declare const SHIP_LIMITS: {
|
|
14
|
+
/** Maximum total characters across all inputs. */
|
|
15
|
+
readonly maxTotalChars: 12000;
|
|
16
|
+
/** Maximum chunks per request. */
|
|
17
|
+
readonly maxChunks: 50;
|
|
18
|
+
/** Maximum emotion spans per request. */
|
|
19
|
+
readonly maxSpans: 100;
|
|
20
|
+
/** Maximum SSML element nodes. */
|
|
21
|
+
readonly maxSsmlNodes: 400;
|
|
22
|
+
/** Maximum SFX events per text. */
|
|
23
|
+
readonly maxSfxEvents: 30;
|
|
24
|
+
/** Maximum break duration in ms. */
|
|
25
|
+
readonly maxBreakMs: 2000;
|
|
26
|
+
/** Maximum concurrent synthesis requests. */
|
|
27
|
+
readonly maxConcurrentSynth: 1;
|
|
28
|
+
/** Per-request timeout in ms. */
|
|
29
|
+
readonly requestTimeoutMs: 20000;
|
|
30
|
+
/** Per-chunk timeout in ms. */
|
|
31
|
+
readonly chunkTimeoutMs: 10000;
|
|
32
|
+
/** Health check timeout in ms. */
|
|
33
|
+
readonly healthTimeoutMs: 2000;
|
|
34
|
+
};
|
|
35
|
+
export declare class LimitError extends Error {
|
|
36
|
+
readonly code: string;
|
|
37
|
+
readonly context?: Record<string, unknown> | undefined;
|
|
38
|
+
constructor(message: string, code: string, context?: Record<string, unknown> | undefined);
|
|
39
|
+
}
|
|
40
|
+
/** Validate text is non-empty and within length limits. */
|
|
41
|
+
export declare function validateText(text: string): string;
|
|
42
|
+
/** Validate speed is within allowed range. */
|
|
43
|
+
export declare function validateSpeed(speed: number | undefined): number;
|
|
44
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAElD,eAAO,MAAM,MAAM;IACjB,yCAAyC;;IAEzC,gCAAgC;;IAEhC,gCAAgC;;IAEhC,gCAAgC;;CAExB,CAAC;AAEX,2DAA2D;AAC3D,eAAO,MAAM,WAAW;IACtB,kDAAkD;;IAElD,kCAAkC;;IAElC,yCAAyC;;IAEzC,kCAAkC;;IAElC,mCAAmC;;IAEnC,oCAAoC;;IAEpC,6CAA6C;;IAE7C,iCAAiC;;IAEjC,+BAA+B;;IAE/B,kCAAkC;;CAE1B,CAAC;AAEX,qBAAa,UAAW,SAAQ,KAAK;aAGjB,IAAI,EAAE,MAAM;aACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAajD;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAU/D"}
|
package/dist/limits.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Conservative limits for synthesis requests. */
|
|
2
|
+
export const LIMITS = {
|
|
3
|
+
/** Maximum text length in characters. */
|
|
4
|
+
maxTextLength: 12_000,
|
|
5
|
+
/** Maximum speed multiplier. */
|
|
6
|
+
maxSpeed: 2.0,
|
|
7
|
+
/** Minimum speed multiplier. */
|
|
8
|
+
minSpeed: 0.5,
|
|
9
|
+
/** Default speed multiplier. */
|
|
10
|
+
defaultSpeed: 1.0,
|
|
11
|
+
};
|
|
12
|
+
/** Consolidated ship-ready limits for the entire stack. */
|
|
13
|
+
export const SHIP_LIMITS = {
|
|
14
|
+
/** Maximum total characters across all inputs. */
|
|
15
|
+
maxTotalChars: 12_000,
|
|
16
|
+
/** Maximum chunks per request. */
|
|
17
|
+
maxChunks: 50,
|
|
18
|
+
/** Maximum emotion spans per request. */
|
|
19
|
+
maxSpans: 100,
|
|
20
|
+
/** Maximum SSML element nodes. */
|
|
21
|
+
maxSsmlNodes: 400,
|
|
22
|
+
/** Maximum SFX events per text. */
|
|
23
|
+
maxSfxEvents: 30,
|
|
24
|
+
/** Maximum break duration in ms. */
|
|
25
|
+
maxBreakMs: 2_000,
|
|
26
|
+
/** Maximum concurrent synthesis requests. */
|
|
27
|
+
maxConcurrentSynth: 1,
|
|
28
|
+
/** Per-request timeout in ms. */
|
|
29
|
+
requestTimeoutMs: 20_000,
|
|
30
|
+
/** Per-chunk timeout in ms. */
|
|
31
|
+
chunkTimeoutMs: 10_000,
|
|
32
|
+
/** Health check timeout in ms. */
|
|
33
|
+
healthTimeoutMs: 2_000,
|
|
34
|
+
};
|
|
35
|
+
export class LimitError extends Error {
|
|
36
|
+
code;
|
|
37
|
+
context;
|
|
38
|
+
constructor(message, code, context) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.code = code;
|
|
41
|
+
this.context = context;
|
|
42
|
+
this.name = "LimitError";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Validate text is non-empty and within length limits. */
|
|
46
|
+
export function validateText(text) {
|
|
47
|
+
const trimmed = text.trim();
|
|
48
|
+
if (trimmed.length === 0) {
|
|
49
|
+
throw new LimitError("Text must not be empty", "TEXT_EMPTY");
|
|
50
|
+
}
|
|
51
|
+
if (trimmed.length > LIMITS.maxTextLength) {
|
|
52
|
+
throw new LimitError(`Text exceeds maximum length of ${LIMITS.maxTextLength} characters (got ${trimmed.length})`, "TEXT_TOO_LONG", { maxLength: LIMITS.maxTextLength, actualLength: trimmed.length });
|
|
53
|
+
}
|
|
54
|
+
return trimmed;
|
|
55
|
+
}
|
|
56
|
+
/** Validate speed is within allowed range. */
|
|
57
|
+
export function validateSpeed(speed) {
|
|
58
|
+
if (speed === undefined)
|
|
59
|
+
return LIMITS.defaultSpeed;
|
|
60
|
+
if (speed < LIMITS.minSpeed || speed > LIMITS.maxSpeed) {
|
|
61
|
+
throw new LimitError(`Speed must be between ${LIMITS.minSpeed} and ${LIMITS.maxSpeed} (got ${speed})`, "SPEED_OUT_OF_RANGE", { min: LIMITS.minSpeed, max: LIMITS.maxSpeed, actual: speed });
|
|
62
|
+
}
|
|
63
|
+
return speed;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,yCAAyC;IACzC,aAAa,EAAE,MAAM;IACrB,gCAAgC;IAChC,QAAQ,EAAE,GAAG;IACb,gCAAgC;IAChC,QAAQ,EAAE,GAAG;IACb,gCAAgC;IAChC,YAAY,EAAE,GAAG;CACT,CAAC;AAEX,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,kDAAkD;IAClD,aAAa,EAAE,MAAM;IACrB,kCAAkC;IAClC,SAAS,EAAE,EAAE;IACb,yCAAyC;IACzC,QAAQ,EAAE,GAAG;IACb,kCAAkC;IAClC,YAAY,EAAE,GAAG;IACjB,mCAAmC;IACnC,YAAY,EAAE,EAAE;IAChB,oCAAoC;IACpC,UAAU,EAAE,KAAK;IACjB,6CAA6C;IAC7C,kBAAkB,EAAE,CAAC;IACrB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM;IACxB,+BAA+B;IAC/B,cAAc,EAAE,MAAM;IACtB,kCAAkC;IAClC,eAAe,EAAE,KAAK;CACd,CAAC;AAEX,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGjB;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,UAAU,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,IAAI,UAAU,CAClB,kCAAkC,MAAM,CAAC,aAAa,oBAAoB,OAAO,CAAC,MAAM,GAAG,EAC3F,eAAe,EACf,EAAE,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACpD,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,MAAM,IAAI,UAAU,CAClB,yBAAyB,MAAM,CAAC,QAAQ,QAAQ,MAAM,CAAC,QAAQ,SAAS,KAAK,GAAG,EAChF,oBAAoB,EACpB,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** WAV concatenation — merge multiple WAV files into one. */
|
|
2
|
+
import type { ChunkArtifact } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Concatenate multiple WAV chunk artifacts into a single WAV file.
|
|
5
|
+
* All chunks must be the same sample rate and format (16-bit PCM mono).
|
|
6
|
+
* Returns the path to the concatenated file.
|
|
7
|
+
*/
|
|
8
|
+
export declare function concatWavFiles(chunks: readonly ChunkArtifact[], outputDir: string): Promise<{
|
|
9
|
+
path: string;
|
|
10
|
+
durationMs: number;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Concatenate multiple WAV chunk artifacts into a single base64 string.
|
|
14
|
+
*/
|
|
15
|
+
export declare function concatWavBase64(chunks: readonly ChunkArtifact[]): Promise<{
|
|
16
|
+
base64: string;
|
|
17
|
+
durationMs: number;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function buildWavFile(pcmData: Buffer, sampleRate: number): Buffer;
|
|
20
|
+
//# sourceMappingURL=concat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concat.d.ts","sourceRoot":"","sources":["../../src/orchestrator/concat.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAK7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC/C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,aAAa,EAAE,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAmCjD;AAkCD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAyBxE"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/** WAV concatenation — merge multiple WAV files into one. */
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
/**
|
|
6
|
+
* Concatenate multiple WAV chunk artifacts into a single WAV file.
|
|
7
|
+
* All chunks must be the same sample rate and format (16-bit PCM mono).
|
|
8
|
+
* Returns the path to the concatenated file.
|
|
9
|
+
*/
|
|
10
|
+
export async function concatWavFiles(chunks, outputDir) {
|
|
11
|
+
const buffers = [];
|
|
12
|
+
let totalDataSize = 0;
|
|
13
|
+
let sampleRate = 24000;
|
|
14
|
+
for (const chunk of chunks) {
|
|
15
|
+
let wav;
|
|
16
|
+
if (chunk.audioPath) {
|
|
17
|
+
wav = await readFile(chunk.audioPath);
|
|
18
|
+
}
|
|
19
|
+
else if (chunk.audioBytesBase64) {
|
|
20
|
+
wav = Buffer.from(chunk.audioBytesBase64, "base64");
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
// Parse WAV header to extract data portion
|
|
26
|
+
const parsed = parseWavData(wav);
|
|
27
|
+
if (parsed) {
|
|
28
|
+
buffers.push(parsed.data);
|
|
29
|
+
totalDataSize += parsed.data.length;
|
|
30
|
+
sampleRate = parsed.sampleRate;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (buffers.length === 0) {
|
|
34
|
+
throw new Error("No valid WAV data to concatenate");
|
|
35
|
+
}
|
|
36
|
+
// Build new WAV file
|
|
37
|
+
const dataChunk = Buffer.concat(buffers);
|
|
38
|
+
const wavFile = buildWavFile(dataChunk, sampleRate);
|
|
39
|
+
const filename = `vsmcp_concat_${randomUUID().slice(0, 8)}.wav`;
|
|
40
|
+
const outPath = join(outputDir, filename);
|
|
41
|
+
await writeFile(outPath, wavFile);
|
|
42
|
+
const bytesPerSample = 2; // 16-bit
|
|
43
|
+
const numSamples = dataChunk.length / bytesPerSample;
|
|
44
|
+
const durationMs = Math.round((numSamples / sampleRate) * 1000);
|
|
45
|
+
return { path: outPath, durationMs };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Concatenate multiple WAV chunk artifacts into a single base64 string.
|
|
49
|
+
*/
|
|
50
|
+
export async function concatWavBase64(chunks) {
|
|
51
|
+
const buffers = [];
|
|
52
|
+
let totalDataSize = 0;
|
|
53
|
+
let sampleRate = 24000;
|
|
54
|
+
for (const chunk of chunks) {
|
|
55
|
+
let wav;
|
|
56
|
+
if (chunk.audioPath) {
|
|
57
|
+
wav = await readFile(chunk.audioPath);
|
|
58
|
+
}
|
|
59
|
+
else if (chunk.audioBytesBase64) {
|
|
60
|
+
wav = Buffer.from(chunk.audioBytesBase64, "base64");
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const parsed = parseWavData(wav);
|
|
66
|
+
if (parsed) {
|
|
67
|
+
buffers.push(parsed.data);
|
|
68
|
+
totalDataSize += parsed.data.length;
|
|
69
|
+
sampleRate = parsed.sampleRate;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (buffers.length === 0) {
|
|
73
|
+
throw new Error("No valid WAV data to concatenate");
|
|
74
|
+
}
|
|
75
|
+
const dataChunk = Buffer.concat(buffers);
|
|
76
|
+
const wavFile = buildWavFile(dataChunk, sampleRate);
|
|
77
|
+
const bytesPerSample = 2;
|
|
78
|
+
const numSamples = dataChunk.length / bytesPerSample;
|
|
79
|
+
const durationMs = Math.round((numSamples / sampleRate) * 1000);
|
|
80
|
+
return { base64: wavFile.toString("base64"), durationMs };
|
|
81
|
+
}
|
|
82
|
+
function parseWavData(wav) {
|
|
83
|
+
if (wav.length < 44)
|
|
84
|
+
return null;
|
|
85
|
+
if (wav.toString("ascii", 0, 4) !== "RIFF")
|
|
86
|
+
return null;
|
|
87
|
+
if (wav.toString("ascii", 8, 12) !== "WAVE")
|
|
88
|
+
return null;
|
|
89
|
+
const sampleRate = wav.readUInt32LE(24);
|
|
90
|
+
// Find data chunk
|
|
91
|
+
let offset = 12;
|
|
92
|
+
while (offset < wav.length - 8) {
|
|
93
|
+
const chunkId = wav.toString("ascii", offset, offset + 4);
|
|
94
|
+
const chunkSize = wav.readUInt32LE(offset + 4);
|
|
95
|
+
if (chunkId === "data") {
|
|
96
|
+
const dataStart = offset + 8;
|
|
97
|
+
const dataEnd = Math.min(dataStart + chunkSize, wav.length);
|
|
98
|
+
return { sampleRate, data: wav.subarray(dataStart, dataEnd) };
|
|
99
|
+
}
|
|
100
|
+
offset += 8 + chunkSize;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
export function buildWavFile(pcmData, sampleRate) {
|
|
105
|
+
const bytesPerSample = 2;
|
|
106
|
+
const channels = 1;
|
|
107
|
+
const fileSize = 44 + pcmData.length;
|
|
108
|
+
const buf = Buffer.alloc(fileSize);
|
|
109
|
+
let o = 0;
|
|
110
|
+
buf.write("RIFF", o);
|
|
111
|
+
o += 4;
|
|
112
|
+
buf.writeUInt32LE(fileSize - 8, o);
|
|
113
|
+
o += 4;
|
|
114
|
+
buf.write("WAVE", o);
|
|
115
|
+
o += 4;
|
|
116
|
+
buf.write("fmt ", o);
|
|
117
|
+
o += 4;
|
|
118
|
+
buf.writeUInt32LE(16, o);
|
|
119
|
+
o += 4;
|
|
120
|
+
buf.writeUInt16LE(1, o);
|
|
121
|
+
o += 2; // PCM
|
|
122
|
+
buf.writeUInt16LE(channels, o);
|
|
123
|
+
o += 2;
|
|
124
|
+
buf.writeUInt32LE(sampleRate, o);
|
|
125
|
+
o += 4;
|
|
126
|
+
buf.writeUInt32LE(sampleRate * bytesPerSample * channels, o);
|
|
127
|
+
o += 4;
|
|
128
|
+
buf.writeUInt16LE(bytesPerSample * channels, o);
|
|
129
|
+
o += 2;
|
|
130
|
+
buf.writeUInt16LE(bytesPerSample * 8, o);
|
|
131
|
+
o += 2;
|
|
132
|
+
buf.write("data", o);
|
|
133
|
+
o += 4;
|
|
134
|
+
buf.writeUInt32LE(pcmData.length, o);
|
|
135
|
+
o += 4;
|
|
136
|
+
pcmData.copy(buf, o);
|
|
137
|
+
return buf;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=concat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concat.js","sourceRoot":"","sources":["../../src/orchestrator/concat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emotion-aware plan runner — synthesizes emotion spans with per-span voice/speed.
|
|
3
|
+
*
|
|
4
|
+
* Each emotion span is chunked independently and synthesized with the
|
|
5
|
+
* span's mapped voice and speed. Results are collected sequentially
|
|
6
|
+
* and optionally concatenated.
|
|
7
|
+
*/
|
|
8
|
+
import type { ChunkingOptions } from "../chunking/types.js";
|
|
9
|
+
import type { ChunkArtifact, RunPlanOptions, SpeechResult } from "./types.js";
|
|
10
|
+
/** Context passed to the emotion-aware synthesize function. */
|
|
11
|
+
export interface EmotionSynthesisContext {
|
|
12
|
+
readonly emotion: string;
|
|
13
|
+
readonly voiceId: string;
|
|
14
|
+
readonly speed: number;
|
|
15
|
+
readonly spanIndex: number;
|
|
16
|
+
}
|
|
17
|
+
/** A synthesize function that receives emotion context. */
|
|
18
|
+
export type EmotionSynthesizeFn = (text: string, chunkIndex: number, context: EmotionSynthesisContext) => Promise<ChunkArtifact>;
|
|
19
|
+
export interface RunEmotionPlanInput {
|
|
20
|
+
/** Raw text with emotion tags. */
|
|
21
|
+
text: string;
|
|
22
|
+
/** Function to synthesize a single text chunk with emotion context. */
|
|
23
|
+
synthesize: EmotionSynthesizeFn;
|
|
24
|
+
/** Orchestrator options. */
|
|
25
|
+
options: RunPlanOptions;
|
|
26
|
+
/** Chunking options (optional overrides). */
|
|
27
|
+
chunkingOptions?: ChunkingOptions;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run emotion-tagged text through the synthesis pipeline.
|
|
31
|
+
*
|
|
32
|
+
* 1. Parse emotion spans from text
|
|
33
|
+
* 2. For each span: chunk text → synthesize with span's voice/speed
|
|
34
|
+
* 3. Collect all artifacts in order
|
|
35
|
+
* 4. Optionally concatenate
|
|
36
|
+
*/
|
|
37
|
+
export declare function runEmotionPlan(input: RunEmotionPlanInput): Promise<SpeechResult>;
|
|
38
|
+
//# sourceMappingURL=emotionRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emotionRunner.d.ts","sourceRoot":"","sources":["../../src/orchestrator/emotionRunner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,YAAY,EAEb,MAAM,YAAY,CAAC;AAGpB,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,2DAA2D;AAC3D,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,mBAAmB,CAAC;IAChC,4BAA4B;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwGtF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emotion-aware plan runner — synthesizes emotion spans with per-span voice/speed.
|
|
3
|
+
*
|
|
4
|
+
* Each emotion span is chunked independently and synthesized with the
|
|
5
|
+
* span's mapped voice and speed. Results are collected sequentially
|
|
6
|
+
* and optionally concatenated.
|
|
7
|
+
*/
|
|
8
|
+
import { parseEmotionSpans } from "../emotion/parser.js";
|
|
9
|
+
import { chunkText } from "../chunking/chunker.js";
|
|
10
|
+
import { concatWavFiles, concatWavBase64 } from "./concat.js";
|
|
11
|
+
/**
|
|
12
|
+
* Run emotion-tagged text through the synthesis pipeline.
|
|
13
|
+
*
|
|
14
|
+
* 1. Parse emotion spans from text
|
|
15
|
+
* 2. For each span: chunk text → synthesize with span's voice/speed
|
|
16
|
+
* 3. Collect all artifacts in order
|
|
17
|
+
* 4. Optionally concatenate
|
|
18
|
+
*/
|
|
19
|
+
export async function runEmotionPlan(input) {
|
|
20
|
+
const { text, synthesize, options, chunkingOptions } = input;
|
|
21
|
+
const warnings = [];
|
|
22
|
+
// Parse emotion spans
|
|
23
|
+
const parseResult = parseEmotionSpans(text);
|
|
24
|
+
warnings.push(...parseResult.warnings);
|
|
25
|
+
if (parseResult.spans.length === 0) {
|
|
26
|
+
return {
|
|
27
|
+
chunks: [],
|
|
28
|
+
totalDurationMs: 0,
|
|
29
|
+
chunkCount: 0,
|
|
30
|
+
interrupted: false,
|
|
31
|
+
warnings,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Synthesize each span
|
|
35
|
+
const artifacts = [];
|
|
36
|
+
let interrupted = false;
|
|
37
|
+
let globalChunkIndex = 0;
|
|
38
|
+
for (let spanIdx = 0; spanIdx < parseResult.spans.length; spanIdx++) {
|
|
39
|
+
if (options.signal?.aborted) {
|
|
40
|
+
interrupted = true;
|
|
41
|
+
warnings.push({
|
|
42
|
+
code: "SYNTHESIS_INTERRUPTED",
|
|
43
|
+
message: `Synthesis interrupted at span ${spanIdx} of ${parseResult.spans.length}`,
|
|
44
|
+
});
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
const span = parseResult.spans[spanIdx];
|
|
48
|
+
const context = {
|
|
49
|
+
emotion: span.emotion,
|
|
50
|
+
voiceId: span.voiceId,
|
|
51
|
+
speed: span.speed,
|
|
52
|
+
spanIndex: spanIdx,
|
|
53
|
+
};
|
|
54
|
+
// Chunk the span text
|
|
55
|
+
const chunkResult = chunkText(span.text, chunkingOptions);
|
|
56
|
+
warnings.push(...chunkResult.warnings);
|
|
57
|
+
for (const chunk of chunkResult.chunks) {
|
|
58
|
+
if (options.signal?.aborted) {
|
|
59
|
+
interrupted = true;
|
|
60
|
+
warnings.push({
|
|
61
|
+
code: "SYNTHESIS_INTERRUPTED",
|
|
62
|
+
message: `Synthesis interrupted at chunk ${globalChunkIndex}`,
|
|
63
|
+
});
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
const artifact = await synthesize(chunk, globalChunkIndex, context);
|
|
67
|
+
artifacts.push(artifact);
|
|
68
|
+
globalChunkIndex++;
|
|
69
|
+
}
|
|
70
|
+
if (interrupted)
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
const totalDurationMs = artifacts.reduce((sum, a) => sum + a.durationMs, 0);
|
|
74
|
+
// Concatenate if requested
|
|
75
|
+
if (options.concat && artifacts.length > 1 && !interrupted) {
|
|
76
|
+
try {
|
|
77
|
+
if (options.artifactMode === "base64") {
|
|
78
|
+
const { base64, durationMs } = await concatWavBase64(artifacts);
|
|
79
|
+
return {
|
|
80
|
+
chunks: artifacts,
|
|
81
|
+
concatBase64: base64,
|
|
82
|
+
totalDurationMs: durationMs,
|
|
83
|
+
chunkCount: artifacts.length,
|
|
84
|
+
interrupted,
|
|
85
|
+
warnings,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
else if (options.outputDir) {
|
|
89
|
+
const { path, durationMs } = await concatWavFiles(artifacts, options.outputDir);
|
|
90
|
+
return {
|
|
91
|
+
chunks: artifacts,
|
|
92
|
+
concatPath: path,
|
|
93
|
+
totalDurationMs: durationMs,
|
|
94
|
+
chunkCount: artifacts.length,
|
|
95
|
+
interrupted,
|
|
96
|
+
warnings,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
warnings.push({
|
|
102
|
+
code: "CONCAT_FAILED",
|
|
103
|
+
message: `WAV concatenation failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
chunks: artifacts,
|
|
109
|
+
totalDurationMs,
|
|
110
|
+
chunkCount: artifacts.length,
|
|
111
|
+
interrupted,
|
|
112
|
+
warnings,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=emotionRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emotionRunner.js","sourceRoot":"","sources":["../../src/orchestrator/emotionRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Orchestrator module — multi-chunk synthesis pipeline. */
|
|
2
|
+
export { type SynthesizeFn, type ChunkArtifact, type RunPlanOptions, type SpeechResult, type OrchestratorWarning, } from "./types.js";
|
|
3
|
+
export { type RunPlanInput, runPlan, } from "./runner.js";
|
|
4
|
+
export { type EmotionSynthesisContext, type EmotionSynthesizeFn, type RunEmotionPlanInput, runEmotionPlan, } from "./emotionRunner.js";
|
|
5
|
+
export { concatWavFiles, concatWavBase64, buildWavFile } from "./concat.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,YAAY,EACjB,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Orchestrator module — multi-chunk synthesis pipeline. */
|
|
2
|
+
export { runPlan, } from "./runner.js";
|
|
3
|
+
export { runEmotionPlan, } from "./emotionRunner.js";
|
|
4
|
+
export { concatWavFiles, concatWavBase64, buildWavFile } from "./concat.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAU5D,OAAO,EAEL,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,OAAO,EAIL,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan runner — sequentially synthesizes chunks from a SpeechPlan.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Sequential chunk synthesis with abort support
|
|
6
|
+
* - Path and base64 artifact modes
|
|
7
|
+
* - Optional WAV concatenation
|
|
8
|
+
*/
|
|
9
|
+
import type { SpeechPlan } from "../ssml/types.js";
|
|
10
|
+
import type { ChunkingOptions } from "../chunking/types.js";
|
|
11
|
+
import type { SynthesizeFn, RunPlanOptions, SpeechResult } from "./types.js";
|
|
12
|
+
export interface RunPlanInput {
|
|
13
|
+
/** The speech plan (from SSML parser or plain text). */
|
|
14
|
+
plan: SpeechPlan;
|
|
15
|
+
/** Function to synthesize a single text chunk. */
|
|
16
|
+
synthesize: SynthesizeFn;
|
|
17
|
+
/** Orchestrator options. */
|
|
18
|
+
options: RunPlanOptions;
|
|
19
|
+
/** Chunking options (optional overrides). */
|
|
20
|
+
chunkingOptions?: ChunkingOptions;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run a speech plan through the synthesis pipeline.
|
|
24
|
+
*
|
|
25
|
+
* 1. Extract plain text from plan
|
|
26
|
+
* 2. Chunk the text
|
|
27
|
+
* 3. Synthesize each chunk sequentially
|
|
28
|
+
* 4. Optionally concatenate results
|
|
29
|
+
*/
|
|
30
|
+
export declare function runPlan(input: RunPlanInput): Promise<SpeechResult>;
|
|
31
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/orchestrator/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EAGb,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,IAAI,EAAE,UAAU,CAAC;IACjB,kDAAkD;IAClD,UAAU,EAAE,YAAY,CAAC;IACzB,4BAA4B;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA6FxE"}
|