From 20a6e30377fb3f05fb555ff96c74d98bdcf908ba Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Sun, 22 Feb 2026 09:13:02 +0100 Subject: [PATCH] v1.8.0: Server VAD interruption, partial response fix, configurable chunk size - Server VAD + interruption: mic stays open while agent speaks, server detects user voice and triggers interruption automatically. Echo suppression disabled in this mode so audio reaches the server. - Fix agent_chat_response_part parsing: ElevenLabs API now uses text_response_part.text instead of agent_chat_response_part_event. Added fallback for legacy format. - Expose MicChunkDurationMs as UPROPERTY (20-500ms, default 100ms) instead of compile-time constant. Co-Authored-By: Claude Opus 4.6 --- .../PS_AI_Agent/Content/test_AI_Actor.uasset | Bin 156705 -> 157912 bytes ...ElevenLabsConversationalAgentComponent.cpp | 60 ++++++++++++------ .../Private/ElevenLabsWebSocketProxy.cpp | 33 ++++++++-- .../ElevenLabsConversationalAgentComponent.h | 17 ++++- 4 files changed, 82 insertions(+), 28 deletions(-) diff --git a/Unreal/PS_AI_Agent/Content/test_AI_Actor.uasset b/Unreal/PS_AI_Agent/Content/test_AI_Actor.uasset index e58641efe931094387554336ccc4b3711c880c3c..0bd20df2e2a2a9536065faa291c267adbc4ab5c8 100644 GIT binary patch literal 157912 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

