@speech-sdk/core 0.8.2-alpha → 0.8.3-alpha

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.
Files changed (97) hide show
  1. package/README.md +4 -2
  2. package/dist/audio-decode.d.ts +7 -0
  3. package/dist/audio-decode.d.ts.map +1 -0
  4. package/dist/audio-decode.js +109 -0
  5. package/dist/audio-decode.js.map +1 -0
  6. package/dist/audio-duration.d.ts.map +1 -1
  7. package/dist/audio-duration.js +3 -12
  8. package/dist/audio-duration.js.map +1 -1
  9. package/dist/audio-output.d.ts.map +1 -1
  10. package/dist/audio-output.js +31 -10
  11. package/dist/audio-output.js.map +1 -1
  12. package/dist/audio-utils.d.ts +2 -0
  13. package/dist/audio-utils.d.ts.map +1 -1
  14. package/dist/audio-utils.js +55 -1
  15. package/dist/audio-utils.js.map +1 -1
  16. package/dist/conversation/pcm-concat.d.ts +0 -1
  17. package/dist/conversation/pcm-concat.d.ts.map +1 -1
  18. package/dist/conversation/pcm-concat.js +6 -143
  19. package/dist/conversation/pcm-concat.js.map +1 -1
  20. package/dist/conversation/stitch.d.ts.map +1 -1
  21. package/dist/conversation/stitch.js +3 -2
  22. package/dist/conversation/stitch.js.map +1 -1
  23. package/dist/encoders/mp3.d.ts.map +1 -1
  24. package/dist/encoders/mp3.js +40 -22
  25. package/dist/encoders/mp3.js.map +1 -1
  26. package/dist/generate-conversation.js +2 -2
  27. package/dist/generate-conversation.js.map +1 -1
  28. package/dist/generate-speech.js +27 -11
  29. package/dist/generate-speech.js.map +1 -1
  30. package/dist/providers/cartesia/index.d.ts +22 -0
  31. package/dist/providers/cartesia/index.d.ts.map +1 -1
  32. package/dist/providers/cartesia/index.js +48 -0
  33. package/dist/providers/cartesia/index.js.map +1 -1
  34. package/dist/providers/deepgram/index.d.ts +16 -0
  35. package/dist/providers/deepgram/index.d.ts.map +1 -1
  36. package/dist/providers/deepgram/index.js +34 -0
  37. package/dist/providers/deepgram/index.js.map +1 -1
  38. package/dist/providers/elevenlabs/index.d.ts +7 -0
  39. package/dist/providers/elevenlabs/index.d.ts.map +1 -1
  40. package/dist/providers/elevenlabs/index.js +25 -0
  41. package/dist/providers/elevenlabs/index.js.map +1 -1
  42. package/dist/providers/fal/index.d.ts +5 -3
  43. package/dist/providers/fal/index.d.ts.map +1 -1
  44. package/dist/providers/fal/index.js +13 -7
  45. package/dist/providers/fal/index.js.map +1 -1
  46. package/dist/providers/fish-audio/index.d.ts +7 -0
  47. package/dist/providers/fish-audio/index.d.ts.map +1 -1
  48. package/dist/providers/fish-audio/index.js +24 -0
  49. package/dist/providers/fish-audio/index.js.map +1 -1
  50. package/dist/providers/google/index.d.ts +5 -0
  51. package/dist/providers/google/index.d.ts.map +1 -1
  52. package/dist/providers/google/index.js +19 -11
  53. package/dist/providers/google/index.js.map +1 -1
  54. package/dist/providers/hume/index.d.ts +9 -0
  55. package/dist/providers/hume/index.d.ts.map +1 -1
  56. package/dist/providers/hume/index.js +24 -0
  57. package/dist/providers/hume/index.js.map +1 -1
  58. package/dist/providers/inworld/index.d.ts +10 -0
  59. package/dist/providers/inworld/index.d.ts.map +1 -1
  60. package/dist/providers/inworld/index.js +32 -8
  61. package/dist/providers/inworld/index.js.map +1 -1
  62. package/dist/providers/mistral/index.d.ts +7 -0
  63. package/dist/providers/mistral/index.d.ts.map +1 -1
  64. package/dist/providers/mistral/index.js +24 -10
  65. package/dist/providers/mistral/index.js.map +1 -1
  66. package/dist/providers/murf/index.d.ts +8 -0
  67. package/dist/providers/murf/index.d.ts.map +1 -1
  68. package/dist/providers/murf/index.js +40 -1
  69. package/dist/providers/murf/index.js.map +1 -1
  70. package/dist/providers/openai/index.d.ts +7 -0
  71. package/dist/providers/openai/index.d.ts.map +1 -1
  72. package/dist/providers/openai/index.js +24 -0
  73. package/dist/providers/openai/index.js.map +1 -1
  74. package/dist/providers/resemble/index.d.ts +14 -0
  75. package/dist/providers/resemble/index.d.ts.map +1 -1
  76. package/dist/providers/resemble/index.js +35 -1
  77. package/dist/providers/resemble/index.js.map +1 -1
  78. package/dist/providers/smallest-ai/index.d.ts +47 -0
  79. package/dist/providers/smallest-ai/index.d.ts.map +1 -0
  80. package/dist/providers/smallest-ai/index.js +107 -0
  81. package/dist/providers/smallest-ai/index.js.map +1 -0
  82. package/dist/providers/xai/index.d.ts +18 -0
  83. package/dist/providers/xai/index.d.ts.map +1 -1
  84. package/dist/providers/xai/index.js +26 -0
  85. package/dist/providers/xai/index.js.map +1 -1
  86. package/dist/providers.d.ts +2 -0
  87. package/dist/providers.d.ts.map +1 -1
  88. package/dist/providers.js +1 -0
  89. package/dist/providers.js.map +1 -1
  90. package/dist/speech-provider.d.ts +15 -0
  91. package/dist/speech-provider.d.ts.map +1 -1
  92. package/dist/speech-provider.js.map +1 -1
  93. package/dist/volume-adjust.d.ts.map +1 -1
  94. package/dist/volume-adjust.js +4 -10
  95. package/dist/volume-adjust.js.map +1 -1
  96. package/package.json +4 -4
  97. package/NOTICE +0 -27
