@speech-sdk/core 0.32.0 → 0.33.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/README.md +39 -10
- package/dist/apply-speed.d.ts +1 -0
- package/dist/apply-speed.d.ts.map +1 -1
- package/dist/apply-speed.js +7 -5
- package/dist/apply-speed.js.map +1 -1
- package/dist/audio-decode.js +3 -2
- package/dist/audio-decode.js.map +1 -1
- package/dist/audio-output.d.ts +1 -0
- package/dist/audio-output.d.ts.map +1 -1
- package/dist/audio-output.js +1 -1
- package/dist/audio-output.js.map +1 -1
- package/dist/conversation/attribute-timestamps.d.ts +1 -21
- package/dist/conversation/attribute-timestamps.d.ts.map +1 -1
- package/dist/conversation/attribute-timestamps.js +26 -264
- package/dist/conversation/attribute-timestamps.js.map +1 -1
- package/dist/conversation/dispatch.d.ts +3 -1
- package/dist/conversation/dispatch.d.ts.map +1 -1
- package/dist/conversation/dispatch.js +44 -18
- package/dist/conversation/dispatch.js.map +1 -1
- package/dist/conversation/errors.d.ts +9 -0
- package/dist/conversation/errors.d.ts.map +1 -1
- package/dist/conversation/errors.js +18 -0
- package/dist/conversation/errors.js.map +1 -1
- package/dist/conversation/pcm-concat.d.ts +13 -0
- package/dist/conversation/pcm-concat.d.ts.map +1 -1
- package/dist/conversation/pcm-concat.js +22 -4
- package/dist/conversation/pcm-concat.js.map +1 -1
- package/dist/conversation/split-turns.d.ts +31 -0
- package/dist/conversation/split-turns.d.ts.map +1 -0
- package/dist/conversation/split-turns.js +158 -0
- package/dist/conversation/split-turns.js.map +1 -0
- package/dist/conversation/stitch.d.ts +1 -3
- package/dist/conversation/stitch.d.ts.map +1 -1
- package/dist/conversation/stitch.js +5 -13
- package/dist/conversation/stitch.js.map +1 -1
- package/dist/conversation/types.d.ts +5 -0
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/conversation/validate.d.ts.map +1 -1
- package/dist/conversation/validate.js +3 -0
- package/dist/conversation/validate.js.map +1 -1
- package/dist/generate-conversation.d.ts +7 -3
- package/dist/generate-conversation.d.ts.map +1 -1
- package/dist/generate-conversation.js +151 -105
- package/dist/generate-conversation.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/speech-result.d.ts +20 -0
- package/dist/speech-result.d.ts.map +1 -1
- package/dist/speech-result.js.map +1 -1
- package/dist/timestamp-finalization.d.ts +1 -0
- package/dist/timestamp-finalization.d.ts.map +1 -1
- package/dist/timestamp-finalization.js +5 -5
- package/dist/timestamp-finalization.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/conversation/proportional-fill.d.ts +0 -10
- package/dist/conversation/proportional-fill.d.ts.map +0 -1
- package/dist/conversation/proportional-fill.js +0 -64
- package/dist/conversation/proportional-fill.js.map +0 -1
- package/dist/conversation/silence-detection.d.ts +0 -14
- package/dist/conversation/silence-detection.d.ts.map +0 -1
- package/dist/conversation/silence-detection.js +0 -52
- package/dist/conversation/silence-detection.js.map +0 -1
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
import { sampleRateHintFrom } from "../audio-output.js";
|
|
2
2
|
import { StitchUnsupportedError } from "./errors.js";
|
|
3
3
|
import { newVoiceKeyer } from "./validate.js";
|
|
4
|
+
const FALLBACK_STITCH_REASONS = {
|
|
5
|
+
"fallback-from-native": "per-turn-provider-options",
|
|
6
|
+
"fallback-from-native-custom-voice": "custom-voice",
|
|
7
|
+
"fallback-from-native-oversized": "native-limit-exceeded",
|
|
8
|
+
"fallback-from-native-voice-count": "single-speaker",
|
|
9
|
+
"fallback-from-native-voice-count-exceeded": "too-many-voices",
|
|
10
|
+
};
|
|
4
11
|
export function chooseConversationPath(input) {
|
|
5
|
-
const { forceStitch
|
|
12
|
+
const { forceStitch, resolvedPerTurn, turns, output } = input;
|
|
6
13
|
const sampleRateHint = sampleRateHintFrom(output);
|
|
7
14
|
// Compare by provider instance reference so two factories with different apiKey/baseURL/fetch configs aren't silently merged.
|
|
8
15
|
const first = resolvedPerTurn[0];
|
|
9
16
|
const allSame = resolvedPerTurn.every((r) => r.provider === first.provider && r.modelId === first.modelId);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
stitchFallbackReason = "fallback-from-native-voice-count";
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
const native = tryNativeDialoguePath({ first, turns, sampleRateHint });
|
|
20
|
-
if (native) {
|
|
21
|
-
if ("path" in native) {
|
|
22
|
-
return native.path;
|
|
23
|
-
}
|
|
24
|
-
stitchFallbackReason = native.fallbackReason;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
17
|
+
const native = allSame
|
|
18
|
+
? nativeEligibility({ first, turns, sampleRateHint })
|
|
19
|
+
: undefined;
|
|
20
|
+
if (native && "path" in native && !forceStitch) {
|
|
21
|
+
return native.path;
|
|
27
22
|
}
|
|
23
|
+
const ineligibleReason = native && "fallbackReason" in native ? native.fallbackReason : undefined;
|
|
24
|
+
// A forced stitch never warns about native fallback, but its public reason still names why native couldn't run.
|
|
25
|
+
const stitchFallbackReason = forceStitch ? undefined : ineligibleReason;
|
|
28
26
|
const stitchOptionsPerTurn = resolvedPerTurn.map((r) => {
|
|
29
27
|
const opts = r.provider.getStitchOptions?.(r.modelId, {
|
|
30
28
|
sampleRate: sampleRateHint,
|
|
@@ -41,8 +39,36 @@ export function chooseConversationPath(input) {
|
|
|
41
39
|
kind: "stitch",
|
|
42
40
|
...(stitchFallbackReason && { reason: stitchFallbackReason }),
|
|
43
41
|
stitchOptionsPerTurn,
|
|
42
|
+
stitchReason: describeStitchReason({
|
|
43
|
+
allSame,
|
|
44
|
+
fallbackReason: ineligibleReason,
|
|
45
|
+
first,
|
|
46
|
+
forceStitch,
|
|
47
|
+
}),
|
|
44
48
|
};
|
|
45
49
|
}
|
|
50
|
+
// The native path when these turns can render as native dialogue, why they can't, or undefined without native dialogue.
|
|
51
|
+
function nativeEligibility(args) {
|
|
52
|
+
if (countUniqueVoices(args.turns) <= 1) {
|
|
53
|
+
// A single speaker is just sequential speech — render per-turn via stitch, never native dialogue.
|
|
54
|
+
return modelSupportsNativeDialogue(args.first)
|
|
55
|
+
? { fallbackReason: "fallback-from-native-voice-count" }
|
|
56
|
+
: undefined;
|
|
57
|
+
}
|
|
58
|
+
return tryNativeDialoguePath(args);
|
|
59
|
+
}
|
|
60
|
+
function describeStitchReason(args) {
|
|
61
|
+
if (args.fallbackReason) {
|
|
62
|
+
return FALLBACK_STITCH_REASONS[args.fallbackReason];
|
|
63
|
+
}
|
|
64
|
+
if (!args.allSame) {
|
|
65
|
+
return "mixed-models";
|
|
66
|
+
}
|
|
67
|
+
if (!modelSupportsNativeDialogue(args.first)) {
|
|
68
|
+
return "no-native-dialogue";
|
|
69
|
+
}
|
|
70
|
+
return args.forceStitch ?? "no-native-dialogue";
|
|
71
|
+
}
|
|
46
72
|
// Native dialogue needs 2+ distinct voices; a single voice is always routed to stitch, so providers declare only maxVoices.
|
|
47
73
|
const NATIVE_DIALOGUE_MIN_VOICES = 2;
|
|
48
74
|
function countUniqueVoices(turns) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/conversation/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/conversation/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,4 +20,13 @@ export declare class StitchUnsupportedError extends SpeechSDKError {
|
|
|
20
20
|
model: string;
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
+
export type TurnSplitFailureReason = "empty_turn" | "non_monotonic" | "undecodable_audio";
|
|
24
|
+
export declare class TurnSplitError extends SpeechSDKError {
|
|
25
|
+
readonly reason: TurnSplitFailureReason;
|
|
26
|
+
readonly turnIndex?: number;
|
|
27
|
+
constructor(options: {
|
|
28
|
+
reason: TurnSplitFailureReason;
|
|
29
|
+
turnIndex?: number;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
23
32
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/conversation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,qBAAa,sBAAuB,SAAQ,cAAc;gBAC5C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB;CAQF;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAQzD"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/conversation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,qBAAa,sBAAuB,SAAQ,cAAc;gBAC5C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB;CAQF;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAQzD;AAED,MAAM,MAAM,sBAAsB,GAC9B,YAAY,GACZ,eAAe,GACf,mBAAmB,CAAC;AASxB,qBAAa,cAAe,SAAQ,cAAc;IAChD,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,OAAO,EAAE;QAAE,MAAM,EAAE,sBAAsB,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAY5E"}
|
|
@@ -25,4 +25,22 @@ export class StitchUnsupportedError extends SpeechSDKError {
|
|
|
25
25
|
this.model = options.model;
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
const TURN_SPLIT_MESSAGES = {
|
|
29
|
+
empty_turn: "a turn has no attributed words",
|
|
30
|
+
non_monotonic: "words are out of order: a word overlaps the previous one or belongs to an earlier turn",
|
|
31
|
+
undecodable_audio: "the conversation audio is not decodable PCM/WAV",
|
|
32
|
+
};
|
|
33
|
+
export class TurnSplitError extends SpeechSDKError {
|
|
34
|
+
reason;
|
|
35
|
+
turnIndex;
|
|
36
|
+
constructor(options) {
|
|
37
|
+
const where = options.turnIndex == null ? "" : ` (turn ${options.turnIndex})`;
|
|
38
|
+
super(`generateConversation cannot split per-turn audio: ${TURN_SPLIT_MESSAGES[options.reason]}${where}.`);
|
|
39
|
+
this.name = "TurnSplitError";
|
|
40
|
+
this.reason = options.reason;
|
|
41
|
+
if (options.turnIndex != null) {
|
|
42
|
+
this.turnIndex = options.turnIndex;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
28
46
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/conversation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,cAAc;IAChD,QAAQ,CAAS;IACjB,KAAK,CAAS;IAEvB,YAAY,OAKX;QACC,KAAK,CACH,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,6BAA6B,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,QAAQ,GAAG,CAC1G,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IAC/C,QAAQ,CAAS;IACjB,KAAK,CAAS;IAEvB,YAAY,OAA4C;QACtD,KAAK,CACH,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,sGAAsG,CAC3I,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/conversation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,cAAc;IAChD,QAAQ,CAAS;IACjB,KAAK,CAAS;IAEvB,YAAY,OAKX;QACC,KAAK,CACH,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,6BAA6B,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,QAAQ,GAAG,CAC1G,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IAC/C,QAAQ,CAAS;IACjB,KAAK,CAAS;IAEvB,YAAY,OAA4C;QACtD,KAAK,CACH,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,sGAAsG,CAC3I,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF;AAOD,MAAM,mBAAmB,GAA2C;IAClE,UAAU,EAAE,gCAAgC;IAC5C,aAAa,EACX,wFAAwF;IAC1F,iBAAiB,EAAE,iDAAiD;CACrE,CAAC;AAEF,MAAM,OAAO,cAAe,SAAQ,cAAc;IACvC,MAAM,CAAyB;IAC/B,SAAS,CAAU;IAE5B,YAAY,OAA+D;QACzE,MAAM,KAAK,GACT,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,SAAS,GAAG,CAAC;QAClE,KAAK,CACH,qDAAqD,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CACpG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACrC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -3,6 +3,7 @@ export interface Pcm16Segment {
|
|
|
3
3
|
readonly pcm: Int16Array;
|
|
4
4
|
readonly sampleRate: number;
|
|
5
5
|
}
|
|
6
|
+
export declare function rmsPcm16(pcm: Int16Array): number;
|
|
6
7
|
export declare const DEFAULT_VOLUME_DBFS = -20;
|
|
7
8
|
export declare function dbfsToInt16Rms(dbfs: number): number;
|
|
8
9
|
export declare function normalizeRms(segments: readonly Pcm16Segment[], targetRmsAmplitude?: number): Pcm16Segment[];
|
|
@@ -13,4 +14,16 @@ export declare function concatPcmToWav(segments: readonly Pcm16Segment[], option
|
|
|
13
14
|
gapMs: number;
|
|
14
15
|
targetSampleRate: number;
|
|
15
16
|
}): Promise<Uint8Array>;
|
|
17
|
+
export interface ConcatenatedWav {
|
|
18
|
+
readonly ranges: readonly {
|
|
19
|
+
readonly start: number;
|
|
20
|
+
readonly end: number;
|
|
21
|
+
}[];
|
|
22
|
+
readonly wav: Uint8Array;
|
|
23
|
+
}
|
|
24
|
+
export declare function concatPcmToWavWithRanges(segments: readonly Pcm16Segment[], options: {
|
|
25
|
+
gapMs: number;
|
|
26
|
+
targetSampleRate: number;
|
|
27
|
+
}): Promise<ConcatenatedWav>;
|
|
28
|
+
export declare function gapMidpointsSec(ranges: ConcatenatedWav["ranges"], sampleRate: number): number[];
|
|
16
29
|
//# sourceMappingURL=pcm-concat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcm-concat.d.ts","sourceRoot":"","sources":["../../src/conversation/pcm-concat.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"pcm-concat.d.ts","sourceRoot":"","sources":["../../src/conversation/pcm-concat.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAUD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAShD;AAmCD,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAKD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,kBAAkB,SAA2B,GAC5C,YAAY,EAAE,CAahB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1C,MAAM,CAWR;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,UAAU,CAAC,CAErB;AAED,MAAM,WAAW,eAAe;IAE9B,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7E,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;CAC1B;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,eAAe,CAAC,CAqC1B;AAGD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EACjC,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAMV"}
|
|
@@ -5,7 +5,7 @@ function silencePcm16(ms, sampleRate) {
|
|
|
5
5
|
const samples = Math.round((ms / 1000) * sampleRate);
|
|
6
6
|
return new Int16Array(samples);
|
|
7
7
|
}
|
|
8
|
-
function rmsPcm16(pcm) {
|
|
8
|
+
export function rmsPcm16(pcm) {
|
|
9
9
|
if (pcm.length === 0) {
|
|
10
10
|
return 0;
|
|
11
11
|
}
|
|
@@ -71,24 +71,42 @@ export function stitchTargetRate(segments) {
|
|
|
71
71
|
return rate;
|
|
72
72
|
}
|
|
73
73
|
export async function concatPcmToWav(segments, options) {
|
|
74
|
+
return (await concatPcmToWavWithRanges(segments, options)).wav;
|
|
75
|
+
}
|
|
76
|
+
export async function concatPcmToWavWithRanges(segments, options) {
|
|
74
77
|
const { gapMs, targetSampleRate } = options;
|
|
75
78
|
const gap = silencePcm16(gapMs, targetSampleRate);
|
|
76
79
|
const resampledSegments = await Promise.all(segments.map((s) => resamplePcm16(s.pcm, s.sampleRate, targetSampleRate)));
|
|
77
80
|
const resampled = [];
|
|
81
|
+
const ranges = [];
|
|
82
|
+
let cursor = 0;
|
|
78
83
|
for (let i = 0; i < resampledSegments.length; i++) {
|
|
79
84
|
resampled.push(resampledSegments[i]);
|
|
85
|
+
ranges.push({ start: cursor, end: cursor + resampledSegments[i].length });
|
|
86
|
+
cursor += resampledSegments[i].length;
|
|
80
87
|
if (i < resampledSegments.length - 1 && gap.length > 0) {
|
|
81
88
|
resampled.push(gap);
|
|
89
|
+
cursor += gap.length;
|
|
82
90
|
}
|
|
83
91
|
}
|
|
84
|
-
const
|
|
85
|
-
const merged = new Int16Array(totalSamples);
|
|
92
|
+
const merged = new Int16Array(cursor);
|
|
86
93
|
let off = 0;
|
|
87
94
|
for (const a of resampled) {
|
|
88
95
|
merged.set(a, off);
|
|
89
96
|
off += a.length;
|
|
90
97
|
}
|
|
91
98
|
const mergedBytes = new Uint8Array(merged.buffer, merged.byteOffset, merged.byteLength);
|
|
92
|
-
return
|
|
99
|
+
return {
|
|
100
|
+
ranges,
|
|
101
|
+
wav: await wrapPcm16Mono(mergedBytes, targetSampleRate),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Cut in the middle of each inserted gap, in seconds of the merged audio.
|
|
105
|
+
export function gapMidpointsSec(ranges, sampleRate) {
|
|
106
|
+
const cuts = [];
|
|
107
|
+
for (let i = 0; i < ranges.length - 1; i++) {
|
|
108
|
+
cuts.push((ranges[i].end + ranges[i + 1].start) / 2 / sampleRate);
|
|
109
|
+
}
|
|
110
|
+
return cuts;
|
|
93
111
|
}
|
|
94
112
|
//# sourceMappingURL=pcm-concat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcm-concat.js","sourceRoot":"","sources":["../../src/conversation/pcm-concat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQjE,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC;AAE1B,SAAS,YAAY,CAAC,EAAU,EAAE,UAAkB;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IACrD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"pcm-concat.js","sourceRoot":"","sources":["../../src/conversation/pcm-concat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type AudioOutput } from "../audio-output.js";
|
|
2
|
+
import { type ConversationTurnAudio } from "../speech-result.js";
|
|
3
|
+
import type { ConversationWordTimestamp } from "../timestamps.js";
|
|
4
|
+
interface TurnSpan {
|
|
5
|
+
readonly firstStart: number;
|
|
6
|
+
readonly lastEnd: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function assertTurnSplitAllowed(args: {
|
|
9
|
+
readonly timestamps: readonly ConversationWordTimestamp[];
|
|
10
|
+
readonly turnCount: number;
|
|
11
|
+
}): readonly TurnSpan[];
|
|
12
|
+
export declare function planTurnCuts(args: {
|
|
13
|
+
readonly knownCutsSec?: readonly (number | undefined)[];
|
|
14
|
+
readonly pcm: Int16Array;
|
|
15
|
+
readonly sampleRate: number;
|
|
16
|
+
readonly spans: readonly TurnSpan[];
|
|
17
|
+
}): number[];
|
|
18
|
+
export declare function splitConversationTurns(args: {
|
|
19
|
+
readonly audio: Uint8Array;
|
|
20
|
+
readonly knownCutsSec?: readonly (number | undefined)[];
|
|
21
|
+
readonly mediaType: string;
|
|
22
|
+
readonly output: AudioOutput | undefined;
|
|
23
|
+
readonly timestamps: readonly ConversationWordTimestamp[];
|
|
24
|
+
readonly turnCount: number;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
readonly pcm: Int16Array;
|
|
27
|
+
readonly sampleRate: number;
|
|
28
|
+
readonly turns: readonly ConversationTurnAudio[];
|
|
29
|
+
}>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=split-turns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-turns.d.ts","sourceRoot":"","sources":["../../src/conversation/split-turns.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAUlE,UAAU,QAAQ;IAChB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAGD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,QAAQ,CAAC,UAAU,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GAAG,SAAS,QAAQ,EAAE,CA2BtB;AA+ED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACxD,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CACrC,GAAG,MAAM,EAAE,CAwBX;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC;IAEV,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAClD,CAAC,CA+CD"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { decodeAudioToPcm16 } from "../audio-decode.js";
|
|
2
|
+
import { applyOptionalOutputConversion, isDecodableSourceMediaType, } from "../audio-output.js";
|
|
3
|
+
import { DefaultGeneratedAudioFile, } from "../speech-result.js";
|
|
4
|
+
import { TurnSplitError } from "./errors.js";
|
|
5
|
+
import { rmsPcm16 } from "./pcm-concat.js";
|
|
6
|
+
const FRAME_MS = 20;
|
|
7
|
+
const MIN_SILENCE_MS = 100;
|
|
8
|
+
const SILENCE_BELOW_REFERENCE_DB = 40;
|
|
9
|
+
const REFERENCE_PERCENTILE = 0.9;
|
|
10
|
+
const TIMING_EPSILON_SECONDS = 1e-6;
|
|
11
|
+
// Split only when every turn owns words and turn order matches time order.
|
|
12
|
+
export function assertTurnSplitAllowed(args) {
|
|
13
|
+
const spans = new Array(args.turnCount);
|
|
14
|
+
let previous;
|
|
15
|
+
for (const word of args.timestamps) {
|
|
16
|
+
if (previous &&
|
|
17
|
+
(word.turnIndex < previous.turnIndex ||
|
|
18
|
+
word.start + TIMING_EPSILON_SECONDS < previous.end)) {
|
|
19
|
+
throw new TurnSplitError({
|
|
20
|
+
reason: "non_monotonic",
|
|
21
|
+
turnIndex: word.turnIndex,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const span = spans[word.turnIndex];
|
|
25
|
+
spans[word.turnIndex] = {
|
|
26
|
+
firstStart: span?.firstStart ?? word.start,
|
|
27
|
+
lastEnd: word.end,
|
|
28
|
+
};
|
|
29
|
+
previous = word;
|
|
30
|
+
}
|
|
31
|
+
return Array.from(spans, (span, turnIndex) => {
|
|
32
|
+
if (!span) {
|
|
33
|
+
throw new TurnSplitError({ reason: "empty_turn", turnIndex });
|
|
34
|
+
}
|
|
35
|
+
return span;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function frameRms(pcm, frameSamples) {
|
|
39
|
+
const frameCount = Math.ceil(pcm.length / frameSamples);
|
|
40
|
+
const rms = new Float64Array(frameCount);
|
|
41
|
+
for (let f = 0; f < frameCount; f++) {
|
|
42
|
+
rms[f] = rmsPcm16(pcm.subarray(f * frameSamples, (f + 1) * frameSamples));
|
|
43
|
+
}
|
|
44
|
+
return rms;
|
|
45
|
+
}
|
|
46
|
+
function silenceThreshold(rms) {
|
|
47
|
+
if (rms.length === 0) {
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
const sorted = Float64Array.from(rms).sort();
|
|
51
|
+
const reference = sorted[Math.floor(REFERENCE_PERCENTILE * (sorted.length - 1))];
|
|
52
|
+
return reference * 10 ** (-SILENCE_BELOW_REFERENCE_DB / 20);
|
|
53
|
+
}
|
|
54
|
+
function clamp(value, min, max) {
|
|
55
|
+
return Math.min(max, Math.max(min, value));
|
|
56
|
+
}
|
|
57
|
+
// Middle of the first qualifying silence in [startSample, endSample]; otherwise the quietest frame there.
|
|
58
|
+
function cutInWindow(args) {
|
|
59
|
+
const { endSample, frameSamples, rms, startSample, threshold } = args;
|
|
60
|
+
if (endSample <= startSample) {
|
|
61
|
+
return startSample;
|
|
62
|
+
}
|
|
63
|
+
const minFrames = Math.ceil(MIN_SILENCE_MS / FRAME_MS);
|
|
64
|
+
const firstFrame = Math.ceil(startSample / frameSamples);
|
|
65
|
+
const endFrame = Math.min(rms.length, Math.floor(endSample / frameSamples));
|
|
66
|
+
let runStart = -1;
|
|
67
|
+
for (let f = firstFrame; f <= endFrame; f++) {
|
|
68
|
+
if (f < endFrame && rms[f] <= threshold) {
|
|
69
|
+
if (runStart < 0) {
|
|
70
|
+
runStart = f;
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (runStart >= 0 && f - runStart >= minFrames) {
|
|
75
|
+
return clamp(Math.round(((runStart + f) * frameSamples) / 2), startSample, endSample);
|
|
76
|
+
}
|
|
77
|
+
runStart = -1;
|
|
78
|
+
}
|
|
79
|
+
// Every frame the window touches, including partial frames at either edge.
|
|
80
|
+
const lo = Math.floor(startSample / frameSamples);
|
|
81
|
+
const hi = Math.min(rms.length, Math.ceil(endSample / frameSamples));
|
|
82
|
+
if (hi <= lo) {
|
|
83
|
+
return Math.round((startSample + endSample) / 2);
|
|
84
|
+
}
|
|
85
|
+
let quietest = lo;
|
|
86
|
+
for (let f = lo + 1; f < hi; f++) {
|
|
87
|
+
if (rms[f] < rms[quietest]) {
|
|
88
|
+
quietest = f;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return clamp(Math.round((quietest + 0.5) * frameSamples), startSample, endSample);
|
|
92
|
+
}
|
|
93
|
+
// Returns one cut (sample index) per turn boundary. `knownCutsSec` pins boundaries the SDK stitched itself.
|
|
94
|
+
export function planTurnCuts(args) {
|
|
95
|
+
const { knownCutsSec, pcm, sampleRate, spans } = args;
|
|
96
|
+
const frameSamples = Math.max(1, Math.round((FRAME_MS / 1000) * sampleRate));
|
|
97
|
+
const rms = frameRms(pcm, frameSamples);
|
|
98
|
+
const threshold = silenceThreshold(rms);
|
|
99
|
+
const toSample = (seconds) => clamp(Math.round(seconds * sampleRate), 0, pcm.length);
|
|
100
|
+
const cuts = [];
|
|
101
|
+
for (let b = 0; b < spans.length - 1; b++) {
|
|
102
|
+
const known = knownCutsSec?.[b];
|
|
103
|
+
const cut = known == null
|
|
104
|
+
? cutInWindow({
|
|
105
|
+
startSample: toSample(spans[b].lastEnd),
|
|
106
|
+
endSample: toSample(spans[b + 1].firstStart),
|
|
107
|
+
frameSamples,
|
|
108
|
+
rms,
|
|
109
|
+
threshold,
|
|
110
|
+
})
|
|
111
|
+
: toSample(known);
|
|
112
|
+
cuts.push(Math.max(cut, cuts.at(-1) ?? 0));
|
|
113
|
+
}
|
|
114
|
+
return cuts;
|
|
115
|
+
}
|
|
116
|
+
export async function splitConversationTurns(args) {
|
|
117
|
+
const spans = assertTurnSplitAllowed(args);
|
|
118
|
+
if (!isDecodableSourceMediaType(args.mediaType)) {
|
|
119
|
+
throw new TurnSplitError({ reason: "undecodable_audio" });
|
|
120
|
+
}
|
|
121
|
+
const { pcm, sampleRate } = await decodeAudioToPcm16(args.audio, args.mediaType);
|
|
122
|
+
const cuts = planTurnCuts({
|
|
123
|
+
knownCutsSec: args.knownCutsSec,
|
|
124
|
+
pcm,
|
|
125
|
+
sampleRate,
|
|
126
|
+
spans,
|
|
127
|
+
});
|
|
128
|
+
const turns = await Promise.all(spans.map(async (_, turnIndex) => {
|
|
129
|
+
const startSample = turnIndex === 0 ? 0 : cuts[turnIndex - 1];
|
|
130
|
+
const endSample = cuts[turnIndex] ?? pcm.length;
|
|
131
|
+
const slice = pcm.subarray(startSample, endSample);
|
|
132
|
+
const converted = await applyOptionalOutputConversion({
|
|
133
|
+
audio: new Uint8Array(slice.buffer, slice.byteOffset, slice.byteLength),
|
|
134
|
+
mediaType: `audio/pcm;rate=${sampleRate}`,
|
|
135
|
+
output: args.output ?? { format: "wav" },
|
|
136
|
+
});
|
|
137
|
+
const startSec = startSample / sampleRate;
|
|
138
|
+
const durationSec = (endSample - startSample) / sampleRate;
|
|
139
|
+
return {
|
|
140
|
+
turnIndex,
|
|
141
|
+
audio: new DefaultGeneratedAudioFile({
|
|
142
|
+
data: converted.audio,
|
|
143
|
+
mediaType: converted.mediaType,
|
|
144
|
+
}),
|
|
145
|
+
startMs: startSec * 1000,
|
|
146
|
+
endMs: (endSample / sampleRate) * 1000,
|
|
147
|
+
timestamps: args.timestamps
|
|
148
|
+
.filter((w) => w.turnIndex === turnIndex)
|
|
149
|
+
.map((w) => ({
|
|
150
|
+
text: w.text,
|
|
151
|
+
start: clamp(w.start - startSec, 0, durationSec),
|
|
152
|
+
end: clamp(w.end - startSec, 0, durationSec),
|
|
153
|
+
})),
|
|
154
|
+
};
|
|
155
|
+
}));
|
|
156
|
+
return { pcm, sampleRate, turns };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=split-turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-turns.js","sourceRoot":"","sources":["../../src/conversation/split-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type AudioOutput } from "../audio-output.js";
|
|
2
1
|
import type { SpeechMetadata } from "../metadata.js";
|
|
3
2
|
import type { PronunciationsInput } from "../pronunciations/types.js";
|
|
4
3
|
import type { ResolvedModel, Voice } from "../speech-provider.js";
|
|
@@ -8,14 +7,12 @@ import type { ConversationTurn } from "./types.js";
|
|
|
8
7
|
interface StitchInput<V extends Voice = Voice> {
|
|
9
8
|
readonly abortSignal?: AbortSignal;
|
|
10
9
|
readonly apiKey?: string;
|
|
11
|
-
readonly deferOutputConversion?: boolean;
|
|
12
10
|
readonly gapMs: number;
|
|
13
11
|
readonly headers?: Record<string, string>;
|
|
14
12
|
readonly instructions?: string;
|
|
15
13
|
readonly maxConcurrency: number;
|
|
16
14
|
readonly maxInputChars?: number;
|
|
17
15
|
readonly maxRetries: number;
|
|
18
|
-
readonly output?: AudioOutput;
|
|
19
16
|
readonly pronunciations?: PronunciationsInput;
|
|
20
17
|
readonly resolvedPerTurn: readonly ResolvedModel<V>[];
|
|
21
18
|
readonly stitchOptionsPerTurn: readonly {
|
|
@@ -39,6 +36,7 @@ interface StitchOutput {
|
|
|
39
36
|
readonly metadataPerTurn: readonly SpeechMetadata[];
|
|
40
37
|
readonly providerMetadataPerTurn: readonly (Record<string, unknown> | undefined)[];
|
|
41
38
|
readonly timestamps?: readonly ConversationWordTimestamp[];
|
|
39
|
+
readonly turnCutsSec: readonly number[];
|
|
42
40
|
readonly warnings: readonly string[];
|
|
43
41
|
}
|
|
44
42
|
export declare function runStitch<V extends Voice>(input: StitchInput<V>): Promise<StitchOutput>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stitch.d.ts","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stitch.d.ts","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAQlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,UAAU,WAAW,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,oBAAoB,EAAE,SAAS;QACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,SAAS,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;IACJ,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD,QAAQ,CAAC,uBAAuB,EAAE,SAAS,CACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,SAAS,CACZ,EAAE,CAAC;IACJ,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAE3D,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAsB,SAAS,CAAC,CAAC,SAAS,KAAK,EAC7C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,YAAY,CAAC,CAsIvB"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { decodeAudioToPcm16 } from "../audio-decode.js";
|
|
2
|
-
import { applyOptionalOutputConversion, } from "../audio-output.js";
|
|
3
2
|
import { mapWithConcurrency } from "../concurrency.js";
|
|
4
3
|
import { TimestampValidationError, withTurnIndex } from "../errors.js";
|
|
5
4
|
import { generateSpeech } from "../generate-speech.js";
|
|
6
5
|
import { combineInstructions } from "../instructions.js";
|
|
7
6
|
import { debug } from "../logger.js";
|
|
8
|
-
import {
|
|
7
|
+
import { concatPcmToWavWithRanges, dbfsToInt16Rms, gapMidpointsSec, normalizeRms, stitchTargetRate, } from "./pcm-concat.js";
|
|
9
8
|
export async function runStitch(input) {
|
|
10
9
|
const start = performance.now();
|
|
11
10
|
// Divide the call budget across active turns so nested chunking cannot exceed it.
|
|
@@ -54,15 +53,7 @@ export async function runStitch(input) {
|
|
|
54
53
|
const segments = perTurn.map((p) => p.segment);
|
|
55
54
|
const leveledSegments = normalizeRms(segments, input.volumeDbfs == null ? undefined : dbfsToInt16Rms(input.volumeDbfs));
|
|
56
55
|
const targetSampleRate = stitchTargetRate(leveledSegments);
|
|
57
|
-
const audio = await
|
|
58
|
-
gapMs: input.gapMs,
|
|
59
|
-
targetSampleRate,
|
|
60
|
-
});
|
|
61
|
-
const { audio: finalAudio, mediaType } = await applyOptionalOutputConversion({
|
|
62
|
-
audio,
|
|
63
|
-
mediaType: "audio/wav",
|
|
64
|
-
output: input.deferOutputConversion ? undefined : input.output,
|
|
65
|
-
});
|
|
56
|
+
const { wav: audio, ranges } = await concatPcmToWavWithRanges(leveledSegments, { gapMs: input.gapMs, targetSampleRate });
|
|
66
57
|
const totalSamples = perTurn.reduce((n, p) => n +
|
|
67
58
|
Math.round((p.segment.pcm.length / p.segment.sampleRate) * targetSampleRate), 0) +
|
|
68
59
|
(perTurn.length - 1) * Math.round((input.gapMs / 1000) * targetSampleRate);
|
|
@@ -100,8 +91,8 @@ export async function runStitch(input) {
|
|
|
100
91
|
debug(`stitch: composed ${timestamps.length} word timestamps across ${perTurn.length} turn(s).`);
|
|
101
92
|
}
|
|
102
93
|
return {
|
|
103
|
-
audio
|
|
104
|
-
mediaType,
|
|
94
|
+
audio,
|
|
95
|
+
mediaType: "audio/wav",
|
|
105
96
|
metadata: {
|
|
106
97
|
inputChars: input.turns.reduce((n, t) => n + t.text.length, 0),
|
|
107
98
|
latencyMs: Math.round(performance.now() - start),
|
|
@@ -110,6 +101,7 @@ export async function runStitch(input) {
|
|
|
110
101
|
metadataPerTurn,
|
|
111
102
|
providerMetadataPerTurn,
|
|
112
103
|
timestamps,
|
|
104
|
+
turnCutsSec: gapMidpointsSec(ranges, targetSampleRate),
|
|
113
105
|
warnings,
|
|
114
106
|
};
|
|
115
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,11 @@ export interface GenerateConversationOptions<V extends Voice = Voice, M extends
|
|
|
27
27
|
readonly pronunciations?: PronunciationsInput;
|
|
28
28
|
readonly providerOptions?: Record<string, unknown>;
|
|
29
29
|
readonly speed?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Also return `turns`: one audio clip per input turn, cut at the silence after each turn's last word. Requires
|
|
32
|
+
* `timestamps: true`. Throws `TurnSplitError` when turn boundaries can't be trusted.
|
|
33
|
+
*/
|
|
34
|
+
readonly splitTurns?: boolean;
|
|
30
35
|
readonly timestampProvider?: TimestampProvider;
|
|
31
36
|
readonly timestamps?: boolean;
|
|
32
37
|
readonly turns: readonly ConversationTurn<V>[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IACvD,mDAAmD;IACnD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B,CAC1C,CAAC,SAAS,KAAK,GAAG,KAAK,EACvB,CAAC,SAAS,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,GAC3C,MAAM,GACN,aAAa,CAAC,CAAC,CAAC,GAChB,SAAS;IAEb,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IACvD,mDAAmD;IACnD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B,CAC1C,CAAC,SAAS,KAAK,GAAG,KAAK,EACvB,CAAC,SAAS,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,GAC3C,MAAM,GACN,aAAa,CAAC,CAAC,CAAC,GAChB,SAAS;IAEb,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|