e< 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 literal 156705 zcmeEP2VfM{)}B=aMNyP)fdr8vErm2hO)rEJNT>o~Nj622-LSg}1QkWG0_wA)qNvzF z5g($W&xXF=r}CZ!6?+$Z#V*Q!zI*T4nVp^8Od3TqFgr8nmQ(II=bl?;^29mE-|)+> zUAt!QuW23k)3hJyilZZ)qn?X>8a)*O|x|UA{P1l5knB?S?n5@K@q~y%xjEwZe5ebPY=~?laNpW%M*-4Z|9{F^6mP(AE>l!M2 zZMvp8=zdm?rj^loHl6h+eY)VZ=wV* zJB0tM60oKp)ZV)wlqU)Fogpopki7AybrETWCEm&!|L_ct*EMPUoKsyTe(jgMp(g>+ zaFv$jF0XXEwDVHW%>x4r&U4q)`cY0Rir=*r(ct)HtSkY&shaD(^EUA%B5Y={_)2J391^AmR;p>`ZdSUZ9_te<+$9X zF0a<{zMh>9H&>bG_G_cwICm7-4#HJbU*pm)oKg9{q|NKBFYtP5TwZ^@mbd=HN>Nd* z-!suw;;O832}x;pyghd$#5#vK_RP;D1@KpT+}f`14*deP%t@mHq`{SSPQOcAv}(Z4 zZh&TZsv(T@+Bw7=iPP;W)#eR5ZcO)(#L1PuN(f*=zfq&W<(y1cnX|Ua?3g^12Cc4Ue+9h|-I05velb~z7m2Q7dZDpzU ze1{_^ktyg<5{=92c2-UDxyHMz>b3LUTQ#AFF+*X!&+n?9?DG1+I@kE!u*6Wtq8{K}%d7;^nt;iz_1!Z4f(B-zHjkRZcyw%R&Dzi&&eh9{tLAq1! z@z!fUFS_F2;D7GS zp1aJWojZEdhcMiXTA$xj&B7IgJMUWd9SBq!tu5Z=ISF;B=NzxIrUFhxyYGYTb%un( z5|`UG(c|%J|5|p#0k9`kB9I_TjVyTNV@MA+Sq^@F{yldh0Hr$M+Dl};GDkouqUXFh z5`1z|G9j1OMXpa9bZG7%v;d{}orSIvkGs^TZ7w=(e<-bTih{X?S8h)i*lWE)7~0nN zb`D3KS?~x!E@bP(PU~U5At@tA7Lbp1d1JH-=AW|`Qp_r?q;|;kln7rc1pIJu=ikAE zOp?yN!0E5h{+D*+S-p`^<*IYJ$2jNsjE&>05-wZ2WA(Qypoe;{v6Us{^(x3_GMqJ} z-!5(C*T0+srnB5maz&+uen|6)$TR@_-|AyI>EpH*^#}&9(TD=p&KQoHBA` zZe?jHS@O2~$~Onf1|c~w_01i}a#>@_$dQ@ERh6d(ZdACcq_VA_3Pym&l(o_)2-ogi z`{&CC3!44j`T`Gm810^^2OleWtE~>S|AcKTQw7lL^?1j+d_HHnORIUiwmr-t3qaxM z{Kv%nhIY>)`TC=TzG~Zl?Q;*TOu%%#x&7w%*TN^d7Pv~Z(?8#NBorSHwIs^Qt3O)P z2W8~*q&Y5cIh4ORI0Tw}=HP4FQ?@eE?RBkRxdpygbbG2J3X*I(=t16rldoMT+Yxl}_Tk1E&^2a0(3f^2e{23vq}lMQ?KR z+0WI1NAZwR@LL7+U-Xjsu6oVw{O?&3Aibe>#IdVHXUKidWT&?h%_Pj{#9bW)A9-%L z8ExX0l5Zht${S$y)~$)75pm|np~Z_cye^`bEw*@kt)BuJe$@J||L~!HhRnhni8c~$ zJ;-GhAAib%DC@kU?O7o{EE<@OW@7>jbrv|u2Ro|-?ayv~|6`c9MYcj$IrLZi_gx44 zgl<-48S9+uO7l|qQ7nG7+aG-O8Uv?DCK=Y2_={yTa}bm1^gFe8M#tx2005cacjDA5 zplEb2q`IiErXAXVp67eKTakDH`>siSs(> zAW`MAJ{#_bsmNT!H~3lf*%_nIB}t&JU5oDDbTZu7SWjtfm5ZWfa*cH^;jL==E_FhA z+=vfTj>)$Scz0dysz|qhFv^Mu?v-=hA07HNY3SYdd-C70|czjc}f1h%}eg?oa z&71v|3s!_8K5f&V*Hr=SIC6K|5BvYS6O6|rBW73r)w^H|%BONDnD*v|&k?7McMA_1 zg+`8==<-pN;d5!Px?=tbcdSzNzH{n%NeR$Eb3$=3D`{b6x!WlmZs%imI>EonE3{6_ z`R?{pqf9`n!pWB(?}0L@!b%kb1b+T$S@H2SI79|_#LO{~%VqZ;0L}-y_Rn?S}|M@MPGH3TX z-99ml(`J5Oa{}x?B*m(liarzGM!zuLo#oa!yCb3hI(PztqWjV=|7`FaSn_y(h07~P z*pGdA%I`wmgFWXV)t8NhTni{TrfzVIrvzcOh-qM+z8WWmMMwDSFMw@I`_N)c|>9D&If*p>InckW0$wcgU(NMDcN3lf})#8T?@JkywnR*1bV~D z555$LFg#El$r~^3ng<)E4xmb#{LG!hpsXsw60D`WC`7?fqsm#MefHzLhhd;9gGfV| zr7b>V&aNI?ED|-RRjA{?JoB-hGT`3gw>}^C1_$c7cut-#yOIWN+S=RFh1=x>q1QAD_N*_v2=0X8qFZ|7 zkrCfPYCal0X~j1$A1x@MVKY*>i`%yNplcz`!b%zwkk@tlM88A9y_`kRx(=Qg1*IwU zl=%&@=b1OXc@uP5*sU?_)P`@#lLg>K##GX1(hYk*`~6){Kx+&Ao*EsRa>&{XAPB;W zO#Sc9?*?g8y9auO6Q1z)Q(34()UJrWYO0_|&>6@Tqg}rfa~Vb2n{R)X14O~0)r$Pr zMnf1vGEbzWR^q{r$m5BW6OTY^A|=C9MW)js@%;6WCLjR>PmT0HAj(uwJiGYbm(D_i z715ZtsIo@e_<4s%VQfXZN#~sM>-C`1r0%^duS|yAbTE%bQ+9puF&7ZQVF4MVPdoD1 zo8#foXu$5ZXr8efW^168V=K`|uDxo}8$iN9y?@@ZG_w=beKHOAJl?oWZBk6tK~S~H zo+=t~j3t$?tf{Ibl^S^2Jp<5_Pw{xGN(nJ!CEH)SZ{h|ANa7hKeaZnbt@hcQr)MH+ z;^cxtG09g>aYL~_2+=Nk>8N+mO-tW2^!a0_p%nskXN2cNj6(_kb-8Vv>`oqdP@<^c^A z3Ct#F@9wy^zZk|^Vi051Ro{I)Wl&I!A%o3e629K=(%X-VTtFw_V9(N-!9!Wy;MjL| z-|4ws2 zTJn1*VLpUYl=H}P({NY2ZtDTZ!^f+{z`*SMuP^FqK+j$whdQW4?`2mAsx6fNfzrGy z1QjC9sPmOc!)}C|9z*lXPV!1{nq4z|*^uN|m)|LdDIcA6-{tVz%4xXrzjBCvUPc+3 zFXw`8AXY^kfnqC%tab_ijyWK`>2rIQ7K-2pR+B#Q6#lIA{kZ+4cKJGt0Q)#$hp%{mi-!SImvJK^9nj6ZuzeL+0-lrnu z`%ukw5`l56B#!B8gm?9- zqLC+ZjVdwBB@(_`RfQSfBL;l;s{0KmH6P#IsxJ5eCKuv+Nj(gr>#6F#^yKE_o1^Ob z#Dwn^1HK$}|GyT%ce1MM2NS+y6&xIKo^Gkl=MVaa!;EjJ1Ph(NR^1o1BEAU*e7i7u zqT}mU#5Yx<5d5(`zna{7@?2=Z$NlS&DXoX^TmwGlZ*wc+TV{dJF}3yhTW-L|@=R@E zeD5k7gn!}K2^_IJUu|K0iY2kLj)%g)$M)B4TFc4v4}*U}+<>txYDfR@YCHO&*B+dud)5M-rIb9k=l>_^-N{&7i?@kKK9pE z`qJGb&yP1XA73PW>0y%RjwhRsFOocuRQTRk_IJnA&Bqr>o<}Ks&nSEsKG(YVxW9c} z;hXq;^YJCCDy;N{``a$c{swPtKE6o$!u{XX%D*8bo z!ttl;i00$ltlGm$KcOo)FTxKUy}CCaAGhDH2Ae^1y-O$C-;D~*ExntMZwCmc!wMg2 z2W!(+{E{Bse0=XJ7iEQy?XO(nyZ*T5<9kox!&{Hw69@3TMtTp?0+4%L>h| zlUf%a%ai%rn%27b*d7?)C7G>@kNaE3m!H$R__)7id>ux&E1e0^F*=-j<1=&!ig=%-wqQ^pDV(E;Y&3hJ8Y7U555kk)e(t5ULX6y zfDg6)PgOLCuE(qU--~s83S@bSgs-nE@woxtXo7u3C;RJ9RG#BzHyXnBI#cN!LML``V~@^pbf(dH1f9d_ z97typovh=@bdNcmbUM4x8AIm)Iy30(N+)=WrZa`kzI2{UCzf*K=@p>+1A6Z2zeqmgtr_CQ|+p20h00N&A`fH&|8p1~{l1RVST z20p+acmo{INCO|>6FdTrXQY8%@ChD)6VFHkFW_T8I>86Zq8xC52Gp5KC*+TEpz}C7 zK{M#xpH8$D=zfh90C^z$ZFG-zfX_i5$gLlpoCmT*n;dI^LH3{zc_4q(g)8bpn;;!@ zM$rk~KswqHyrN8B1;Z6((7s3qe&7MlOgd2qXaP+~13&R}f;T*)O(7Ge6?8(*D9f_CT?+5++c40)iZkOMzMmq9N-r_w!S z$IoeW4;k@uI^9DScm|FPIw1$>Jm<-z`(xEJU7B^E&W>~j-Z;??rKh01%_Zm!kUA=}UG4V*j?h{mIeuM6ezs*;0D%wziij6w0{i5DBuIK19eKHv%cfL& zCrlb%os^xOKd-Vf&YzSJk0k&6>0_r1ugITPKXHCtY;9V6X=d!g2{DwCk&}}iTV9cs zGS@pUsVIA%cgljno^kWaDJg5Tt2(73r)W;h+L)aY};Q zIVGVgEo~YqPM;P(v91I(L^y;vfPA`l!Sqs?-E}s-b*< z)>7UwjXvGeK}BJVtEfjQbjjccE+Wz#m?GHQcbP0y=K+B)?B zRl816(^|Weswaym@Du&eig}{FYltETy^JWeDO@_sN~hysRU%Z=99n0UHl8#~=XDZ2 z)sR%6W%DSyDzBzN!*URf&^QEs*-*0peX9TY+^l@9V{@_w>bK-M#t zI7IE%x(AD9DW;2jHKYM2XoaFw8PNpI%%HP^?mgNBrMnLDSQ3j>8n+N%bsUZJM2sU- zVD*!JvUGI(R%sm-ZHKF?E=l7ZOV!whMqAWzG?x#ihczXa+Wb_~JqLv+Qi`D|?1dxq z&{vgDq=85l=^}pPDA-G&GlK%gc)F&Le@UUcOwzS@N*_s2BPkX4@pR3gQo5Ztmsh6S z=nM5$i=4_W5}D^C6wlctLEVQK@y*uIrVi~em9x1#vB$_IJzOX}x$ZHHF!pYd>F=Sa z(rE`Lr;?4r_J$jJgW1%UNm@PS=Ng;K2}?w$x`^;DB)-b1_bQ`%U22i?a2qgPM!RCK zrR$WDKOLWgLO-ef&E<-fXE>fac<6@Hu*`9L=SLHC#$AQ}J3M z{L@0h(NKCHMF-2!S~ED7KuimNuFEv4h4^4OjHXB|owOa}8qgmO9^FECSw6rE`!1)` zMMY!GK$WJ7Y#-(e?bRxPmLnx`=HN{f?w3 z2Th^MHjIpKlFBuS#_AZ=N0WxhF=DiOMw~|9tfg@kEX+kYFn5CM0!pc-f3ggG8)hz| zNsr)hWbWZKYRVE;Q$Z;;q{roSokt}-0vjSgl*8ztTGU!j_r}p7>O!QrkbJy@CZz3f z#r;Zf&uFKW2B`W&y*XQ40nvgP4(OTd44HYjC>rlv}MP>SzFLo!*e-A3!-F8 z*>(~6#}d*Hj4KfFU<7T9sKTYk*`lAv{pCb^jlkg`-L%6wM-I6}75ai~s-aBH@{XmN zN=V)qhj~;ViarG+BS0XjbmB$M2s_9!>|o?^Z18Lr;$4gpxW|(8ILM~#)X7#0n;l7X zWYH;SmoRUHnWk9cES^qSE5^e)ly4+iauVglY|{w3gTxYT;p3i4_tK-u??5KT5se(b z&J%E!QIf6tS-<5dUh1-W6c1>E;6s>& zBkBWsS6w4gY;l{Ta+ybp6UgpoQ+=bwFV~8h&rlu3Y*Z-Jp5|J$)5x&W;aFgj&{$A~ zIg1l)amvwM49&yHHJljX5B&72bBbATIl~5DVVyRcTERh!;dZQp`%SZr!8e;nC?~2K zo9p*@h7t4V8MJZ-Da|2Eg!h=EL3R~{iLvyhC4bJDMevhs@x{I?bo~Z1gzzU=`0PF;^4Dd>DJ?*_O*k_idubr0ovR!wd||F8}!6}3DB6`s1l%v zJyT>EGF6}`*A@=eqY@F>RFf4-PX&9g7y6iIs~)zp5^XAJp`T@&h2p5^PNu#P zv3MM{asu^$IdqK`DVcP|SRDVjUreMs2lZ%n@bR33as3>VrGsr*6c?08WupIvv zP>Qj?=g0u-;ON6J@8F=dT|1mxM}_IaW6P0%ah`C3tvZ>99BOSjzmiSu7EAh(L%ITO zklK<+vdka|qDPGI66iUeWDLELW4Vd8@bP?oxb-sdq0jK@Yi5P2cJ?FsTr|h^y6hd~ zG3>}wUy(*s8r&k2Y}H`hBAGOfK}3QT8zWUbj*aXoxka*sToXxulS%TJGlP}JQX6EF z+|dFVlmh!6L3t3HXNmU6qI5*}4w@ggBL$wL57#2r+~_ScRbdHj8TOXpBFt#9hpC+8 z9)#p^tt;YXzb9E+?}E*l^yq>cSv@JiUn1XjqxbO%#COVtvpg+o<}x!tpcL?9Qe zv6=l2b{$}L*iEUBVK_-Uv|?NI^Bj3(D(vE%9hO`6Y0y1$%Q|gQ8f;^%H*>;bWIfSa zCYmIMxo<@4m@Puw?;!1z+8^3NJhLQix{UIbs=Qpc^%@zMDa^wDX@g%u+n=; zMvK*C9qCAK^WgpHv63WAt3yoBG#sOD7Qb{7);FQKjDxe(yB1|YOleGi8vA~N%Xh_4d;&Pa~gY`S;S5gyM#@ugX_f`&hKdf6}pB6k~5<$>= z!|UM=D_ya4&7j{z`iFTo%#dRy&LOO&VLF)_jN=h~vUXymi`{i{53qx{Zw&QG76Xh9nf>Xp!=$Ft(VXa~$ zU9sOTNAM1*AWD`aBfl+t(JEKyH~{^Z97D>r$0Cv(EUrrR)tG1Iox~2x+n83wiYi7w z=yP+3-UOl_PngNYXlbNK!AKB2v>fwgiZ;f24r0eTTljcS1-R4aG=n)a^A)@+bG|J+ z+-m7Uvri>|joz*CGIfyl*pVael?on}8?lFux9V-x%$z`nFxrl#wulurhH+E^wK-0V zt>Q@ccufsY>C|Rfl$Jp!M&|H-_!n8ghL z<`(2AF`H;irhAM>zyszNpo8#h7(0Tek#vRCjUZg7+rp=hBjl_|Bo5B7RU>mCeK344 zsD=Eo&j577_Tkxbhy!p5y0eG}_`EDS;SI4mu*eoZ_I!Tf%@8r1X{(%0Cst9ha{{X| zuxI#Scx9~1VC)X6kOO-v&>o1rK_g~CV9#gS!pHX9xEYOX^1XPw1Ri*?Ej-K@qzc`U zb5Y<5EdUJ%)sQt>05e#a$wAMQPIuCi0qW4swuO(Q6X`LG^qym@Jku-J&OkLhDEfAc z&OtFW8hfwNv&-2v^o`Ogz#)42Y{Ip~7CxTy2fapW&sC*E`_{u$ik>@KtSA^Gf%9zP zW?rHF(o(@GtOA^3H4S||bPTqgLp*1Y6wqRFZ69`m6@G_yepqTds1&_-cW4(V81t_0 zK??T5IYQI$R!(go=5f%giP9TdrOu{&Si!*Bm%hKum^0c?(}k+0$bOZ5k{#MEvQ;C? zUCzQm>tXBgme3sZ6!MJ#$RE~#D=Y;*3Em6Z2Y=wumMVOqTEb&HBkvAvnaVFEh+iJ9 z&LA2ven(G*ehS#oTfsV0NGlM*!mmq8K@Db}peLXwhwd;gXU>oci-D(w&Y)a2{e!1M z?NYu_$WO_YTdV^wHFV=`qJFddjB#goP9p6w>_(be>M-;h&e&iGPt> zlzlYjQ{?)>#j0F*IbwCtPq7kqqdK%p!sh21&~IO=a_Q1;>|D@sss`h10mszlc_5y9 zgAGW&CXxLF&z-RCASHOtAe#1Xak=9O>pv9c$dcsthL&O{5N3k1sZHS@&~ITBBt1J~ zPDI<7TgHqt{01O+qa~eiU1kek=r}ug&7W5U5V`X>Q{M>y3Uz3>6@klbQNmuqj?}ME zHL`B#Guneyig~o&m>DZ>wP1a4Xjj_egIh2%1r6(;L%S+0m+a@|Ocm4X(5?B5RT1;!-7et8E?IcVWTBz3hier+-FLK(r$*d@_ywaytOMZ= zqeS#NaxDT@lSOG5XJ!!$F#@7Zj5Je-%A*ve)}C4)A;RATk9!^3b*ijAFN1y(b1LXF zAU99|kAgl1qa|23dtM@>OJKv$Iao0IEyx6G>uBqnZQ&MJ(TiWY}Le+V}ybT5fK}_4kCGY z9cU=xHdrYv1D1>RTscO8jo=?fjH?yC(EjO2l@i{zp@CMqcWa|~fMlV6-~+ZQ<3+@e z7z@hy7cBz)lsbylYIr8tH@whow(#{=xf*9_++#(Hw^;ndaSe^uFv53ex7)(YZ3XQ? zYz)fLZtyMOTaF~*x!~W>lF%>c7I=qFBC>)9yTcZ~o+_8L5j}R+M?Y4)+-a+B<^^6+ z+6Cq#;2q(WG24Y05HpbQmY^M!L+`L62);44#+=X^Tljc}4!qdqWUZ<>RHHevko(lI zc7d5DT`msoE?ZRTQh;?~z77#Cc!L+k{6E?h_h>`-P*@wD5rx2F5&6Pz+}%ig(o&=h z5jkK62)z{S2D^5F50M8nNX`O7>k#$GG2=RgueBo!jP@`hfOJ5Mq!6P6v_7I9NDKWo z#)PnKq`)4qQj$PaMkz|Iy-#?n3?38S(_B>=J`+pwj`qvhjyjrDw3 z;e)T!zcAvUzsDo0P4L(UM(wHEYM@a*Ve;o}f#pwB|jg_sk0!8>#XzI}r& zeEQn070vhAs)MZ>vX$NqHjAh@lYT+3YzJrpdRENO!;a+)A=Xnc#?2;N8x_9r9tf*> z6=K~HdpC?8=>D)}S>oohdJIt}=4KxVTLaGkm}|g0nph{mE&zB$hxVYVgKwA(=$X)J@OjDf5B)l*k@NFd8J4s2h=QdDM|6UG7$st?{4ZPh*fJ(j z?ni8uU`-63iN&mfd@r4M3Os77Hnw#cHA5G9-U_`DbPAe`SPiWuN9r8;E~kf6!fcMMUJdL;Q)hK(B><0Dcnvu0#8;EqpxR-MA=J zZ!tO3g|{KG&x?1TNlX2oEecrQ!2{NE5y@dj1Z@Nk(Q42-#4PBo(GLKIE20UE#$g!_ z?Ri`HI4ZTK`2|~bFwL+TSRv??)`yWcA_?qVkSi>R9MFTySrYh1j7<=qB9eZwk@#Tc zm=#Av1u4KsK@$+OLk}>AF2^Yt1tZo%9_SG;JLpd~%jhc9M*FE0Ya2C=^Yzw`rZ+x9 zTRxg<+Nx^f2*Em5ZQ4Amd8R0_ZZ8sTsr8Zu~M__<=&=p%QE=wrXa!lVXbL`JbJ7A#;+|*7O|7h zCdG^~9L1PLHIA}hQy3%bba$02I3_l?8rBmb&xMrxbzAkaw#u0X#JcEr(KFzLuav9# z@C+C$z(WFxJ`JOGcqWV-9NHVU@bQdg<7E1#s=K+Cz+M_{<5u&#@HDm5!upr!tW)2z z#osY1m(`o4<0uM2%cD216xv@#a>Unp100ifed3Dh|(Bl z#SOl?$?1&GST`_(hIoM)JYoG7urkd_`(%Bz8YiKWiWuz-dN#_-SX*QaOnt)`W`Dl)(6s?01DU7wv;pIMmH=x5#zGAHJ81*PIm|b=3g&Sc z#@c|{5(&c$skBJUQ%P7;v>_qjySP4#_hfy#K4472Fm5X=uZ=Z1&KJo$V4g?jv-aAu zY;fO#xezYHwA!^8%=E~z4a+FlPOs^}vUmA%V**{}HNy{B60 zRnU(hhir@B+-C$*(H7>qxTH)&FOQlTDs9eOpTx!Xh_zI`glsA65|CUt{4!1Uh~PxF zsC7LuP0wp3Bj!M+ao(gL8Om7aG{r5aA+Icrxyo=9b6RiA@I;F7Hf zvnf(XSf{aiB_X=~VeHN@E@@?dSi$0avSqBJCd@L*eAf2IICSbTPXkVaZPI9eOurE( zTLWXcBu7ojRj_!RUF7wME9jvTfMLgMB+zL72x# z7_cfX^XVFg^#KWsjMZ8nQUX4M@mlpNSW%QXB72sW?o}`&&2q7Bd#0-)n`vsxw0_%L z^(t8BWWII%<#yKF9_t=<+CEgLF_+31xaE!3$5^qt(o_tgI*pwTj8(_Ld_~sZP#zHV zaF3_Af6L=XhLuhy$+ve%pJU!3RVJ9=ji&kEi)7T^bediEi)f_vr zrCW{vk&pdJWKZAHGXTJ>$C!WZIe<_P3GUG@@O|7qfU&=q{j^-omh-U_dnRtCfzUKPU<3CY~y!Z zfI>aa`1{$r&ONt}b>uDQLmO@%-M>o@-m>i@Tm0{~vSYM&_Re}tZ1fAk zL;C@{b0Tsq)UZ~xMapfFa$BU#Gb}O^h`ibk3+7&pt=ekM75UgF;GTO#?$h-BaBXqe z-#ZTD=#jO_Iu6rUcN@~CmX5<@KZQ2>d#$}Aiu zwTQJ?LmQS&u>GJcbD?XVRWHz7EV?E$H&$30;|W5?kD!rz5yoOYub}UvkKD#~dmCV8 z{ffL}6ggSztk?9cX68_ewNh_+D}RlgtT|2523@~cf>!MWEcSE``>)J8r;qa^>s<4+ z!EWSX+|S<@d04f!9-B2*qpWm!&+PJoM{SEdLTxd|!vD8L9=eZ(EbRMJt3JtocX-=Y0Q897Dw1gF6#)Eo5Vi&Oo{gF537$=ATLF-Jo!Z{FGVXN@9R=Er z`|)*6shyGgh_<-DZEsQA-lE3sEs|eGK@ZPynswZdZ++Xb!M3_I#44q@!yW@U+ z&rjsJf^bp4e80u0P2r+`9$iHC=q>+FhkRcW6#m`z7Rfg}CFgAG#&K>_;=a&6-R{Uj zewzr?MAm?|kp<>4B8|Z9`Ixp9K6_uc#M%mSYHAvVex} zqS&1)eDZr}4SS;2jBLWK@EN~l#{Sv~oD{ zAEwp_jnGMz_z-Km@sVxNZcl7? z+y@_{$5K`?m~p(#JQ!hZvt%-I!g$82_tp2pvh>1f0MZ*?g=`HC(AQtvG=L)@y&u-! zjA=?QtVc=>wLfFty&k|A2mPH|UyrTyF=XrSw8tzQN6tE4-TODJVZoya-Mi?Ka?9^k z(J5vfZh0J`<8RD?=rKC?GuDxE+fMt)JMHaxA!sMJLz@@E4pEkdZmUfn4_fW~-E&?j z)Uw*Vkgol@H*NDmy6!i3SDw8Y33wr%_lWF;+GZr$W+d8XBpNd#0o&qt={S}%?w;Ve zVC3U@fyg$fuhF;sOt7*4WonHujtQIICmU;P9Sl~zz7ea=1CRfjHu4M}7wn!LI?xhc zsbc9F*A0!@#B&S{X%pAiJZ+M5GKk=G3jgXmbV6sJ>_`1*z1=_e)He5^$5y*%?ty)b zj<+r9Z;Sfbcel>26ZCdGgT$DuV-Ea%DLa0sE#{E>5cQRZ;NE}ljyW3tZK0W>Z<5i( zDPomHLZDev2BCikh)0n8W)DZR;pVu_Q8DV~GE#r>O%Fiz2!*2z>{DXBWqd8Aql^QX zIfl|B8U1hjSbw(|r6gtgjD``WN1x0=!!yu`Ga|K!wDHgu(fb}mWq9ApuX(jv%_Uk_ z?~$x}Li|lI=A>Z?gRMdT!U1Y&Eat|n{siL%HnbjWwJDfUrg5#JX@_Z=mg91}yiUKX zG^5Jt^J!xUG`z6HTUp~Dp5-pDbi0P7SJk>|yp?W$aMl6CbDY(#;eMCTU!0a#oL1uZ zc!vc&6=w|4x>J35)iqVFYL}aku9~XK5(uck>#1>h{gp(!#B~VeXfBq{ zREJ4u+5iK!k=sB!h_W6^r=WSP%kPA=v>yqQo<>Jr?&Pv5)!qq{hF2$LXXnqWtc>#~ zCB!4iKY#kzDZ?xBr`1oKUl&`O7GIhfyKq7brDWvfq{o(5WTnjYj!P=ap68viV6bQ0 zymCs)8ttl1smLjs6Ek;S{`|s<+__Vyk4s*N`qC!QnU0^dx`}bw{^^A&G1I4xid{;C4<)s7gzlhKkdt#ZRm& z0Syrjp-(}gkj>vMRG=c45M4mMi|T7!5>ik!tstv-oX1=3tP)x%s>!Z$mivUnW8;!X zB*n%gi?p$x(%LE)v{w`kYD__p%rMbaB{a6c>8~Jiw0%xfM-a`9Pyg6;=9ir`hu}c{ z{6k&q4ZwD||8Cc=UA+{r*qjIxxzVG)e8Br#p%08^B4IvP2+E@)Nqa(r4MCe62&QpU4ZWGi4eBmaBWT z&#~$r?RBoYNBa#`_d;+7F44XxS~3(2(%~Z@N&@5qc#}%uR>Gr@`kz!ook}#i8Dqv5 zkPgY=gnLe)^F%s((RnzXgXuhy&QWwm(V0r;5IPas45RZnI@9Px&@`ORfpjL(If%~V z=}e~cC_2;W>_TS@ozNMu)|F29$7niJ=$qA3dRzM`z8!dsd$Z+=3BuWUqed6H;j6f(=Ta}XBfcmh9k6v~VEm7ah!2&#gk;c7za zl?6qEqn26IXJx}Sk6B19*?oGugMkmmBoC|NXmWOg&{rIQ;lMSD&Z`{U@dax5FWC~* z8R|$_OOe${Ck{}M3jo)Lwq?qCQ-Y!_H8N$;_F_756nl?~vEZGG7;`ZYE{_0_P&^}V z2T;1X7#A`$@kdmQr8q~W8;gYzJhv4*EDjq*n5QyXBB+Q>WrANaVv15#$xA>K9}-VS zZ8tZw;wh50n~OvskVOHtH5UsbJr+3Bwvk0j6w5|2gu%jup^a=}F}9JpNCXiWg>5zt z8^SghiGYa-EVU5BK*gs_3TVR?(gqd<+Q^J8jP#6cWU~lkfxvARVSZo~<{}ZqU=(;e zDr%t(2NIZ$fEXAPe7U(u1WZPkf=JYeDT1CZh9nZRft3JV8`@D)iSb`*iAcyIj|aXIH!y34gbu~}&&;$yQDN5m(`CdZ^_j)+gl%#KUWOi#?n zOc;@wj93+Tj3jm!nBf#~1TY%`6>kyd5PG`Ls(6RsJw$>r`+xz%U!(*`98rVT`^g^% zo=kUV$)6YiQ=_@%x=(NaI!Tnm7Fk`N43FDQQ4f1k<8H*7RQq^?lCNnQEyauscWX56y1h8;b z)15pb4kR652g_nJ79${}Dy6zv$Es4@r_TyiENCMiN54T@)qT2?htq)?;pG|>!D*_R zfYKNNAyu(m3H$D+iUNnoX#`ZfO;ic!978tg7!FhrII?uuhY=vklo`tOiPZ!;a*yH& zlrjQBO7&|e3JKb%SfG#*5K>40j9iF1I++n00U>o@Izb$wEapXU1n?UHA!UVY6Xm#p z1Lcf>kaFC&NkQ?TD^S)52r1jo(8aI=2+5>(B|%yG6K4#t=t{CCP8>fmYGl-Dv1e#~ zvf@Xi#3iMtj7Z4J%8pBk8Ics1o|c)Go)nuBla`#GZR|(5PQ4#th@cD|0|SEl5r&5J zBb?Ag_s{)EP(SIZ(YwjU)@xZII^HprKEKP2p109eHsB^+7j8mzj6%tv=`0u_SR+6; z;1bG)1E$j$1Lmq5XTV&lQ3lL~Lbzyz0dpNqF<>s+SOeyAO)+3DYcyc)TLT8nnREjV z$^rvsfQ11Uxfb}NCei}4$L(_k3^_X?J|QtVeMDS#R%Tp$N_@(Qtn|2)?6l0dq!BR* zBaDX3b?b)AkbogGAlQ%@8e+(t&{*p*>pj;K&=>{?y%)XG1}Hrp7GDgHCr^lzoCXq?RX2mC`r)S2G$c!72ZnOffShoU(1gwAo!B)V~ z5G&w>CR#!JP9zR}bY$q`?O0oBeG>WiWp-5JruwBxL^NT}-Ikr_YpwL9Ge&1=_C zpkseto98wzQ}rR3#DOcuiWalS#}hb_PM*^)p?e$wZQ;5Qsqvh4Nqf6gp{fw3d_<2u zrYwsuqG5);;^3QQl8?IRXo5`U$dbBDxGsd;ER*v{hayw;E*z&iLS#}IXy^kErGBuE377G|~+vdhDRmIWRVgZBegR(GVB}9&5%&>rgWj!2B2`F$2 zh@=obEg#vqsa8+*45cgVR?GraDd0SH#YISghhJly%eW*v!Lsu;7m3O{i!?OG0#w|a&aLm@_ zpZuQ{tN?}7ArypKN-D~D1vS>rImI<>LQt;Y2T?UEOfO2yJN%yY>yKTVxxzR2|3>~g z^c7@BI_JT&`2Zh}t-eTG_;I_;8&8;Z@5M`9qpV;L7zzgQ=4d_M7^NK^-c0-YsgBj@ zSCcus$tX1r_yNO^wEvc&%E*J;LM9Re0S?nW$_Cc3%FoH@@#@T)P z-+0*KRaUS)>6?ZTjpgMX-gx#L|M+!V-`RHFnBUQDMs7h$2Os^H|Gr}SK@0OP_H94$ zb=U0+tYE@0P$3<=%Qvz5_9UE7of-Gx;Ac-wyL0K3va)FP_LZj z-GBV@#nm@_4q2FCyUk}U0@W4=H@Zbqu+JJ!IsDm!Vh?z5b?)W;zvx}Q`NlF7il`O4 z$!DFXsAq2yHWGWB+}1 zFY_|9H|}3qQh9v0ldNES(xJiVXFOFkLvBw5~+sx(9BX;{9j$?2RifzjD)^(FM?(7a_G z+KPk^JB?qIk@K&L{}q4MWyiNn0w`jKW@S)Tus!L}pqysM1Rf$bFQtQzH$Pn0`PWBE zGcF$R=;x{Bp8vCg?Ma8$jc6Qo^~U?=Uo|Lw#*zV@K5Lqsj}3AgjZ+ zLyM)-FV*yXdF#jlxtARM%dwkoO&yC0BWnC^a%dMR&e)sy)pN1B;v&4u<1}yCvJUM( z@6GA9^O6t7FMaBoA6`4@^Ou-}07|;CGAJw9o^)tXPP1bI4-uPJ@pk6i{l||wMwC3miS3%r?Od(xp{>|At}r^i{dei^g;{JFWeJold)2xN=5@eh9cagY5HQa7%C z;pcPLetrpfGsE^Jhjud2-xP-izKhD<{^5y}PZ@jBj33MYc>4SYtzZe14@avzw51YH z$ggdO7Dq+jzNp=w=ibvR@BHpbOScc+@d|2-sPVhWp)FQyu{R0p&s?iUn_7cEXNN7cdDx!V#L4L0Q4}q(g&pnw=1Mh}gW84nFQ%GHl7= zD=Jbioj0b>qOtk6Si$y$Lj(Od?C@|`uh)J~UeR&%4L_WdclpHcF8~i_*uLbrP9pl7 z;<&(fWy*q;o2ML<^_c&yZVOAduC;>gHpg`~5oC3sQNtZ#l9n?JrCisZIdfRr!M=;pD6S4+SG?#cpz3XDSZZYlL-N5r>wuo8q`mudGV{u=O|*B z%dn2-_f<1uB)Umr96!V7pJM*FmNU_7)_Ho^Bx#zcovL8(T z?Z@H$r)>srX4t;uxKfG!rbJfY`}3L~5|5a1WX3;_eb@I*%y&Oq!Pw!n`jBu55oC36 zqg$m3#p4V^D95&O<=1_4#?rC>bjMz_Ec?`cC=^jECaY@Kt1B|M!hWzds(SV&;T;-n zKnv^8z9s+evmiL)mahT#9`)6YAKjaM$Kyx5H$m%s0h54w$a{(d+hE3j@Y89J?tE^{ zZRz)3pH|WCQY+Y=bZB^8WJg8Ej2#PJ%)6l9=kI>=>7)HYe8lFZbgQjmR!_Oy0K_w2QI{WkH)(#}rsW`>1xXok&RhFcCbwFRJo4py1HWZzfI+3Z)u zYS=xTS4rjr+=sQM?=0UGTwGPX?F@=g5e+-vVYbYpSKmWR3dQ6H@-isMN7-IS3(;-Ry1^3VC& z(Q)ikjwM#GJ?Sy9mF}XWP8ok-f6wSk&;8H(ZAU%51;jVxF~CRq#m~LBYsDvd=P!)j z?#bzSt`%%gcnr{w!wwI(oPBcAwr|UFuUuNwSzC6*-Qd9tYa!17LlSiHk5OkB7Vi3* zDjZZpI0ga70cQTpzw*@k3)YOi<;Ly9GG|}C!3wrnwd@WC&XrEEnYm~h?`?CJI)FwUX)U0_HJ(K#!oK)ZP-)k zcmJH~n%BARVQ^!HZB(4#63op#DutT>Uvn^I4sSEYOxPehaN>zE!(zlSB!_Mj6LCKz z{lr*?rUh;Xi4V3lt_0%?qAr|08e4nFsV`_}#q2-+ku4|pSls1^T*$`^JArGbYp{H- zRw)w=If8Cka6v%R172&1Q(_P=?*tw=W23n`^ut{Tcb#9BwPEax->&@m&B5Tx3@hi_ z=^D&cjYjxYFi;hvKhpbs2IngYNuH``REL5^OrL-J>*6=kZaRP4voRf_&$WWBL}ls-;?2<_!2nmy*C5`GC+JUOGaO5nq^2&r z6U)Zu4N1N4 zz5K)e_nH4GqXzSE4G#0_wF7mKPDWn*|eg*#~EEmUsd(Q{VTT36I)&E z@V5QKt2!6Gbzo!^_v4S8WB` zn}=(l*X;eQU^6HmA3+MJwTOpC>}Gh^ztB%#u+hIa)6C%;_}TEm_ScS{xjpCJGmiX6 z^(FD^tYCeZLAnO>h&~I4(G5w6`VE_4$kjr_H&A}w&;|D;zSTE>wWr|PTL-SW)C#t5 z4BtTc)8~wO^U8al7`^O{qz_}i{Ou$w*xz;d23cH~vV4ng@uu;Q)@u3p%<8D|;PUc9^3T7DzqI2n(wZK(E%Z18R!g}+t396vg zMOY)pQUfT5Io?B|hGHpjV=iX}djOTGBj5&f4qI`f6?1qjVV~JAuWzp@t}zcyzWke0 zhdm-5$~$v+-NUlS{H(Vv(qanV>;A>sDk{jnujH^-J%Fw5AoKNX(h@m7^a(G<8JUrLiK zc5Il_-M?S}uFMgr6>NrT6I=qSJ&+#q-1Jo_`g>;O9o3~{QH3kYCqPktPgIqsJjzo` z(^@SOsUj2%id2I?jR;$7#!3SiH;1ZLus)QJkAN^n6Qlrt*bQ9M-+Xhq+#S&Y1mrTtQ{EJzkP_{E5-|tPkcb&(88|~C;tPryo+^*G;~4t0fKD$t z3wnSp)t2~cy{?YJj!Fd3QzjHe_!3gC(n?=Vm9t*c{@QCNkf%BLwt`s(-{`0^Yw1rh zR(jkWv#UH#f7C!9d8sPb&>F9+q|!(5K~ly_oKdAJd(^+;bbeTu4dlh<>WA{#6^P_MtT+7(si^;8RR ziN{@5Sx(*K)kG?ey=jO5Ih%(FRxmQlz!C6-bp*?TpRXRk-g8o*ekN)ZoOOdp@#1-Xq*GIV)&}VNUNGdNqW0cD4qs;ya zQQAj%P%p`HuUS{x+Xg0&caAVHxwqXuH!$fm;Mzf#bxX{@eoc=DN~W#9!Ppz}zy#fq zd0=7%vmBTRwQl_(NgUz1^=nV|cb#9%yJPbQ*E$A$@fA=v6tII2^N_>}_5dnVN5DYw z+=_z{#%G5I^8f=pm|=|{bO;Le{4fH{n1>NoFw0?tB@erQfB<^U0|YCWiqREuPH_#JV93=%)6}5c z9I=OkG4{Qi8*^k0Zp<*tXj`!N*N&7S3v;Aw1+$Elg?z3Szk62<3J%OMs1?jI1{M75 zHPK)E&pQHC?a<71@7{S`!jP_{G9o(q2GTY6xI&olk(%QnfTgW<8Ise_6a{7 z-ET7(H^Vj%jE|tkYnhb?bm3xYVMtW2XMU8^>x!!P)JC1mD8*IaWk^KETF$w&%ofI& zLn1hrd-lEgp*!E2yx_y6RT<}8R{vt?zZ0u63ZP@FQ;UU_N$}f#0R@vUPSzoR;zGu#Tc z_Zv8T(Zto^WKbDv3zQkg?mgxLhcdVv_KKm0Nftu!^-3k*1C(;-)O z?U%mt=tGLP-F)|{Oae$`FK`^)$92A|*VA3EAA4=xj4pG(=^A4Nv-ARj*VbD?VFw;h zc=G>w_wlJe&&;{qf65(yUOn?-pf)#%Ajj|nKFr?%w1QdMKk8}4uAOIH2d`by>$caISiu_a5d=csW5>lqs4(hMNMaa(2%b1CV&k=3 z58X1WC@*x0V4JJj?Q^?qKijqc3Hg_F8+Yz455K$2Kkgi3Yw{{ee`+c7DvA|sPkM%- zMB@nm!#ADq{w-tHTt4ymuV$ow0tJhxT$Bzz%n^kZY)^Ow(2v6o59U=A@L-1BCTa`) zOD#024D)KAD8L?oRb%(BqJSCmDvA|svtkgJ!1zqS%slM=UACatJON<^YvolGgg1uQ z>*RQ?(2tkwa$If~UZMo`!S<%56i{wnO0k0N8%rsm z+`MdJ1^c@$r9c+ur4%dJzO|GB4$Mm_R;e=;N>M`4Hymw~W%A>x@ihg~`0YDwjKm}R!13t_H5-XVHfCQDa;!p(D z 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 F{|iDHc{l(7 diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp index d066e46..812bb1b 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp @@ -249,7 +249,17 @@ void UElevenLabsConversationalAgentComponent::StartListening() &UElevenLabsConversationalAgentComponent::OnMicrophoneDataCaptured); // Echo suppression: point the mic at our atomic bAgentSpeaking flag so it skips // capture entirely (before resampling) while the agent is speaking. - Mic->EchoSuppressFlag = &bAgentSpeaking; + // In Server VAD + interruption mode, disable echo suppression so the server + // receives the user's voice even during agent playback — the server's own VAD + // handles echo filtering and interruption detection. + if (TurnMode == EElevenLabsTurnMode::Server && bAllowInterruption) + { + Mic->EchoSuppressFlag = nullptr; + } + else + { + Mic->EchoSuppressFlag = &bAgentSpeaking; + } Mic->StartCapture(); const double T = TurnStartTime - SessionStartTime; @@ -460,22 +470,26 @@ void UElevenLabsConversationalAgentComponent::HandleAgentResponseStarted() const double LatencyFromTurnEnd = TurnEndTime > 0.0 ? Now - TurnEndTime : 0.0; if (bIsListening) { - // Collision: server started generating Turn N's response while Turn M (M>N) mic was open. - // The server's VAD detected a pause in the user's speech and started generating - // prematurely — the user hasn't finished speaking yet. - // - // Stop the mic WITHOUT flushing the accumulated audio buffer (see StopListening's - // bAgentGenerating guard). Flushing would send audio to a server that is mid-generation, - // causing it to re-enter "user speaking" state and stall — both sides stuck. - // - // Do NOT send an interrupt here — just let the server's response play out: - // - If audio arrives → EnqueueAgentAudio sets bAgentSpeaking, response plays normally. - // - If audio never arrives → generating timeout (10s) clears bAgentGenerating. - // Either way the state machine recovers and Blueprint can reopen the mic. - UE_LOG(LogElevenLabsAgent, Log, - TEXT("[T+%.2fs] [Turn %d → Turn %d collision] Agent generating Turn %d response — mic (Turn %d) was open, stopping. (%.2fs after turn end)"), - T, LastClosedTurnIndex, TurnIndex, LastClosedTurnIndex, TurnIndex, LatencyFromTurnEnd); - StopListening(); + // In Server VAD + interruption mode, keep the mic open so the server can + // detect if the user speaks over the agent and send an interruption event. + // The server handles echo filtering and VAD — we just keep streaming audio. + if (TurnMode == EElevenLabsTurnMode::Server && bAllowInterruption) + { + UE_LOG(LogElevenLabsAgent, Log, + TEXT("[T+%.2fs] [Turn %d] Agent generating — mic stays open (Server VAD + interruption). (%.2fs after turn end)"), + T, LastClosedTurnIndex, LatencyFromTurnEnd); + } + else + { + // Collision: server started generating Turn N's response while Turn M (M>N) mic was open. + // Stop the mic WITHOUT flushing the accumulated audio buffer (see StopListening's + // bAgentGenerating guard). Flushing would send audio to a server that is mid-generation, + // causing it to re-enter "user speaking" state and stall — both sides stuck. + UE_LOG(LogElevenLabsAgent, Log, + TEXT("[T+%.2fs] [Turn %d → Turn %d collision] Agent generating Turn %d response — mic (Turn %d) was open, stopping. (%.2fs after turn end)"), + T, LastClosedTurnIndex, TurnIndex, LastClosedTurnIndex, TurnIndex, LatencyFromTurnEnd); + StopListening(); + } } UE_LOG(LogElevenLabsAgent, Log, @@ -615,9 +629,13 @@ void UElevenLabsConversationalAgentComponent::OnMicrophoneDataCaptured(const TAr // Echo suppression: skip sending mic audio while the agent is speaking. // This prevents the agent from hearing its own voice through the speakers, - // which would confuse the server's VAD and STT. Matches the approach used - // in the official ElevenLabs C++ SDK (outputPlaying_ flag). - if (bAgentSpeaking) return; + // which would confuse the server's VAD and STT. + // In Server VAD + interruption mode, keep sending audio so the server can + // detect the user speaking over the agent and trigger an interruption. + if (bAgentSpeaking && !(TurnMode == EElevenLabsTurnMode::Server && bAllowInterruption)) + { + return; + } // Convert this callback's samples to int16 bytes and accumulate. // WASAPI fires every ~5ms (158 bytes at 16kHz). ElevenLabs needs ≥100ms @@ -630,7 +648,7 @@ void UElevenLabsConversationalAgentComponent::OnMicrophoneDataCaptured(const TAr FScopeLock Lock(&MicSendLock); MicAccumulationBuffer.Append(PCMBytes); - if (MicAccumulationBuffer.Num() >= MicChunkMinBytes) + if (MicAccumulationBuffer.Num() >= GetMicChunkMinBytes()) { WebSocketProxy->SendAudioChunk(MicAccumulationBuffer); MicAccumulationBuffer.Reset(); diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp index 0dd8219..65b86f9 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp @@ -588,19 +588,40 @@ void UElevenLabsWebSocketProxy::HandleAgentChatResponsePart(const TSharedPtr* PartEvent = nullptr; - if (Root->TryGetObjectField(TEXT("agent_chat_response_part_event"), PartEvent) && PartEvent) + FString PartText; + bool bFound = false; + + // Try current format: text_response_part.text + const TSharedPtr* TextPart = nullptr; + if (Root->TryGetObjectField(TEXT("text_response_part"), TextPart) && TextPart) { - FString PartText; - if ((*PartEvent)->TryGetStringField(TEXT("agent_response_part"), PartText) && !PartText.IsEmpty()) + (*TextPart)->TryGetStringField(TEXT("text"), PartText); + bFound = true; + } + + // Fallback: legacy format agent_chat_response_part_event.agent_response_part + if (!bFound) + { + const TSharedPtr* PartEvent = nullptr; + if (Root->TryGetObjectField(TEXT("agent_chat_response_part_event"), PartEvent) && PartEvent) { - OnAgentResponsePart.Broadcast(PartText); + (*PartEvent)->TryGetStringField(TEXT("agent_response_part"), PartText); + bFound = true; } } + + if (bFound && !PartText.IsEmpty()) + { + OnAgentResponsePart.Broadcast(PartText); + } } void UElevenLabsWebSocketProxy::HandleInterruption(const TSharedPtr& Root) diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsConversationalAgentComponent.h b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsConversationalAgentComponent.h index bd1334c..ecd5923 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsConversationalAgentComponent.h +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsConversationalAgentComponent.h @@ -118,6 +118,18 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ElevenLabs|Latency") bool bSpeculativeTurn = false; + /** + * Duration in milliseconds of each microphone audio chunk sent to ElevenLabs. + * WASAPI captures audio every ~5ms, but sending tiny chunks degrades VAD/STT + * accuracy. We accumulate audio and send once this duration is reached. + * - Lower values (50-80ms): less latency, but VAD may be less reliable. + * - Higher values (150-250ms): more reliable VAD, but adds latency. + * Default: 100ms (3200 bytes at 16kHz 16-bit mono). + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ElevenLabs|Latency", + meta = (ClampMin = "20", ClampMax = "500", Units = "ms")) + int32 MicChunkDurationMs = 100; + /** * Allow the user to interrupt the agent while it is playing audio (speaking). * When true, calling StartListening() while the agent is audibly speaking automatically @@ -405,5 +417,8 @@ private: // in OnMicrophoneDataCaptured and from game thread in StopListening flush). TArray MicAccumulationBuffer; FCriticalSection MicSendLock; - static constexpr int32 MicChunkMinBytes = 3200; // 100ms @ 16kHz 16-bit mono (1600 samples) + + /** Compute the minimum bytes from the user-facing MicChunkDurationMs. + * Formula: bytes = SampleRate * (ms / 1000) * BytesPerSample = 16000 * ms / 1000 * 2 = 32 * ms */ + int32 GetMicChunkMinBytes() const { return MicChunkDurationMs * 32; } };