package/README.md CHANGED
@@ -274,10 +274,12 @@ result.audio.mediaType; // "audio/mpeg"
274
274
  ```
275
275
 
276
276
  Supported explicit formats are `wav`, `mp3`, and `pcm`.
277
- For direct providers, explicit output conversion requires a provider with a decodable PCM/WAV mode.
277
+
278
+ For direct providers, the SDK first asks each provider whether it can natively produce the requested format. If yes, the provider returns it directly and the SDK passes the bytes through unchanged. If the provider can return WAV/PCM but not the requested format (e.g. ElevenLabs has no native WAV output, Cartesia has no native MP3), the SDK requests a decodable format and converts via mediabunny. The SDK never decodes compressed audio (mp3/opus/aac) — providers must return wav/pcm for any local conversion to succeed.
279
+
278
280
  For gateway models, the SDK forwards `output` to the gateway API unchanged.
279
281
 
280
- MP3 encoding uses [`@breezystack/lamejs`](https://www.npmjs.com/package/@breezystack/lamejs) (LGPL-3.0-or-later), loaded dynamically only when MP3 output is requested. See [`NOTICE`](./NOTICE) for attribution and license details.
282
+ MP3 encoding uses [`@mediabunny/mp3-encoder`](https://mediabunny.dev/guide/extensions/mp3-encoder), loaded dynamically only when MP3 output is requested and the host environment does not already provide native MP3 encoding.
281
283
 
282
284
  ## Audio tags
283
285
 
@@ -0,0 +1,7 @@
1
+ export interface DecodedPcm16 {
2
+ readonly channels: 1;
3
+ readonly pcm: Int16Array;
4
+ readonly sampleRate: number;
5
+ }
6
+ export declare function decodeAudioToPcm16(bytes: Uint8Array, mediaType: string): Promise<DecodedPcm16>;
7
+ //# sourceMappingURL=audio-decode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-decode.d.ts","sourceRoot":"","sources":["../src/audio-decode.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAQvB"}
@@ -0,0 +1,109 @@
1
+ import { ALL_FORMATS, AudioSample, AudioSampleSink, BlobSource, Input, } from "mediabunny";
2
+ import { parseMediaTypeParam } from "./audio-utils.js";
3
+ export async function decodeAudioToPcm16(bytes, mediaType) {
4
+ const lower = mediaType.toLowerCase();
5
+ if (lower.startsWith("audio/pcm") || lower.startsWith("audio/x-pcm")) {
6
+ return decodeRawPcm(bytes, mediaType);
7
+ }
8
+ return await decodeContainerized(bytes, mediaType);
9
+ }
10
+ const ENCODING_PARAM_RE = /(?:^|;)\s*encoding=([a-z0-9_-]+)(?=$|;|\s)/i;
11
+ function decodeRawPcm(bytes, mediaType) {
12
+ const sampleRate = parseMediaTypeParam(mediaType, "rate") ?? 24_000;
13
+ const channels = parseMediaTypeParam(mediaType, "channels") ?? 1;
14
+ const encoding = mediaType.toLowerCase().match(ENCODING_PARAM_RE)?.[1];
15
+ const format = encoding === "float32" ? "f32" : "s16";
16
+ const bytesPerSample = format === "f32" ? 4 : 2;
17
+ const numberOfFrames = Math.floor(bytes.byteLength / bytesPerSample / channels);
18
+ if (numberOfFrames === 0) {
19
+ return { pcm: new Int16Array(0), sampleRate, channels: 1 };
20
+ }
21
+ const data = format === "f32"
22
+ ? new Float32Array(copyAligned(bytes, 4).buffer, 0, numberOfFrames * channels)
23
+ : new Int16Array(copyAligned(bytes, 2).buffer, 0, numberOfFrames * channels);
24
+ const sample = new AudioSample({
25
+ data,
26
+ format,
27
+ numberOfChannels: channels,
28
+ sampleRate,
29
+ timestamp: 0,
30
+ });
31
+ const monoFrames = sample.numberOfFrames;
32
+ const out = new Int16Array(monoFrames);
33
+ if (channels === 1) {
34
+ sample.copyTo(out, { format: "s16", planeIndex: 0 });
35
+ return { pcm: out, sampleRate, channels: 1 };
36
+ }
37
+ const interleaved = new Int16Array(monoFrames * channels);
38
+ sample.copyTo(interleaved, { format: "s16", planeIndex: 0 });
39
+ for (let f = 0; f < monoFrames; f++) {
40
+ let sum = 0;
41
+ for (let c = 0; c < channels; c++) {
42
+ sum += interleaved[f * channels + c];
43
+ }
44
+ out[f] = Math.round(sum / channels);
45
+ }
46
+ return { pcm: out, sampleRate, channels: 1 };
47
+ }
48
+ async function decodeContainerized(bytes, mediaType) {
49
+ // .slice() copies into a fresh ArrayBuffer (Blob accepts ArrayBuffer-backed views, not SharedArrayBuffer).
50
+ const blob = new Blob([bytes.slice()], { type: mediaType });
51
+ const input = new Input({
52
+ source: new BlobSource(blob),
53
+ formats: ALL_FORMATS,
54
+ });
55
+ const track = await input.getPrimaryAudioTrack();
56
+ if (!track) {
57
+ throw new Error(`audio-decode: no audio track found in input (mediaType="${mediaType}")`);
58
+ }
59
+ const sampleRate = track.sampleRate;
60
+ const sourceChannels = track.numberOfChannels;
61
+ const sink = new AudioSampleSink(track);
62
+ const chunks = [];
63
+ let totalMonoFrames = 0;
64
+ for await (const sample of sink.samples()) {
65
+ const frames = sample.numberOfFrames;
66
+ if (frames === 0) {
67
+ sample.close();
68
+ continue;
69
+ }
70
+ if (sourceChannels === 1) {
71
+ const buf = new Int16Array(frames);
72
+ sample.copyTo(buf, { format: "s16", planeIndex: 0 });
73
+ chunks.push(buf);
74
+ totalMonoFrames += frames;
75
+ }
76
+ else {
77
+ const interleaved = new Int16Array(frames * sourceChannels);
78
+ sample.copyTo(interleaved, { format: "s16", planeIndex: 0 });
79
+ const mono = new Int16Array(frames);
80
+ for (let f = 0; f < frames; f++) {
81
+ let sum = 0;
82
+ for (let c = 0; c < sourceChannels; c++) {
83
+ sum += interleaved[f * sourceChannels + c];
84
+ }
85
+ mono[f] = Math.round(sum / sourceChannels);
86
+ }
87
+ chunks.push(mono);
88
+ totalMonoFrames += frames;
89
+ }
90
+ sample.close();
91
+ }
92
+ const pcm = new Int16Array(totalMonoFrames);
93
+ let offset = 0;
94
+ for (const chunk of chunks) {
95
+ pcm.set(chunk, offset);
96
+ offset += chunk.length;
97
+ }
98
+ return { pcm, sampleRate, channels: 1 };
99
+ }
100
+ function copyAligned(bytes, alignment) {
101
+ if (bytes.byteOffset % alignment === 0 &&
102
+ bytes.byteLength % alignment === 0) {
103
+ return bytes;
104
+ }
105
+ const aligned = new Uint8Array(bytes.byteLength - (bytes.byteLength % alignment));
106
+ aligned.set(bytes.subarray(0, aligned.length));
107
+ return aligned;
108
+ }
109
+ //# sourceMappingURL=audio-decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-decode.js","sourceRoot":"","sources":["../src/audio-decode.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"audio-duration.d.ts","sourceRoot":"","sources":["../src/audio-duration.ts"],"names":[],"mappings":"AAEA,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,GAAG,MAAM,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B"}
1
+ {"version":3,"file":"audio-duration.d.ts","sourceRoot":"","sources":["../src/audio-duration.ts"],"names":[],"mappings":"AAGA,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,GAAG,MAAM,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkB7B"}
@@ -1,11 +1,10 @@
1
1
  import { ALL_FORMATS, BlobSource, Input } from "mediabunny";
2
+ import { base64ToUint8Array } from "./audio-utils.js";
2
3
  export async function computeAudioDuration(data, mediaType) {
3
4
  try {
4
5
  const bytes = data instanceof Uint8Array ? data : base64ToUint8Array(data);
5
- // Copy to a fresh ArrayBuffer bytes may be a subarray of a larger buffer.
6
- const ab = new ArrayBuffer(bytes.byteLength);
7
- new Uint8Array(ab).set(bytes);
8
- const blob = new Blob([ab], { type: mediaType });
6
+ // .slice() copies into a fresh ArrayBuffer (Blob accepts ArrayBuffer-backed views, not SharedArrayBuffer).
7
+ const blob = new Blob([bytes.slice()], { type: mediaType });
9
8
  const input = new Input({
10
9
  source: new BlobSource(blob),
11
10
  formats: ALL_FORMATS,
@@ -21,12 +20,4 @@ export async function computeAudioDuration(data, mediaType) {
21
20
  return;
22
21
  }
23
22
  }
24
- function base64ToUint8Array(b64) {
25
- const binaryString = atob(b64);
26
- const bytes = new Uint8Array(binaryString.length);
27
- for (let i = 0; i < binaryString.length; i++) {
28
- bytes[i] = binaryString.charCodeAt(i);
29
- }
30
- return bytes;
31
- }
32
23
  //# sourceMappingURL=audio-duration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-duration.js","sourceRoot":"","sources":["../src/audio-duration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAyB,EACzB,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3E,4EAA4E;QAC5E,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"audio-duration.js","sourceRoot":"","sources":["../src/audio-duration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAyB,EACzB,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3E,2GAA2G;QAC3G,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC;YAC5B,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"audio-output.d.ts","sourceRoot":"","sources":["../src/audio-output.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAEtD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAgB,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,SAAS,EAC9D,MAAM,EAAE,CAAC,GACR,CAAC,CAOH;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,WAAW,GAClB,mBAAmB,CASrB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAQtE;AA6BD,wBAAsB,6BAA6B,CAAC,IAAI,EAAE;IACxD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCtE;AAED,wBAAsB,6BAA6B,CAAC,IAAI,EAAE;IACxD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;CAC1C,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAStE"}
1
+ {"version":3,"file":"audio-output.d.ts","sourceRoot":"","sources":["../src/audio-output.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAEtD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAgB,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,SAAS,EAC9D,MAAM,EAAE,CAAC,GACR,CAAC,CAOH;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,WAAW,GAClB,mBAAmB,CASrB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAQtE;AAuCD,wBAAsB,6BAA6B,CAAC,IAAI,EAAE;IACxD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAkDtE;AAED,wBAAsB,6BAA6B,CAAC,IAAI,EAAE;IACxD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;CAC1C,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAStE"}
@@ -1,7 +1,8 @@
1
- import { wrapPcm16Mono } from "./audio-utils.js";
2
- import { decodeToPcm16 } from "./conversation/pcm-concat.js";
1
+ import { decodeAudioToPcm16 } from "./audio-decode.js";
2
+ import { parseMediaTypeParam, wrapPcm16Mono } from "./audio-utils.js";
3
3
  import { encodePcm16ToMp3 } from "./encoders/mp3.js";
4
4
  import { AudioOutputInputError } from "./errors.js";
5
+ const DEFAULT_PCM_RATE = 24_000;
5
6
  export const DEFAULT_MP3_BITRATE_KBPS = 96;
6
7
  export function validateOutput(output) {
7
8
  if (output?.format !== "mp3" && output != null && "bitrate" in output) {
@@ -39,8 +40,16 @@ function isWavSource(mediaType) {
39
40
  const lower = mediaType.toLowerCase();
40
41
  return lower.startsWith("audio/wav") || lower.startsWith("audio/x-wav");
41
42
  }
42
- function decodeToPcmBytes(audio, mediaType) {
43
- const segment = decodeToPcm16(audio, mediaType);
43
+ function isMp3Source(mediaType) {
44
+ const lower = mediaType.toLowerCase();
45
+ return lower.startsWith("audio/mpeg") || lower.startsWith("audio/mp3");
46
+ }
47
+ function isPcmSource(mediaType) {
48
+ const lower = mediaType.toLowerCase();
49
+ return lower.startsWith("audio/pcm") || lower.startsWith("audio/x-pcm");
50
+ }
51
+ async function decodeToPcmBytes(audio, mediaType) {
52
+ const segment = await decodeAudioToPcm16(audio, mediaType);
44
53
  return {
45
54
  pcmBytes: new Uint8Array(segment.pcm.buffer, segment.pcm.byteOffset, segment.pcm.byteLength),
46
55
  sampleRate: segment.sampleRate,
@@ -48,19 +57,31 @@ function decodeToPcmBytes(audio, mediaType) {
48
57
  }
49
58
  export async function convertDecodableAudioToOutput(args) {
50
59
  const { audio, mediaType, output } = args;
60
+ if (output.format === "wav" && isWavSource(mediaType)) {
61
+ return { audio, mediaType: "audio/wav" };
62
+ }
63
+ if (output.format === "mp3" && isMp3Source(mediaType)) {
64
+ return { audio, mediaType: "audio/mpeg" };
65
+ }
66
+ if (output.format === "pcm" && isPcmSource(mediaType)) {
67
+ // Some providers (e.g. OpenAI) return bare "audio/pcm" without rate;
68
+ // normalize to mediaTypeForOutput so callers always know the rate.
69
+ const sampleRate = parseMediaTypeParam(mediaType, "rate") ?? DEFAULT_PCM_RATE;
70
+ return {
71
+ audio,
72
+ mediaType: mediaTypeForOutput({ format: "pcm", sampleRate }),
73
+ };
74
+ }
51
75
  if (!isDecodableSourceMediaType(mediaType)) {
52
76
  throw new AudioOutputInputError(`convertDecodableAudioToOutput: source mediaType "${mediaType}" is not decodable. Only audio/wav, audio/x-wav, audio/pcm, and audio/x-pcm are supported.`);
53
77
  }
54
78
  if (output.format === "wav") {
55
- if (isWavSource(mediaType)) {
56
- return { audio, mediaType: "audio/wav" };
57
- }
58
- const { pcmBytes, sampleRate } = decodeToPcmBytes(audio, mediaType);
79
+ const { pcmBytes, sampleRate } = await decodeToPcmBytes(audio, mediaType);
59
80
  const wav = await wrapPcm16Mono(pcmBytes, sampleRate);
60
81
  return { audio: wav, mediaType: "audio/wav" };
61
82
  }
62
83
  if (output.format === "pcm") {
63
- const { pcmBytes, sampleRate } = decodeToPcmBytes(audio, mediaType);
84
+ const { pcmBytes, sampleRate } = await decodeToPcmBytes(audio, mediaType);
64
85
  return {
65
86
  audio: pcmBytes,
66
87
  mediaType: mediaTypeForOutput({
@@ -69,7 +90,7 @@ export async function convertDecodableAudioToOutput(args) {
69
90
  }),
70
91
  };
71
92
  }
72
- const { pcmBytes, sampleRate } = decodeToPcmBytes(audio, mediaType);
93
+ const { pcmBytes, sampleRate } = await decodeToPcmBytes(audio, mediaType);
73
94
  const mp3 = await encodePcm16ToMp3({
74
95
  pcm: pcmBytes,
75
96
  sampleRate,
@@ -1 +1 @@
1
- {"version":3,"file":"audio-output.js","sourceRoot":"","sources":["../src/audio-output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio-output.js","sourceRoot":"","sources":["../src/audio-output.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export declare function parseMediaTypeParam(mediaType: string, name: string): number | undefined;
2
2
  export declare function wrapPcm16Mono(pcm: Uint8Array, sampleRate: number): Promise<Uint8Array>;
3
+ export declare function resamplePcm16(pcm: Int16Array, fromRate: number, toRate: number): Promise<Int16Array>;
4
+ export declare function uint8ArrayToBase64(bytes: Uint8Array): string;
3
5
  export declare function base64ToUint8Array(b64: string): Uint8Array;
4
6
  //# sourceMappingURL=audio-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-utils.d.ts","sourceRoot":"","sources":["../src/audio-utils.ts"],"names":[],"mappings":"AAUA,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAapB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAO1D"}
1
+ {"version":3,"file":"audio-utils.d.ts","sourceRoot":"","sources":["../src/audio-utils.ts"],"names":[],"mappings":"AAcA,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAapB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAS5D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAO1D"}
@@ -1,4 +1,4 @@
1
- import { BufferTarget, EncodedAudioPacketSource, EncodedPacket, Output, WavOutputFormat, } from "mediabunny";
1
+ import { ALL_FORMATS, BlobSource, BufferTarget, Conversion, EncodedAudioPacketSource, EncodedPacket, Input, Output, WavOutputFormat, } from "mediabunny";
2
2
  const PARAM_REGEX_CACHE = new Map();
3
3
  export function parseMediaTypeParam(mediaType, name) {
4
4
  let re = PARAM_REGEX_CACHE.get(name);
@@ -39,6 +39,60 @@ export async function wrapPcm16Mono(pcm, sampleRate) {
39
39
  }
40
40
  return new Uint8Array(buffer);
41
41
  }
42
+ export async function resamplePcm16(pcm, fromRate, toRate) {
43
+ if (fromRate === toRate || pcm.length === 0) {
44
+ return pcm;
45
+ }
46
+ const sourceWav = await wrapPcm16Mono(new Uint8Array(pcm.buffer, pcm.byteOffset, pcm.byteLength), fromRate);
47
+ const blob = new Blob([sourceWav.slice()], { type: "audio/wav" });
48
+ const input = new Input({
49
+ source: new BlobSource(blob),
50
+ formats: ALL_FORMATS,
51
+ });
52
+ // Output is required by Conversion.init; we drop samples in `process` so
53
+ // no encode happens — the buffer stays empty and we never read it.
54
+ const output = new Output({
55
+ format: new WavOutputFormat(),
56
+ target: new BufferTarget(),
57
+ });
58
+ const captured = [];
59
+ let totalFrames = 0;
60
+ const conversion = await Conversion.init({
61
+ input,
62
+ output,
63
+ audio: {
64
+ sampleRate: toRate,
65
+ numberOfChannels: 1,
66
+ // WaveMuxer asserts on empty output, so samples pass through to the encoder;
67
+ // we capture s16 here to skip decoding the output WAV.
68
+ process: (sample) => {
69
+ const buf = new Int16Array(sample.numberOfFrames);
70
+ sample.copyTo(buf, { format: "s16", planeIndex: 0 });
71
+ captured.push(buf);
72
+ totalFrames += buf.length;
73
+ return sample;
74
+ },
75
+ },
76
+ showWarnings: false,
77
+ });
78
+ await conversion.execute();
79
+ const out = new Int16Array(totalFrames);
80
+ let offset = 0;
81
+ for (const chunk of captured) {
82
+ out.set(chunk, offset);
83
+ offset += chunk.length;
84
+ }
85
+ return out;
86
+ }
87
+ // Chunked to avoid call-stack overflow on large payloads (~32k arg limit).
88
+ const BASE64_CHUNK = 0x80_00;
89
+ export function uint8ArrayToBase64(bytes) {
90
+ let s = "";
91
+ for (let i = 0; i < bytes.length; i += BASE64_CHUNK) {
92
+ s += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + BASE64_CHUNK)));
93
+ }
94
+ return btoa(s);
95
+ }
42
96
  export function base64ToUint8Array(b64) {
43
97
  const binary = atob(b64);
44
98
  const bytes = new Uint8Array(binary.length);
@@ -1 +1 @@
1
- {"version":3,"file":"audio-utils.js","sourceRoot":"","sources":["../src/audio-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,MAAM,EACN,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,IAAY;IAEZ,IAAI,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,kDAAkD;QAClD,EAAE,GAAG,IAAI,MAAM,CAAC,cAAc,IAAI,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAC7D,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAe,EACf,UAAkB;IAElB,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,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE;QACvB,aAAa,EAAE;YACb,KAAK,EAAE,SAAS;YAChB,gBAAgB,EAAE,CAAC;YACnB,UAAU;SACX;KACF,CAAC,CAAC;IAEH,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,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"audio-utils.js","sourceRoot":"","sources":["../src/audio-utils.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,6 @@ export interface Pcm16Segment {
3
3
  readonly pcm: Int16Array;
4
4
  readonly sampleRate: number;
5
5
  }
6
- export declare function decodeToPcm16(data: Uint8Array, mediaType: string): Pcm16Segment;
7
6
  export declare const DEFAULT_VOLUME_DBFS = -20;
8
7
  export declare function dbfsToInt16Rms(dbfs: number): number;
9
8
  export declare function normalizeRms(segments: readonly Pcm16Segment[], targetRmsAmplitude?: number): Pcm16Segment[];
@@ -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;AA8DD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,GAChB,YAAY,CAkCd;AA+GD,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,CAQhB;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,CA8BrB"}
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;AAwCD,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,CAQhB;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,CA8BrB"}
@@ -1,143 +1,6 @@
1
- import { parseMediaTypeParam, wrapPcm16Mono } from "../audio-utils.js";
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
- for (let i = 0; i < segments.length; i++) {
192
- const s = segments[i];
193
- resampled.push(resamplePcm16LinearMono(s.pcm, s.sampleRate, targetSampleRate));
194
- if (i < segments.length - 1 && gap.length > 0) {
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":"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"}
1
+ {"version":3,"file":"pcm-concat.js","sourceRoot":"","sources":["../../src/conversation/pcm-concat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stitch.d.ts","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEjB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,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,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,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,CA6IvB"}
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,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,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,CA6IvB"}
@@ -1,8 +1,9 @@
1
+ import { decodeAudioToPcm16 } from "../audio-decode.js";
1
2
  import { applyOptionalOutputConversion, } from "../audio-output.js";
2
3
  import { withTurnIndex } from "../errors.js";
3
4
  import { generateSpeech } from "../generate-speech.js";
4
5
  import { debug } from "../logger.js";
5
- import { concatPcmToWav, dbfsToInt16Rms, decodeToPcm16, normalizeRms, } from "./pcm-concat.js";
6
+ import { concatPcmToWav, dbfsToInt16Rms, normalizeRms } from "./pcm-concat.js";
6
7
  import { fillTurnTimestampsProportional } from "./proportional-fill.js";
7
8
  const TARGET_SAMPLE_RATE = 24_000;
8
9
  const WHITESPACE_RE = /\s+/;
@@ -49,7 +50,7 @@ export async function runStitch(input) {
49
50
  throw withTurnIndex(err, i);
50
51
  }
51
52
  // Hume and others omit sample rate from content-type; prefer getStitchOptions.
52
- const segment = decodeToPcm16(result.audio.uint8Array, stitchOpts.mediaType);
53
+ const segment = await decodeAudioToPcm16(result.audio.uint8Array, stitchOpts.mediaType);
53
54
  return { result, segment };
54
55
  });
55
56
  const segments = perTurn.map((p) => p.segment);