@elevenlabs/client 1.7.1 → 1.8.1
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/dist/BaseConversation.d.ts +2 -2
- package/dist/BaseConversation.d.ts.map +1 -1
- package/dist/BaseConversation.js +18 -15
- package/dist/BaseConversation.js.map +1 -1
- package/dist/InputController.d.ts +9 -0
- package/dist/InputController.d.ts.map +1 -1
- package/dist/OutputController.d.ts +18 -0
- package/dist/OutputController.d.ts.map +1 -1
- package/dist/TextConversation.js +2 -2
- package/dist/TextConversation.js.map +1 -1
- package/dist/VoiceConversation.d.ts +3 -6
- package/dist/VoiceConversation.d.ts.map +1 -1
- package/dist/VoiceConversation.js +15 -69
- package/dist/VoiceConversation.js.map +1 -1
- package/dist/WebRTCAudioAdapter.d.ts +52 -0
- package/dist/WebRTCAudioAdapter.d.ts.map +1 -0
- package/dist/WebRTCAudioAdapter.js +17 -0
- package/dist/WebRTCAudioAdapter.js.map +1 -0
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +6 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -1
- package/dist/internal.js.map +1 -1
- package/dist/lib.iife.js +3519 -3220
- package/dist/lib.iife.js.map +1 -1
- package/dist/platform/VoiceSessionSetup.d.ts +10 -15
- package/dist/platform/VoiceSessionSetup.d.ts.map +1 -1
- package/dist/platform/VoiceSessionSetup.js +20 -62
- package/dist/platform/VoiceSessionSetup.js.map +1 -1
- package/dist/platform/tsconfig.test.tsbuildinfo +1 -0
- package/dist/platform/web/VoiceSessionSetup.d.ts +9 -0
- package/dist/platform/web/VoiceSessionSetup.d.ts.map +1 -0
- package/dist/platform/web/VoiceSessionSetup.js +166 -0
- package/dist/platform/web/VoiceSessionSetup.js.map +1 -0
- package/dist/platform/web/addLibsamplerateModule.d.ts.map +1 -0
- package/dist/platform/web/addLibsamplerateModule.js.map +1 -0
- package/dist/platform/web/audioConcatProcessor.generated.d.ts.map +1 -0
- package/dist/platform/web/audioConcatProcessor.generated.js.map +1 -0
- package/dist/platform/web/audioUnlock.d.ts +11 -0
- package/dist/platform/web/audioUnlock.d.ts.map +1 -0
- package/dist/platform/web/audioUnlock.js +74 -0
- package/dist/platform/web/audioUnlock.js.map +1 -0
- package/dist/platform/web/compatibility.d.ts.map +1 -0
- package/dist/platform/web/compatibility.js.map +1 -0
- package/dist/platform/web/createWorkletModuleLoader.d.ts.map +1 -0
- package/dist/platform/web/createWorkletModuleLoader.js.map +1 -0
- package/dist/platform/web/index.d.ts +3 -0
- package/dist/platform/web/index.d.ts.map +1 -0
- package/dist/platform/web/index.js +18 -0
- package/dist/platform/web/index.js.map +1 -0
- package/dist/{utils → platform/web}/input.d.ts +3 -12
- package/dist/platform/web/input.d.ts.map +1 -0
- package/dist/platform/web/input.js.map +1 -0
- package/dist/platform/web/output.d.ts +29 -0
- package/dist/platform/web/output.d.ts.map +1 -0
- package/dist/{utils → platform/web}/output.js +29 -3
- package/dist/platform/web/output.js.map +1 -0
- package/dist/platform/web/rawAudioProcessor.generated.d.ts.map +1 -0
- package/dist/platform/web/rawAudioProcessor.generated.js.map +1 -0
- package/dist/platform/web/scribeAudioProcessor.generated.d.ts.map +1 -0
- package/dist/platform/web/scribeAudioProcessor.generated.js.map +1 -0
- package/dist/platform/web/scribeMicrophone.d.ts +10 -0
- package/dist/platform/web/scribeMicrophone.d.ts.map +1 -0
- package/dist/platform/web/scribeMicrophone.js +65 -0
- package/dist/platform/web/scribeMicrophone.js.map +1 -0
- package/dist/platform/web/volumeProvider.d.ts +4 -0
- package/dist/platform/web/volumeProvider.d.ts.map +1 -0
- package/dist/platform/web/volumeProvider.js +24 -0
- package/dist/platform/web/volumeProvider.js.map +1 -0
- package/dist/platform/web/webAudioAdapter.d.ts +23 -0
- package/dist/platform/web/webAudioAdapter.d.ts.map +1 -0
- package/dist/platform/web/webAudioAdapter.js +127 -0
- package/dist/platform/web/webAudioAdapter.js.map +1 -0
- package/dist/runtime.d.ts +181 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +34 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scribe/microphone.d.ts +31 -0
- package/dist/scribe/microphone.d.ts.map +1 -0
- package/dist/scribe/microphone.js +23 -0
- package/dist/scribe/microphone.js.map +1 -0
- package/dist/scribe/scribe.d.ts +1 -1
- package/dist/scribe/scribe.d.ts.map +1 -1
- package/dist/scribe/scribe.js +6 -62
- package/dist/scribe/scribe.js.map +1 -1
- package/dist/types.d.ts +12 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/BaseConnection.d.ts +1 -1
- package/dist/utils/BaseConnection.d.ts.map +1 -1
- package/dist/utils/WebRTCConnection.d.ts +4 -7
- package/dist/utils/WebRTCConnection.d.ts.map +1 -1
- package/dist/utils/WebRTCConnection.js +51 -128
- package/dist/utils/WebRTCConnection.js.map +1 -1
- package/dist/utils/WebSocketConnection.d.ts +2 -1
- package/dist/utils/WebSocketConnection.d.ts.map +1 -1
- package/dist/utils/WebSocketConnection.js +29 -12
- package/dist/utils/WebSocketConnection.js.map +1 -1
- package/dist/utils/applyDelay.d.ts +3 -2
- package/dist/utils/applyDelay.d.ts.map +1 -1
- package/dist/utils/applyDelay.js +18 -12
- package/dist/utils/applyDelay.js.map +1 -1
- package/dist/utils/assert.d.ts +3 -0
- package/dist/utils/assert.d.ts.map +1 -0
- package/dist/utils/assert.js +9 -0
- package/dist/utils/assert.js.map +1 -0
- package/dist/utils/attachConnectionToOutput.d.ts +1 -1
- package/dist/utils/attachConnectionToOutput.d.ts.map +1 -1
- package/dist/utils/attachInputToConnection.d.ts +1 -1
- package/dist/utils/attachInputToConnection.d.ts.map +1 -1
- package/dist/utils/audio.d.ts.map +1 -1
- package/dist/utils/audio.js +2 -3
- package/dist/utils/audio.js.map +1 -1
- package/dist/utils/connection.d.ts +1 -1
- package/dist/utils/connection.d.ts.map +1 -1
- package/dist/utils/connection.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +5 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/mergeOptions.d.ts.map +1 -1
- package/dist/utils/mergeOptions.js +1 -3
- package/dist/utils/mergeOptions.js.map +1 -1
- package/dist/utils/volumeProvider.d.ts +0 -1
- package/dist/utils/volumeProvider.d.ts.map +1 -1
- package/dist/utils/volumeProvider.js +0 -22
- package/dist/utils/volumeProvider.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -2
- package/dist/utils/addLibsamplerateModule.d.ts.map +0 -1
- package/dist/utils/addLibsamplerateModule.js.map +0 -1
- package/dist/utils/audioConcatProcessor.generated.d.ts.map +0 -1
- package/dist/utils/audioConcatProcessor.generated.js.map +0 -1
- package/dist/utils/compatibility.d.ts.map +0 -1
- package/dist/utils/compatibility.js.map +0 -1
- package/dist/utils/createWorkletModuleLoader.d.ts.map +0 -1
- package/dist/utils/createWorkletModuleLoader.js.map +0 -1
- package/dist/utils/input.d.ts.map +0 -1
- package/dist/utils/input.js.map +0 -1
- package/dist/utils/output.d.ts +0 -45
- package/dist/utils/output.d.ts.map +0 -1
- package/dist/utils/output.js.map +0 -1
- package/dist/utils/rawAudioProcessor.generated.d.ts.map +0 -1
- package/dist/utils/rawAudioProcessor.generated.js.map +0 -1
- package/dist/utils/scribeAudioProcessor.generated.d.ts.map +0 -1
- package/dist/utils/scribeAudioProcessor.generated.js.map +0 -1
- /package/dist/{utils → platform/web}/addLibsamplerateModule.d.ts +0 -0
- /package/dist/{utils → platform/web}/addLibsamplerateModule.js +0 -0
- /package/dist/{utils → platform/web}/audioConcatProcessor.generated.d.ts +0 -0
- /package/dist/{utils → platform/web}/audioConcatProcessor.generated.js +0 -0
- /package/dist/{utils → platform/web}/compatibility.d.ts +0 -0
- /package/dist/{utils → platform/web}/compatibility.js +0 -0
- /package/dist/{utils → platform/web}/createWorkletModuleLoader.d.ts +0 -0
- /package/dist/{utils → platform/web}/createWorkletModuleLoader.js +0 -0
- /package/dist/{utils → platform/web}/input.js +0 -0
- /package/dist/{utils → platform/web}/rawAudioProcessor.generated.d.ts +0 -0
- /package/dist/{utils → platform/web}/rawAudioProcessor.generated.js +0 -0
- /package/dist/{utils → platform/web}/scribeAudioProcessor.generated.d.ts +0 -0
- /package/dist/{utils → platform/web}/scribeAudioProcessor.generated.js +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { isIosDevice } from "./compatibility.js";
|
|
2
|
+
const STASH_TTL_MS = 30_000;
|
|
3
|
+
const UNLOCK_EVENTS = ["touchstart", "touchend", "click"];
|
|
4
|
+
let stashedAudioContext = null;
|
|
5
|
+
let discardTimer = null;
|
|
6
|
+
let unlockListenerInstalled = false;
|
|
7
|
+
function unlockAudioContext(ctx) {
|
|
8
|
+
const buffer = ctx.createBuffer(1, 1, 22050);
|
|
9
|
+
const source = ctx.createBufferSource();
|
|
10
|
+
source.buffer = buffer;
|
|
11
|
+
source.connect(ctx.destination);
|
|
12
|
+
source.start(0);
|
|
13
|
+
void ctx.resume().catch(() => { });
|
|
14
|
+
}
|
|
15
|
+
function scheduleStashDiscard() {
|
|
16
|
+
if (discardTimer) {
|
|
17
|
+
clearTimeout(discardTimer);
|
|
18
|
+
}
|
|
19
|
+
discardTimer = setTimeout(() => {
|
|
20
|
+
discardTimer = null;
|
|
21
|
+
discardStashedAudioContext();
|
|
22
|
+
}, STASH_TTL_MS);
|
|
23
|
+
}
|
|
24
|
+
function clearStashDiscardTimer() {
|
|
25
|
+
if (!discardTimer) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
clearTimeout(discardTimer);
|
|
29
|
+
discardTimer = null;
|
|
30
|
+
}
|
|
31
|
+
/** Unlock iOS audio during a user gesture. No-op on non-iOS. */
|
|
32
|
+
export function unlockIosAudioForSession() {
|
|
33
|
+
if (!isIosDevice() || stashedAudioContext) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const ctx = new AudioContext();
|
|
37
|
+
unlockAudioContext(ctx);
|
|
38
|
+
stashedAudioContext = ctx;
|
|
39
|
+
scheduleStashDiscard();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Listen for the first user interaction on the page and unlock iOS audio in
|
|
43
|
+
* the capture phase, before application click handlers run. Covers callers
|
|
44
|
+
* (such as the convai widget) that `await` before `Conversation.startSession`.
|
|
45
|
+
*/
|
|
46
|
+
export function installIosAudioUnlockListener() {
|
|
47
|
+
if (!isIosDevice() ||
|
|
48
|
+
unlockListenerInstalled ||
|
|
49
|
+
typeof document === "undefined") {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
unlockListenerInstalled = true;
|
|
53
|
+
const onUserGesture = () => {
|
|
54
|
+
unlockIosAudioForSession();
|
|
55
|
+
};
|
|
56
|
+
for (const event of UNLOCK_EVENTS) {
|
|
57
|
+
document.addEventListener(event, onUserGesture, true);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function takeUnlockedAudioContext() {
|
|
61
|
+
const ctx = stashedAudioContext;
|
|
62
|
+
stashedAudioContext = null;
|
|
63
|
+
clearStashDiscardTimer();
|
|
64
|
+
return ctx;
|
|
65
|
+
}
|
|
66
|
+
export function discardStashedAudioContext() {
|
|
67
|
+
if (!stashedAudioContext) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
void stashedAudioContext.close().catch(() => { });
|
|
71
|
+
stashedAudioContext = null;
|
|
72
|
+
clearStashDiscardTimer();
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=audioUnlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioUnlock.js","sourceRoot":"","sources":["../../../src/platform/web/audioUnlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAU,CAAC;AAEnE,IAAI,mBAAmB,GAAwB,IAAI,CAAC;AACpD,IAAI,YAAY,GAAyC,IAAI,CAAC;AAC9D,IAAI,uBAAuB,GAAG,KAAK,CAAC;AAEpC,SAAS,kBAAkB,CAAC,GAAiB;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACxC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IACD,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,YAAY,GAAG,IAAI,CAAC;QACpB,0BAA0B,EAAE,CAAC;IAC/B,CAAC,EAAE,YAAY,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,YAAY,CAAC,YAAY,CAAC,CAAC;IAC3B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC,WAAW,EAAE,IAAI,mBAAmB,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;IAC/B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,mBAAmB,GAAG,GAAG,CAAC;IAC1B,oBAAoB,EAAE,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B;IAC3C,IACE,CAAC,WAAW,EAAE;QACd,uBAAuB;QACvB,OAAO,QAAQ,KAAK,WAAW,EAC/B,CAAC;QACD,OAAO;IACT,CAAC;IAED,uBAAuB,GAAG,IAAI,CAAC;IAC/B,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,wBAAwB,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,GAAG,GAAG,mBAAmB,CAAC;IAChC,mBAAmB,GAAG,IAAI,CAAC;IAC3B,sBAAsB,EAAE,CAAC;IACzB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,KAAK,mBAAmB,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjD,mBAAmB,GAAG,IAAI,CAAC;IAC3B,sBAAsB,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../../../src/platform/web/compatibility.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,YAa1B;AAED,wBAAgB,eAAe,YAE9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../../src/platform/web/compatibility.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW;IACzB,OAAO,CACL;QACE,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;QAChB,MAAM;QACN,QAAQ;QACR,MAAM;KACP,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC9B,2BAA2B;QAC3B,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,IAAI,QAAQ,CAAC,CAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkletModuleLoader.d.ts","sourceRoot":"","sources":["../../../src/platform/web/createWorkletModuleLoader.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAC1D,SAAS,YAAY,EAAE,OAAO,MAAM,mBA2CnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkletModuleLoader.js","sourceRoot":"","sources":["../../../src/platform/web/createWorkletModuleLoader.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,UAAkB;IACxE,OAAO,KAAK,EAAE,OAAqB,EAAE,IAAa,EAAE,EAAE;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,iEAAiE;QACjE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC9B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,8BAA8B,IAAI,YAAY,KAAK,EAAE,CAChF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC;YACH,qEAAqE;YACrE,gEAAgE;YAChE,qEAAqE;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,sCAAsC,MAAM,EAAE,CAAC;YACjE,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,4IAA4I,CACvK,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/platform/web/index.ts"],"names":[],"mappings":"AACA,OAAO,wBAAwB,CAAC;AAmBhC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Side-effect: registers the web voice session setup strategy
|
|
2
|
+
import "./VoiceSessionSetup.js";
|
|
3
|
+
// Side-effect: arms iOS audio unlock on first user gesture (no-op on other
|
|
4
|
+
// platforms). Needed because the convai widget awaits other promises (terms
|
|
5
|
+
// modal etc.) between the user's tap and Conversation.startSession, by which
|
|
6
|
+
// point the gesture has been consumed.
|
|
7
|
+
import { installIosAudioUnlockListener } from "./audioUnlock.js";
|
|
8
|
+
installIosAudioUnlockListener();
|
|
9
|
+
// Side-effect: registers the web audio adapter for WebRTC connections
|
|
10
|
+
import { setWebRTCAudioAdapterFactory } from "../../WebRTCAudioAdapter.js";
|
|
11
|
+
import { WebAudioAdapter } from "./webAudioAdapter.js";
|
|
12
|
+
setWebRTCAudioAdapterFactory(() => new WebAudioAdapter());
|
|
13
|
+
// Side-effect: registers the web Scribe microphone implementation
|
|
14
|
+
import { setScribeMicrophoneSetup } from "../../scribe/microphone.js";
|
|
15
|
+
import { webScribeMicrophoneSetup } from "./scribeMicrophone.js";
|
|
16
|
+
setScribeMicrophoneSetup(webScribeMicrophoneSetup);
|
|
17
|
+
export * from "../../index.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platform/web/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,wBAAwB,CAAC;AAEhC,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,uCAAuC;AACvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,6BAA6B,EAAE,CAAC;AAEhC,sEAAsE;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,4BAA4B,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;AAE1D,kEAAkE;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;AAEnD,cAAc,gBAAgB,CAAC"}
|
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
import type { FormatConfig } from "
|
|
2
|
-
import type { AudioWorkletConfig } from "
|
|
3
|
-
import type { InputController, InputDeviceConfig } from "
|
|
4
|
-
export type InputConfig = InputDeviceConfig & {
|
|
5
|
-
onError?(message: string, context?: unknown): void;
|
|
6
|
-
};
|
|
7
|
-
export type InputMessageEvent = MessageEvent<[Uint8Array, number]>;
|
|
8
|
-
export type InputListener = (event: InputMessageEvent) => void;
|
|
9
|
-
export type InputEventTarget = {
|
|
10
|
-
addListener(listener: InputListener): void;
|
|
11
|
-
removeListener(listener: InputListener): void;
|
|
12
|
-
};
|
|
1
|
+
import type { FormatConfig } from "../../utils/BaseConnection.js";
|
|
2
|
+
import type { AudioWorkletConfig } from "../../BaseConversation.js";
|
|
3
|
+
import type { InputController, InputDeviceConfig, InputConfig, InputEventTarget, InputListener } from "../../InputController.js";
|
|
13
4
|
export declare class MediaDeviceInput implements InputController, InputEventTarget {
|
|
14
5
|
private readonly context;
|
|
15
6
|
private readonly analyser;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/platform/web/input.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAelC,qBAAa,gBAAiB,YAAW,eAAe,EAAE,gBAAgB;IA2GtE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;WAhHG,MAAM,CAAC,EACzB,UAAU,EACV,MAAM,EACN,6BAA6B,EAC7B,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,OAAO,GACR,EAAE,YAAY,GACb,WAAW,GACX,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmFhD,OAAO,CAAC,MAAM,CAAC,qBAAqB;IASpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,OAAO;IAsBA,WAAW,IAAI,YAAY;IAI3B,SAAS,IAAI,MAAM;IAKnB,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI;IAQ3D,OAAO,IAAI,OAAO;IAIlB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIpD,OAAO,CAAC,0BAA0B;IAOrB,KAAK;IASL,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,OAAO,CAAC,YAAY,CAAkB;IACzB,SAAS,CACpB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,iBAAiB,GACjD,OAAO,CAAC,IAAI,CAAC;IAkDhB,OAAO,CAAC,uBAAuB,CAe7B;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/platform/web/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { FormatConfig } from "../../utils/BaseConnection.js";
|
|
2
|
+
import type { AudioWorkletConfig } from "../../BaseConversation.js";
|
|
3
|
+
import type { OutputController, OutputDeviceConfig, OutputConfig, PlaybackEventTarget, PlaybackListener } from "../../OutputController.js";
|
|
4
|
+
export declare class MediaDeviceOutput implements OutputController, PlaybackEventTarget {
|
|
5
|
+
private readonly context;
|
|
6
|
+
private readonly analyser;
|
|
7
|
+
private readonly gain;
|
|
8
|
+
private readonly worklet;
|
|
9
|
+
private readonly audioElement;
|
|
10
|
+
static create({ sampleRate, format, outputDeviceId, workletPaths, libsampleratePath, audioContext, }: FormatConfig & OutputConfig & AudioWorkletConfig & {
|
|
11
|
+
audioContext?: AudioContext;
|
|
12
|
+
}): Promise<MediaDeviceOutput>;
|
|
13
|
+
private volume;
|
|
14
|
+
private interrupted;
|
|
15
|
+
private interruptTimeout;
|
|
16
|
+
private readonly volumeProvider;
|
|
17
|
+
private constructor();
|
|
18
|
+
getAnalyser(): AnalyserNode;
|
|
19
|
+
getVolume(): number;
|
|
20
|
+
getByteFrequencyData(buffer: Uint8Array<ArrayBuffer>): void;
|
|
21
|
+
addListener(listener: PlaybackListener): void;
|
|
22
|
+
removeListener(listener: PlaybackListener): void;
|
|
23
|
+
setVolume(volume: number): void;
|
|
24
|
+
playAudio(chunk: ArrayBuffer): void;
|
|
25
|
+
interrupt(resetDuration?: number): void;
|
|
26
|
+
setDevice(config?: Partial<FormatConfig> & OutputDeviceConfig): Promise<void>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/platform/web/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AA0CnC,qBAAa,iBACX,YAAW,gBAAgB,EAAE,mBAAmB;IAkG9C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY;WApGX,MAAM,CAAC,EACzB,UAAU,EACV,MAAM,EACN,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,EAAE,YAAY,GACb,YAAY,GACZ,kBAAkB,GAAG;QACnB,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+EhC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,OAAO;IAgBA,WAAW,IAAI,YAAY;IAI3B,SAAS,IAAI,MAAM;IAInB,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI;IAI3D,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI7C,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIhD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAWnC,SAAS,CAAC,aAAa,SAAO,GAAG,IAAI;IA2B/B,SAAS,CACpB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,kBAAkB,GAClD,OAAO,CAAC,IAAI,CAAC;IAgBH,KAAK;CAcnB"}
|
|
@@ -1,18 +1,43 @@
|
|
|
1
1
|
import { loadAudioConcatProcessor } from "./audioConcatProcessor.generated.js";
|
|
2
2
|
import { addLibsamplerateModule } from "./addLibsamplerateModule.js";
|
|
3
3
|
import { createAnalyserVolumeProvider, } from "./volumeProvider.js";
|
|
4
|
+
import { isIosDevice } from "./compatibility.js";
|
|
5
|
+
function maybePrimeIosPlayback({ sampleRate, format, worklet, audioElement, }) {
|
|
6
|
+
if (!isIosDevice()) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
// ~100ms of silence is enough to flush the worklet → MediaStream → audio
|
|
10
|
+
// element pipeline so iOS treats the element as "playing media" and won't
|
|
11
|
+
// stall the first real audio chunk.
|
|
12
|
+
const PRIME_DURATION_MS = 100;
|
|
13
|
+
const primeFrameCount = Math.floor((sampleRate * PRIME_DURATION_MS) / 1000);
|
|
14
|
+
// μ-law silence is 0xFF, not 0x00. The worklet decodes 0x00 to ~-32124
|
|
15
|
+
// (near full-scale negative DC), which would emit a loud pop instead of
|
|
16
|
+
// priming with silence. PCM silence is plain zero, so the zero-filled
|
|
17
|
+
// Int16Array is correct as-is.
|
|
18
|
+
const silentBuffer = format === "ulaw"
|
|
19
|
+
? new Uint8Array(primeFrameCount).fill(0xff)
|
|
20
|
+
: new Int16Array(primeFrameCount);
|
|
21
|
+
worklet.port.postMessage({
|
|
22
|
+
type: "buffer",
|
|
23
|
+
buffer: silentBuffer.buffer,
|
|
24
|
+
});
|
|
25
|
+
void audioElement.play().catch(() => { });
|
|
26
|
+
}
|
|
4
27
|
export class MediaDeviceOutput {
|
|
5
28
|
context;
|
|
6
29
|
analyser;
|
|
7
30
|
gain;
|
|
8
31
|
worklet;
|
|
9
32
|
audioElement;
|
|
10
|
-
static async create({ sampleRate, format, outputDeviceId, workletPaths, libsampleratePath, }) {
|
|
11
|
-
let context = null;
|
|
33
|
+
static async create({ sampleRate, format, outputDeviceId, workletPaths, libsampleratePath, audioContext, }) {
|
|
34
|
+
let context = audioContext ?? null;
|
|
12
35
|
let audioElement = null;
|
|
13
36
|
try {
|
|
14
37
|
const supportsSampleRateConstraint = navigator.mediaDevices.getSupportedConstraints().sampleRate;
|
|
15
|
-
|
|
38
|
+
if (!context) {
|
|
39
|
+
context = new AudioContext(supportsSampleRateConstraint ? { sampleRate } : {});
|
|
40
|
+
}
|
|
16
41
|
const analyser = context.createAnalyser();
|
|
17
42
|
const gain = context.createGain();
|
|
18
43
|
// Always create an audio element for device switching capability
|
|
@@ -38,6 +63,7 @@ export class MediaDeviceOutput {
|
|
|
38
63
|
worklet.port.postMessage({ type: "setFormat", format, sampleRate });
|
|
39
64
|
worklet.connect(gain);
|
|
40
65
|
await context.resume();
|
|
66
|
+
maybePrimeIosPlayback({ sampleRate, format, worklet, audioElement });
|
|
41
67
|
// Set initial output device if provided
|
|
42
68
|
if (outputDeviceId && audioElement.setSinkId) {
|
|
43
69
|
await audioElement.setSinkId(outputDeviceId);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/platform/web/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAQrE,OAAO,EACL,4BAA4B,GAE7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,SAAS,qBAAqB,CAAC,EAC7B,UAAU,EACV,MAAM,EACN,OAAO,EACP,YAAY,GAMb;IACC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,oCAAoC;IACpC,MAAM,iBAAiB,GAAG,GAAG,CAAC;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5E,uEAAuE;IACvE,wEAAwE;IACxE,sEAAsE;IACtE,+BAA+B;IAC/B,MAAM,YAAY,GAChB,MAAM,KAAK,MAAM;QACf,CAAC,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5C,CAAC,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QACvB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,YAAY,CAAC,MAAM;KAC5B,CAAC,CAAC;IACH,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,OAAO,iBAAiB;IAmGT;IACA;IACA;IACA;IACA;IApGZ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EACzB,UAAU,EACV,MAAM,EACN,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,GAKX;QACD,IAAI,OAAO,GAAwB,YAAY,IAAI,IAAI,CAAC;QACxD,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,4BAA4B,GAChC,SAAS,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC,UAAU,CAAC;YAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,YAAY,CACxB,4BAA4B,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CACnD,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YAElC,iEAAiE;YACjE,YAAY,GAAG,IAAI,KAAK,EAAE,CAAC;YAC3B,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC;YACtB,YAAY,CAAC,IAAI,EAAE,CAAC;YACpB,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC7B,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAEpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,gEAAgE;YAChE,MAAM,WAAW,GAAG,OAAO,CAAC,4BAA4B,EAAE,CAAC;YAC3D,YAAY,CAAC,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;YAE5C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvB,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAE9B,IAAI,CAAC,4BAA4B,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACvE,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;oBACtC,OAAO,CAAC,IAAI,CACV,kCAAkC,UAAU,iCAAiC,OAAO,CAAC,UAAU,EAAE,CAClG,CAAC;gBACJ,CAAC;gBACD,MAAM,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,wBAAwB,CAC5B,OAAO,CAAC,YAAY,EACpB,YAAY,EAAE,oBAAoB,CACnC,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEtB,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YAEvB,qBAAqB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YAErE,wCAAwC;YACxC,IAAI,cAAc,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC7C,MAAM,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,iBAAiB,CACrC,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,YAAY,CACb,CAAC;YAEF,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kCAAkC;YAClC,IAAI,YAAY,EAAE,UAAU,EAAE,CAAC;gBAC7B,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACpD,CAAC;YACD,YAAY,EAAE,KAAK,EAAE,CAAC;YACtB,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC1C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,MAAM,GAAG,CAAC,CAAC;IACX,WAAW,GAAG,KAAK,CAAC;IACpB,gBAAgB,GAAyC,IAAI,CAAC;IACrD,cAAc,CAAiB;IAEhD,YACmB,OAAqB,EACrB,QAAsB,EACtB,IAAc,EACd,OAAyB,EACzB,YAA8B;QAJ9B,YAAO,GAAP,OAAO,CAAc;QACrB,aAAQ,GAAR,QAAQ,CAAc;QACtB,SAAI,GAAJ,IAAI,CAAU;QACd,YAAO,GAAP,OAAO,CAAkB;QACzB,iBAAY,GAAZ,YAAY,CAAkB;QAE/C,2DAA2D;QAC3D,8DAA8D;QAC9D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,4BAA4B,CAChD,QAAQ,EACR,OAAO,CAAC,UAAU,CACnB,CAAC;IACJ,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;IACzC,CAAC;IAEM,oBAAoB,CAAC,MAA+B;QACzD,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAEM,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAEM,cAAc,CAAC,QAA0B;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEM,SAAS,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;IAChC,CAAC;IAEM,SAAS,CAAC,KAAkB;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAEM,SAAS,CAAC,aAAa,GAAG,IAAI;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,6BAA6B;QAC7B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAErD,sBAAsB;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CACzC,MAAM,EACN,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,aAAa,GAAG,IAAI,CAChD,CAAC;QAEF,4DAA4D;QAC5D,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC,EAAE,aAAa,CAAC,CAAC;IACpB,CAAC;IAEM,KAAK,CAAC,SAAS,CACpB,MAAmD;QAEnD,IAAI,CAAC,CAAC,WAAW,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,qCAAqC;QACrC,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,CAAC;QAE9C,sEAAsE;QACtE,+CAA+C;QAC/C,wEAAwE;QAExE,4EAA4E;QAC5E,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,sCAAsC;QACtC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawAudioProcessor.generated.d.ts","sourceRoot":"","sources":["../../../src/platform/web/rawAudioProcessor.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,yDAgIjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawAudioProcessor.generated.js","sourceRoot":"","sources":["../../../src/platform/web/rawAudioProcessor.generated.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,yBAAyB,CAC5D,mBAAmB;AACnB,sBAAsB;AACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4HD,CACA,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scribeAudioProcessor.generated.d.ts","sourceRoot":"","sources":["../../../src/platform/web/scribeAudioProcessor.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,yDA8GpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scribeAudioProcessor.generated.js","sourceRoot":"","sources":["../../../src/platform/web/scribeAudioProcessor.generated.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,CAC/D,sBAAsB;AACtB,sBAAsB;AACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0GD,CACA,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ScribeMicrophoneSetup } from "../../scribe/microphone.js";
|
|
2
|
+
/**
|
|
3
|
+
* Web implementation of Scribe microphone streaming.
|
|
4
|
+
*
|
|
5
|
+
* Uses `navigator.mediaDevices.getUserMedia`, `AudioContext`, and an
|
|
6
|
+
* `AudioWorkletNode` to capture, resample, and encode microphone audio
|
|
7
|
+
* as base64 PCM16 chunks.
|
|
8
|
+
*/
|
|
9
|
+
export declare const webScribeMicrophoneSetup: ScribeMicrophoneSetup;
|
|
10
|
+
//# sourceMappingURL=scribeMicrophone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scribeMicrophone.d.ts","sourceRoot":"","sources":["../../../src/platform/web/scribeMicrophone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAMpC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,qBAmEtC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { arrayBufferToBase64 } from "../../utils/audio.js";
|
|
2
|
+
import { loadScribeAudioProcessor } from "./scribeAudioProcessor.generated.js";
|
|
3
|
+
const TARGET_SAMPLE_RATE = 16000;
|
|
4
|
+
/**
|
|
5
|
+
* Web implementation of Scribe microphone streaming.
|
|
6
|
+
*
|
|
7
|
+
* Uses `navigator.mediaDevices.getUserMedia`, `AudioContext`, and an
|
|
8
|
+
* `AudioWorkletNode` to capture, resample, and encode microphone audio
|
|
9
|
+
* as base64 PCM16 chunks.
|
|
10
|
+
*/
|
|
11
|
+
export const webScribeMicrophoneSetup = async (config, onAudioData) => {
|
|
12
|
+
// Get microphone access
|
|
13
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
14
|
+
audio: {
|
|
15
|
+
deviceId: config.deviceId,
|
|
16
|
+
echoCancellation: config.echoCancellation ?? true,
|
|
17
|
+
noiseSuppression: config.noiseSuppression ?? true,
|
|
18
|
+
autoGainControl: config.autoGainControl ?? true,
|
|
19
|
+
channelCount: config.channelCount ?? 1,
|
|
20
|
+
sampleRate: { ideal: TARGET_SAMPLE_RATE },
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
// Get the actual sample rate from the stream — the ideal may not have been honored
|
|
24
|
+
const [audioTrack] = stream.getAudioTracks();
|
|
25
|
+
const streamSampleRate = audioTrack?.getSettings().sampleRate;
|
|
26
|
+
// Create audio context matching the stream's sample rate to avoid Firefox errors.
|
|
27
|
+
// Firefox requires the AudioContext to match the microphone's native sample rate.
|
|
28
|
+
const audioContext = new AudioContext(streamSampleRate ? { sampleRate: streamSampleRate } : {});
|
|
29
|
+
// Load scribe worklet
|
|
30
|
+
await loadScribeAudioProcessor(audioContext.audioWorklet);
|
|
31
|
+
// Set up audio pipeline
|
|
32
|
+
const source = audioContext.createMediaStreamSource(stream);
|
|
33
|
+
const scribeNode = new AudioWorkletNode(audioContext, "scribeAudioProcessor");
|
|
34
|
+
// Configure the worklet with sample rate info for resampling
|
|
35
|
+
// (only needed when AudioContext sample rate differs from target)
|
|
36
|
+
if (audioContext.sampleRate !== TARGET_SAMPLE_RATE) {
|
|
37
|
+
scribeNode.port.postMessage({
|
|
38
|
+
type: "configure",
|
|
39
|
+
inputSampleRate: audioContext.sampleRate,
|
|
40
|
+
outputSampleRate: TARGET_SAMPLE_RATE,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
// Handle audio data from worklet
|
|
44
|
+
scribeNode.port.onmessage = event => {
|
|
45
|
+
onAudioData(arrayBufferToBase64(event.data.audioData));
|
|
46
|
+
};
|
|
47
|
+
// Connect audio pipeline
|
|
48
|
+
source.connect(scribeNode);
|
|
49
|
+
// Resume audio context if needed
|
|
50
|
+
if (audioContext.state === "suspended") {
|
|
51
|
+
await audioContext.resume();
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
mediaStreamTrack: audioTrack,
|
|
55
|
+
cleanup: () => {
|
|
56
|
+
for (const track of stream.getTracks()) {
|
|
57
|
+
track.stop();
|
|
58
|
+
}
|
|
59
|
+
source.disconnect();
|
|
60
|
+
scribeNode.disconnect();
|
|
61
|
+
void audioContext.close();
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=scribeMicrophone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scribeMicrophone.js","sourceRoot":"","sources":["../../../src/platform/web/scribeMicrophone.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA0B,KAAK,EAClE,MAA8B,EAC9B,WAA0C,EACT,EAAE;IACnC,wBAAwB;IACxB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;QACvD,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI;YACjD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI;YACjD,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;YAC/C,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC;YACtC,UAAU,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE;SAC1C;KACF,CAAC,CAAC;IAEH,mFAAmF;IACnF,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAC7C,MAAM,gBAAgB,GAAG,UAAU,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC;IAE9D,kFAAkF;IAClF,kFAAkF;IAClF,MAAM,YAAY,GAAG,IAAI,YAAY,CACnC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CACzD,CAAC;IAEF,sBAAsB;IACtB,MAAM,wBAAwB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAE1D,wBAAwB;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;IAE9E,6DAA6D;IAC7D,kEAAkE;IAClE,IAAI,YAAY,CAAC,UAAU,KAAK,kBAAkB,EAAE,CAAC;QACnD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1B,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,YAAY,CAAC,UAAU;YACxC,gBAAgB,EAAE,kBAAkB;SACrC,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE;QAClC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3B,iCAAiC;IACjC,IAAI,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,UAAU;QAC5B,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YACD,MAAM,CAAC,UAAU,EAAE,CAAC;YACpB,UAAU,CAAC,UAAU,EAAE,CAAC;YACxB,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type VolumeProvider } from "../../utils/volumeProvider.js";
|
|
2
|
+
export { type VolumeProvider } from "../../utils/volumeProvider.js";
|
|
3
|
+
export declare function createAnalyserVolumeProvider(analyser: AnalyserNode, sampleRate: number): VolumeProvider;
|
|
4
|
+
//# sourceMappingURL=volumeProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volumeProvider.d.ts","sourceRoot":"","sources":["../../../src/platform/web/volumeProvider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,cAAc,CAqBhB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { calculateVolume } from "../../utils/calculateVolume.js";
|
|
2
|
+
import { resampleVoiceRange, } from "../../utils/volumeProvider.js";
|
|
3
|
+
export function createAnalyserVolumeProvider(analyser, sampleRate) {
|
|
4
|
+
const binCount = analyser.frequencyBinCount;
|
|
5
|
+
let rawData;
|
|
6
|
+
// Resampled buffer used by getVolume() so the scalar is computed from the
|
|
7
|
+
// voice-frequency range only, matching RN's RMS processor behaviour.
|
|
8
|
+
let voiceData;
|
|
9
|
+
return {
|
|
10
|
+
getVolume() {
|
|
11
|
+
rawData ??= new Uint8Array(binCount);
|
|
12
|
+
voiceData ??= new Uint8Array(binCount);
|
|
13
|
+
analyser.getByteFrequencyData(rawData);
|
|
14
|
+
resampleVoiceRange(rawData, voiceData, sampleRate);
|
|
15
|
+
return calculateVolume(voiceData);
|
|
16
|
+
},
|
|
17
|
+
getByteFrequencyData(buffer) {
|
|
18
|
+
rawData ??= new Uint8Array(binCount);
|
|
19
|
+
analyser.getByteFrequencyData(rawData);
|
|
20
|
+
resampleVoiceRange(rawData, buffer, sampleRate);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=volumeProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volumeProvider.js","sourceRoot":"","sources":["../../../src/platform/web/volumeProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAEL,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAIvC,MAAM,UAAU,4BAA4B,CAC1C,QAAsB,EACtB,UAAkB;IAElB,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IAC5C,IAAI,OAA4C,CAAC;IACjD,0EAA0E;IAC1E,qEAAqE;IACrE,IAAI,SAA8C,CAAC;IAEnD,OAAO;QACL,SAAS;YACP,OAAO,KAAK,IAAI,UAAU,CAAC,QAAQ,CAA4B,CAAC;YAChE,SAAS,KAAK,IAAI,UAAU,CAAC,QAAQ,CAA4B,CAAC;YAClE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACvC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACnD,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,oBAAoB,CAAC,MAA+B;YAClD,OAAO,KAAK,IAAI,UAAU,CAAC,QAAQ,CAA4B,CAAC;YAChE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACvC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RemoteAudioTrack } from "livekit-client";
|
|
2
|
+
import type { FormatConfig } from "../../utils/BaseConnection.js";
|
|
3
|
+
import type { WebRTCAudioAdapter, AnalysisResult } from "../../WebRTCAudioAdapter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Web implementation of {@link WebRTCAudioAdapter}.
|
|
6
|
+
*
|
|
7
|
+
* Uses AudioContext, HTMLAudioElement, and AudioWorkletNode to:
|
|
8
|
+
* - Attach remote audio tracks for playback via the DOM
|
|
9
|
+
* - Analyse input/output volume via AnalyserNode
|
|
10
|
+
* - Capture raw output audio via an AudioWorklet for the `onAudio` callback
|
|
11
|
+
*/
|
|
12
|
+
export declare class WebAudioAdapter implements WebRTCAudioAdapter {
|
|
13
|
+
private audioElements;
|
|
14
|
+
private inputAudioContext;
|
|
15
|
+
private audioCaptureContext;
|
|
16
|
+
attachRemoteTrack(track: RemoteAudioTrack, outputDeviceId: string | null): Promise<void>;
|
|
17
|
+
setupInputAnalysis(mediaStreamTrack: MediaStreamTrack): AnalysisResult;
|
|
18
|
+
setupOutputAnalysis(track: RemoteAudioTrack, format: FormatConfig, onAudioData: (audioData: ArrayBuffer, maxVolume: number) => void): Promise<AnalysisResult>;
|
|
19
|
+
setVolume(volume: number): void;
|
|
20
|
+
setOutputDevice(deviceId: string): Promise<void>;
|
|
21
|
+
cleanup(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=webAudioAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webAudioAdapter.d.ts","sourceRoot":"","sources":["../../../src/platform/web/webAudioAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACf,MAAM,6BAA6B,CAAC;AAIrC;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,kBAAkB;IACxD,OAAO,CAAC,aAAa,CAA0B;IAE/C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,mBAAmB,CAA6B;IAElD,iBAAiB,CACrB,KAAK,EAAE,gBAAgB,EACvB,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,CAAC;IAyBhB,kBAAkB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,cAAc;IAsBhE,mBAAmB,CACvB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAC/D,OAAO,CAAC,cAAc,CAAC;IAgD1B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMzB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtD,OAAO,IAAI,IAAI;CAuBhB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { loadRawAudioProcessor } from "./rawAudioProcessor.generated.js";
|
|
2
|
+
import { createAnalyserVolumeProvider } from "./volumeProvider.js";
|
|
3
|
+
/**
|
|
4
|
+
* Web implementation of {@link WebRTCAudioAdapter}.
|
|
5
|
+
*
|
|
6
|
+
* Uses AudioContext, HTMLAudioElement, and AudioWorkletNode to:
|
|
7
|
+
* - Attach remote audio tracks for playback via the DOM
|
|
8
|
+
* - Analyse input/output volume via AnalyserNode
|
|
9
|
+
* - Capture raw output audio via an AudioWorklet for the `onAudio` callback
|
|
10
|
+
*/
|
|
11
|
+
export class WebAudioAdapter {
|
|
12
|
+
audioElements = [];
|
|
13
|
+
inputAudioContext = null;
|
|
14
|
+
audioCaptureContext = null;
|
|
15
|
+
async attachRemoteTrack(track, outputDeviceId) {
|
|
16
|
+
const audioElement = track.attach();
|
|
17
|
+
audioElement.autoplay = true;
|
|
18
|
+
audioElement.controls = false;
|
|
19
|
+
// Set output device if one was previously selected
|
|
20
|
+
if (outputDeviceId && audioElement.setSinkId) {
|
|
21
|
+
try {
|
|
22
|
+
await audioElement.setSinkId(outputDeviceId);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.warn("Failed to set output device for new audio element:", error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Add to DOM (hidden) to ensure it plays
|
|
29
|
+
audioElement.style.display = "none";
|
|
30
|
+
document.body.appendChild(audioElement);
|
|
31
|
+
// Store reference for volume control and cleanup
|
|
32
|
+
this.audioElements.push(audioElement);
|
|
33
|
+
}
|
|
34
|
+
setupInputAnalysis(mediaStreamTrack) {
|
|
35
|
+
// Clean up previous input audio context
|
|
36
|
+
if (this.inputAudioContext) {
|
|
37
|
+
this.inputAudioContext.close().catch(() => { });
|
|
38
|
+
this.inputAudioContext = null;
|
|
39
|
+
}
|
|
40
|
+
const ctx = new AudioContext();
|
|
41
|
+
const analyser = ctx.createAnalyser();
|
|
42
|
+
const source = ctx.createMediaStreamSource(new MediaStream([mediaStreamTrack]));
|
|
43
|
+
source.connect(analyser);
|
|
44
|
+
this.inputAudioContext = ctx;
|
|
45
|
+
return {
|
|
46
|
+
volumeProvider: createAnalyserVolumeProvider(analyser, ctx.sampleRate),
|
|
47
|
+
analyser,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async setupOutputAnalysis(track, format, onAudioData) {
|
|
51
|
+
// Clean up previous audio capture context
|
|
52
|
+
if (this.audioCaptureContext) {
|
|
53
|
+
this.audioCaptureContext.close().catch(() => { });
|
|
54
|
+
this.audioCaptureContext = null;
|
|
55
|
+
}
|
|
56
|
+
// Create audio context for processing
|
|
57
|
+
const audioContext = new AudioContext();
|
|
58
|
+
this.audioCaptureContext = audioContext;
|
|
59
|
+
// Create analyser for frequency data
|
|
60
|
+
const analyser = audioContext.createAnalyser();
|
|
61
|
+
analyser.fftSize = 2048;
|
|
62
|
+
analyser.smoothingTimeConstant = 0.8;
|
|
63
|
+
// Create MediaStream from the track
|
|
64
|
+
const mediaStream = new MediaStream([track.mediaStreamTrack]);
|
|
65
|
+
// Create audio source from the stream
|
|
66
|
+
const source = audioContext.createMediaStreamSource(mediaStream);
|
|
67
|
+
const volumeProvider = createAnalyserVolumeProvider(analyser, audioContext.sampleRate);
|
|
68
|
+
await loadRawAudioProcessor(audioContext.audioWorklet);
|
|
69
|
+
const worklet = new AudioWorkletNode(audioContext, "rawAudioProcessor");
|
|
70
|
+
// Configure the processor and set up the message listener
|
|
71
|
+
// before connecting the graph, so no early messages are missed.
|
|
72
|
+
worklet.port.postMessage({
|
|
73
|
+
type: "setFormat",
|
|
74
|
+
format: format.format,
|
|
75
|
+
sampleRate: format.sampleRate,
|
|
76
|
+
});
|
|
77
|
+
worklet.port.onmessage = (event) => {
|
|
78
|
+
const [audioData, maxVolume] = event.data;
|
|
79
|
+
onAudioData(audioData.buffer, maxVolume);
|
|
80
|
+
};
|
|
81
|
+
// Connect the audio graph: source → analyser → worklet
|
|
82
|
+
source.connect(analyser);
|
|
83
|
+
analyser.connect(worklet);
|
|
84
|
+
return { volumeProvider, analyser };
|
|
85
|
+
}
|
|
86
|
+
setVolume(volume) {
|
|
87
|
+
for (const element of this.audioElements) {
|
|
88
|
+
element.volume = volume;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async setOutputDevice(deviceId) {
|
|
92
|
+
if (!("setSinkId" in HTMLAudioElement.prototype)) {
|
|
93
|
+
throw new Error("setSinkId is not supported in this browser");
|
|
94
|
+
}
|
|
95
|
+
await Promise.all(this.audioElements.map(async (element) => {
|
|
96
|
+
try {
|
|
97
|
+
await element.setSinkId(deviceId);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error("Failed to set sink ID for audio element:", error);
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
cleanup() {
|
|
106
|
+
// Clean up input audio context
|
|
107
|
+
if (this.inputAudioContext) {
|
|
108
|
+
this.inputAudioContext.close().catch(error => {
|
|
109
|
+
console.warn("Error closing input audio context:", error);
|
|
110
|
+
});
|
|
111
|
+
this.inputAudioContext = null;
|
|
112
|
+
}
|
|
113
|
+
// Clean up audio capture context
|
|
114
|
+
if (this.audioCaptureContext) {
|
|
115
|
+
this.audioCaptureContext.close().catch(error => {
|
|
116
|
+
console.warn("Error closing audio capture context:", error);
|
|
117
|
+
});
|
|
118
|
+
this.audioCaptureContext = null;
|
|
119
|
+
}
|
|
120
|
+
// Clean up audio elements
|
|
121
|
+
for (const element of this.audioElements) {
|
|
122
|
+
element.remove();
|
|
123
|
+
}
|
|
124
|
+
this.audioElements = [];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=webAudioAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webAudioAdapter.js","sourceRoot":"","sources":["../../../src/platform/web/webAudioAdapter.ts"],"names":[],"mappings":"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"}
|