@speech-sdk/core 0.8.0-alpha → 0.8.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 +63 -1
- package/dist/audio-decode.d.ts +7 -0
- package/dist/audio-decode.d.ts.map +1 -0
- package/dist/audio-decode.js +109 -0
- package/dist/audio-decode.js.map +1 -0
- package/dist/audio-duration.d.ts.map +1 -1
- package/dist/audio-duration.js +3 -12
- package/dist/audio-duration.js.map +1 -1
- package/dist/audio-output.d.ts +39 -0
- package/dist/audio-output.d.ts.map +1 -0
- package/dist/audio-output.js +111 -0
- package/dist/audio-output.js.map +1 -0
- package/dist/audio-utils.d.ts +2 -0
- package/dist/audio-utils.d.ts.map +1 -1
- package/dist/audio-utils.js +55 -1
- package/dist/audio-utils.js.map +1 -1
- package/dist/conversation/pcm-concat.d.ts +0 -1
- package/dist/conversation/pcm-concat.d.ts.map +1 -1
- package/dist/conversation/pcm-concat.js +6 -143
- package/dist/conversation/pcm-concat.js.map +1 -1
- package/dist/conversation/stitch.d.ts +6 -0
- package/dist/conversation/stitch.d.ts.map +1 -1
- package/dist/conversation/stitch.js +32 -15
- package/dist/conversation/stitch.js.map +1 -1
- package/dist/conversation/types.d.ts +6 -2
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/encoders/mp3.d.ts +6 -0
- package/dist/encoders/mp3.d.ts.map +1 -0
- package/dist/encoders/mp3.js +54 -0
- package/dist/encoders/mp3.js.map +1 -0
- package/dist/errors.d.ts +15 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +37 -1
- package/dist/errors.js.map +1 -1
- package/dist/generate-conversation.d.ts +3 -3
- package/dist/generate-conversation.d.ts.map +1 -1
- package/dist/generate-conversation.js +107 -44
- package/dist/generate-conversation.js.map +1 -1
- package/dist/generate-speech.d.ts +6 -2
- package/dist/generate-speech.d.ts.map +1 -1
- package/dist/generate-speech.js +130 -60
- package/dist/generate-speech.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/pronunciations/errors.d.ts +5 -0
- package/dist/pronunciations/errors.d.ts.map +1 -0
- package/dist/pronunciations/errors.js +8 -0
- package/dist/pronunciations/errors.js.map +1 -0
- package/dist/pronunciations/inverse-align.d.ts +4 -0
- package/dist/pronunciations/inverse-align.d.ts.map +1 -0
- package/dist/pronunciations/inverse-align.js +54 -0
- package/dist/pronunciations/inverse-align.js.map +1 -0
- package/dist/pronunciations/merge.d.ts +4 -0
- package/dist/pronunciations/merge.d.ts.map +1 -0
- package/dist/pronunciations/merge.js +13 -0
- package/dist/pronunciations/merge.js.map +1 -0
- package/dist/pronunciations/substitute.d.ts +6 -0
- package/dist/pronunciations/substitute.d.ts.map +1 -0
- package/dist/pronunciations/substitute.js +67 -0
- package/dist/pronunciations/substitute.js.map +1 -0
- package/dist/pronunciations/types.d.ts +18 -0
- package/dist/pronunciations/types.d.ts.map +1 -0
- package/dist/pronunciations/types.js +2 -0
- package/dist/pronunciations/types.js.map +1 -0
- package/dist/pronunciations/validate.d.ts +3 -0
- package/dist/pronunciations/validate.d.ts.map +1 -0
- package/dist/pronunciations/validate.js +26 -0
- package/dist/pronunciations/validate.js.map +1 -0
- package/dist/provider-utils.d.ts +1 -0
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +26 -0
- package/dist/provider-utils.js.map +1 -1
- package/dist/providers/cartesia/index.d.ts +22 -0
- package/dist/providers/cartesia/index.d.ts.map +1 -1
- package/dist/providers/cartesia/index.js +48 -0
- package/dist/providers/cartesia/index.js.map +1 -1
- package/dist/providers/deepgram/index.d.ts +16 -0
- package/dist/providers/deepgram/index.d.ts.map +1 -1
- package/dist/providers/deepgram/index.js +34 -0
- package/dist/providers/deepgram/index.js.map +1 -1
- package/dist/providers/elevenlabs/index.d.ts +7 -0
- package/dist/providers/elevenlabs/index.d.ts.map +1 -1
- package/dist/providers/elevenlabs/index.js +25 -0
- package/dist/providers/elevenlabs/index.js.map +1 -1
- package/dist/providers/fal/index.d.ts +5 -3
- package/dist/providers/fal/index.d.ts.map +1 -1
- package/dist/providers/fal/index.js +13 -7
- package/dist/providers/fal/index.js.map +1 -1
- package/dist/providers/fish-audio/index.d.ts +7 -0
- package/dist/providers/fish-audio/index.d.ts.map +1 -1
- package/dist/providers/fish-audio/index.js +24 -0
- package/dist/providers/fish-audio/index.js.map +1 -1
- package/dist/providers/gateway/index.d.ts +8 -0
- package/dist/providers/gateway/index.d.ts.map +1 -1
- package/dist/providers/gateway/index.js +16 -1
- package/dist/providers/gateway/index.js.map +1 -1
- package/dist/providers/google/index.d.ts +5 -0
- package/dist/providers/google/index.d.ts.map +1 -1
- package/dist/providers/google/index.js +19 -11
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/hume/index.d.ts +9 -0
- package/dist/providers/hume/index.d.ts.map +1 -1
- package/dist/providers/hume/index.js +24 -0
- package/dist/providers/hume/index.js.map +1 -1
- package/dist/providers/inworld/index.d.ts +10 -0
- package/dist/providers/inworld/index.d.ts.map +1 -1
- package/dist/providers/inworld/index.js +32 -8
- package/dist/providers/inworld/index.js.map +1 -1
- package/dist/providers/mistral/index.d.ts +7 -0
- package/dist/providers/mistral/index.d.ts.map +1 -1
- package/dist/providers/mistral/index.js +24 -10
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/murf/index.d.ts +8 -0
- package/dist/providers/murf/index.d.ts.map +1 -1
- package/dist/providers/murf/index.js +40 -1
- package/dist/providers/murf/index.js.map +1 -1
- package/dist/providers/openai/index.d.ts +7 -0
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +24 -0
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/resemble/index.d.ts +14 -0
- package/dist/providers/resemble/index.d.ts.map +1 -1
- package/dist/providers/resemble/index.js +35 -1
- package/dist/providers/resemble/index.js.map +1 -1
- package/dist/providers/smallest-ai/index.d.ts +47 -0
- package/dist/providers/smallest-ai/index.d.ts.map +1 -0
- package/dist/providers/smallest-ai/index.js +107 -0
- package/dist/providers/smallest-ai/index.js.map +1 -0
- package/dist/providers/xai/index.d.ts +18 -0
- package/dist/providers/xai/index.d.ts.map +1 -1
- package/dist/providers/xai/index.js +26 -0
- package/dist/providers/xai/index.js.map +1 -1
- package/dist/providers.d.ts +2 -0
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +1 -0
- package/dist/providers.js.map +1 -1
- package/dist/retry-options.d.ts +6 -0
- package/dist/retry-options.d.ts.map +1 -0
- package/dist/retry-options.js +48 -0
- package/dist/retry-options.js.map +1 -0
- package/dist/speech-provider.d.ts +15 -0
- package/dist/speech-provider.d.ts.map +1 -1
- package/dist/speech-provider.js.map +1 -1
- package/dist/speech-result.d.ts +5 -1
- package/dist/speech-result.d.ts.map +1 -1
- package/dist/speech-result.js.map +1 -1
- package/dist/stream-speech.d.ts +4 -2
- package/dist/stream-speech.d.ts.map +1 -1
- package/dist/stream-speech.js +36 -21
- package/dist/stream-speech.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/volume-adjust.d.ts.map +1 -1
- package/dist/volume-adjust.js +4 -10
- package/dist/volume-adjust.js.map +1 -1
- package/package.json +3 -1
|
@@ -1,143 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
// Int16Array views require 2-byte alignment; copy on misalignment.
|
|
3
|
-
function pcmBytesToInt16(bytes) {
|
|
4
|
-
if (bytes.byteOffset % 2 === 0 && bytes.byteLength % 2 === 0) {
|
|
5
|
-
return new Int16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);
|
|
6
|
-
}
|
|
7
|
-
const copy = new Uint8Array(bytes.byteLength);
|
|
8
|
-
copy.set(bytes);
|
|
9
|
-
return new Int16Array(copy.buffer);
|
|
10
|
-
}
|
|
11
|
-
function downmixToMono(interleaved, channels) {
|
|
12
|
-
if (channels === 1) {
|
|
13
|
-
return interleaved;
|
|
14
|
-
}
|
|
15
|
-
const frames = Math.floor(interleaved.length / channels);
|
|
16
|
-
const out = new Int16Array(frames);
|
|
17
|
-
for (let f = 0; f < frames; f++) {
|
|
18
|
-
let sum = 0;
|
|
19
|
-
for (let c = 0; c < channels; c++) {
|
|
20
|
-
sum += interleaved[f * channels + c];
|
|
21
|
-
}
|
|
22
|
-
out[f] = Math.round(sum / channels);
|
|
23
|
-
}
|
|
24
|
-
return out;
|
|
25
|
-
}
|
|
26
|
-
// Float32Array views require 4-byte alignment; copy on misalignment.
|
|
27
|
-
function pcmBytesToFloat32(bytes) {
|
|
28
|
-
if (bytes.byteOffset % 4 === 0 && bytes.byteLength % 4 === 0) {
|
|
29
|
-
return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
|
|
30
|
-
}
|
|
31
|
-
const copy = new Uint8Array(bytes.byteLength);
|
|
32
|
-
copy.set(bytes);
|
|
33
|
-
return new Float32Array(copy.buffer);
|
|
34
|
-
}
|
|
1
|
+
import { resamplePcm16, wrapPcm16Mono } from "../audio-utils.js";
|
|
35
2
|
const INT16_MAX = 32_767;
|
|
36
3
|
const INT16_MIN = -32_768;
|
|
37
|
-
function float32ToInt16(f32) {
|
|
38
|
-
const out = new Int16Array(f32.length);
|
|
39
|
-
for (let i = 0; i < f32.length; i++) {
|
|
40
|
-
const s = f32[i];
|
|
41
|
-
if (s >= 1) {
|
|
42
|
-
out[i] = INT16_MAX;
|
|
43
|
-
}
|
|
44
|
-
else if (s <= -1) {
|
|
45
|
-
out[i] = INT16_MIN;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
out[i] = Math.round(s * INT16_MAX);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return out;
|
|
52
|
-
}
|
|
53
|
-
const ENCODING_PARAM_RE = /(?:^|;)\s*encoding=([a-z0-9_-]+)(?=$|;|\s)/i;
|
|
54
|
-
export function decodeToPcm16(data, mediaType) {
|
|
55
|
-
const lower = mediaType.toLowerCase();
|
|
56
|
-
if (lower.startsWith("audio/pcm") || lower.startsWith("audio/x-pcm")) {
|
|
57
|
-
// audio/l16 (RFC 2586, big-endian) intentionally unsupported.
|
|
58
|
-
const sampleRate = parseMediaTypeParam(mediaType, "rate") ?? 24_000;
|
|
59
|
-
const channels = parseMediaTypeParam(mediaType, "channels") ?? 1;
|
|
60
|
-
const encoding = lower.match(ENCODING_PARAM_RE)?.[1];
|
|
61
|
-
if (encoding === "float32") {
|
|
62
|
-
const interleaved = float32ToInt16(pcmBytesToFloat32(data));
|
|
63
|
-
return {
|
|
64
|
-
pcm: downmixToMono(interleaved, channels),
|
|
65
|
-
sampleRate,
|
|
66
|
-
channels: 1,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
const interleaved = pcmBytesToInt16(data);
|
|
70
|
-
return {
|
|
71
|
-
pcm: downmixToMono(interleaved, channels),
|
|
72
|
-
sampleRate,
|
|
73
|
-
channels: 1,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
if (lower.startsWith("audio/wav") || lower.startsWith("audio/x-wav")) {
|
|
77
|
-
return decodeWav(data);
|
|
78
|
-
}
|
|
79
|
-
throw new Error(`conversation.pcm-concat: unsupported stitch mediaType "${mediaType}". ` +
|
|
80
|
-
'getStitchOptions must return "audio/wav" or "audio/pcm;rate=...[;encoding=float32]" so the stitch layer can concatenate without a compressed-audio decoder.');
|
|
81
|
-
}
|
|
82
|
-
function decodeWav(bytes) {
|
|
83
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
84
|
-
if (view.getUint32(0) !== 0x52_49_46_46 ||
|
|
85
|
-
view.getUint32(8) !== 0x57_41_56_45) {
|
|
86
|
-
throw new Error("conversation.pcm-concat: not a RIFF/WAVE file");
|
|
87
|
-
}
|
|
88
|
-
let offset = 12;
|
|
89
|
-
let sampleRate = 0;
|
|
90
|
-
let channels = 0;
|
|
91
|
-
let bitsPerSample = 0;
|
|
92
|
-
let audioFormat = 0;
|
|
93
|
-
let dataStart = -1;
|
|
94
|
-
let dataLen = 0;
|
|
95
|
-
while (offset + 8 <= bytes.byteLength) {
|
|
96
|
-
const chunkId = view.getUint32(offset);
|
|
97
|
-
const chunkSize = view.getUint32(offset + 4, true);
|
|
98
|
-
if (chunkId === 0x66_6d_74_20) {
|
|
99
|
-
audioFormat = view.getUint16(offset + 8, true);
|
|
100
|
-
channels = view.getUint16(offset + 10, true);
|
|
101
|
-
sampleRate = view.getUint32(offset + 12, true);
|
|
102
|
-
bitsPerSample = view.getUint16(offset + 22, true);
|
|
103
|
-
}
|
|
104
|
-
else if (chunkId === 0x64_61_74_61) {
|
|
105
|
-
dataStart = offset + 8;
|
|
106
|
-
dataLen = chunkSize;
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
offset += 8 + chunkSize + (chunkSize % 2);
|
|
110
|
-
}
|
|
111
|
-
if (dataStart < 0 ||
|
|
112
|
-
sampleRate === 0 ||
|
|
113
|
-
bitsPerSample !== 16 ||
|
|
114
|
-
audioFormat !== 1) {
|
|
115
|
-
throw new Error(`conversation.pcm-concat: only 16-bit PCM WAV is supported (got audioFormat=${audioFormat}, bps=${bitsPerSample})`);
|
|
116
|
-
}
|
|
117
|
-
const payload = bytes.subarray(dataStart, dataStart + dataLen);
|
|
118
|
-
const interleaved = pcmBytesToInt16(payload);
|
|
119
|
-
return {
|
|
120
|
-
pcm: downmixToMono(interleaved, channels || 1),
|
|
121
|
-
sampleRate,
|
|
122
|
-
channels: 1,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
function resamplePcm16LinearMono(input, fromRate, toRate) {
|
|
126
|
-
if (fromRate === toRate) {
|
|
127
|
-
return input;
|
|
128
|
-
}
|
|
129
|
-
const ratio = fromRate / toRate;
|
|
130
|
-
const outLen = Math.round(input.length / ratio);
|
|
131
|
-
const out = new Int16Array(outLen);
|
|
132
|
-
for (let i = 0; i < outLen; i++) {
|
|
133
|
-
const srcPos = i * ratio;
|
|
134
|
-
const i0 = Math.floor(srcPos);
|
|
135
|
-
const i1 = Math.min(i0 + 1, input.length - 1);
|
|
136
|
-
const frac = srcPos - i0;
|
|
137
|
-
out[i] = Math.round(input[i0] * (1 - frac) + input[i1] * frac);
|
|
138
|
-
}
|
|
139
|
-
return out;
|
|
140
|
-
}
|
|
141
4
|
function silencePcm16(ms, sampleRate) {
|
|
142
5
|
const samples = Math.round((ms / 1000) * sampleRate);
|
|
143
6
|
return new Int16Array(samples);
|
|
@@ -186,12 +49,12 @@ export function normalizeRms(segments, targetRmsAmplitude = DEFAULT_TARGET_RMS_I
|
|
|
186
49
|
}
|
|
187
50
|
export async function concatPcmToWav(segments, options) {
|
|
188
51
|
const { gapMs, targetSampleRate } = options;
|
|
189
|
-
const resampled = [];
|
|
190
52
|
const gap = silencePcm16(gapMs, targetSampleRate);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
53
|
+
const resampledSegments = await Promise.all(segments.map((s) => resamplePcm16(s.pcm, s.sampleRate, targetSampleRate)));
|
|
54
|
+
const resampled = [];
|
|
55
|
+
for (let i = 0; i < resampledSegments.length; i++) {
|
|
56
|
+
resampled.push(resampledSegments[i]);
|
|
57
|
+
if (i < resampledSegments.length - 1 && gap.length > 0) {
|
|
195
58
|
resampled.push(gap);
|
|
196
59
|
}
|
|
197
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcm-concat.js","sourceRoot":"","sources":["../../src/conversation/pcm-concat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pcm-concat.js","sourceRoot":"","sources":["../../src/conversation/pcm-concat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { type AudioOutput } from "../audio-output.js";
|
|
2
|
+
import type { SpeechMetadata } from "../metadata.js";
|
|
3
|
+
import type { PronunciationsInput } from "../pronunciations/types.js";
|
|
1
4
|
import type { ResolvedModel, Voice } from "../speech-provider.js";
|
|
2
5
|
import type { ConversationWordTimestamp } from "../timestamps.js";
|
|
3
6
|
import type { ConversationTurn } from "./types.js";
|
|
@@ -8,6 +11,8 @@ interface StitchInput<V extends Voice = Voice> {
|
|
|
8
11
|
readonly headers?: Record<string, string>;
|
|
9
12
|
readonly maxConcurrency: number;
|
|
10
13
|
readonly maxRetries: number;
|
|
14
|
+
readonly output?: AudioOutput;
|
|
15
|
+
readonly pronunciations?: PronunciationsInput;
|
|
11
16
|
readonly resolvedPerTurn: readonly ResolvedModel<V>[];
|
|
12
17
|
readonly stitchOptionsPerTurn: readonly {
|
|
13
18
|
providerOptions: Record<string, unknown>;
|
|
@@ -26,6 +31,7 @@ interface StitchOutput {
|
|
|
26
31
|
readonly latencyMs: number;
|
|
27
32
|
readonly audioDurationMs?: number;
|
|
28
33
|
};
|
|
34
|
+
readonly metadataPerTurn: readonly SpeechMetadata[];
|
|
29
35
|
readonly providerMetadataPerTurn: readonly (Record<string, unknown> | undefined)[];
|
|
30
36
|
readonly timestamps?: readonly ConversationWordTimestamp[];
|
|
31
37
|
readonly warnings: readonly string[];
|
|
@@ -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":"AACA,OAAO,EACL,KAAK,WAAW,EAEjB,MAAM,oBAAoB,CAAC;AAI5B,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,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAGlE,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,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,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,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;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AA4BD,wBAAsB,SAAS,CAAC,CAAC,SAAS,KAAK,EAC7C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,YAAY,CAAC,CA8IvB"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { decodeAudioToPcm16 } from "../audio-decode.js";
|
|
2
|
+
import { applyOptionalOutputConversion, } from "../audio-output.js";
|
|
3
|
+
import { withTurnIndex } from "../errors.js";
|
|
1
4
|
import { generateSpeech } from "../generate-speech.js";
|
|
2
5
|
import { debug } from "../logger.js";
|
|
3
|
-
import { concatPcmToWav, dbfsToInt16Rms,
|
|
6
|
+
import { concatPcmToWav, dbfsToInt16Rms, normalizeRms } from "./pcm-concat.js";
|
|
4
7
|
import { fillTurnTimestampsProportional } from "./proportional-fill.js";
|
|
5
8
|
const TARGET_SAMPLE_RATE = 24_000;
|
|
6
9
|
const WHITESPACE_RE = /\s+/;
|
|
@@ -29,19 +32,26 @@ export async function runStitch(input) {
|
|
|
29
32
|
...turn.providerOptions,
|
|
30
33
|
...stitchOpts.providerOptions,
|
|
31
34
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
let result;
|
|
36
|
+
try {
|
|
37
|
+
result = await generateSpeech({
|
|
38
|
+
model: resolved,
|
|
39
|
+
text: turn.text,
|
|
40
|
+
voice: turn.voice,
|
|
41
|
+
apiKey: input.apiKey,
|
|
42
|
+
providerOptions: mergedProviderOptions,
|
|
43
|
+
maxRetries: input.maxRetries,
|
|
44
|
+
abortSignal: input.abortSignal,
|
|
45
|
+
headers: input.headers,
|
|
46
|
+
timestamps: input.timestamps,
|
|
47
|
+
pronunciations: input.pronunciations,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
throw withTurnIndex(err, i);
|
|
52
|
+
}
|
|
43
53
|
// Hume and others omit sample rate from content-type; prefer getStitchOptions.
|
|
44
|
-
const segment =
|
|
54
|
+
const segment = await decodeAudioToPcm16(result.audio.uint8Array, stitchOpts.mediaType);
|
|
45
55
|
return { result, segment };
|
|
46
56
|
});
|
|
47
57
|
const segments = perTurn.map((p) => p.segment);
|
|
@@ -50,12 +60,18 @@ export async function runStitch(input) {
|
|
|
50
60
|
gapMs: input.gapMs,
|
|
51
61
|
targetSampleRate: TARGET_SAMPLE_RATE,
|
|
52
62
|
});
|
|
63
|
+
const { audio: finalAudio, mediaType } = await applyOptionalOutputConversion({
|
|
64
|
+
audio,
|
|
65
|
+
mediaType: "audio/wav",
|
|
66
|
+
output: input.output,
|
|
67
|
+
});
|
|
53
68
|
const totalSamples = perTurn.reduce((n, p) => n +
|
|
54
69
|
Math.round((p.segment.pcm.length / p.segment.sampleRate) * TARGET_SAMPLE_RATE), 0) +
|
|
55
70
|
(perTurn.length - 1) *
|
|
56
71
|
Math.round((input.gapMs / 1000) * TARGET_SAMPLE_RATE);
|
|
57
72
|
const audioDurationMs = Math.round((totalSamples / TARGET_SAMPLE_RATE) * 1000);
|
|
58
73
|
const warnings = perTurn.flatMap((p) => p.result.warnings ?? []);
|
|
74
|
+
const metadataPerTurn = perTurn.map((p) => p.result.metadata);
|
|
59
75
|
const providerMetadataPerTurn = perTurn.map((p) => p.result.providerMetadata);
|
|
60
76
|
// Use source duration (pre-resample) so offsets match what the per-turn STT/native saw.
|
|
61
77
|
const gapSeconds = input.gapMs / 1000;
|
|
@@ -102,13 +118,14 @@ export async function runStitch(input) {
|
|
|
102
118
|
debug(`stitch: composed ${timestamps.length} word timestamps across ${perTurn.length} turn(s); ${filledTurns.length} turn(s) filled proportionally.`);
|
|
103
119
|
}
|
|
104
120
|
return {
|
|
105
|
-
audio,
|
|
106
|
-
mediaType
|
|
121
|
+
audio: finalAudio,
|
|
122
|
+
mediaType,
|
|
107
123
|
metadata: {
|
|
108
124
|
inputChars: input.turns.reduce((n, t) => n + t.text.length, 0),
|
|
109
125
|
latencyMs: Math.round(performance.now() - start),
|
|
110
126
|
audioDurationMs,
|
|
111
127
|
},
|
|
128
|
+
metadataPerTurn,
|
|
112
129
|
providerMetadataPerTurn,
|
|
113
130
|
timestamps,
|
|
114
131
|
warnings: warnings.length > 0 || fillWarnings.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { AudioOutput } from "../audio-output.js";
|
|
2
|
+
import type { PronunciationsFor } from "../pronunciations/types.js";
|
|
1
3
|
import type { ResolvedModel, Voice } from "../speech-provider.js";
|
|
2
4
|
export interface ConversationTurn<V extends Voice = Voice> {
|
|
3
5
|
readonly model?: string | ResolvedModel<V>;
|
|
@@ -5,14 +7,16 @@ export interface ConversationTurn<V extends Voice = Voice> {
|
|
|
5
7
|
readonly text: string;
|
|
6
8
|
readonly voice: V;
|
|
7
9
|
}
|
|
8
|
-
export interface GenerateConversationOptions<V extends Voice = Voice> {
|
|
10
|
+
export interface GenerateConversationOptions<V extends Voice = Voice, M extends string | ResolvedModel<V> | undefined = string | ResolvedModel<V> | undefined> {
|
|
9
11
|
readonly abortSignal?: AbortSignal;
|
|
10
12
|
readonly apiKey?: string;
|
|
11
13
|
readonly gapMs?: number;
|
|
12
14
|
readonly headers?: Record<string, string>;
|
|
13
15
|
readonly maxConcurrency?: number;
|
|
14
16
|
readonly maxRetries?: number;
|
|
15
|
-
readonly model?:
|
|
17
|
+
readonly model?: M;
|
|
18
|
+
readonly output?: AudioOutput;
|
|
19
|
+
readonly pronunciations?: PronunciationsFor<M>;
|
|
16
20
|
readonly providerOptions?: Record<string, unknown>;
|
|
17
21
|
readonly timestamps?: boolean;
|
|
18
22
|
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,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IACvD,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;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B,
|
|
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,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IACvD,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;IACnD,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,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,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,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mp3.d.ts","sourceRoot":"","sources":["../../src/encoders/mp3.ts"],"names":[],"mappings":"AA4BA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,UAAU,CAAC,CAwCtB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AudioSample, AudioSampleSource, BufferTarget, canEncodeAudio, Mp3OutputFormat, Output, } from "mediabunny";
|
|
2
|
+
const SUPPORTED_SAMPLE_RATES = new Set([
|
|
3
|
+
16_000, 22_050, 24_000, 32_000, 44_100, 48_000,
|
|
4
|
+
]);
|
|
5
|
+
let mp3EncoderRegistered;
|
|
6
|
+
async function ensureMp3Encoder() {
|
|
7
|
+
if (!mp3EncoderRegistered) {
|
|
8
|
+
mp3EncoderRegistered = (async () => {
|
|
9
|
+
if (await canEncodeAudio("mp3")) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const { registerMp3Encoder } = await import("@mediabunny/mp3-encoder");
|
|
13
|
+
registerMp3Encoder();
|
|
14
|
+
})();
|
|
15
|
+
}
|
|
16
|
+
await mp3EncoderRegistered;
|
|
17
|
+
}
|
|
18
|
+
export async function encodePcm16ToMp3(args) {
|
|
19
|
+
const { pcm, sampleRate, bitrateKbps } = args;
|
|
20
|
+
if (pcm.byteLength === 0) {
|
|
21
|
+
throw new Error("encodePcm16ToMp3: input pcm is empty");
|
|
22
|
+
}
|
|
23
|
+
if (!SUPPORTED_SAMPLE_RATES.has(sampleRate)) {
|
|
24
|
+
throw new Error(`encodePcm16ToMp3: unsupported sample rate ${sampleRate}`);
|
|
25
|
+
}
|
|
26
|
+
await ensureMp3Encoder();
|
|
27
|
+
const output = new Output({
|
|
28
|
+
format: new Mp3OutputFormat(),
|
|
29
|
+
target: new BufferTarget(),
|
|
30
|
+
});
|
|
31
|
+
const source = new AudioSampleSource({
|
|
32
|
+
codec: "mp3",
|
|
33
|
+
bitrate: bitrateKbps * 1000,
|
|
34
|
+
});
|
|
35
|
+
output.addAudioTrack(source);
|
|
36
|
+
await output.start();
|
|
37
|
+
const numberOfFrames = Math.floor(pcm.byteLength / 2);
|
|
38
|
+
const sample = new AudioSample({
|
|
39
|
+
data: new Int16Array(pcm.buffer, pcm.byteOffset, numberOfFrames),
|
|
40
|
+
format: "s16",
|
|
41
|
+
numberOfChannels: 1,
|
|
42
|
+
sampleRate,
|
|
43
|
+
timestamp: 0,
|
|
44
|
+
});
|
|
45
|
+
await source.add(sample);
|
|
46
|
+
source.close();
|
|
47
|
+
await output.finalize();
|
|
48
|
+
const buffer = output.target.buffer;
|
|
49
|
+
if (!buffer) {
|
|
50
|
+
throw new Error("encodePcm16ToMp3: Mp3OutputFormat produced no buffer");
|
|
51
|
+
}
|
|
52
|
+
return new Uint8Array(buffer);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=mp3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mp3.js","sourceRoot":"","sources":["../../src/encoders/mp3.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,MAAM,GACP,MAAM,YAAY,CAAC;AAEpB,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAC/C,CAAC,CAAC;AAEH,IAAI,oBAA+C,CAAC;AAEpD,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,oBAAoB,GAAG,CAAC,KAAK,IAAI,EAAE;YACjC,IAAI,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YACvE,kBAAkB,EAAE,CAAC;QACvB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,MAAM,oBAAoB,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAItC;IACC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAE9C,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,6CAA6C,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,gBAAgB,EAAE,CAAC;IAEzB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,MAAM,EAAE,IAAI,eAAe,EAAE;QAC7B,MAAM,EAAE,IAAI,YAAY,EAAE;KAC3B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;QACnC,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,WAAW,GAAG,IAAI;KAC5B,CAAC,CAAC;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;QAC7B,IAAI,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC;QAChE,MAAM,EAAE,KAAK;QACb,gBAAgB,EAAE,CAAC;QACnB,UAAU;QACV,SAAS,EAAE,CAAC;KACb,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -7,22 +7,36 @@ export declare class ApiError extends SpeechSDKError {
|
|
|
7
7
|
readonly statusCode: number;
|
|
8
8
|
readonly responseBody?: unknown;
|
|
9
9
|
readonly code?: string;
|
|
10
|
+
readonly turnIndex?: number;
|
|
11
|
+
readonly retryAfterMs?: number;
|
|
10
12
|
constructor(message: string, options: {
|
|
11
13
|
statusCode: number;
|
|
12
14
|
responseBody?: unknown;
|
|
13
15
|
cause?: unknown;
|
|
14
16
|
code?: string;
|
|
17
|
+
turnIndex?: number;
|
|
18
|
+
retryAfterMs?: number;
|
|
15
19
|
});
|
|
16
20
|
}
|
|
17
21
|
export declare class NoSpeechGeneratedError extends SpeechSDKError {
|
|
18
|
-
|
|
22
|
+
readonly turnIndex?: number;
|
|
23
|
+
constructor(message?: string, options?: {
|
|
24
|
+
turnIndex?: number;
|
|
25
|
+
});
|
|
19
26
|
}
|
|
27
|
+
export declare function withTurnIndex(err: unknown, turnIndex: number): unknown;
|
|
20
28
|
export declare class StreamingNotSupportedError extends SpeechSDKError {
|
|
21
29
|
constructor(model: string);
|
|
22
30
|
}
|
|
23
31
|
export declare class VolumeAdjustmentUnsupportedError extends SpeechSDKError {
|
|
24
32
|
constructor(model: string);
|
|
25
33
|
}
|
|
34
|
+
export declare class OutputConversionUnsupportedError extends SpeechSDKError {
|
|
35
|
+
constructor(model: string);
|
|
36
|
+
}
|
|
37
|
+
export declare class AudioOutputInputError extends SpeechSDKError {
|
|
38
|
+
constructor(message: string);
|
|
39
|
+
}
|
|
26
40
|
export declare class GatewayInputError extends SpeechSDKError {
|
|
27
41
|
constructor(message: string);
|
|
28
42
|
}
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,qBAAa,QAAS,SAAQ,cAAc;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEhC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,qBAAa,QAAS,SAAQ,cAAc;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEhC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CAUJ;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IAExD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAK/D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAetE;AAED,qBAAa,0BAA2B,SAAQ,cAAc;gBAChD,KAAK,EAAE,MAAM;CAM1B;AAED,qBAAa,gCAAiC,SAAQ,cAAc;gBACtD,KAAK,EAAE,MAAM;CAM1B;AAED,qBAAa,gCAAiC,SAAQ,cAAc;gBACtD,KAAK,EAAE,MAAM;CAM1B;AAED,qBAAa,qBAAsB,SAAQ,cAAc;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,cAAc;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAQ9D;AAED,qBAAa,wBAAyB,SAAQ,cAAc;gBAC9C,OAAO,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB;CASF"}
|
package/dist/errors.js
CHANGED
|
@@ -9,19 +9,43 @@ export class ApiError extends SpeechSDKError {
|
|
|
9
9
|
responseBody;
|
|
10
10
|
// RFC 7807 `code` extension; only Speech Gateway populates it today.
|
|
11
11
|
code;
|
|
12
|
+
// Set by generateConversation's stitch path; undefined for single-turn calls and single-API-call paths (gateway, native dialogue).
|
|
13
|
+
turnIndex;
|
|
14
|
+
retryAfterMs;
|
|
12
15
|
constructor(message, options) {
|
|
13
16
|
super(message, { cause: options.cause });
|
|
14
17
|
this.name = "ApiError";
|
|
15
18
|
this.statusCode = options.statusCode;
|
|
16
19
|
this.responseBody = options.responseBody;
|
|
17
20
|
this.code = options.code;
|
|
21
|
+
this.turnIndex = options.turnIndex;
|
|
22
|
+
this.retryAfterMs = options.retryAfterMs;
|
|
18
23
|
}
|
|
19
24
|
}
|
|
20
25
|
export class NoSpeechGeneratedError extends SpeechSDKError {
|
|
21
|
-
|
|
26
|
+
// Set by generateConversation's stitch path; undefined for single-turn calls.
|
|
27
|
+
turnIndex;
|
|
28
|
+
constructor(message, options) {
|
|
22
29
|
super(message ?? "No speech audio was generated.");
|
|
23
30
|
this.name = "NoSpeechGeneratedError";
|
|
31
|
+
this.turnIndex = options?.turnIndex;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function withTurnIndex(err, turnIndex) {
|
|
35
|
+
if (err instanceof ApiError) {
|
|
36
|
+
return new ApiError(err.message, {
|
|
37
|
+
statusCode: err.statusCode,
|
|
38
|
+
responseBody: err.responseBody,
|
|
39
|
+
code: err.code,
|
|
40
|
+
cause: err,
|
|
41
|
+
turnIndex,
|
|
42
|
+
retryAfterMs: err.retryAfterMs,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (err instanceof NoSpeechGeneratedError) {
|
|
46
|
+
return new NoSpeechGeneratedError(err.message, { turnIndex });
|
|
24
47
|
}
|
|
48
|
+
return err;
|
|
25
49
|
}
|
|
26
50
|
export class StreamingNotSupportedError extends SpeechSDKError {
|
|
27
51
|
constructor(model) {
|
|
@@ -35,6 +59,18 @@ export class VolumeAdjustmentUnsupportedError extends SpeechSDKError {
|
|
|
35
59
|
this.name = "VolumeAdjustmentUnsupportedError";
|
|
36
60
|
}
|
|
37
61
|
}
|
|
62
|
+
export class OutputConversionUnsupportedError extends SpeechSDKError {
|
|
63
|
+
constructor(model) {
|
|
64
|
+
super(`Explicit output format is not supported by ${model}: the provider doesn't expose a decodable PCM/WAV output mode.`);
|
|
65
|
+
this.name = "OutputConversionUnsupportedError";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class AudioOutputInputError extends SpeechSDKError {
|
|
69
|
+
constructor(message) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.name = "AudioOutputInputError";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
38
74
|
export class GatewayInputError extends SpeechSDKError {
|
|
39
75
|
constructor(message) {
|
|
40
76
|
super(message);
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,cAAc;IACjC,UAAU,CAAS;IACnB,YAAY,CAAW;IAChC,qEAAqE;IAC5D,IAAI,CAAU;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { GenerateConversationOptions } from "./conversation/types.js";
|
|
2
|
-
import { type Voice } from "./speech-provider.js";
|
|
2
|
+
import { type ResolvedModel, type Voice } from "./speech-provider.js";
|
|
3
3
|
import type { ConversationResult } from "./speech-result.js";
|
|
4
4
|
export { ConversationInputError, DialogueConstraintError, MixedDispatchError, StitchUnsupportedError, } from "./conversation/errors.js";
|
|
5
5
|
export type { ConversationTurn, GenerateConversationOptions, } from "./conversation/types.js";
|
|
6
|
-
export type { ConversationResult } from "./speech-result.js";
|
|
7
|
-
export declare function generateConversation<V extends Voice = Voice>(options: GenerateConversationOptions<V>): Promise<ConversationResult>;
|
|
6
|
+
export type { ConversationMetadata, ConversationResult, } from "./speech-result.js";
|
|
7
|
+
export declare function generateConversation<V extends Voice = Voice, M extends string | ResolvedModel<V> | undefined = string | ResolvedModel<V> | undefined>(options: GenerateConversationOptions<V, M>): Promise<ConversationResult>;
|
|
8
8
|
//# sourceMappingURL=generate-conversation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-conversation.d.ts","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-conversation.d.ts","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,yBAAyB,CAAC;AAkBjC,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,KAAK,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAM5B,wBAAsB,oBAAoB,CACxC,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,EACb,OAAO,EAAE,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+GzE"}
|