From 5348ea3ac452c03b2aab704b4b84bffe70e1c18b Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Sun, 23 Apr 2023 21:28:56 -0500 Subject: [PATCH] Add processing tone (#91931) * Add processing tone * Update homeassistant/components/voip/voip.py Co-authored-by: Paulus Schoutsen * Update homeassistant/components/voip/voip.py Co-authored-by: Paulus Schoutsen * Fix linting * Fix tests --------- Co-authored-by: Paulus Schoutsen --- homeassistant/components/voip/processing.pcm | Bin 0 -> 20938 bytes homeassistant/components/voip/voip.py | 32 ++++++++++++++++--- tests/components/voip/test_voip.py | 3 ++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 homeassistant/components/voip/processing.pcm diff --git a/homeassistant/components/voip/processing.pcm b/homeassistant/components/voip/processing.pcm new file mode 100644 index 0000000000000000000000000000000000000000..c76c8787e5c53025f249685ca12ca90f2401af00 GIT binary patch literal 20938 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

BCBk26;zdk;$&W6{6D-wi(w zezp1h=Y!b$iEj(u9Dm*U`q=B@Hxu59z5n;Y^7DbOwLh|d=l!c@Y-Gt|*WudA^M&uR zK#|Z4;ZTv;B1IzCgii=X2-fjO@IK(u=LlpCWAgj&`zPV&tZzJD4tzZJUhCcGH|lRL zyngz+_)YHH3-4xp*!W5A>;CUEes%xtV(4WqWV7Ks!7allEU;Vfo6reiT@gu<8Ny42 zyal`XD|v;uOE?y>u4mf%f8(DEKUu$*eNp-(_o3*W%3G&5XI>w9ZTN=it?RqT@9%z8 z`LgO;+E0f+#{X5BxLB{S=Ww0odC0d=fJx}TP>=8i;RN9&LQR5S_$B$Ca2Il(V*AA` z#%S=*_jliquV1HqZvMFYeZ;$vxBK2qeRK0o|J!Bnv_Jg+sQYE=H>;maf1dn1$+(;) zg`Jrznx~e}USN~p9-(;QDZ&ZDJA^h1+6h$i#qlt4<*=`3xz70gpWL75pZmW>e=+)$ z{Nc&FQ*R~SUVQWIP50a8caPuC{!{0a>A2 zLdwEC!Zkv@f+hlue04mATx-~Wv*NYx;Y}54~?+KeK&G{vh|>hxO@II4!|YG9zMTK&^z-WPhJR*^kD064-g4-2 zYx6$la}sbDd?lzP^iMEduu?#ozmd0-JCgG?TQtj7#=rkU{_Otg@}1-B-%lPNZ@oYF zPV(Kwx6j@tzH@qC`hoM)qtE}phX1(mEAKBq!wx2I*1hapT%tS=cw_h*1Y88y3$76K z5o{Gm<$uSk&Lhutn?0ZPF_Rm^y1%l&*Zs)&7WSp@6W7OQ?}gv5emD2suXmf?pZQ?^ z>HFvJUk!iE{w4Q!+y4Njn=C%;6FC=h7x8}OQx*6vkT2LKXfD_-P|vT(SHM%t<;U@f zwS@UOL*T#Dzr%kDeEss#Mi{LjH{Kyg6$-;J>#~2x_|cnEdCz; zwes`*kJCOZde8a(+`BLDO5TTj=={k0`No$=-z0w4|Nii|oZ&rF66*@~i=3OeV|lmp z?d8uC*e9@2z+Iq;KZ)-|I7ah|33L+`L}~#L_hENxZ=aN_tW1m zeE;YDz7J~=zjQa(TD_=Cfgg}`&(x(pLjpIeYpDmz;`zPf80Y*udOtxl@dM-Vl#k|M)rttF%s0+O058#jCli}^<-pjd%y_MC1`7%TH zKmI?5e=hsJ?CY=3WuGEHR(|;R{`z~~53@fsecblR^2_h9U%xB-O8#^7pAuse^GVh> z>~A=iaO?0!@j39H%LB2nH^Y|a} zU*XT-U&}X}*O_N2*IABZY|~l7nEw6W{x|!#-%sc7bzdKRp8aX!$HyPqKh%A=_Mz-! z>8CB9oxd`D|Nle$cktht|L-%(v)HjYaqx33_zO#NS{v!36?^DpnCm$|;;QhGxW80^#pS8Z;{OT{H zb^O@*P5A5P&oe$9`{?me{-fK+qaUY!TKie>>$-2vKN^26_;dar2cso(Bx@wQ0q0dN zQ=S-JUA}F6Z~4yf#q!PLoy6nFy_NGdJ0sg$<`ayw{^$M;{O$j<`1^^kpmCyq}RpZ0v}{5=6-+n zb;g(O&qqJGf0F)W{%Pr_*v~Ov=6n_Ze(=Z4U+sS;{hPtCoM{eA4Vy8?K28B{1)h&Q z1-z?xC-Um@*7CG*`*YpouwYMPt!A!dEcl=Gx8(QKpZC58ef#(2&1Z?vQ$7WKO8K|8XUM6;y2doR&4LB!oZQ!2Fqt9E%+sf<6yN>5B_aUx) z&R6WFY{@L;Of?K`|EB)g@r&VS#&^zdkG_2S9QpbCr}v+fKCk&)^rhkJ@o%m_Uj5wp zd+Ohw|5c1>%r>lF*jhNAa&mEh<(|&-nTLz_JWm+U1ny2QKh8_+=4=HllbKdAZ2x!R z&!1nmKR14N`X>8T`Ah9*-p^k@NqnC0+4YP4*Ya=ozgPb>`_1$B%fAN8Ik4E#Dfyc7D0| zIqtLhXTQ(eKF59W{95qs%=fUL?7uJn+4ye?LphTd3me-4c5Y5DE>CVAo-UsKJeznT zc=mAL$11>=eT&;CmMiTriohyQopZ(Ls;zU=*6^SS-=mCrd}?7xP8 zoBLh*=bm5Xe}ez1Fz_&4V4lpX!9IuMCg)SG)!ZgL$sn6F)b9-u_wV%j++9zVdy~`SJPZyx%c@wf_HN zIKouHBF)yz{($2f=QXYh?rYqixleM(aBtu`#JQBim;Dl}F-slOPKHna^#9iVe)hBQ zhsJmQZzf;+znFXx{$l@S$(O*d#@~X!&;23wYt8SJzw-Z|Gc03@VtL1!!@iZ{8s{Fa zB<_pcU%2maS93q&V&wYFv6kJ2Z4C|6|Sf-fwfie*RMZCFD!| zm%U$nzN&uH{+{#W($BcxY=3wDt70%_dc<7K`i0GzBZD)Ti(!Vu-=l(wPljnQnmqi~xzVm;3=e6G(#kcYw zrhnf3!}DJ-OEuR<{%#QmaRtdZiCVFAAvazv_7aBtUnO5Qe3uv2jpHKh41^?w| zY2{ibuta2vxVdaATo8(Io zKfb@L@BZxk9P>K&$*%j2cMb0KKWuwm{r=LAV@#zy@}hsF+Y};{!W3u7)`|D=W@8fj8{O{(b(c^-k+W(i7{)Tb}HB zap&EPZ<_xvv!CYo6gww%PR3H^heW>cZ|($U*I)e~KfIKCGU>t6`!NsKJe7On{w3<~ zDz+H@17i9zX7V%Ty<{g!921<*xt`(v_m}TmUYb75cx?2f=ehjb^e>10WU@}??Gjlc znJ2Sa#zCr9bRAz4+w#8;zA(Mr_^kcW{RdAU);&#oE%f=$Z&ubFymq2*q#Wg#<@scn zNyrIFa5*z({|NlB?WOe7H;+6Yn>>qp9rCI2mpF4S_jaL3iBr;tWmKgl#Xku+a;{?d z`Tfaz{g;_f7$2ED`u0TVmH5Y`pDs-AxK;@5l2|VzCHGOrMKVkHHFp8?#$O$uCcJKW zw)=70qZ(<43d9v?izDn*AInFzmRrK$vFLU4Wy;%R`;N!5T!7qc}pZlip zzlq(Re}Sm5l$Fd4X-3JH!W_JRSPK7`efj(*>G{jYpC45{DSlD;j_X_1KR$M5{*|H` zQa5D|%IHXWicaC1$|m}6|JS51U zCW!L!XRu5Ezx6HqecH=}r)wXVJz4qu&zt|BIsX)~l<-6g&yZLs?JkoqOzM8*KlG68w9Taq5qzEX_h%LVsyJz_fWOYC#^n{Cfoo^E||@|nzQyN}y{ zoM*VsAtmr$^p0em^e(9x;@Lv8xX&=J`u*m!+gtY+X-^+M+4b!7t8E{CeSi1=CA%)a zqNur~l=Mugu2Bn|NHkh zA1q!cJm2~>`kCiTlXsiH82w>kspWnzctLErq@z@m#6pp$d=J=_8Pa})eC&Qb>G`3j z_RrW~UVLl$W%ciRW>)Trf|JFjOGZeYk>C_9;jiO3!@&OY>BoPsA3uNi)au!}7ddaI ze!l&yi;0_SiNG~c8A%%{VaffXy#h};i@&x)TlzgYgJ{!`0OX~x+c zf&80A>?9URo|4!ndR!oai-9@$x6v2AcNH(+KkIu|_M+&G(kHQ>a~R|}9`Z$sFiG@F z-jw(#Dk-?1tC0En@9AG+-mQE2^;!8dqZj;drhQEOar(alyD;B6;d$a!lKPTs#2kdI zdGuMg{Vo3{{6XsVzvsW6nZBrhJ@$&xdNw3bl>-*yKyOt@N zvxnbJ#8zBJ;+fcd;e~t=9Da;izdAnuearQV{e|p{@K<^7WWOB$^@i~Qhamr3VNr2? z2@7#Ukplie&TJ;%-*divdUy0y^$WKbimyJu4g7rd=PicI>_U9v!Wm+F#s7%ui_GF* z#(9D1*l+HyVeffgFMZ+mg89|zx8FY{{mfv9XWz(sR>)p#r?{+mfyiHeajp<%hd<3< zH@^3Oz5j*7i;FLl-gbR@^W*OS^K4qY$wDk*$HgnfwM97vOSzx2eEnUL*8Ve2+@48d7__$7V$}Qo?vqN zBmV8=hr4fPyt00E;)vTS|i2`SYt3*9T9fVu?OS!69WdD8qUh>KKUFGX(ulinxyj$@}>4*Qn zc`OZF#r&MYFGaqHCjh!dhZfHo&EmuuO*8Lmj?e$ zp=%;6qTa$U_yxG#SpWVz`@{P4*>^WzZ+(^d`r}*PPpRK4|DIt!$a$M@mC$Vw2hoed z>jmU^I@!_~Y=15K^7s9@H?FUzyk7Y>;-mjJ$v@UiN*sZ_UV?{&b45agYXtOpF0x%@ zIQC2BYtskgw-aCQe!cRo)kmRkr++_YJjKq+D=n%n)JJzF`a!A&rN|z!hIqagu?`rczrmkm>U0F`u5{v)I0Y#?_Ni~ zP55x)i^{M6|8KCWahLI@3auBm5f%~5;O*jg&BXOL?R)p9tM696(SK9$HuA&lFOPq2 z_}|QWlgo_XN@%gLm#~B2D&7YiKFryF4}HJsa->!V$_PO{6|G&%3_MA6(Ed}|7t%cVLPU6$xy2m2@ zzwBrD7q1Uf-nP9_dt33|cqN%O~#d34eYurm?H=oZ;se+90%9P=eot+k@>AgZppIZ%;lxc^Ch-`K{ag z=1=dwsr}i;D8c@Kdn*46!Bs*B1zq`zxTmveFwXm3@=f^@>-*fd1#hL^JA9h)?d0!Z z#)E8AxD)s<3T_tqE4YzggeQevifQ(rqVG(fcfP;zw(sqYcPl=w`a12`=l`Cp8eHOh z#|3@~P86KS@5XbBeJ4}GU+W)dKj(hPd-wmX;``$t7k@4Pwf#Rg>m$zlymJJe2~HK< z&0oPI&%wgH`ESz?-Y-)=G`{=v_TRgXkD*^BentFW%QA&?0dK9qUBPXFzxeO-EaX_i z9P&@==j<;WA5Xkvdw1iV#>Zn{!hSaWJI1_`;}*|#{zAb3v-OMf0caziQ?jj+s2`_+tf|1my%gczrm_S?vEy{3`jn|D(@)zjx2x z{rHglpIbwO5`27SY2>J-D;yuHu%=-WT!(WEq;y-PBU;A$FyY>&WJ|FqM z;LlFR4QveD(R`T#tb$SkXLzl+&az%)xbR!;yT|9A4_fa%-aqH|L2zPMt|%XHQ2hi{_z?J{1dPf z(BeDGHGyphoFGmW`Pd*C)Zh=C+S=_tX&6rdF?f5zSYy79!59{8S zeCYdh{VT(-RsTwvpR%vzj^Vq?f0MtN?>4s~#}Q`!|Ea&6zWx4m^Mk;LEgzPDy8ZRR z&*pzt%$wLNxUKmP^55s5!Nq!RdKY~B{zsP@j@PYAT(I=U&+kY_pZDahxdWG{2&q2O${#kroJQr^g>oefa({`OBs6?|T%MKbL;}_$le5 z%17f*^A=U}PcmP=f1CH~;6G+&CiYaWyF6xm zete3&SGl^_7cs~FH~O9Tz3@xN6 z{)Tzu|N7rszc2pM_i5F~{~srPHvhKe=l;K68JXCcICXdq@GA1z^ICBmaFnxzG8p|y z`QhxE2@{fYAx}Rk} zS$~@Kng3hb&(Ob3j6JNfoDaCC@+$GA@HTVL;rPgMpJB_N`#%EB27&xv1q ze|Y^#VTfm8;CR4whGzz^7VjKxHqIriXBkiY{r_{{x8N_IKJERq_4Bc>hkhjf31@I) zxyrtaYbj41uN?0}ZV}F7tZx}V{Z;yP<6Fv?cc0dM>isuWyM8_Wo%8p>e|=0EZ04L5+}n8W@Lc1*!ugUdhk3#Od%tUc9Q^v_ zv)1RX&p*DzfA9RI`tKuSC+kWMChk<8^*r~uS-9NU-!fY=wER)}8U3yNOaJGKpQXR1 zeJ}a-`|oZ>Kh}JX3tSF7vw7}u3vy+!3$kP}Z2aT>v+7&xmr0-ZeE#*txVGJg3x<=5)(Jzqn<=zZb;`uW@3pAY_|F}!3JVxP|$z|Fz4g4>si ziG!JSHY4l5Wxw`*@BJF^Mf}VAFNeOR{#^J+lVKh6Q?_bOCvFa&qud2twj3_34;g*` zz4-O!`}VI9UwFS9{Zjpn?WfM4W&gF9liBz<-*DaF-o`zJtDa*kYckWDe@(x8e^`Ax z{UzqhmoMGlKL23;ll}i8lQi2AjxAh^xfgIZa`kW=V(nn!{J-k=iXQ>ru6_yp^7u>q zx6?n4|2F==lIc0?Vvdu+`uE^qEO?gL!>oKx6(nXMRJ{CW5@^ZWL%U%qI4jro@LL+-cFzp0F;Sz6hb zaNgt6d&*E+26N+eep&7tIapZA0K|n{L5fm$dbk0&v~EAjC(p4 zBj+l%EzG41%73MPP5OT3>+3H}U-`fN{yyW^roVp}j9A#%oj6x=sdF#qvgKrBH(+6A zJotC>FSQ@8-#owCe%1W;@q5{?lD}&i?lP}t`^XW;^^U8aOP%vSnm%1RE-y|4_Cl6GMxlTIeFfKi zQ@{WD`RtD*gB!CRTN{Tu*Ilk~C0ZGp_qL=l7Q%Z@+E%n(>wU+r;m;e=h%X z>i=t|Q>=O%=Qw9@6>~*$R{%di$&O_oSbKe^me5Fd4EgW3SwqxakUuQuP3zX$xh^?UojLyQwyc-XITJmKWv^5@*k-oSc* z>G=OMf8>9C_+Itx_E-6DuHSWkuKzv#-weiDmM?5qIbL%ra+PqtW8cZjz|73R`PciG z_>bOi_rD5#Q~v(@NA7Qre;$n5EF0ODa9rTjA$-fW;1KB>2MTszT&LpwB)d2+rWH@;n81(-{*eFemDN6_3hWUsXxyDs`;DDV9$Jw z^)-7C=LgPpoC`QEu$8cEVZ8TG?$6PmKfXWvw)~sj_t`%d{Zjb*`2P|nT~6&xO% zikwm$*=$lQC5$Wn{rJ83=iTpTzIA?+|6cZ^{@0&B2mW_5iL)BBui}W|wB_{Tn8Oyy zvXSx0KixkUe*XM^=UeADuJ6%5{C*wz)AZkk=`IT+doM>MXDDYQ#|O3(EJjQv{}29& z`BnbI{`>iFI^UyysQqgHqyGOXV?N6)HgyhWPEJm5j$>>aSX7vb{vZ4k_pAJe#rMPC z#J*epVEq;Khxz|*#sHQkHdzjKPASd|j*o2jS>l+M{r~c(>(|sDKHm?0iB*ZYgW=KN^511Yxqd`_&-?E3MlAFF;I{H^!zG(!M$H>*2)9LH7; zZw^`Za8_>Sc7_*!TYp#nh%KkmDdn4o3p}D%Lt? z2FAjF?0aTsVB$cd<@qHe_7z&-#ztubvxB%CbCVtopC?m+^P_PwO97zAOBY{kh}U!9TM98yHV8Z(&to|I9AH zQN?b}R>I=R^#1?kzh%F7{+#%O=ZEbNnV(aCb^JO0Pk}Lx*^l)I+g$c@>`v^mYzZvx zOrQTR_}l#Z_|K_7_ z^j|8&9Hu2K=4`I)E7=p+3)tSWd}BJoQ1Z|JPvtL}pYcCDe?0sl{p;%QkAF=WDwyh7 zl-TUpx3hP#Z)OW%EoKg86!`z)5AW|KKM(!r{qgAs+pq55O@EjEKg)Q5IgfP)n+iKO zdl(xVt0%J^qu~F4f7E{;`1$z9iXZ$xMSjiw-T8O*|LcqwnHyLav)Qw2vRAPgvX(Jt zGTQ%_|LgYq;?Gw<7X0}8L{ddqW_n+5(u>ZXDQ|tGe zKVSceFiJAtV9{cG&nC;hlx-fXB#SYVIs^AV^*`7{6DT852G z`7Ebd=d#^lt6^(r6=rc}vSTp(7w~7-uO&Z4eyaaG|C8hQ%0Kh|tzlThRLF9cbv4@? zwi#?oSglzyn9>t_vQ+0Jy6;pIR6 zzvaJOe@*#W`t#+_XTPHU$o%7H_{n&XS({azZ5mr1+fLR-mIq9%j6DCf|MvX${x#`m z+Rt-8kNnd6^WpEk{}&jiGYhZ^vh}l-vt3|a#v;mW!|4A%{qM2gWxv+_%=)?S=j>na ze$W3~^FM=8k9j4_K2|q2H?}RTb6Av_BN)s6&-wf9_r_m$e$M*&@aK+StbbPh?fjq1 zXvVym-^{WuU|iB{@nkw;@8sO#(x?9-(gtJWWW-}%EqS7wx9JP zOBwS?#vlKc|5g4`{B8K_%+I$!=lnYM+v~5$|JMxLnCw_`SS8uq*zT}?XPL?TnNga- z<=><~2EVO-9sBw4XXCGBzg7Oe{&$3-pGk=&n3bQ+ne8R3AnQqHO{N5fj(=DFr2UTj zb@u0}pB}&5f3NuC_fMSRGGjXPLY89IBdk5F*ICvxn=rL79Q&vK_wer{zbttEKRtURnwn3I{-F}(Wc`1jK96Tb|8$^Dx2tN!<;KZXDF z8QwD1G9O@>&ia}4D61svU*=|}n+ziVbN+t&{ot3?FX3OMzdV0W_#^)B!vAJQG3GcH z7uI#GGg%o~e=tvH`p)3`fBs+NKT^NTe!2Zx_N(Cc=08UNUi_cVsLfo;62*Fkbvvsv zt1`=WCPl{N|NH*B{n7Yc^2_npgkKTAd;bXh+xx$Sk%Kvs#hZ0M>uy$ER#TQ+O!kZu z{@?$b`^V;Y{V&U3#lLiZd;Qt>H|{?_<3gq%%%4~)Svyz-Sq)g8G9@u?|1bS-(VzO? zJAM`ZTJ|gCcfp_Af6M=?Fm7YwVc}+-#JZf-h&7mnhq;yU_J6Z~d;YZjKJ+W?*Q{Tb zzXSek{~Pe1fpHSk2j*`q?X1gKEm>1ol$lpEGBG6md-!MB?~}ihe&zo9^Xu(ztG@^T zg)_WjbYTu<`Ojj^`kuv#MUnXkqb0+Je>Q*l|Cs!~`0K{61C7AggV?4w8e*u4G{+Rtf_UqU$=ilmoGX6gJSH|$4F@d>=MUgd$Ri3qq zC61Yssfyw4zudnje;j|G__g_$>hG_=RsT-?C&RFuk)2tA(~2Vp1)=OIR0Js&yZmwqX@GO%R3fZR!P{@?#Q>Cdd+e|}y0CI9>4 z?-ze;|Ly#5!#JPmDDy0qe=I*)YFXwp=Q43Iw*8m+cka*i-{!yBfBXFY@|*2%z`xV~ z-5FOgU1VOy!q3XhI+bM`a}SdOR zB>wFCedf3RpAUcD{+0P3$7Ul$u0I-oRR7fdk@?H|PvXA~ zLlR>GlOgja=9kR-n0=U=nI-?IPB48DwPOifHznQk$yX0l+K&3KuCi9zds-oNvIGyYoq_4qsWulT>C|N8&O zFz7H|VoYRO$#jHi29pKTa>fq~S`3N*m;Dp?x8!fp->ScR{~G_h@^9k*5C(C^os70j z9ZU3=oTz+d%$+yBM=7iT!bki+jZu~3zFU@d}A(HVFqcW2wk&=Q~zoH`~3IrU#5TF z|Mva!{QvBK6N5NoH{)|gekLKNM~wZ9qKv%^pZ}-+fAp{ZpY1=bf7bt+{@weR`2WrS z8U|*@e8xkJPZ^&xZevVl{J@aOaOJ=6|C9f6{^|S^`=|3S``@X59{(@@Ph@z`5YD)q z@han0#`TN|j9(Z^7@qu3`hWjl`#;Bj`u{BdmH#{Q&*lHg|Nab@85|iWF&1;?Z4pvb^nU~1^r9-*Z1$yKd=8M|GP6BVbEl(VO+|%fpG$(KjV9b8iv3B zYyR{9U-7TxpU=Pee{KJ6{#>1_n{a492O9^BKDs-59?xG%&C;^!=Clf9PMs zzvO?J|0evq`OotIs{bks(-{~T0~p&Fr!jUihB0z6u4J%aIPpL3Khyu?|K|Q%{BPI4 zfB$^`@A$94(97_e!H6-Lv6wNQ(TMR8LmPu6!|MO8|6l*x^sn>Zgn!Haz5HkXf5CrF zh7yJ=404PCj46zvj9QE@7}^*#7`FY7`2YXk(SLLQ&HuOg-^YK}|7ZVaVaQ-O${@n% zz!=9E$f(Eoo?$kF4a4>S75|n0zx=oV-=2SG{xSY{`#=BxzyApgTNxM_br{_ktr%q( zZ!kJgpPx`O* z|IfcK|Gxi|`yc#&#{W0}Eg5DVekLO|E~X4|MUD8`mg#w@PFI?{22Nfb~D^zc+PO2;TXeAhC~Jx zhP(fl{m=RD@!#mb-hYSx@&70OKlz`N!HuDsVKu`chD!{`7}hZ~G59m^GF<*Y<$uzD z+yCnS)&Cp+kNn^C|KR^$|E(GF8RjwUVK~ZglwmnT8-qWCIKz$q3;yT+_xx}8-|)Z9 z|Cs+>|M&d=^WT^uhhZASc7_8CM;KNx^e}`ms4+bIzxjW||LFg&{~i8&{!jVe_kYj- zZ~yfe;uv}vmNIN-*ub!up_(CtL5kt||F!=c!73g9yZul5-}Zmc|9Ah@86p^(85S^X zU|7pAm!W|nfI)@f#sBU9JO8Kt_x@LycyIPKL0=V zf6o7k|H=QO{>S_;{@?w7*Z&9q#TaZDG8q~frZP+itMq5kX88U8%>QNo8~*41PyCKmUKu|C;|({_psI z?>`rV5knY52}2V@7efO>E<*r=HUk60t^e!)PyAo~Klgvp|C;|(|L^#J`#&dxK0`1= zK0^aT8(3u!gB}AL!`=To{!jnk^uP3f$^WMR)BkV#fB!!Ng8_pVLmopVLmNXKLjgks zgDHau!;AkQ-%tME@W1(g`~NxrxBb8N|L=cU1_y>nhAf6+hCGHO1}_F322O@&|Bw7% z{(r*%mj5mPJN_^Hzvch!|G)psgH>iTlrrQoWH5L!m@@D&y#Igd|N8$k|9AiI{6FFU z{QrCYU;F>(zchm_LkL3#Lq0=3Lo$OOgE@mB!}tFe{_prd|NrFwegCKYU-W;+|7-t0 z{g+_SXYgZ)W=La5Wr$($U@%}1V)*#~+W&3;m;9gpf5QKn|CjvV_5a5IFaO0E^cj2^ zA{jCnk{RL{ycmoaBpAN^zx99r|K_jfx(j@fWeKyg+Yr!mVue!<^Svd_y6DVf9?PE|F`}>^8f1p zcmG)!q!>&XY#IC*d>MQhoEVH4r1|F`_#@PGIJBmb}efBT=2L54w_ z!GXbz!JomM!I{B`L5_ik;luw2|4;wl_kZjEt^arYKl=a5|L6bz{TF0VV=!fKU~pk@ zX0T?^WsqfHWBB_2?*9w__x|7ef6M=a|BwE^@&EPzzyHM4mR2fVdOc~4>j2YA!q#3vvzWsms|LXs<{||%hKKuX1 z|5yKi|L0~so|1bW(_5bDnKmWNH zfY#B@#3>f4XL>T`5|MdUf|EvE`{Xg~p$p6d#ul|4W|J#2S1_=g520aE7 z1|tSj22}A1 z{}=zC{(trV_5aWQfB66ZKQDtgg9?K>gEoT}gA#)@13v>J!`J`M|KI(8{r{!^7yn=X zfA{~Z|6l*JG4L`dF(@+_Fz7MpGiZX%1F)&r|6l+A@c+~QU;Z;Na56|T$S`Ozs4(a-C@{z|2r;lR z{Qm#p|KtA;z$V`L|M36I|6l(zGVm}+GAJ;pf!(RXpuix+z{Bw8|Cj&I|3CVF>;Jv~ zH~&BX|Lp(I|9}7UGYErSs>Ptrpa!;`i{an@FaKZtfAIhQ|6Bj>{(t=c+5fNqfBolX z5MYpIP-IYIP-l>1kYf;J;9y{6`1t?r|HuFDf#K8tFaLl4|LZ?51ISMx|7(EVDZ;?R zzyMB9FaAIH|KR__|BwH_{r~Ad0|PsQAcG8p9D^EzB7+KpB!dJ42RQ8C{eSuYKG@vH z|6l)q_x}&rPofMGV4GzaBp8GkI2f22zW)FC|Hc2O{~v)}`3CGx4zTZ~7!(=g859{L z8N?Yl8Q2+q{Qvs@)&H0OAN_y+|M~y7|G)nK4UQ!d23ZCfuq&k)gc=45ADo3~~%o46+Pj45ADi3>*wU{(t}f=Kst8FaJOJ|N8%% z|6l(9`On0_!yw2Y$solb#~{rh$so+Y!@$Py_y3pwAHgc0|9|=a{r^v3AAv$tj6s?~ znn8*|l0lGxpMi;if#J*l&;MWifAjyz|F{3&{Qvy_CphML7{nPsZWU#aWDsEBV_;$U z|Nr~{kN@9;ee?4FhyP#x|NPGc4pAWn2?i+!aRw;{eg=L9R)+uofBpaP|HJ=R|6l)q z{r^2wB`X6zgAju_Se-C~C<7M*JH!9~KmULJ|Nj4*|F8bP0lV|p|9}747`Pb(8AKSw zz-|y^;ALQAU|{(5|Lgw`|KI+92Tt+t|Nr~{=RXGn$WNjSq732;q6`9Hm5dC(|AXQQ zr1H)GPyavt{|#2j!5{!u1Ik6h4BQOt3=H6~{{prdr1IncAOHXTXJp`F;9(G85C%g5 z25xY=`}hAR*esC0KL7s;4kcy=E(Tr(AqF7^5pZ0B{Lakq_y2dWOFw}9^Y#Dt|Ns9p zGH^0*gZ(cA4tJ253=IFkDnYUT_5YjyKmULI|Mx!=0~-Sm122Ohg8+jN10Mr711AF` zI7Gkx{|pYRZ{YC!`=1%AlAi&T-h~*r7}yxt7=Hf$|NrCv@BiQb{|u(T{%2tL|DTnC z8yr%gnB-&NVPIuoW%%>|*Z-gY-~ayxR{QP$xBq|tGcd3)a4~R!W1NqHpMeXUKR_W3 zO3$E_@)?}te*b4?U}oTC;9=kchX5x79|J1`GXo>Tum2#GAeVjxr@Ej285vj@KrzY- z4poqUI2jlim>7P7eGD=4+yC$X|NZ~{AC$ud7}ywu7&saD88{d?8JHQE7=HZ+l_fv^ zfBp}0<*)z0|1&UvatH?l9|ITIl@K5O|Nr;@&;Q^5fBFCQ|Cj&Y{{Q&@=l?%&h;o4A zlm{G|>=vu`=*5FoAOj$i{DA*Z%(h{XYZ4pZ{zO zptuM5ACv+>zWe_l6!xGP1;zf4|6l(9{tq#enSq@FR6etVQxXdUD+9=cf8aFq1?+}j z|9^pFo*5kapfn9~FDQ;cF%OETAOC;+|Mnkb`(JPhWdWNBiYbsvkeQ4OpjZO=38eD- z|DXT={Qv!*h2h_Sb_NaxkYCssIKeRiN@G9&{|1`~N^=l*{`=1Y4pWe7P)cHFU}0bc zyA%{sKcTiWF#P<_!oa}53N{NA>YNO$V3nY-2c;)a8TIS`_y2$X|NZ~}KNABem4eI! zg#kMQC@uW`|M&kNa4P!tACy}D{QvWxfdQ2A*cezDxENT#X0tJXbc0L*nfeo)Rzb1( z?>{K~*csTNYC*Bd!T_=h|TmY^^I zg%T+2K&cmGGbq$K7#P51C@7wOgF^}w27mwm{?Eh!vY(lO6`U_P7(nG8DC9sTAt?X+ z_zwzMP>eA%fXaJFiUOI*$^Z(B|NsAkOCykfK(>R-1eF7zGLsW*8b~b*INgDABdFy1 z4Ne`u{zH5OG6kfDl>w9nA)y2^^FKJXgHjSGJpca(xeAmfA+h@ZKL^9#|11ok5CoYC zs)<465-4~62j_Z526k{9+d7t>L8|p-1#4zLP2?v6`Y1Zp$@8%K=}jYuHWDk4T>QU2Kfk7 zhk;TwC=Y?sD7DBMA|gHk9n1IVQy z7lJ|-%*fm{kv3CdT0|ATx9QwdQA3MWwh0);jxBtfb{x*ZXY6ZnR$nT)i9bqCUjzBUHl_0x8Z6*+A0EZDMra+}9C~vYd{QA$r016wB z{r|uv!=L}m44^a$@(0L;pilzE5-2r+%mk?dxf0|fP@N14K~Ok>%muMQK7zzGs5StF zCMd`;@pjZN>KTw!~ayKZAf>eO=KFA#) z_kdyvlqW!KAP@$r1&M=V3FHQlJ3(n4RM#N<^dDSOfd2E`Dl>;r`oB;A4B2f`4uLE!;%Dab?y z22lA0!XUST!Vu&qSSW!)3X~#1sRWYZ5Go<51mtUw4p3SEr7}=jf!Ga7hY&MCZUcoD zs5}Fy1*w6k1%(qR3_x~(Tn~yrh$@iHpwtACf%pSt7R>LUJO(lml#bXK{`?2!5ReN% z;R7-cM1$0WYyz1Cic1g%#Vx3f1PT>UNP)})g$Bq3P}&2T3kpw&T2L&3OaPe(3NKKo zgM0p^(~WIo6&P@4@zgG_^|1Gx}n!r%X(7zf1>C`JDR=Pr None: """Set up pipeline RTP server.""" # STT expects 16Khz mono with 16-bit samples @@ -94,6 +95,7 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): self.pipeline_timeout = pipeline_timeout self.audio_timeout = audio_timeout self.listening_tone_enabled = listening_tone_enabled + self.processing_tone_enabled = processing_tone_enabled self._audio_queue: asyncio.Queue[bytes] = asyncio.Queue() self._context = context @@ -101,6 +103,7 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): self._pipeline_task: asyncio.Task | None = None self._session_id: str | None = None self._tone_bytes: bytes | None = None + self._processing_bytes: bytes | None = None def connection_made(self, transport): """Server is ready.""" @@ -157,6 +160,9 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): chunk_buffer, ): yield chunk + + if self.processing_tone_enabled: + await self._play_processing_tone() except asyncio.TimeoutError: # Expected after caller hangs up _LOGGER.debug("Audio timeout") @@ -289,7 +295,8 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): if self._tone_bytes is None: # Do I/O in executor self._tone_bytes = await self.hass.async_add_executor_job( - self._load_tone, + self._load_pcm, + "tone.pcm", ) await self.hass.async_add_executor_job( @@ -301,9 +308,26 @@ class PipelineRtpDatagramProtocol(RtpDatagramProtocol): ) ) - def _load_tone(self) -> bytes: - """Load raw tone audio (16Khz, 16-bit mono).""" - return (Path(__file__).parent / "tone.pcm").read_bytes() + async def _play_processing_tone(self) -> None: + """Play a tone to indicate that Home Assistant is processing the voice command.""" + if self._processing_bytes is None: + # Do I/O in executor + self._processing_bytes = await self.hass.async_add_executor_job( + self._load_pcm, + "processing.pcm", + ) + + await self.hass.async_add_executor_job( + partial( + self.send_audio, + self._processing_bytes, + **_RTP_AUDIO_SETTINGS, + ) + ) + + def _load_pcm(self, file_name: str) -> bytes: + """Load raw audio (16Khz, 16-bit mono).""" + return (Path(__file__).parent / file_name).read_bytes() class NotConfiguredRtpDatagramProtocol(RtpDatagramProtocol): diff --git a/tests/components/voip/test_voip.py b/tests/components/voip/test_voip.py index fe39fe9f567..c26d9a7a294 100644 --- a/tests/components/voip/test_voip.py +++ b/tests/components/voip/test_voip.py @@ -88,6 +88,7 @@ async def test_pipeline( voip_device, Context(), listening_tone_enabled=False, + processing_tone_enabled=False, ) rtp_protocol.transport = Mock() @@ -137,6 +138,7 @@ async def test_pipeline_timeout(hass: HomeAssistant, voip_device: VoIPDevice) -> Context(), pipeline_timeout=0.001, listening_tone_enabled=False, + processing_tone_enabled=False, ) transport = Mock(spec=["close"]) rtp_protocol.connection_made(transport) @@ -175,6 +177,7 @@ async def test_stt_stream_timeout(hass: HomeAssistant, voip_device: VoIPDevice) Context(), audio_timeout=0.001, listening_tone_enabled=False, + processing_tone_enabled=False, ) transport = Mock(spec=["close"]) rtp_protocol.connection_made(transport)