hanc-webrtc-widgets 2.4.3 → 2.4.4
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.
|
@@ -181,7 +181,7 @@ a=extmap-allow-mixed`)!==-1){const g=t.sdp.split(`
|
|
|
181
181
|
</div>
|
|
182
182
|
`,"outputLatency","INIT_WASM_PROCESSOR","logs","ue boom","store","antlion wireless microphone","createWAVBlob","MODEL_NOT_FOUND","STATE","usb/xlr dynamic microphone","charCodeAt","1672448QvIZkP","KrispSDK:init","AudioFiletrNode:constructor","jbl go","audioengine","inc2000","message","mi portable bluetooth speaker","_malloc","SDK_ALREADY_INITIALIZED","lg ph1(2a)","jbl charge","stadia controller rev. a","rog eye s","razer nommo chroma","audio/wav; codecs=wav","1062s","anker soundcore boost","logi rally bar mini audio","sembrandt ht3000","auna mic cm900","enableOnceReady","razer base station v2 chroma","ready elite","BVC:add","DISABLE_VAD","hypemic","audiohub speaker","unloadModuleModel","movo-um700","konftel ego","logi mx sound","aoni microphone","røde nt-usb","Loading compatible devices from: ","bluetooth music","jbl tuner fm","map","Preparing BVC compatible devices list","blue snowball","_inputData","Logger is not initialized","logAudio","anker powerconf s3(大会議室)","audiopro x5 microphone","klipsch groove","live streamer cam313 microphone","state","TOGGLE","bind","ln01a",'"><source src="',"SDK is not initialized","send","KrispSDK","_state","MIN_BVC_SUPPORT_SAMPLE_RATE","dell slim soundbar sb521a","philips s3505","SET_AUDIO_PROCESSOR_READY","soundsticks","paths","xech t2s","polycom","logic sp2","cambridge audio one","loadModel","collectFrom","trust gxt 242 microphone","KWebWorker","WORKLET_URL","AudioFilterNode:isNCEnabled","obsbot tiny 4k microphone","instances","querySelector","sennheiser xs lav usb-c","mts-2026","enable","AudioFilterNode","spa4040b","_fetchFile","_isReady","data","responseType","anker powerconf s3","mu900","gxt 244 microphone","Adding Runtime BVC allowed device","usb lcs","cmteck","akg s30","cybertrack h6","dispose","creating web worker (type: module)","AudioFilterNode:enableNC","sennheiser sp 30","worker","mediaDevices","megablast","samson gomic","_channelData","result","connectedCallback","threadName","logitech x50","gxt 256 microphone","webcam","AudioFilterNode:constructor","label",`<p>
|
|
183
183
|
<audio controls title="recording-input-`,"onmousemove","logitech speakerphone p710e","display","hk onyx studio 4","kz-dc4k audio","revolabs digital audio device","axcs speaker","wba31","fifine k690 microphone","BVC_ALLOWED_DEVICES","VAD_CB","removeDebugWidget","useBVC","onmessage","at2005usb","subarray","port1","clientY","srs-xb43","BVC:remove","isEnabled","chat 150",`
|
|
184
|
-
<p>Recording: `,"soundtech","KrispSDK:preload","printAvailableReadAndWrite","stanmore speaker","sp-ad70-a","hasInvalidFilePath","ready","forceAllowBVC","absolute","createObjectURL","prototype","isSupported","enumerateDevices","isNcEnabled","INVALID_MODEL_URL","yeti","ModelLoader","WORKLET_PROCESSOR_NAME","jbl pulse 3"];return Bs=function(){return i},Bs()}const Ke=vI;(function(i,A){const e=vI,t=i();for(;;)try{if(parseInt(e(427))/1*(parseInt(e(488))/2)+parseInt(e(418))/3*(parseInt(e(509))/4)+parseInt(e(423))/5*(-parseInt(e(503))/6)+parseInt(e(460))/7+parseInt(e(472))/8+-parseInt(e(478))/9*(-parseInt(e(448))/10)+-parseInt(e(465))/11===A)break;t.push(t.shift())}catch{t.push(t.shift())}})(Es,590710);function vI(i,A){const e=Es();return vI=function(t,g){return t=t-418,e[t]},vI(i,A)}function Es(){const i=["model16","token","ject is no","rning earl","Server res","4UxfDAa","Bearer ","modelPaths","ugin, retu","iveKit pro","te. Server","setEnabled","statusText","Could not ","shed yet.","Krisp: Not","ld not ena","us ","se filter","createMedi","bleState","Krisp: Cou","isEnabled","warn","audioConte","abling noi","stream","model8","status","livekit","bufferOver","onEnable","json","Krisp: Ena","aStreamDes","createNois","enable","replace","1201299HSSAAe","isSupporte","debug","vekit.io/i","model32","1269155XLbAQH","settings","ntegration"," first","1Bqtovj"," missing","eFilter","it wasn't "," with stat","e filter"," not publi","enhancedNo","Krisp: Def","noise filt","t supporte","er, this L","enabled an","desiredEna","Models are","https://li","ation"," enabling ","not restar","ble plugin","SDK not in","1270Rstlki","zed","disable","h status ","erring ena","debugLogs"," responded","iseCancell","tination","node, but ","startsWith","Krisp: Det","7757155WjQtwu","t without ","Krisp: Dis","node","init","20733482QXslvX","restart","Krisp: Err","or disabli","itialized","til SDK is",", track is","5757560UMZDdX","disable pl","ng SDK","to enable/","or disposi","yways","1827hMCuhx","connect","dispose","connecting","ng filter ","s/enc/v1","aStreamSou","flowMs","isReady","Krisp: Can","950658wrRENs","bling nois"," loaded","http","onPublish","rce","ected newe","authentica","ponded wit","disconnect","blement un","isInitiali","url","engine","r request ","6RTcZIV"];return Es=function(){return i},Es()}const Yi=fi(Ke(533));var cg,_t,LI,_o,eo,xn,UI,cs,Gx,Fx,vx,Lx,MQ,Ux,GQ,Tx;class FQ{constructor(A){hi(this,MQ),hi(this,GQ),hi(this,cg,void 0),hi(this,_t,void 0),hi(this,LI,!1),hi(this,_o,void 0),hi(this,eo,void 0),hi(this,xn,void 0),hi(this,UI,void 0),hi(this,cs,void 0),di(this,Gx,!1),di(this,Fx,!0),di(this,vx),di(this,Lx),Lt(this,UI,A)}static[Ke(419)+"d"](){return Mx[Ke(419)+"d"]()}get[(Gx=Ke(486),Fx=Ke(440)+Ke(524),vx=Ke(528)+"xt",Ke(499)+Ke(449))](){return WA(this,LI)}async[(Lx=Ke(535),Ke(464))](){var A,e;const t=Ke,{model8:g,model16:o,model32:n}=await vd(this,GQ,Tx).call(this);if(!WA(this,cg)){if(!g||!o||!o)throw new Error(t(441)+t(428));Lt(this,cg,new Mx({params:{debugLogs:(A=WA(this,UI))==null?void 0:A[t(453)],logProcessStats:!1,useSharedArrayBuffer:!1,bufferOverflowMS:((e=WA(this,UI))==null?void 0:e[t(534)+t(485)])??50,models:{model8:g,model16:o,model32:n}}}))}await WA(this,cg)[t(464)](),Lt(this,LI,!0)}[Ke(480)](){var A,e,t,g,o;const n=Ke;(A=this[n(535)])==null||A.call(this,!1),Lt(this,xn,void 0);let I=(e=WA(this,_t))==null?void 0:e[n(526)]();try{(t=WA(this,_t))==null||t[n(450)]()}catch(a){I?Yi[n(527)](n(467)+n(468)+n(482)+n(463),a):Yi[n(420)](n(467)+n(468)+n(482)+n(457)+n(430)+n(439)+n(477),a)}try{(g=WA(this,_t))==null||g[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(482)+n(463),a)}try{(o=WA(this,cg))==null||o[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(474),a)}Lt(this,cg,void 0),Lt(this,LI,!1),this[n(486)]=!1,clearInterval(WA(this,cs))}async[Ke(479)](A,e){const t=Ke;if(!WA(this,cg))throw new TypeError(t(447)+t(469));return Lt(this,_t,await WA(this,cg)[t(539)+t(429)]({audioContext:A,stream:e},async()=>{const g=t;this[g(486)]=!0},()=>{const g=t;this[g(486)]=!1})),this[t(528)+"xt"]=A,Lt(this,_o,this[t(528)+"xt"][t(523)+t(484)+t(493)](e)),WA(this,eo)??Lt(this,eo,this[t(528)+"xt"][t(523)+t(538)+t(456)]()),WA(this,_o)[t(479)](WA(this,_t))[t(479)](WA(this,eo)),WA(this,eo)[t(530)]}async[Ke(492)](A){Lt(this,xn,A)}async[Ke(515)](A){var e,t,g,o,n,I,a;const s=Ke;if(this[s(440)+s(524)]=A,!this[s(486)]&&(Yi[s(420)](s(435)+s(452)+s(498)+s(470)+s(490)),await new Promise(C=>{Lt(this,cs,setInterval(()=>{this[vI(486)]&&C(void 0)},20))})),A!==this[s(440)+s(524)]){Yi[s(420)](s(459)+s(494)+s(502)+s(475)+s(473)+s(512)+s(507)+"y");return}return A?WA(this,xn)?await vd(this,MQ,Ux).call(this,WA(this,xn))?(Yi[s(420)](s(537)+s(489)+s(432)),(g=WA(this,_t))==null||g[s(540)](),(o=this[s(535)])==null||o.call(this,!0),!0):(Yi[s(527)](s(519)+s(444)+s(436)+s(438)+s(513)+s(506)+s(437)+"d."),(n=WA(this,_t))==null||n[s(450)](),(I=this[s(535)])==null||I.call(this,!1),!1):(Yi[s(527)](s(525)+s(520)+s(446)+s(471)+s(433)+s(518)),(a=this[s(535)])==null||a.call(this,!1),!1):(Yi[s(420)](s(462)+s(529)+s(522)),(e=WA(this,_t))==null||e[s(450)](),(t=this[s(535)])==null||t.call(this,!1),!1)}[Ke(526)](){const A=Ke;return this[A(499)+A(449)]&&this[A(486)]&&!!WA(this,_t)&&WA(this,_t)[A(526)]()}async[Ke(466)](A){var e,t;const g=Ke;if(!WA(this,_t)||!WA(this,eo)||!WA(this,_o)||!this[g(528)+"xt"])throw Error(g(487)+g(445)+g(461)+g(481)+g(426));return WA(this,_o)[g(497)](),(e=WA(this,_t))==null||e[g(497)](WA(this,eo)),(t=WA(this,_t))==null||t[g(480)](),Lt(this,_o,void 0),this[g(479)](this[g(528)+"xt"],A)}}cg=new WeakMap,_t=new WeakMap,LI=new WeakMap,_o=new WeakMap,eo=new WeakMap,xn=new WeakMap,UI=new WeakMap,cs=new WeakMap,MQ=new WeakSet,Ux=async function(i){const A=Ke;let e=i[A(501)][A(500)];e[A(458)]("ws")&&(e=e[A(541)](/^(ws)/,A(491)));const t=i[A(501)][A(505)],g=new URL(A(424),e),o=await fetch(g,{headers:{authorization:A(510)+t}});if(o.ok)return(await o[A(536)]())[A(434)+A(455)+A(443)]===!0;throw new Error(A(517)+A(495)+A(514)+A(454)+A(431)+A(521)+o[A(532)]+": "+o[A(516)])},GQ=new WeakSet,Tx=async function(){const i=Ke,A=await fetch(i(442)+i(421)+i(425)+i(483));if(A.ok){const e=await A[i(536)]();return{model8:e[i(511)][i(531)],model16:e[i(511)][i(504)],model32:e[i(511)][i(422)]}}else throw new Error(i(508)+i(496)+i(451)+A[i(532)]+": "+A[i(516)])};const vQ=fi("livekit");var Tt;class Kx{constructor(A){di(this,"name","livekit-noise-filter"),di(this,"processedTrack"),di(this,"trackSettings"),di(this,"originalTrack"),hi(this,Tt,void 0),di(this,"init",async e=>{vQ.debug("Krisp: Initializing track processor"),this.originalTrack=e.track,this.trackSettings=e.track.getSettings(),e.audioContext.sampleRate!==this.trackSettings.sampleRate&&vQ.debug("Krisp: Sample rate mismatch, reapplying"),await e.track.applyConstraints({...this.trackSettings,noiseSuppression:!1,voiceIsolation:!1,sampleRate:e.audioContext.sampleRate}),WA(this,Tt)||Lt(this,Tt,new FQ),WA(this,Tt).onEnable=t=>{var g;const o=new Event(`${t?"enable":"disable"}-lk-krisp-noise-filter`);(g=this.processedTrack)==null||g.dispatchEvent(o)},await WA(this,Tt).init(),this.processedTrack=(await WA(this,Tt).connect(e.audioContext,new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"restart",async e=>{if(!WA(this,Tt))throw Error("LiveKit-Krisp: Cannot restart without having initialized first");vQ.debug("Krisp: Restarting plugin"),this.processedTrack=(await WA(this,Tt).restart(new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"destroy",async()=>{var e,t;(e=WA(this,Tt))==null||e.dispose(),await((t=this.originalTrack)==null?void 0:t.applyConstraints(this.trackSettings))}),Lt(this,Tt,new FQ(A))}static isSupported(){return FQ.isSupported()}async onPublish(A){WA(this,Tt).onPublish(A),this.setEnabled(!0)}async setEnabled(A){return await WA(this,Tt).setEnabled(A)}isEnabled(){return WA(this,Tt).isEnabled()}}Tt=new WeakMap;const Hy=Kx.isSupported,Py=i=>new Kx(i);class LQ extends EventTarget{constructor(){super(...arguments),this.room=null,this.callStatus="idle",this.isReady=!1,this.error=null,this.microphoneEnabled=!1,this.connectedParticipants=[],this.userIdentity="",this.roomName="",this.audioPlaybackPrompt=!1,this.isAppleDevice=/iPhone|iPad|iPod|Macintosh|Mac OS/i.test(navigator.userAgent),this.krispFilter=null,this.krispSupported=Hy(),this.pendingAudioTrack=null}set serviceUrl(A){this._serviceUrl=A}get serviceUrl(){return this._serviceUrl??"https://voice.hanc.ai"}get status(){return this.callStatus}get ready(){return this.isReady}get currentError(){return this.error}get currentRoom(){return this.room}get isMicrophoneEnabled(){return this.microphoneEnabled}get participants(){return this.connectedParticipants}get identity(){return this.userIdentity}get roomNameValue(){return this.roomName}get showAudioPrompt(){return this.audioPlaybackPrompt}updateStatus(A){this.callStatus=A,this.dispatchEvent(new CustomEvent("status-changed",{detail:A}))}async makeCall({agentId:A}){if(!(this.room&&this.room.state==="connected")){this.updateStatus("connecting"),this.error=null,this.isReady=!1,this.room&&(await this.room.disconnect(),this.room=null),this.pendingAudioTrack&&(this.pendingAudioTrack.stop(),this.pendingAudioTrack=null);try{const e={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};try{this.pendingAudioTrack=await Md(e),console.log("[AEC] Local audio track created for echo cancellation training")}catch(s){console.warn("[AEC] Could not create local audio track:",s)}const t=new gn;this.room=t,this.setupRoomEventListeners(t),this.setupGreetingDoneListener(t);const g=await fetch(`${this.serviceUrl}/create-room-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metadata:{agent_id:A,timestamp:Date.now(),is_apple_device:this.isAppleDevice}})});if(!g.ok){const s=await g.text();throw new Error(`Failed to get room token: ${g.status} ${s}`)}const{token:o,url:n,room_name:I,user_identity:a}=await g.json();this.roomName=I,this.userIdentity=a,await t.connect(n,o),this.updateStatus("connected"),this.isReady=!0,this.dispatchEvent(new CustomEvent("room-connected",{detail:{roomName:I,identity:a}}))}catch(e){this.error=`Connection failed: ${e instanceof Error?e.message:String(e)}`,this.updateStatus("error"),this.isReady=!1,this.room=null,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}}setupRoomEventListeners(A){A.on(oA.Connected,()=>{this.updateStatus("connected"),this.isReady=!0}),A.on(oA.Disconnected,()=>{this.updateStatus("disconnected"),this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.room=null,this.isReady=!1,this.krispFilter=null,this.dispatchEvent(new CustomEvent("disconnected"))}),A.on(oA.ParticipantConnected,e=>{this.connectedParticipants=[...this.connectedParticipants,e.identity];const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("agent-connected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-connected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(oA.ParticipantDisconnected,e=>{this.connectedParticipants=this.connectedParticipants.filter(g=>g!==e.identity);const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.audioPlaybackPrompt=!1,this.updateStatus("connected"),this.dispatchEvent(new CustomEvent("agent-disconnected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-disconnected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(oA.TrackSubscribed,(e,t,g)=>{if(e.kind==="audio"){const o=e.attach();document.body.appendChild(o),this.dispatchEvent(new CustomEvent("audio-track-added",{detail:{participant:g.identity,element:o}}));const n=e.mediaStreamTrack;n&&this.dispatchEvent(new CustomEvent("audio-track",{detail:n}))}}),A.on(oA.TrackUnsubscribed,(e,t,g)=>{e.detach(),this.dispatchEvent(new CustomEvent("audio-track-removed",{detail:{participant:g.identity}}))}),A.on(oA.MediaDevicesError,e=>{this.error=`Media device error: ${e.message}`,this.updateStatus("error"),this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}),A.on(oA.AudioPlaybackStatusChanged,async()=>{A.canPlaybackAudio||this.connectedParticipants.some(t=>t.includes("agent")||t.includes("voice-assistant")||t.includes("AJ_"))&&!this.audioPlaybackPrompt&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0),this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:A.canPlaybackAudio}}))})}setupGreetingDoneListener(A){A.on(oA.DataReceived,async e=>{try{JSON.parse(new TextDecoder().decode(e)).type==="greeting_done"&&(console.log("[AEC] Greeting done signal received, publishing audio track"),await this.publishPendingAudioTrack())}catch{}}),setTimeout(async()=>{this.pendingAudioTrack&&!this.microphoneEnabled&&(console.log("[AEC] Fallback: publishing audio track after timeout"),await this.publishPendingAudioTrack())},5e3)}async publishPendingAudioTrack(){if(!(!this.room||!this.pendingAudioTrack)&&!this.microphoneEnabled)try{await this.applyKrispFilter(this.pendingAudioTrack),await this.room.localParticipant.publishTrack(this.pendingAudioTrack),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled"));const A=this.pendingAudioTrack.mediaStreamTrack;A&&this.dispatchEvent(new CustomEvent("local-audio-track",{detail:A})),console.log("[AEC] Audio track published successfully"),this.pendingAudioTrack=null}catch(A){console.warn("[AEC] Failed to publish audio track:",A),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))}}async applyKrispFilter(A){if(!this.krispSupported){console.log("[Krisp] Not supported in this browser");return}try{this.krispFilter||(this.krispFilter=Py()),await A.setProcessor(this.krispFilter),console.log("[Krisp] Noise filter applied successfully")}catch(e){console.warn("[Krisp] Failed to apply noise filter:",e)}}async toggleMicrophone(){if(this.room)try{if(this.microphoneEnabled)await this.room.localParticipant.setMicrophoneEnabled(!1),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"));else{await this.room.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled"));const A=Array.from(this.room.localParticipant.audioTrackPublications.values()).find(e=>e.kind==="audio");A!=null&&A.track&&await this.applyKrispFilter(A.track)}}catch(A){this.error=`Failed to toggle microphone: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async enableAudio(){if(this.room)try{await this.room.startAudio(),this.audioPlaybackPrompt=!1;const A=JSON.stringify({type:"audio_enabled"}),t=new TextEncoder().encode(A);await this.room.localParticipant.publishData(t,{reliable:!0}),this.dispatchEvent(new CustomEvent("audio-enabled"))}catch(A){this.error=`Failed to enable audio: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async hangUp(){if(!this.room){this.error="No active connection to end.";return}this.updateStatus("disconnecting");const A=this.room;this.room=null,this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.isReady=!1,this.krispFilter=null,this.pendingAudioTrack&&(this.pendingAudioTrack.stop(),this.pendingAudioTrack=null),this.updateStatus("disconnected"),this.dispatchEvent(new CustomEvent("call-ended")),requestAnimationFrame(()=>{setTimeout(async()=>{try{await A.disconnect()}catch(e){console.warn("Error during room disconnect:",e)}},0)})}}/**
|
|
184
|
+
<p>Recording: `,"soundtech","KrispSDK:preload","printAvailableReadAndWrite","stanmore speaker","sp-ad70-a","hasInvalidFilePath","ready","forceAllowBVC","absolute","createObjectURL","prototype","isSupported","enumerateDevices","isNcEnabled","INVALID_MODEL_URL","yeti","ModelLoader","WORKLET_PROCESSOR_NAME","jbl pulse 3"];return Bs=function(){return i},Bs()}const Ke=vI;(function(i,A){const e=vI,t=i();for(;;)try{if(parseInt(e(427))/1*(parseInt(e(488))/2)+parseInt(e(418))/3*(parseInt(e(509))/4)+parseInt(e(423))/5*(-parseInt(e(503))/6)+parseInt(e(460))/7+parseInt(e(472))/8+-parseInt(e(478))/9*(-parseInt(e(448))/10)+-parseInt(e(465))/11===A)break;t.push(t.shift())}catch{t.push(t.shift())}})(Es,590710);function vI(i,A){const e=Es();return vI=function(t,g){return t=t-418,e[t]},vI(i,A)}function Es(){const i=["model16","token","ject is no","rning earl","Server res","4UxfDAa","Bearer ","modelPaths","ugin, retu","iveKit pro","te. Server","setEnabled","statusText","Could not ","shed yet.","Krisp: Not","ld not ena","us ","se filter","createMedi","bleState","Krisp: Cou","isEnabled","warn","audioConte","abling noi","stream","model8","status","livekit","bufferOver","onEnable","json","Krisp: Ena","aStreamDes","createNois","enable","replace","1201299HSSAAe","isSupporte","debug","vekit.io/i","model32","1269155XLbAQH","settings","ntegration"," first","1Bqtovj"," missing","eFilter","it wasn't "," with stat","e filter"," not publi","enhancedNo","Krisp: Def","noise filt","t supporte","er, this L","enabled an","desiredEna","Models are","https://li","ation"," enabling ","not restar","ble plugin","SDK not in","1270Rstlki","zed","disable","h status ","erring ena","debugLogs"," responded","iseCancell","tination","node, but ","startsWith","Krisp: Det","7757155WjQtwu","t without ","Krisp: Dis","node","init","20733482QXslvX","restart","Krisp: Err","or disabli","itialized","til SDK is",", track is","5757560UMZDdX","disable pl","ng SDK","to enable/","or disposi","yways","1827hMCuhx","connect","dispose","connecting","ng filter ","s/enc/v1","aStreamSou","flowMs","isReady","Krisp: Can","950658wrRENs","bling nois"," loaded","http","onPublish","rce","ected newe","authentica","ponded wit","disconnect","blement un","isInitiali","url","engine","r request ","6RTcZIV"];return Es=function(){return i},Es()}const Yi=fi(Ke(533));var cg,_t,LI,_o,eo,xn,UI,cs,Gx,Fx,vx,Lx,MQ,Ux,GQ,Tx;class FQ{constructor(A){hi(this,MQ),hi(this,GQ),hi(this,cg,void 0),hi(this,_t,void 0),hi(this,LI,!1),hi(this,_o,void 0),hi(this,eo,void 0),hi(this,xn,void 0),hi(this,UI,void 0),hi(this,cs,void 0),di(this,Gx,!1),di(this,Fx,!0),di(this,vx),di(this,Lx),Lt(this,UI,A)}static[Ke(419)+"d"](){return Mx[Ke(419)+"d"]()}get[(Gx=Ke(486),Fx=Ke(440)+Ke(524),vx=Ke(528)+"xt",Ke(499)+Ke(449))](){return WA(this,LI)}async[(Lx=Ke(535),Ke(464))](){var A,e;const t=Ke,{model8:g,model16:o,model32:n}=await vd(this,GQ,Tx).call(this);if(!WA(this,cg)){if(!g||!o||!o)throw new Error(t(441)+t(428));Lt(this,cg,new Mx({params:{debugLogs:(A=WA(this,UI))==null?void 0:A[t(453)],logProcessStats:!1,useSharedArrayBuffer:!1,bufferOverflowMS:((e=WA(this,UI))==null?void 0:e[t(534)+t(485)])??50,models:{model8:g,model16:o,model32:n}}}))}await WA(this,cg)[t(464)](),Lt(this,LI,!0)}[Ke(480)](){var A,e,t,g,o;const n=Ke;(A=this[n(535)])==null||A.call(this,!1),Lt(this,xn,void 0);let I=(e=WA(this,_t))==null?void 0:e[n(526)]();try{(t=WA(this,_t))==null||t[n(450)]()}catch(a){I?Yi[n(527)](n(467)+n(468)+n(482)+n(463),a):Yi[n(420)](n(467)+n(468)+n(482)+n(457)+n(430)+n(439)+n(477),a)}try{(g=WA(this,_t))==null||g[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(482)+n(463),a)}try{(o=WA(this,cg))==null||o[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(474),a)}Lt(this,cg,void 0),Lt(this,LI,!1),this[n(486)]=!1,clearInterval(WA(this,cs))}async[Ke(479)](A,e){const t=Ke;if(!WA(this,cg))throw new TypeError(t(447)+t(469));return Lt(this,_t,await WA(this,cg)[t(539)+t(429)]({audioContext:A,stream:e},async()=>{const g=t;this[g(486)]=!0},()=>{const g=t;this[g(486)]=!1})),this[t(528)+"xt"]=A,Lt(this,_o,this[t(528)+"xt"][t(523)+t(484)+t(493)](e)),WA(this,eo)??Lt(this,eo,this[t(528)+"xt"][t(523)+t(538)+t(456)]()),WA(this,_o)[t(479)](WA(this,_t))[t(479)](WA(this,eo)),WA(this,eo)[t(530)]}async[Ke(492)](A){Lt(this,xn,A)}async[Ke(515)](A){var e,t,g,o,n,I,a;const s=Ke;if(this[s(440)+s(524)]=A,!this[s(486)]&&(Yi[s(420)](s(435)+s(452)+s(498)+s(470)+s(490)),await new Promise(C=>{Lt(this,cs,setInterval(()=>{this[vI(486)]&&C(void 0)},20))})),A!==this[s(440)+s(524)]){Yi[s(420)](s(459)+s(494)+s(502)+s(475)+s(473)+s(512)+s(507)+"y");return}return A?WA(this,xn)?await vd(this,MQ,Ux).call(this,WA(this,xn))?(Yi[s(420)](s(537)+s(489)+s(432)),(g=WA(this,_t))==null||g[s(540)](),(o=this[s(535)])==null||o.call(this,!0),!0):(Yi[s(527)](s(519)+s(444)+s(436)+s(438)+s(513)+s(506)+s(437)+"d."),(n=WA(this,_t))==null||n[s(450)](),(I=this[s(535)])==null||I.call(this,!1),!1):(Yi[s(527)](s(525)+s(520)+s(446)+s(471)+s(433)+s(518)),(a=this[s(535)])==null||a.call(this,!1),!1):(Yi[s(420)](s(462)+s(529)+s(522)),(e=WA(this,_t))==null||e[s(450)](),(t=this[s(535)])==null||t.call(this,!1),!1)}[Ke(526)](){const A=Ke;return this[A(499)+A(449)]&&this[A(486)]&&!!WA(this,_t)&&WA(this,_t)[A(526)]()}async[Ke(466)](A){var e,t;const g=Ke;if(!WA(this,_t)||!WA(this,eo)||!WA(this,_o)||!this[g(528)+"xt"])throw Error(g(487)+g(445)+g(461)+g(481)+g(426));return WA(this,_o)[g(497)](),(e=WA(this,_t))==null||e[g(497)](WA(this,eo)),(t=WA(this,_t))==null||t[g(480)](),Lt(this,_o,void 0),this[g(479)](this[g(528)+"xt"],A)}}cg=new WeakMap,_t=new WeakMap,LI=new WeakMap,_o=new WeakMap,eo=new WeakMap,xn=new WeakMap,UI=new WeakMap,cs=new WeakMap,MQ=new WeakSet,Ux=async function(i){const A=Ke;let e=i[A(501)][A(500)];e[A(458)]("ws")&&(e=e[A(541)](/^(ws)/,A(491)));const t=i[A(501)][A(505)],g=new URL(A(424),e),o=await fetch(g,{headers:{authorization:A(510)+t}});if(o.ok)return(await o[A(536)]())[A(434)+A(455)+A(443)]===!0;throw new Error(A(517)+A(495)+A(514)+A(454)+A(431)+A(521)+o[A(532)]+": "+o[A(516)])},GQ=new WeakSet,Tx=async function(){const i=Ke,A=await fetch(i(442)+i(421)+i(425)+i(483));if(A.ok){const e=await A[i(536)]();return{model8:e[i(511)][i(531)],model16:e[i(511)][i(504)],model32:e[i(511)][i(422)]}}else throw new Error(i(508)+i(496)+i(451)+A[i(532)]+": "+A[i(516)])};const vQ=fi("livekit");var Tt;class Kx{constructor(A){di(this,"name","livekit-noise-filter"),di(this,"processedTrack"),di(this,"trackSettings"),di(this,"originalTrack"),hi(this,Tt,void 0),di(this,"init",async e=>{vQ.debug("Krisp: Initializing track processor"),this.originalTrack=e.track,this.trackSettings=e.track.getSettings(),e.audioContext.sampleRate!==this.trackSettings.sampleRate&&vQ.debug("Krisp: Sample rate mismatch, reapplying"),await e.track.applyConstraints({...this.trackSettings,noiseSuppression:!1,voiceIsolation:!1,sampleRate:e.audioContext.sampleRate}),WA(this,Tt)||Lt(this,Tt,new FQ),WA(this,Tt).onEnable=t=>{var g;const o=new Event(`${t?"enable":"disable"}-lk-krisp-noise-filter`);(g=this.processedTrack)==null||g.dispatchEvent(o)},await WA(this,Tt).init(),this.processedTrack=(await WA(this,Tt).connect(e.audioContext,new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"restart",async e=>{if(!WA(this,Tt))throw Error("LiveKit-Krisp: Cannot restart without having initialized first");vQ.debug("Krisp: Restarting plugin"),this.processedTrack=(await WA(this,Tt).restart(new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"destroy",async()=>{var e,t;(e=WA(this,Tt))==null||e.dispose(),await((t=this.originalTrack)==null?void 0:t.applyConstraints(this.trackSettings))}),Lt(this,Tt,new FQ(A))}static isSupported(){return FQ.isSupported()}async onPublish(A){WA(this,Tt).onPublish(A),this.setEnabled(!0)}async setEnabled(A){return await WA(this,Tt).setEnabled(A)}isEnabled(){return WA(this,Tt).isEnabled()}}Tt=new WeakMap;const Hy=Kx.isSupported,Py=i=>new Kx(i);class LQ extends EventTarget{constructor(){super(...arguments),this.room=null,this.callStatus="idle",this.isReady=!1,this.error=null,this.microphoneEnabled=!1,this.connectedParticipants=[],this.userIdentity="",this.roomName="",this.audioPlaybackPrompt=!1,this.isAppleDevice=/iPhone|iPad|iPod|Macintosh|Mac OS/i.test(navigator.userAgent),this.krispFilter=null,this.krispSupported=Hy(),this.pendingAudioTrack=null}set serviceUrl(A){this._serviceUrl=A}get serviceUrl(){return this._serviceUrl??"https://voice.hanc.ai"}get status(){return this.callStatus}get ready(){return this.isReady}get currentError(){return this.error}get currentRoom(){return this.room}get isMicrophoneEnabled(){return this.microphoneEnabled}get participants(){return this.connectedParticipants}get identity(){return this.userIdentity}get roomNameValue(){return this.roomName}get showAudioPrompt(){return this.audioPlaybackPrompt}updateStatus(A){this.callStatus=A,this.dispatchEvent(new CustomEvent("status-changed",{detail:A}))}async makeCall({agentId:A}){if(!(this.room&&this.room.state==="connected")){this.updateStatus("connecting"),this.error=null,this.isReady=!1,this.room&&(await this.room.disconnect(),this.room=null),this.pendingAudioTrack&&(this.pendingAudioTrack.stop(),this.pendingAudioTrack=null);try{const e={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};try{this.pendingAudioTrack=await Md(e),console.log("[AEC] Local audio track created for echo cancellation training")}catch(s){console.warn("[AEC] Could not create local audio track:",s)}const t=new gn({webAudioMix:!0});this.room=t,this.setupRoomEventListeners(t),this.setupGreetingDoneListener(t);const g=await fetch(`${this.serviceUrl}/create-room-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metadata:{agent_id:A,timestamp:Date.now(),is_apple_device:this.isAppleDevice}})});if(!g.ok){const s=await g.text();throw new Error(`Failed to get room token: ${g.status} ${s}`)}const{token:o,url:n,room_name:I,user_identity:a}=await g.json();this.roomName=I,this.userIdentity=a,await t.connect(n,o),this.updateStatus("connected"),this.isReady=!0,this.dispatchEvent(new CustomEvent("room-connected",{detail:{roomName:I,identity:a}}))}catch(e){this.error=`Connection failed: ${e instanceof Error?e.message:String(e)}`,this.updateStatus("error"),this.isReady=!1,this.room=null,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}}setupRoomEventListeners(A){A.on(oA.Connected,()=>{this.updateStatus("connected"),this.isReady=!0}),A.on(oA.Disconnected,()=>{this.updateStatus("disconnected"),this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.room=null,this.isReady=!1,this.krispFilter=null,this.dispatchEvent(new CustomEvent("disconnected"))}),A.on(oA.ParticipantConnected,e=>{this.connectedParticipants=[...this.connectedParticipants,e.identity];const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("agent-connected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-connected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(oA.ParticipantDisconnected,e=>{this.connectedParticipants=this.connectedParticipants.filter(g=>g!==e.identity);const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.audioPlaybackPrompt=!1,this.updateStatus("connected"),this.dispatchEvent(new CustomEvent("agent-disconnected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-disconnected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(oA.TrackSubscribed,(e,t,g)=>{if(e.kind==="audio"){const o=e.attach();document.body.appendChild(o),this.dispatchEvent(new CustomEvent("audio-track-added",{detail:{participant:g.identity,element:o}}));const n=e.mediaStreamTrack;n&&this.dispatchEvent(new CustomEvent("audio-track",{detail:n}))}}),A.on(oA.TrackUnsubscribed,(e,t,g)=>{e.detach(),this.dispatchEvent(new CustomEvent("audio-track-removed",{detail:{participant:g.identity}}))}),A.on(oA.MediaDevicesError,e=>{this.error=`Media device error: ${e.message}`,this.updateStatus("error"),this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}),A.on(oA.AudioPlaybackStatusChanged,async()=>{A.canPlaybackAudio||this.connectedParticipants.some(t=>t.includes("agent")||t.includes("voice-assistant")||t.includes("AJ_"))&&!this.audioPlaybackPrompt&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0),this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:A.canPlaybackAudio}}))})}setupGreetingDoneListener(A){A.on(oA.DataReceived,async e=>{try{JSON.parse(new TextDecoder().decode(e)).type==="greeting_done"&&(console.log("[AEC] Greeting done signal received, publishing audio track"),await this.publishPendingAudioTrack())}catch{}}),setTimeout(async()=>{this.pendingAudioTrack&&!this.microphoneEnabled&&(console.log("[AEC] Fallback: publishing audio track after timeout"),await this.publishPendingAudioTrack())},5e3)}async publishPendingAudioTrack(){if(!(!this.room||!this.pendingAudioTrack)&&!this.microphoneEnabled)try{await this.applyKrispFilter(this.pendingAudioTrack),await this.room.localParticipant.publishTrack(this.pendingAudioTrack),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled"));const A=this.pendingAudioTrack.mediaStreamTrack;A&&this.dispatchEvent(new CustomEvent("local-audio-track",{detail:A})),console.log("[AEC] Audio track published successfully"),this.pendingAudioTrack=null}catch(A){console.warn("[AEC] Failed to publish audio track:",A),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))}}async applyKrispFilter(A){if(!this.krispSupported){console.log("[Krisp] Not supported in this browser");return}try{this.krispFilter||(this.krispFilter=Py()),await A.setProcessor(this.krispFilter),console.log("[Krisp] Noise filter applied successfully")}catch(e){console.warn("[Krisp] Failed to apply noise filter:",e)}}async toggleMicrophone(){if(this.room)try{if(this.microphoneEnabled)await this.room.localParticipant.setMicrophoneEnabled(!1),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"));else{await this.room.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled"));const A=Array.from(this.room.localParticipant.audioTrackPublications.values()).find(e=>e.kind==="audio");A!=null&&A.track&&await this.applyKrispFilter(A.track)}}catch(A){this.error=`Failed to toggle microphone: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async enableAudio(){if(this.room)try{await this.room.startAudio(),this.audioPlaybackPrompt=!1;const A=JSON.stringify({type:"audio_enabled"}),t=new TextEncoder().encode(A);await this.room.localParticipant.publishData(t,{reliable:!0}),this.dispatchEvent(new CustomEvent("audio-enabled"))}catch(A){this.error=`Failed to enable audio: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async hangUp(){if(!this.room){this.error="No active connection to end.";return}this.updateStatus("disconnecting");const A=this.room;this.room=null,this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.isReady=!1,this.krispFilter=null,this.pendingAudioTrack&&(this.pendingAudioTrack.stop(),this.pendingAudioTrack=null),this.updateStatus("disconnected"),this.dispatchEvent(new CustomEvent("call-ended")),requestAnimationFrame(()=>{setTimeout(async()=>{try{await A.disconnect()}catch(e){console.warn("Error during room disconnect:",e)}},0)})}}/**
|
|
185
185
|
* @license
|
|
186
186
|
* Copyright 2010-2025 Three.js Authors
|
|
187
187
|
* SPDX-License-Identifier: MIT
|