@speech-sdk/core 0.7.0 → 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 +227 -108
- package/dist/__tests__/e2e/_save-audio.d.ts +0 -42
- package/dist/__tests__/e2e/_save-audio.d.ts.map +1 -1
- package/dist/__tests__/e2e/_save-audio.js +0 -59
- package/dist/__tests__/e2e/_save-audio.js.map +1 -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 +0 -5
- package/dist/audio-duration.d.ts.map +1 -1
- package/dist/audio-duration.js +5 -21
- 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 -10
- package/dist/audio-utils.d.ts.map +1 -1
- package/dist/audio-utils.js +57 -15
- package/dist/audio-utils.js.map +1 -1
- package/dist/captions.d.ts +0 -108
- package/dist/captions.d.ts.map +1 -1
- package/dist/captions.js +8 -98
- package/dist/captions.js.map +1 -1
- package/dist/conversation/attribute-timestamps.d.ts +26 -0
- package/dist/conversation/attribute-timestamps.d.ts.map +1 -0
- package/dist/conversation/attribute-timestamps.js +276 -0
- package/dist/conversation/attribute-timestamps.js.map +1 -0
- package/dist/conversation/dispatch.d.ts +5 -5
- package/dist/conversation/dispatch.d.ts.map +1 -1
- package/dist/conversation/dispatch.js +18 -8
- package/dist/conversation/dispatch.js.map +1 -1
- package/dist/conversation/errors.d.ts +3 -0
- package/dist/conversation/errors.d.ts.map +1 -1
- package/dist/conversation/errors.js +6 -0
- package/dist/conversation/errors.js.map +1 -1
- package/dist/conversation/pcm-concat.d.ts +0 -24
- package/dist/conversation/pcm-concat.d.ts.map +1 -1
- package/dist/conversation/pcm-concat.js +8 -183
- package/dist/conversation/pcm-concat.js.map +1 -1
- package/dist/conversation/proportional-fill.d.ts +10 -0
- package/dist/conversation/proportional-fill.d.ts.map +1 -0
- package/dist/conversation/proportional-fill.js +64 -0
- package/dist/conversation/proportional-fill.js.map +1 -0
- package/dist/conversation/silence-detection.d.ts +14 -0
- package/dist/conversation/silence-detection.d.ts.map +1 -0
- package/dist/conversation/silence-detection.js +52 -0
- package/dist/conversation/silence-detection.js.map +1 -0
- package/dist/conversation/stitch.d.ts +9 -6
- package/dist/conversation/stitch.d.ts.map +1 -1
- package/dist/conversation/stitch.js +72 -51
- package/dist/conversation/stitch.js.map +1 -1
- package/dist/conversation/types.d.ts +7 -37
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/conversation/validate.d.ts +1 -16
- package/dist/conversation/validate.d.ts.map +1 -1
- package/dist/conversation/validate.js +29 -29
- package/dist/conversation/validate.js.map +1 -1
- package/dist/default-stt-fallback.d.ts +3 -0
- package/dist/default-stt-fallback.d.ts.map +1 -0
- package/dist/default-stt-fallback.js +11 -0
- package/dist/default-stt-fallback.js.map +1 -0
- package/dist/derive-timestamps.d.ts +1 -5
- package/dist/derive-timestamps.d.ts.map +1 -1
- package/dist/derive-timestamps.js +1 -15
- package/dist/derive-timestamps.js.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 +20 -13
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +49 -15
- package/dist/errors.js.map +1 -1
- package/dist/generate-conversation.d.ts +5 -4
- package/dist/generate-conversation.d.ts.map +1 -1
- package/dist/generate-conversation.js +250 -93
- package/dist/generate-conversation.js.map +1 -1
- package/dist/generate-speech.d.ts +7 -28
- package/dist/generate-speech.d.ts.map +1 -1
- package/dist/generate-speech.js +185 -94
- package/dist/generate-speech.js.map +1 -1
- package/dist/index.d.ts +7 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +2 -13
- package/dist/logger.js.map +1 -1
- package/dist/metadata.d.ts +0 -22
- package/dist/metadata.d.ts.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 +4 -9
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +60 -51
- package/dist/provider-utils.js.map +1 -1
- package/dist/providers/cartesia/alignment.d.ts +0 -16
- package/dist/providers/cartesia/alignment.d.ts.map +1 -1
- package/dist/providers/cartesia/alignment.js +1 -6
- package/dist/providers/cartesia/alignment.js.map +1 -1
- package/dist/providers/cartesia/index.d.ts +29 -19
- package/dist/providers/cartesia/index.d.ts.map +1 -1
- package/dist/providers/cartesia/index.js +116 -80
- package/dist/providers/cartesia/index.js.map +1 -1
- package/dist/providers/deepgram/index.d.ts +23 -8
- package/dist/providers/deepgram/index.d.ts.map +1 -1
- package/dist/providers/deepgram/index.js +51 -18
- package/dist/providers/deepgram/index.js.map +1 -1
- package/dist/providers/elevenlabs/alignment.d.ts +7 -21
- package/dist/providers/elevenlabs/alignment.d.ts.map +1 -1
- package/dist/providers/elevenlabs/alignment.js +8 -9
- package/dist/providers/elevenlabs/alignment.js.map +1 -1
- package/dist/providers/elevenlabs/index.d.ts +14 -38
- package/dist/providers/elevenlabs/index.d.ts.map +1 -1
- package/dist/providers/elevenlabs/index.js +186 -169
- package/dist/providers/elevenlabs/index.js.map +1 -1
- package/dist/providers/fal/index.d.ts +11 -20
- package/dist/providers/fal/index.d.ts.map +1 -1
- package/dist/providers/fal/index.js +49 -37
- package/dist/providers/fal/index.js.map +1 -1
- package/dist/providers/fish-audio/index.d.ts +14 -8
- package/dist/providers/fish-audio/index.d.ts.map +1 -1
- package/dist/providers/fish-audio/index.js +47 -19
- package/dist/providers/fish-audio/index.js.map +1 -1
- package/dist/providers/gateway/index.d.ts +76 -0
- package/dist/providers/gateway/index.d.ts.map +1 -0
- package/dist/providers/gateway/index.js +251 -0
- package/dist/providers/gateway/index.js.map +1 -0
- package/dist/providers/google/index.d.ts +12 -20
- package/dist/providers/google/index.d.ts.map +1 -1
- package/dist/providers/google/index.js +180 -162
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/hume/alignment.d.ts +30 -35
- package/dist/providers/hume/alignment.d.ts.map +1 -1
- package/dist/providers/hume/alignment.js +14 -8
- package/dist/providers/hume/alignment.js.map +1 -1
- package/dist/providers/hume/index.d.ts +16 -16
- package/dist/providers/hume/index.d.ts.map +1 -1
- package/dist/providers/hume/index.js +79 -65
- package/dist/providers/hume/index.js.map +1 -1
- package/dist/providers/inworld/alignment.d.ts +8 -22
- package/dist/providers/inworld/alignment.d.ts.map +1 -1
- package/dist/providers/inworld/alignment.js +9 -8
- package/dist/providers/inworld/alignment.js.map +1 -1
- package/dist/providers/inworld/index.d.ts +17 -20
- package/dist/providers/inworld/index.d.ts.map +1 -1
- package/dist/providers/inworld/index.js +79 -47
- package/dist/providers/inworld/index.js.map +1 -1
- package/dist/providers/mistral/index.d.ts +14 -8
- package/dist/providers/mistral/index.d.ts.map +1 -1
- package/dist/providers/mistral/index.js +63 -48
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/murf/alignment.d.ts +10 -19
- package/dist/providers/murf/alignment.d.ts.map +1 -1
- package/dist/providers/murf/alignment.js +10 -5
- package/dist/providers/murf/alignment.js.map +1 -1
- package/dist/providers/murf/index.d.ts +15 -16
- package/dist/providers/murf/index.d.ts.map +1 -1
- package/dist/providers/murf/index.js +105 -58
- package/dist/providers/murf/index.js.map +1 -1
- package/dist/providers/openai/index.d.ts +43 -29
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +294 -106
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/resemble/alignment.d.ts +8 -29
- package/dist/providers/resemble/alignment.d.ts.map +1 -1
- package/dist/providers/resemble/alignment.js +9 -12
- package/dist/providers/resemble/alignment.js.map +1 -1
- package/dist/providers/resemble/index.d.ts +21 -11
- package/dist/providers/resemble/index.d.ts.map +1 -1
- package/dist/providers/resemble/index.js +89 -49
- 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 +25 -9
- package/dist/providers/xai/index.d.ts.map +1 -1
- package/dist/providers/xai/index.js +63 -40
- package/dist/providers/xai/index.js.map +1 -1
- package/dist/providers.d.ts +31 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +16 -0
- package/dist/providers.js.map +1 -0
- package/dist/resolve-provider.d.ts.map +1 -1
- package/dist/resolve-provider.js +8 -51
- package/dist/resolve-provider.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 +28 -53
- package/dist/speech-provider.d.ts.map +1 -1
- package/dist/speech-provider.js +5 -26
- package/dist/speech-provider.js.map +1 -1
- package/dist/speech-result.d.ts +8 -9
- package/dist/speech-result.d.ts.map +1 -1
- package/dist/speech-result.js.map +1 -1
- package/dist/speech-to-text-provider.d.ts +0 -12
- package/dist/speech-to-text-provider.d.ts.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 -22
- package/dist/stream-speech.js.map +1 -1
- package/dist/timestamps.d.ts +3 -17
- package/dist/timestamps.d.ts.map +1 -1
- package/dist/turns.d.ts +9 -0
- package/dist/turns.d.ts.map +1 -0
- package/dist/turns.js +21 -0
- package/dist/turns.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/volume-adjust.d.ts +0 -6
- package/dist/volume-adjust.d.ts.map +1 -1
- package/dist/volume-adjust.js +4 -16
- package/dist/volume-adjust.js.map +1 -1
- package/package.json +13 -66
- package/dist/stt-providers/openai/index.d.ts +0 -42
- package/dist/stt-providers/openai/index.d.ts.map +0 -1
- package/dist/stt-providers/openai/index.js +0 -184
- package/dist/stt-providers/openai/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-timestamps.js","sourceRoot":"","sources":["../../src/conversation/attribute-timestamps.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAC/C,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAChD,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC;SACL,WAAW,EAAE;SACb,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI;SACR,KAAK,CAAC,mBAAmB,CAAC;SAC1B,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAS,EAAE,CAAS;IAC9C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IACpB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,oBAAoB;IACpB,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBACd,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,6BAA6B;IAC7B,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC;YACf,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,mKAAmK;AACnK,MAAM,UAAU,cAAc,CAAC,IAG9B;IACC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SACzE,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEnE,wDAAwD;IACxD,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CACxC,CAAC;IACF,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,GAAG,GAAgC,EAAE,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,eAAe,EAAE,CAAC;QAClB,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACpE,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,yCAAyC;YACzC,SAAS;QACX,CAAC;QAED,sDAAsD;QACtD,OACE,SAAS,GAAG,UAAU,CAAC,MAAM;YAC7B,UAAU,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,EAClD,CAAC;YACD,SAAS,EAAE,CAAC;YACZ,UAAU,GAAG,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACnC,yDAAyD;YACzD,cAAc,GAAG,IAAI,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,SAAS,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC;aACjC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAE3D,IAAI,QAAQ,KAAK,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,SAAS;aACV,CAAC,CAAC;YACH,UAAU,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,kFAAkF;QAClF,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC7D,IACE,YAAY;YACZ,CAAC,QAAQ,KAAK,YAAY,IAAI,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EACzE,CAAC;YACD,4EAA4E;YAC5E,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,SAAS;aACV,CAAC,CAAC;YACH,UAAU,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,qGAAqG;QACrG,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QACd,IACE,YAAY;YACZ,CAAC,YAAY,KAAK,QAAQ,IAAI,kBAAkB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,EACzE,CAAC;YACD,8EAA8E;YAC9E,WAAW,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,SAAS;aACV,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,mDAAmD;QACnD,WAAW,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,GAAG,EAAE,EAAE,CAAC,GAAG;YACX,SAAS;SACV,CAAC,CAAC;QACH,UAAU,EAAE,CAAC;IACf,CAAC;IAED,0CAA0C;IAC1C,MAAM,gBAAgB,GACpB,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,UAAU,CAAC;IACb,IACE,aAAa,GAAG,CAAC;QACjB,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,EACnD,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,OAAO;QACL,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,eAAe;QAC3B,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,2BAA2B,GAC/B,2FAA2F,CAAC;AAC9F,MAAM,6BAA6B,GACjC,oHAAoH,CAAC;AACvH,MAAM,8BAA8B,GAClC,0FAA0F,CAAC;AAC7F,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,wKAAwK;AACxK,MAAM,UAAU,oBAAoB,CAAC,IAIpC;IACC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;IACnC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACrD,OAAO,WAAW,GAAG,iBAAiB,IAAI,WAAW,GAAG,cAAc,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,IAAI,aAAa,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,GAAG,aAAa,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;SAC3C,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC;SACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAEzC,oDAAoD;IACpD,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CACxC,CAAC;IAEF,oEAAoE;IACpE,MAAM,UAAU,GAAsB,KAAK,CAAC,IAAI,CAC9C,EAAE,MAAM,EAAE,SAAS,EAAE,EACrB,GAAG,EAAE,CAAC,EAAE,CACT,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OACE,SAAS,GAAG,aAAa,CAAC,MAAM;YAChC,QAAQ,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,EAClE,CAAC;YACD,SAAS,EAAE,CAAC;QACd,CAAC;QACD,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,gCAAgC;IAChC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;QACtD,IAAI,KAAK,GAAG,qBAAqB,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;YACnE,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAgC,EAAE,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAAC,IAInC;IACC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,CAAC,8BAA8B,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,KAAK,GAAG,oBAAoB,CAAC;QACjC,UAAU,EAAE,QAAQ;QACpB,IAAI,EAAE,WAAW;QACjB,SAAS;KACV,CAAC,CAAC;IACH,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,+BAA+B;IAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE;gBACR,GAAG,2BAA2B,KAAK,KAAK,CAAC,UAAU,mCAAmC;aACvF;SACF,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,qBAAqB,GAAG,SAAS,CAAC,GAAG,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CACvE,CAAC;IACF,MAAM,KAAK,GAAG,0BAA0B,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAC1E,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,CAAC,6BAA6B,CAAC;KAC1C,CAAC;AACJ,CAAC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ResolvedModel, type StitchTurnOptions, type Voice } from "../speech-provider.js";
|
|
2
2
|
import type { ConversationTurn } from "./types.js";
|
|
3
3
|
export type ConversationPath = {
|
|
4
|
+
kind: "gateway";
|
|
5
|
+
resolvedPerTurn: readonly ResolvedModel<Voice>[];
|
|
6
|
+
} | {
|
|
4
7
|
kind: "native";
|
|
5
8
|
resolved: ResolvedModel<Voice>;
|
|
6
9
|
} | {
|
|
7
10
|
kind: "stitch";
|
|
8
|
-
stitchOptionsPerTurn: readonly
|
|
9
|
-
providerOptions: Record<string, unknown>;
|
|
10
|
-
mediaType: string;
|
|
11
|
-
}[];
|
|
11
|
+
stitchOptionsPerTurn: readonly StitchTurnOptions[];
|
|
12
12
|
};
|
|
13
13
|
export declare function chooseConversationPath(input: {
|
|
14
14
|
resolvedPerTurn: readonly ResolvedModel<Voice>[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/conversation/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/conversation/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,KAAK,EACX,MAAM,uBAAuB,CAAC;AAM/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,eAAe,EAAE,SAAS,aAAa,CAAC,KAAK,CAAC,EAAE,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,oBAAoB,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,CAAC;AAE3E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,eAAe,EAAE,SAAS,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;IACjD,KAAK,EAAE,SAAS,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;CAC3C,GAAG,gBAAgB,CA6CnB"}
|
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { isSpeechGatewayModel, } from "../speech-provider.js";
|
|
2
|
+
import { DialogueConstraintError, MixedDispatchError, StitchUnsupportedError, } from "./errors.js";
|
|
3
|
+
import { newVoiceKeyer } from "./validate.js";
|
|
3
4
|
export function chooseConversationPath(input) {
|
|
4
5
|
const { resolvedPerTurn, turns } = input;
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
// Gateway and direct-provider routing can't be combined in one conversation — no coherent ordering/stitching exists across both paths.
|
|
7
|
+
const gatewayCount = resolvedPerTurn.filter(isSpeechGatewayModel).length;
|
|
8
|
+
if (gatewayCount > 0 && gatewayCount < resolvedPerTurn.length) {
|
|
9
|
+
throw new MixedDispatchError();
|
|
10
|
+
}
|
|
11
|
+
// Gateway wire takes string voices only; clone voices (`{url}`/`{audio}`) on gateway models fall past every other branch and throw StitchUnsupportedError below.
|
|
12
|
+
if (gatewayCount === resolvedPerTurn.length) {
|
|
13
|
+
const allVoicesString = turns.every((t) => typeof t.voice === "string");
|
|
14
|
+
if (allVoicesString) {
|
|
15
|
+
return { kind: "gateway", resolvedPerTurn };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// Compare by provider instance reference so two factories with different apiKey/baseURL/fetch configs aren't silently merged.
|
|
8
19
|
const first = resolvedPerTurn[0];
|
|
9
20
|
const allSame = resolvedPerTurn.every((r) => r.provider === first.provider && r.modelId === first.modelId);
|
|
10
21
|
if (allSame) {
|
|
@@ -17,7 +28,6 @@ export function chooseConversationPath(input) {
|
|
|
17
28
|
}
|
|
18
29
|
}
|
|
19
30
|
}
|
|
20
|
-
// Stitch path — every resolved (provider, modelId) must support getStitchOptions.
|
|
21
31
|
const stitchOptionsPerTurn = resolvedPerTurn.map((r) => {
|
|
22
32
|
const opts = r.provider.getStitchOptions?.(r.modelId);
|
|
23
33
|
if (!opts) {
|
|
@@ -32,8 +42,8 @@ export function chooseConversationPath(input) {
|
|
|
32
42
|
}
|
|
33
43
|
function assertNativeConstraints(args) {
|
|
34
44
|
const { provider, modelId, caps, turns } = args;
|
|
35
|
-
const
|
|
36
|
-
const unique = new Set(turns.map((t) =>
|
|
45
|
+
const keyOf = newVoiceKeyer();
|
|
46
|
+
const unique = new Set(turns.map((t) => keyOf(t.voice))).size;
|
|
37
47
|
if (unique < caps.minVoices || unique > caps.maxVoices) {
|
|
38
48
|
const rule = caps.minVoices === caps.maxVoices
|
|
39
49
|
? `exactly ${caps.minVoices} unique voices`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/conversation/dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/conversation/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,qBAAa,kBAAmB,SAAQ,cAAc;;CAOrD"}
|
|
@@ -25,4 +25,10 @@ export class StitchUnsupportedError extends SpeechSDKError {
|
|
|
25
25
|
this.model = options.model;
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
export class MixedDispatchError extends SpeechSDKError {
|
|
29
|
+
constructor() {
|
|
30
|
+
super('generateConversation: cannot mix gateway-routed models (e.g. "openai/tts-1") with direct-provider models in a single conversation. All turns must route through the gateway, or all turns must use direct providers.');
|
|
31
|
+
this.name = "MixedDispatchError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
28
34
|
//# 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;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD;QACE,KAAK,CACH,sNAAsN,CACvN,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -3,33 +3,9 @@ export interface Pcm16Segment {
|
|
|
3
3
|
readonly pcm: Int16Array;
|
|
4
4
|
readonly sampleRate: number;
|
|
5
5
|
}
|
|
6
|
-
/** Decode a provider response to mono 16-bit PCM + its native sample rate. */
|
|
7
|
-
export declare function decodeToPcm16(data: Uint8Array, mediaType: string): Pcm16Segment;
|
|
8
|
-
/**
|
|
9
|
-
* Default RMS target: −20 dBFS — broadcast/podcast voice loudness convention
|
|
10
|
-
* with ~20 dB peak headroom. Comfortable to listen to and leaves room for
|
|
11
|
-
* typical TTS peaks not to clip.
|
|
12
|
-
*/
|
|
13
6
|
export declare const DEFAULT_VOLUME_DBFS = -20;
|
|
14
|
-
/** Convert a dBFS level (≤ 0) to the equivalent int16 RMS amplitude. */
|
|
15
7
|
export declare function dbfsToInt16Rms(dbfs: number): number;
|
|
16
|
-
/**
|
|
17
|
-
* RMS-normalize each segment to an absolute target amplitude. Each segment
|
|
18
|
-
* is processed independently — no cross-segment dependency — so:
|
|
19
|
-
* - The output level is the same across runs regardless of input mix.
|
|
20
|
-
* - Two `generateConversation` calls produce comparable loudness even
|
|
21
|
-
* with completely different content.
|
|
22
|
-
*
|
|
23
|
-
* Silent segments pass through unchanged. Output is clamped to int16
|
|
24
|
-
* range, so a quiet segment with rare peaks may clip slightly when
|
|
25
|
-
* boosted; the default target leaves ~20 dB headroom to make this rare
|
|
26
|
-
* for typical TTS content.
|
|
27
|
-
*/
|
|
28
8
|
export declare function normalizeRms(segments: readonly Pcm16Segment[], targetRmsAmplitude?: number): Pcm16Segment[];
|
|
29
|
-
/**
|
|
30
|
-
* Resample each segment to `targetSampleRate` mono, interleave with `gapMs`
|
|
31
|
-
* silence, and mux the result as a WAV file via mediabunny.
|
|
32
|
-
*/
|
|
33
9
|
export declare function concatPcmToWav(segments: readonly Pcm16Segment[], options: {
|
|
34
10
|
gapMs: number;
|
|
35
11
|
targetSampleRate: number;
|
|
@@ -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;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,164 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
/**
|
|
3
|
-
* View 16-bit little-endian PCM bytes as an Int16Array. Reuses the existing
|
|
4
|
-
* buffer when `byteOffset` is 2-aligned; otherwise copies into a fresh,
|
|
5
|
-
* aligned buffer (Int16Array's buffer view requires 2-byte alignment).
|
|
6
|
-
*/
|
|
7
|
-
function pcmBytesToInt16(bytes) {
|
|
8
|
-
if (bytes.byteOffset % 2 === 0 && bytes.byteLength % 2 === 0) {
|
|
9
|
-
return new Int16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);
|
|
10
|
-
}
|
|
11
|
-
const copy = new Uint8Array(bytes.byteLength);
|
|
12
|
-
copy.set(bytes);
|
|
13
|
-
return new Int16Array(copy.buffer);
|
|
14
|
-
}
|
|
15
|
-
function downmixToMono(interleaved, channels) {
|
|
16
|
-
if (channels === 1) {
|
|
17
|
-
return interleaved;
|
|
18
|
-
}
|
|
19
|
-
const frames = Math.floor(interleaved.length / channels);
|
|
20
|
-
const out = new Int16Array(frames);
|
|
21
|
-
for (let f = 0; f < frames; f++) {
|
|
22
|
-
let sum = 0;
|
|
23
|
-
for (let c = 0; c < channels; c++) {
|
|
24
|
-
sum += interleaved[f * channels + c];
|
|
25
|
-
}
|
|
26
|
-
out[f] = Math.round(sum / channels);
|
|
27
|
-
}
|
|
28
|
-
return out;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* View 32-bit little-endian float PCM bytes as a Float32Array. Reuses the
|
|
32
|
-
* existing buffer when 4-aligned; otherwise copies into a fresh, aligned
|
|
33
|
-
* buffer (Float32Array's view requires 4-byte alignment).
|
|
34
|
-
*/
|
|
35
|
-
function pcmBytesToFloat32(bytes) {
|
|
36
|
-
if (bytes.byteOffset % 4 === 0 && bytes.byteLength % 4 === 0) {
|
|
37
|
-
return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
|
|
38
|
-
}
|
|
39
|
-
const copy = new Uint8Array(bytes.byteLength);
|
|
40
|
-
copy.set(bytes);
|
|
41
|
-
return new Float32Array(copy.buffer);
|
|
42
|
-
}
|
|
1
|
+
import { resamplePcm16, wrapPcm16Mono } from "../audio-utils.js";
|
|
43
2
|
const INT16_MAX = 32_767;
|
|
44
3
|
const INT16_MIN = -32_768;
|
|
45
|
-
/** Convert normalized [-1,1] float32 samples to int16 with clamping. */
|
|
46
|
-
function float32ToInt16(f32) {
|
|
47
|
-
const out = new Int16Array(f32.length);
|
|
48
|
-
for (let i = 0; i < f32.length; i++) {
|
|
49
|
-
const s = f32[i];
|
|
50
|
-
if (s >= 1) {
|
|
51
|
-
out[i] = INT16_MAX;
|
|
52
|
-
}
|
|
53
|
-
else if (s <= -1) {
|
|
54
|
-
out[i] = INT16_MIN;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
out[i] = Math.round(s * INT16_MAX);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return out;
|
|
61
|
-
}
|
|
62
|
-
/** Match `encoding=<value>` (string) in a mediaType param list. */
|
|
63
|
-
const ENCODING_PARAM_RE = /(?:^|;)\s*encoding=([a-z0-9_-]+)(?=$|;|\s)/i;
|
|
64
|
-
/** Decode a provider response to mono 16-bit PCM + its native sample rate. */
|
|
65
|
-
export function decodeToPcm16(data, mediaType) {
|
|
66
|
-
const lower = mediaType.toLowerCase();
|
|
67
|
-
if (lower.startsWith("audio/pcm") || lower.startsWith("audio/x-pcm")) {
|
|
68
|
-
// NOTE: `audio/l16` (RFC 2586) is intentionally NOT handled here. The
|
|
69
|
-
// standard mandates network byte order (big-endian) but no provider in
|
|
70
|
-
// this SDK currently emits it. If support is added later, byte-swap on
|
|
71
|
-
// little-endian hosts before constructing the Int16Array.
|
|
72
|
-
const sampleRate = parseMediaTypeParam(mediaType, "rate") ?? 24_000;
|
|
73
|
-
const channels = parseMediaTypeParam(mediaType, "channels") ?? 1;
|
|
74
|
-
const encoding = lower.match(ENCODING_PARAM_RE)?.[1];
|
|
75
|
-
if (encoding === "float32") {
|
|
76
|
-
const interleaved = float32ToInt16(pcmBytesToFloat32(data));
|
|
77
|
-
return {
|
|
78
|
-
pcm: downmixToMono(interleaved, channels),
|
|
79
|
-
sampleRate,
|
|
80
|
-
channels: 1,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
const interleaved = pcmBytesToInt16(data);
|
|
84
|
-
return {
|
|
85
|
-
pcm: downmixToMono(interleaved, channels),
|
|
86
|
-
sampleRate,
|
|
87
|
-
channels: 1,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
if (lower.startsWith("audio/wav") || lower.startsWith("audio/x-wav")) {
|
|
91
|
-
return decodeWav(data);
|
|
92
|
-
}
|
|
93
|
-
throw new Error(`conversation.pcm-concat: unsupported stitch mediaType "${mediaType}". ` +
|
|
94
|
-
'getStitchOptions must return "audio/wav" or "audio/pcm;rate=...[;encoding=float32]" so the stitch layer can concatenate without a compressed-audio decoder.');
|
|
95
|
-
}
|
|
96
|
-
function decodeWav(bytes) {
|
|
97
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
98
|
-
if (view.getUint32(0) !== 0x52_49_46_46 ||
|
|
99
|
-
view.getUint32(8) !== 0x57_41_56_45) {
|
|
100
|
-
throw new Error("conversation.pcm-concat: not a RIFF/WAVE file");
|
|
101
|
-
}
|
|
102
|
-
// Scan chunks for "fmt " and "data".
|
|
103
|
-
let offset = 12;
|
|
104
|
-
let sampleRate = 0;
|
|
105
|
-
let channels = 0;
|
|
106
|
-
let bitsPerSample = 0;
|
|
107
|
-
let audioFormat = 0;
|
|
108
|
-
let dataStart = -1;
|
|
109
|
-
let dataLen = 0;
|
|
110
|
-
while (offset + 8 <= bytes.byteLength) {
|
|
111
|
-
const chunkId = view.getUint32(offset);
|
|
112
|
-
const chunkSize = view.getUint32(offset + 4, true);
|
|
113
|
-
if (chunkId === 0x66_6d_74_20) {
|
|
114
|
-
audioFormat = view.getUint16(offset + 8, true);
|
|
115
|
-
channels = view.getUint16(offset + 10, true);
|
|
116
|
-
sampleRate = view.getUint32(offset + 12, true);
|
|
117
|
-
bitsPerSample = view.getUint16(offset + 22, true);
|
|
118
|
-
}
|
|
119
|
-
else if (chunkId === 0x64_61_74_61) {
|
|
120
|
-
dataStart = offset + 8;
|
|
121
|
-
dataLen = chunkSize;
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
offset += 8 + chunkSize + (chunkSize % 2);
|
|
125
|
-
}
|
|
126
|
-
if (dataStart < 0 ||
|
|
127
|
-
sampleRate === 0 ||
|
|
128
|
-
bitsPerSample !== 16 ||
|
|
129
|
-
audioFormat !== 1) {
|
|
130
|
-
throw new Error(`conversation.pcm-concat: only 16-bit PCM WAV is supported (got audioFormat=${audioFormat}, bps=${bitsPerSample})`);
|
|
131
|
-
}
|
|
132
|
-
const payload = bytes.subarray(dataStart, dataStart + dataLen);
|
|
133
|
-
const interleaved = pcmBytesToInt16(payload);
|
|
134
|
-
return {
|
|
135
|
-
pcm: downmixToMono(interleaved, channels || 1),
|
|
136
|
-
sampleRate,
|
|
137
|
-
channels: 1,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
/** Simple linear interpolation resampler for mono Int16 PCM. */
|
|
141
|
-
function resamplePcm16LinearMono(input, fromRate, toRate) {
|
|
142
|
-
if (fromRate === toRate) {
|
|
143
|
-
return input;
|
|
144
|
-
}
|
|
145
|
-
const ratio = fromRate / toRate;
|
|
146
|
-
const outLen = Math.round(input.length / ratio);
|
|
147
|
-
const out = new Int16Array(outLen);
|
|
148
|
-
for (let i = 0; i < outLen; i++) {
|
|
149
|
-
const srcPos = i * ratio;
|
|
150
|
-
const i0 = Math.floor(srcPos);
|
|
151
|
-
const i1 = Math.min(i0 + 1, input.length - 1);
|
|
152
|
-
const frac = srcPos - i0;
|
|
153
|
-
out[i] = Math.round(input[i0] * (1 - frac) + input[i1] * frac);
|
|
154
|
-
}
|
|
155
|
-
return out;
|
|
156
|
-
}
|
|
157
4
|
function silencePcm16(ms, sampleRate) {
|
|
158
5
|
const samples = Math.round((ms / 1000) * sampleRate);
|
|
159
6
|
return new Int16Array(samples);
|
|
160
7
|
}
|
|
161
|
-
/** Root-mean-square amplitude of a PCM segment. */
|
|
162
8
|
function rmsPcm16(pcm) {
|
|
163
9
|
if (pcm.length === 0) {
|
|
164
10
|
return 0;
|
|
@@ -178,7 +24,6 @@ function clampInt16(value) {
|
|
|
178
24
|
}
|
|
179
25
|
return value;
|
|
180
26
|
}
|
|
181
|
-
/** Multiply each sample by `gain`, clamping to int16 range. */
|
|
182
27
|
function scaleClamp(pcm, gain) {
|
|
183
28
|
const out = new Int16Array(pcm.length);
|
|
184
29
|
for (let i = 0; i < pcm.length; i++) {
|
|
@@ -186,29 +31,13 @@ function scaleClamp(pcm, gain) {
|
|
|
186
31
|
}
|
|
187
32
|
return out;
|
|
188
33
|
}
|
|
189
|
-
|
|
190
|
-
* Default RMS target: −20 dBFS — broadcast/podcast voice loudness convention
|
|
191
|
-
* with ~20 dB peak headroom. Comfortable to listen to and leaves room for
|
|
192
|
-
* typical TTS peaks not to clip.
|
|
193
|
-
*/
|
|
34
|
+
// −20 dBFS: broadcast/podcast voice loudness with ~20 dB peak headroom.
|
|
194
35
|
export const DEFAULT_VOLUME_DBFS = -20;
|
|
195
|
-
/** Convert a dBFS level (≤ 0) to the equivalent int16 RMS amplitude. */
|
|
196
36
|
export function dbfsToInt16Rms(dbfs) {
|
|
197
37
|
return Math.round(INT16_MAX * 10 ** (dbfs / 20));
|
|
198
38
|
}
|
|
199
39
|
const DEFAULT_TARGET_RMS_INT16 = dbfsToInt16Rms(DEFAULT_VOLUME_DBFS);
|
|
200
|
-
|
|
201
|
-
* RMS-normalize each segment to an absolute target amplitude. Each segment
|
|
202
|
-
* is processed independently — no cross-segment dependency — so:
|
|
203
|
-
* - The output level is the same across runs regardless of input mix.
|
|
204
|
-
* - Two `generateConversation` calls produce comparable loudness even
|
|
205
|
-
* with completely different content.
|
|
206
|
-
*
|
|
207
|
-
* Silent segments pass through unchanged. Output is clamped to int16
|
|
208
|
-
* range, so a quiet segment with rare peaks may clip slightly when
|
|
209
|
-
* boosted; the default target leaves ~20 dB headroom to make this rare
|
|
210
|
-
* for typical TTS content.
|
|
211
|
-
*/
|
|
40
|
+
// Per-segment, no cross-segment coupling — gives consistent loudness across runs.
|
|
212
41
|
export function normalizeRms(segments, targetRmsAmplitude = DEFAULT_TARGET_RMS_INT16) {
|
|
213
42
|
return segments.map((s) => {
|
|
214
43
|
const segRms = rmsPcm16(s.pcm);
|
|
@@ -218,18 +47,14 @@ export function normalizeRms(segments, targetRmsAmplitude = DEFAULT_TARGET_RMS_I
|
|
|
218
47
|
return { ...s, pcm: scaleClamp(s.pcm, targetRmsAmplitude / segRms) };
|
|
219
48
|
});
|
|
220
49
|
}
|
|
221
|
-
/**
|
|
222
|
-
* Resample each segment to `targetSampleRate` mono, interleave with `gapMs`
|
|
223
|
-
* silence, and mux the result as a WAV file via mediabunny.
|
|
224
|
-
*/
|
|
225
50
|
export async function concatPcmToWav(segments, options) {
|
|
226
51
|
const { gapMs, targetSampleRate } = options;
|
|
227
|
-
const resampled = [];
|
|
228
52
|
const gap = silencePcm16(gapMs, targetSampleRate);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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) {
|
|
233
58
|
resampled.push(gap);
|
|
234
59
|
}
|
|
235
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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConversationWordTimestamp, WordTimestamp } from "../timestamps.js";
|
|
2
|
+
export declare function distributeWordsAcrossTurns(words: readonly WordTimestamp[], expectedTokensPerTurn: readonly number[]): readonly ConversationWordTimestamp[];
|
|
3
|
+
export declare function fillTurnTimestampsProportional(args: {
|
|
4
|
+
turnIndex: number;
|
|
5
|
+
tokenCount: number;
|
|
6
|
+
startSec: number;
|
|
7
|
+
endSec: number;
|
|
8
|
+
texts: readonly string[];
|
|
9
|
+
}): readonly ConversationWordTimestamp[];
|
|
10
|
+
//# sourceMappingURL=proportional-fill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proportional-fill.d.ts","sourceRoot":"","sources":["../../src/conversation/proportional-fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,qBAAqB,EAAE,SAAS,MAAM,EAAE,GACvC,SAAS,yBAAyB,EAAE,CAkDtC;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,GAAG,SAAS,yBAAyB,EAAE,CAiBvC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export function distributeWordsAcrossTurns(words, expectedTokensPerTurn) {
|
|
2
|
+
if (words.length === 0) {
|
|
3
|
+
return [];
|
|
4
|
+
}
|
|
5
|
+
if (expectedTokensPerTurn.length <= 1) {
|
|
6
|
+
return words.map((w) => ({ ...w, turnIndex: 0 }));
|
|
7
|
+
}
|
|
8
|
+
const totalExpected = expectedTokensPerTurn.reduce((n, t) => n + t, 0);
|
|
9
|
+
if (totalExpected === 0) {
|
|
10
|
+
return words.map((w) => ({ ...w, turnIndex: 0 }));
|
|
11
|
+
}
|
|
12
|
+
const idealCounts = expectedTokensPerTurn.map((t) => (t / totalExpected) * words.length);
|
|
13
|
+
const counts = idealCounts.map(Math.floor);
|
|
14
|
+
let assigned = counts.reduce((n, c) => n + c, 0);
|
|
15
|
+
const remainders = idealCounts
|
|
16
|
+
.map((value, turnIndex) => ({
|
|
17
|
+
turnIndex,
|
|
18
|
+
remainder: value - Math.floor(value),
|
|
19
|
+
}))
|
|
20
|
+
.sort((a, b) => b.remainder - a.remainder || a.turnIndex - b.turnIndex);
|
|
21
|
+
for (const r of remainders) {
|
|
22
|
+
if (assigned >= words.length) {
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
counts[r.turnIndex] = (counts[r.turnIndex] ?? 0) + 1;
|
|
26
|
+
assigned++;
|
|
27
|
+
}
|
|
28
|
+
const out = [];
|
|
29
|
+
let wordIndex = 0;
|
|
30
|
+
for (let turnIndex = 0; turnIndex < counts.length; turnIndex++) {
|
|
31
|
+
const count = counts[turnIndex] ?? 0;
|
|
32
|
+
for (let i = 0; i < count && wordIndex < words.length; i++) {
|
|
33
|
+
out.push({ ...words[wordIndex], turnIndex });
|
|
34
|
+
wordIndex++;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
while (wordIndex < words.length) {
|
|
38
|
+
out.push({
|
|
39
|
+
...words[wordIndex],
|
|
40
|
+
turnIndex: expectedTokensPerTurn.length - 1,
|
|
41
|
+
});
|
|
42
|
+
wordIndex++;
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
export function fillTurnTimestampsProportional(args) {
|
|
47
|
+
const { turnIndex, tokenCount, startSec, endSec, texts } = args;
|
|
48
|
+
if (tokenCount === 0) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
const span = Math.max(0, endSec - startSec);
|
|
52
|
+
const per = span / tokenCount;
|
|
53
|
+
const out = [];
|
|
54
|
+
for (let i = 0; i < tokenCount; i++) {
|
|
55
|
+
out.push({
|
|
56
|
+
text: texts[i] ?? "",
|
|
57
|
+
start: startSec + i * per,
|
|
58
|
+
end: startSec + (i + 1) * per,
|
|
59
|
+
turnIndex,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=proportional-fill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proportional-fill.js","sourceRoot":"","sources":["../../src/conversation/proportional-fill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SilenceGap {
|
|
2
|
+
readonly durationMs: number;
|
|
3
|
+
readonly endMs: number;
|
|
4
|
+
readonly startMs: number;
|
|
5
|
+
}
|
|
6
|
+
export interface DetectSilenceOptions {
|
|
7
|
+
readonly minDurationMs: number;
|
|
8
|
+
readonly sampleRate: number;
|
|
9
|
+
readonly silenceRmsThreshold?: number;
|
|
10
|
+
readonly windowMs?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function detectSilenceGaps(pcm: Int16Array, options: DetectSilenceOptions): readonly SilenceGap[];
|
|
13
|
+
export declare function pickTopGaps(gaps: readonly SilenceGap[], n: number): readonly SilenceGap[];
|
|
14
|
+
//# sourceMappingURL=silence-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"silence-detection.d.ts","sourceRoot":"","sources":["../../src/conversation/silence-detection.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAKD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,oBAAoB,GAC5B,SAAS,UAAU,EAAE,CAiDvB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,UAAU,EAAE,EAC3B,CAAC,EAAE,MAAM,GACR,SAAS,UAAU,EAAE,CASvB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const DEFAULT_RMS_THRESHOLD = 200;
|
|
2
|
+
const DEFAULT_WINDOW_MS = 20;
|
|
3
|
+
export function detectSilenceGaps(pcm, options) {
|
|
4
|
+
const { sampleRate, minDurationMs, silenceRmsThreshold = DEFAULT_RMS_THRESHOLD, windowMs = DEFAULT_WINDOW_MS, } = options;
|
|
5
|
+
if (pcm.length === 0 || sampleRate <= 0 || minDurationMs <= 0) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
const windowSamples = Math.max(1, Math.round((windowMs / 1000) * sampleRate));
|
|
9
|
+
const windowCount = Math.floor(pcm.length / windowSamples);
|
|
10
|
+
if (windowCount === 0) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
// Mark each window as silent or not.
|
|
14
|
+
const silent = new Array(windowCount);
|
|
15
|
+
for (let w = 0; w < windowCount; w++) {
|
|
16
|
+
const start = w * windowSamples;
|
|
17
|
+
let sumSq = 0;
|
|
18
|
+
for (let i = 0; i < windowSamples; i++) {
|
|
19
|
+
const s = pcm[start + i] ?? 0;
|
|
20
|
+
sumSq += s * s;
|
|
21
|
+
}
|
|
22
|
+
const rms = Math.sqrt(sumSq / windowSamples);
|
|
23
|
+
silent[w] = rms < silenceRmsThreshold;
|
|
24
|
+
}
|
|
25
|
+
const gaps = [];
|
|
26
|
+
let runStart = -1;
|
|
27
|
+
for (let w = 0; w <= windowCount; w++) {
|
|
28
|
+
const isSilent = w < windowCount && silent[w];
|
|
29
|
+
if (isSilent && runStart === -1) {
|
|
30
|
+
runStart = w;
|
|
31
|
+
}
|
|
32
|
+
else if (!isSilent && runStart !== -1) {
|
|
33
|
+
const startMs = (runStart * windowSamples * 1000) / sampleRate;
|
|
34
|
+
const endMs = (w * windowSamples * 1000) / sampleRate;
|
|
35
|
+
const durationMs = endMs - startMs;
|
|
36
|
+
if (durationMs >= minDurationMs) {
|
|
37
|
+
gaps.push({ startMs, endMs, durationMs });
|
|
38
|
+
}
|
|
39
|
+
runStart = -1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return gaps;
|
|
43
|
+
}
|
|
44
|
+
export function pickTopGaps(gaps, n) {
|
|
45
|
+
if (n <= 0 || gaps.length === 0) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
const sortedByDuration = [...gaps].sort((a, b) => b.durationMs - a.durationMs);
|
|
49
|
+
const top = sortedByDuration.slice(0, n);
|
|
50
|
+
return top.sort((a, b) => a.startMs - b.startMs);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=silence-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"silence-detection.js","sourceRoot":"","sources":["../../src/conversation/silence-detection.ts"],"names":[],"mappings":"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"}
|