From 4a9297dc65ad438a3b48d187658b38db548e5a42 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Sun, 23 Mar 2025 17:20:36 +0800 Subject: [PATCH] =?UTF-8?q?update:=E4=BC=98=E5=8C=96=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E9=9F=B3=E9=85=8D=E7=BD=AE=EF=BC=8C=E8=BF=99=E5=8F=AA=E6=88=90?= =?UTF-8?q?=E5=8F=AF=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - main/xiaozhi-server/config.yaml | 6 ++-- .../config/assets/tts_notify.mp3 | Bin 0 -> 11752 bytes .../core/handle/sendAudioHandle.py | 33 +++++++++++------- main/xiaozhi-server/data/tts_notify.mp3 | Bin 18858 -> 0 bytes 5 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 main/xiaozhi-server/config/assets/tts_notify.mp3 delete mode 100644 main/xiaozhi-server/data/tts_notify.mp3 diff --git a/.gitignore b/.gitignore index f6264b6d..a25b3401 100644 --- a/.gitignore +++ b/.gitignore @@ -145,7 +145,6 @@ tmp .history .DS_Store main/xiaozhi-server/data -!main/xiaozhi-server/data/tts_notify.mp3 main/manager-web/node_modules .config.yaml .secrets.yaml diff --git a/main/xiaozhi-server/config.yaml b/main/xiaozhi-server/config.yaml index dc6304ca..724e0b7a 100644 --- a/main/xiaozhi-server/config.yaml +++ b/main/xiaozhi-server/config.yaml @@ -57,10 +57,12 @@ delete_audio: true close_connection_no_voice_time: 120 # TTS请求超时时间(秒) tts_timeout: 10 -# TTS播放结束提示音 -tts_notify: "data/tts_notify.mp3" # 开场是否回复唤醒词 enable_greeting: true +# 说完话是否开启提示音 +enable_stop_tts_notify: false +# 说完话是否开启提示音,音效地址 +stop_tts_notify_voice: "config/assets/tts_notify.mp3" CMD_exit: - "退出" diff --git a/main/xiaozhi-server/config/assets/tts_notify.mp3 b/main/xiaozhi-server/config/assets/tts_notify.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ff071501d500198f48c0eb507bb21432df426d04 GIT binary patch literal 11752 zcmeI2cTiN%m+0>>FbpujkaG?K5@yIjVSquRWF+g5a}X30VPKFXk|ljbkenncpyV7S zgG9+7K|yk!r~9h5_U)_MzxLJs@qYbBcb~ea?!9$BeY*RcI+|z+Fz~kt7#kU>{TXQi z0IZ{YS4~0`i9m7+*g8D2;S?AAH;@ zurqX2ukdKTaVqnI_F;#-xmm=>WpqOSO%hhK@Z@{kl6Z0an}~ZS=_-Cqiudy6UjAn}P8j6&QbfVmv%XyNo#d$mlQC0+;IFn?ol? zRUguZKh*?li7q;9|4gC*>$n-?FA~rppnVIV1=Y$(sFV9`5z6gJn+{wTb5tGP$236fy>sCpe3X{Ex=PMKBIguDBCYLJ`ZM9dx6J3) z_+1u@dueh~%ukg=L(uj&!0pj&+;`UCV`M~~I+0ms(>?-)C&DOYYFU~RxvdB`iawjq zI@M$|UN(}GnzyW?eI{{=QcvJMseNCyW186yov*yvk{eo?F`nR zpc5ewHQK?7?;}F725g=$c4$NRdPi*%+)bQ>#@7SBvdhm(sL`jQT+EXMc}YG-?LQV; z{scD%7jYXsl_WHjC!`Z@ZFp{AA=wYlappPp$k`8QgU`R%Vmgk~%%`f^0@UgfctdnF ze)JtW6@4AZd)uv^5x}%r@N*$q+so%x5w8#oQ|WlFRx~{S4QbDj3jci6HFa8N%&9(HnpM2e3G0LYEQ zrYjW#2*m2kp4qv$n?k^}TzX21G<@cj%y|jIwOm^X@){b7U7Td1E4BtKu}|>$TwZ@L zJee!PHW;QVWZBxI0*i=cBnP8@fbtE2Q257TPJ3>DuHPODY(lzKzCUOE=RYpk%+8w3 z@Z(xg6;wC_0+wLX{8a3Z?gjFQSxjBlFjh;lzXco#sZ%TVWjm>Qwfxm`0bhdu>C8}m zzu^X9%h~4^8o*o8vYO&id+A~C%kMuM=hXLXIZkd=sEEU!zWTPidr~{O%eb)dw#Mn| z2VVU7i^N|$7xmw-(hu-I@ruWN*VNBXDaeBg$NZarT$f*ze8KQv-&5cpd*<=Q+H;Yp z^Z`yxLVU!CoKqt3h6gVxM=LhWBLYLP9Gqvf(OLII>t&j8QO7mAcY1!Y`*O*CowuVt zG;4mIx9RaDJ4Y#_O+Ir#$*1VWvI(u$pC7xqx$jZI?|Q@$gksZuDbkXLl%D!mm$lWq zdClzjaHYG-t`)ldu6@b>vnE=X<5hFgUqW}V5HG!nUtYX~j@`XiT@64S)J-U00}G5$ zMVISAWo}}R=IR1= zQcu|%Z#P$**Ntu#ZFEkUNz;u9uph9$cKHe#5UQjXfEV ze!iS3>ojKAj88{w>sjM}%L3F|VFb!wY- zX&B+6KE{zSi~z%nb$Fb_cno!Y(}f&(=acxUs?N65pz^hf|GD(m$%AjQp%-@GyJ0W; zB5@V=bll_*1!{szEtQQhCGS=}hf>D--rE_D z8bCT01kMdPNRlTH_vvv>aOq*CeEpcU5#h(x^z>lhAEYNZQZeo!Ut0D!pKXj;f2lKwV@1q1h#T_uV0A2n$HwL9!zW~Ov;y1zIn#~7NAUTjh}|9&7vFHnBgR$!J@ zm`~pLwKL!S@mH$(F;rT%Jk?KVpHbPu=EBz~@8(`&UgrY-zBu59$ccxYJDaEPv&U@^ z+IWWCic3#KB~u$lNNxB&p|LelElOUk*w1gbYi&D28y*++vd1ba-jJ8umY>OEH~=wM z$9_e3et3xNws|Ys#rch%4cC5nyrl|XHJEktyu2)1RY3|DG!GTo9QtsyFv1{rZ-@0S zT%u7h;f(nOJbp1al%_hI;lhy%3JKcJIOGz!{KYC;yVXbukgCeqDt_LqX4n1wD?+_- z;mHdKmjTrbBDMEM;oYXj-B>F6A-|KA#*6xo{kTQE0bx6I>GIDJ$2*r|?f$x=4fZLm z0>`s~4#Y0K$^P={63Yj17#gQu&HGD;3P_63GTRoUZ;)_giU)F%;CTl8Vw*&$n&|we z#4+Ss!TjP~ZUdU%6RH!&lg$XJ!l=o(6Sm@CobU3BKM>#Y|0WcYViGBy7hRv`d*3JH zr*o9|jF1*VNJ|_u(Be$Z&#guuRQ6Uso{A_kH)6Cy=NsM!Y5v|wTdEn4M_-R`DdUmY z@PG97L5i%Wyllq2JpPdc9k}dbDYccCdEpZ_FU=mkG10gPnvrWHE!{Ib$1Jxxg?*GZ zNjd@c*+d-KUZALfO~m zVo1`{P$NIMg$l&V&Fo03?DCtqS8#O9eB4T4tK=P51W~7CL{92+Ywy?jNB!aL*;`>| zW3DN$VuJ8T=4O$4^-K3Yr03VYTd#51PP=y7I_-<>lZfm-`w^A}$O;9W-q4BS-zySr z>D%V%qF8#%*qTEk9VxcIFw%Tl@18Dm(kCu0+I;b9ae@F6ifxPLYvDY^Fpq@WElN83 z3vlPaY%gKqi6Ne7>FIn}ikPbSz~%r2 zk)JX$!wGTWBvsrabsDnQWycg%%s4SDQ+8U*;Oaml9>*vvfHEVng*z`RV-$G^+9Bb~ zKx(h>{kW7ye%|{%R79|czKQh_>-YJV_)30K+pxpNd!J|pH8UudRgQVTnW)2mUk$k4 zQRtHM46qq8qry{S0b#)BLA>{LX)d*jxX>}l=fupTE;qIBstyX@i}y23XZ)iNcfwU< zs-=7WEbYB$1c9&D@yz5LAi~5qk`-R$Y`^f$VBXI`C*7tJS9t4DA&NjmtkYCcrnTrStXOi$# zMA?6QYezTW;vVVGq?Z9|Cyse%AWod+F1}=vK!0ftGKng-?;)8zVh*~vZTp2d2tT{0 znvFj+F2|oI32=>HuqX_T)c?0#E~5IU!JtCBaEq|I^CDCrhO%dYb7-#{sLaTr-Ge%V zfjB}6lBC~0Z|SlJEsVp`)8G01)R}?`ioYdLY}J;QcC@P+EJX_Y3c&ob?|SljoJDnt z31@Rne2|cfpS{vv^JU>K96^iAdCp;EkQq8sq3RDV^ttj&flW^-t&E~P^cukR%5k`%%QwCEH20#9k}h+uOE;-y6r z&^m4&VRHpvFoMF4HAcsRM;wm2$l}JG!42Hh=IMFpvp#8cjL1b~#WP813A{vh>uyv1 z=>KdaxyyeM%26}uzczIEbu`Uu{z7{9&_}oHW%|Sib4`dE*}E<3HFPcYSj~3Ed92KQ zU!*SIq(lW$$-{ixlJAwv&D++{*{xc1!F}KN@#((;`gZS3e-FjCecrfo%w`5a8XyEU zN*qCty+V+yAP|_8XX1y^?Z{G9F6m!Zj))9pHc97uh@NzD!f<(16#@&_s?F#Rw@Ke$ zn19YJ_jxAio)_|wpLptDLVVC9M!hc8E5SuXZcp1SFf(O<7@OE$0k(^Mg%Jz&MxZ2o^p#xvZ+_{qQtMe&p7}Vn;R!WV4yBSxRc^OE9e_l->$2o{=c}2rR(| z2eKSN0>pO+Dq!nGQ%ra0kXHG{RD_OFr%L>}RVaQamMq_a0t;Fvr)T?QOG`S|@H*d@ z(YR6BRZh>;n6|1!ck949JJ**gX~0g%xOGG|n#Q1wX!40GvuM;sS|85_H*rs3A^QA> zRx_0izFydBK4|Ht@5205$#q2=mW<4bw_DHtfa(Y~M#N_hQO)-5coy^PP~CRKpnASM zJI9ZQ(KPL_+4sA|I<0^FruBtBD9hRd~Rmx+*S25SMjlC6gk-f(}L; zBPz!k!a#=rI|Ml|2$(Q=_(|m7nR_zI&bX?Wk`nmb>e&T6r?VR2(|okM{3TN63=loj z2S}YQkh#ePcH>A#@Q`6!NJSXEWm9n=lq}(N>1pzO(vemD zO(x5e(}epH$mE2+K$5xON@~sTPu4$7srjOw^pqIH$!yZ0v% z!20211fV5Pzc=(VOaVd|+aV?Edg;FIMtSuvzWnwjdNyG)!3x8=Vg2Cf-S6ckYwfY(Ne&Xdprx&h%6aqKRr1w*$MMAYgK?RP9uw-N z_(|~1$7h}?kza03SbfcAwrCvQ>B0|Z;>QA2uGmd4vuRb;LnZ)Fiar+3h>?b_LzS_% zRr>`pmG17I0$n@b3GHJj+WUurtPY3~j#=ZSmYYz$&~yYUraMC*YZw-0-ABdhLb2ob z%tK-%@8&1Iq@u^Bj|_#tsvVMoB=|SyGKXJySbh$BZ9Nf-nd=O&47uh7s-R%9W~bSV zj{544efQM)=Au>WktA#N8!z$%Wvck;3blz8@W^S)rE~xNax~Y4G6gzOuFal;+T@jm@yJO2t!b+h&%voH5EfjrqIAnzU zo!8Op!yYZPf*A24T4Hh%IK{c`O&aKannAfR^I|EWnQ2$Mb)>^T%GH7!qAgBy8Hgi1 zQCV8X_wpRYv5@xd6ieqG!A%Y39VA6me4>~TK;TIY1;8LUAvci$XB9GpBe9QY75N+F zn`uWUewS#>RS}sDX0k!Z8Lo?;MLs2u_;;IoZCIBack+iP1b5WC9lRPE338^g; zu$83^Ti49w_M~PF?=dB~+n&4y$QOk~F;cHA6Y(6evRULcd|{RP?0lDck}mB^?89pE z-e})b9a&Aa)aF;m4;qTNejvxQ4pTS*Zf&*Ko3)3P(fI*`Tr56pQ;rN}!Y>Q6MEU3& z@`%KIh5r(Yj|A&8bdAk2RY{^FKS06E1H$bb<<5>Ro#Z(Ye{Kprxkbg1?&FI4hBO&3 zGXaoA9Ey;WA0tl;Aqpn7@%b25oga#sV_DaqD8mraI|68k2DglCoPJxf5(yXAG~-v_ zeCx8(o&w6A$qVo5&9`$|9i@&A$$?I%$vLl6ioIa?A+gOXAy=W)6?SD}v|>ACr6?#h zbFu{>-b8^6hzR_eO|lY^+q`U?0w=UK+{DxIIG#>I%o8-$q;NvjRv}wQp>Td@eVYpQu4nqGcK6`e9X^#V<=$VqaJi#5L|^5d9JQ$S zs5Z0jZXd8sWcof)%Dam1qf>G9S7=*17C)1@Dmr67ax{fIeE*f|TUl*+7!&}1S3-2E zQ%E#JMG{n6o)nR*pFMZ|9DRcEqsH{s))3Jf+(`nF5M|mK;x!Cf<|iOBS?X|(W0tNV zE`TJTUm2i#ivZgKD1?Koui7JKiox+IDqr(i9M=A=V^L~YN z{v}igO*Fi9r+=0yTiO=7iTL9~tzZ^0XUB-)*E#kWs53DwYeem7u>M#s&GgQ()P4E| zu@p)gvxe_MX@P$D%7b_L4<^z=bQ(h0sXp$V=t6Sfq4NJ=v zXlox526+tKGj=GJ?<;m;Vswk|d7LdbAyWNN70JX{T{WMk)1T2$=82oO4N)7$GV{j+ zAmz@3-Mu!mZpww*Qm}4HiTs;JrrZ=LD<5`Y;=)i04#@;J`p)i(U2~knrg=(@G~qxx zzrfjDQUJuP55V7H7(oyyhSau>XhSR{)tOV^&I?}w%m97&?Nr87XVp2B^H>^vqLDB8 z3B~9xN4?rRyBS6)qbI-F$wggl$#p4tEq%SFE^9Z_=MGu;>!P`+2$2Dbz8Jgs8t=b^ zrXz5gD0QP5rYz}pm%D)DQ;NrGEPD3&*n_y7ADl4n#oXuSnm(aUTD2<#nr4v$bDad` zzGY7?uB||OfQAs{;7_hPG11rd`JL>y+ua?7K{A~Ro&Nc^$+ELI>g+SAL~E2veDOa| zsd%a4lV3RN{A%Lnuli&Kx>eJZN7GXx=n8|jK5G39z*Zr*1~hmFlC1qZ%ox;BBGvS9 z2X6&{1M~d6+Qt+7i`q=Nudeg22lTi;88-7+($1$dH^0L*+v2k%#0l-p-0uWyCYKGR zH42d8PW1~rOIV%>?I0_`3?7j`i+3q%UB1JXZL-r@Iq;hVc*BYmXwE-}GUvAzBp)lG zD>alIO_aHwF7;Frit1~jrx-N_RBqLIqAQv$D$+yxU6YR~-UN$qE)w(z+CHNQoB;r> z3IIlgrEQUfMpFjcw-cVdcJ8|D{Xy|sgrcHr91JKwr3GOsxKkMkgsRY}=*qgbACk{eXjB8rSo|grBLem7?Hg@mc#;2#H6%u68gb~6SL;n)m zBT4+O->E&rw5WoEP9Rn&2B+2Ohn$^SA>=u^zhSa#D&Z~}-%aZ}!n`1sunEe1dm#MX z`;OwLZ+h`&0LiT^082^#;gN8&PoAeXW6txuIL(yh9tLUc#ynU-;=8XiRwoMU0XMa= zm1rG<2Ve0;roZa~Vy`*MSiR5W6m^?tPnC~|DEs;moFFhcqEUJqlp}z#kPMdt(_+PC z*N_uP0SVcMOHnIcq-#50R{|}*2kqh09Q~U!U$D;3KFniZs2yS{J^CzpYOSk0*u7HY zaUFCKGm=JrA@lU7`X(Q6&KgrYYFnzB_5d8i+PCdlJ%oe~{c-G3In6{y9>SzK96`407aTtZU_ zkVgR+2nd%Yje(ItAO&CSlNrJc+X5YOM{N;rq~3wx?B>T7aVb*`?k6weI(wD0O76^8 zj`)X6H>-Gkf14ZnCQ^_(TI9m5rnI*=LP&51A18d9-Ja(5H_BO=(?KsO=ImGN%YO+S zL?($Cb!vC9VAR7jrg_2iy1fRp<@R0J!vvl}@93v@u8-GQzo;4$VKo)saLb4n(N-+G ziEy57R5?r+qD!hOfDk;K&`L4pGT^G$sCL;5VS0>xM&798o!N2aE( z3bS9O5;Hn*uF6IN1}&V+AnFtPf5}C z1wTqA+jMdFuQnxyLNw#uiX<8ugGM*`Ek~+J?t?g&N%?d=zC?@gkWHC)1+c8#ZlR5Y zqrh3RPDhMq>n8{*le@7GA^YLE4Zq@%PWl`GJvW@}qiEm+8-b|p@-7+IazJhFE>iuZGY;7Aw?O4FMiftR2u24Nv><8Lxyt zNjde|;;JD~*dITa>rs6TCp&Wr{0>To8i&Be+liA zgi78+S5G6eP@#3xe|!i|ZVIP#?g}Q3St;};*SC>rtD?z-o$w7XL3aMRAn>wS9SyT7 z`|;ttBPj3Uc;<0|0|2FlHR;CZ;Jw;fD<4e^aEdhwCT};jX$LWrlQvqu&hAYYq|!6e z96kHJN%eH->@>iDX2!&J`Hh&*Q~3SZg*Is>ie$@44GfcMK9n#Yv=nyVAwLdwqYJZc z|1#eI3xdgYh*y&OljIxe6+2D%8+YCM!Fe&WEN>QK-n7^s*+nm2!pcSO+{IgGs5Q9! zGeX=`hmTUYfWc@}SRvI_rL#($sJnHHAjchbmj0?Z%U$Tec%@YNJEMNI<8XI0UGT6Q z?R)R@3*HnV#*%x^C2CqHh6_J;#u*I$+yRB9e1rJ)RF!^w{rWsTOT__A0&&p_QDOPG zHt3lasK&9$S?S$-K5dONayu?*&peT!9AB+l^N>F8lkv|iI@z(CaQzb(CN)6_@)70g zPb=1iVO?)lAn@>k+rRjs!qGFn`Ch+fGp>WV7akl7z0Ib67m#VOGkUEZasKMW_b;Ix zC~nb6tv{c|N29l=N|=X&n#dGJu?7idOXac3p@_^au{ZD>Hd4EA(!9@B9j~TF^)XvN za_-_y)LDIFoXf!Jnr`5a63&VllY6e#i^cY1x>NH$XZ2I@58sDJ4xQIcjIcCj0g*j3 zydZV?psw}{r7thSf9(IZs~FT5B?WbmOV>Hl3s2rxe6OM>L!w6!aFdVr%9KlbyI-hv zsgTUs*{p)oMv(pC8NE$Ku|2Dwoi~SQaZd;c^OC&zY^f^uTYPt}ZKQ1Vtt9(2fh}XB z7~JQ|s^g7>Cv4pBDSOg|gh#gd4+u?Wh2PK%;mVe;;$3SSJj`|)7bNIbLN(;+2BRwD z_GR5k%|Z&kF&qq8(~-qGe-g8x;UNnN8VFW5J^l21<093ybGEG-yhdMotZ*4G_?0#9@~#TP_YMU%w%KxoH)sp*5 zXf6_WVcbDhhs=^C_;C*75vBa>1Rr<|0ujC8$wfrV8q8gu=sRvWOR?Go1uzzh@R!9X zY->ASMk3jJPFSaA)RaPEdlBv9k8d{B2R+8ueB;&_Gb+>@D2v7C0;2*18*|c*wKos1 zXybb0k&tNzTH@PAX3y6dTIDA8%>dzOGAD6DNre8 z&NYNMnLg$Yvsy+aHwI(SFxQgR&f_JJ# z@9~&r2%B;iQ0MPvf0(yG!4+LUv5RMX-^|$4Sm7n=R99cRmcsN;RMCr9SDb@dfKFl( z4R-=lYv}!u+?&Q)KFeY6%j&6lTeqs@vD0;0GgdskUc612p-* z>2#s1e!lHXH+s*`nDe~UpY;f-U6=i0(3{%0$3bcMu`%{I6K877F8oack52-?M4#aV zlfMK@4L&{p*8JgRk!o6(B8-1j3K7ql8`UN9sDUX}|F@=!D{R1tK>zB9>uZ{dfA!{= zM6qb#(Z2TM(yv2`=aUyUij&Pd@(Ts{gITsMlXY zYe47&qjsFTc#HJQUQ$A^4-B12+nwrx+TvR#q@wK6=ow@&QXtsF9wtxUGn5#C@ARLI z@_v%-bUA!4rG5KtM5=pV(86so?vPDM>6Si95fUM?2x6L6zvz${h^qQMZCDSdRtP_o zw@J_fe(`*cKdMCFnZZ&D)ZoVU>}|C*@wAV*{^79ox+lW5KYa?i23Eygh;*4%#ZweH zYDETLzOktp-GA0zo%ujqOl?Rm(|}HJEcYcxpIfuj`-O4&$_^e0iMP)Sw3d?CZ*8|EOCU>oJO(a4gp_tZJ6<7v2c$xr?E&Je8ePVc*%q0xzEfuSHq1DZt!;5g=z_ZsRtHxCVqCuN+#AOCZ?OJ z*ANqZYP%BSnq%7uKf8kV;yii@Wbt)LwS?+){gEktD@EJ!NUXS-aYbsvILGZ!sJPTb zERS+ULPF-cxY<}cFBYvGk=aq8ZL4q6W;_wSFcckFJYZuwJN*wH*$B&fpE{IOdpVqM zI1Ggvq>-N=1QwUKmj;+b&%R(TKMFdc)(K*)A)sy5Cz(ni7it+!+DR%Jwl9fA7ohcM z*jsZdOool6DAueYnewC|#s7CnRq=mE`|Cr$C=Z|(Z6F&)_ygDkbYpWc< zmx)DE6#jR7=f8djK!<5riH}d{7p|HPe6UmX0FOU5clQxb*2W8`90=YscZgZFcb(K0 zuF7U&uFyxdhCEVi7w>%&970IW8r$n|=1_H6jhDh?1%sh~6s!7LmBA3I;odhmaIzVU zR_WUGuH@L`gfX=Tea**OUp!{i1k3SwCpxDqm9|SWQ#!{=126nG9sM7%^t@9o(l+EP zJw4sFy|J;y|0BEq*Y^02PyZ5%p*)CkDu82H2?ViphJW%ke=6p3|8$%HAc+M4!vCoM z|J(e398mG!f<|S^z5lbI@n3}geIfpj6Z-2ysMvo2`gbD#dGaqp|Jfq{lK+zh{uc&* B*pC1J literal 0 HcmV?d00001 diff --git a/main/xiaozhi-server/core/handle/sendAudioHandle.py b/main/xiaozhi-server/core/handle/sendAudioHandle.py index 545a9286..9a289d75 100644 --- a/main/xiaozhi-server/core/handle/sendAudioHandle.py +++ b/main/xiaozhi-server/core/handle/sendAudioHandle.py @@ -7,12 +7,26 @@ from core.utils.util import remove_punctuation_and_length, get_string_no_punctua TAG = __name__ logger = setup_logging() + async def sendAudioMessage(conn, audios, text, text_index=0): # 发送句子开始消息 if text_index == conn.tts_first_text_index: logger.bind(tag=TAG).info(f"发送第一段语音: {text}") await send_tts_message(conn, "sentence_start", text) + # 播放音频 + await sendAudio(conn, audios) + + await send_tts_message(conn, "sentence_end", text) + + # 发送结束消息(如果是最后一个文本) + if conn.llm_finish_task and text_index == conn.tts_last_text_index: + await send_tts_message(conn, 'stop', None) + if conn.close_after_chat: + await conn.close() + +# 播放音频 +async def sendAudio(conn, audios): # 流控参数优化 original_frame_duration = 60 # 原始帧时长(毫秒) adjusted_frame_duration = int(original_frame_duration * 0.8) # 缩短20% @@ -42,13 +56,6 @@ async def sendAudioMessage(conn, audios, text, text_index=0): if compensation > 0: await asyncio.sleep(compensation) - await send_tts_message(conn, "sentence_end", text) - - # 发送结束消息(如果是最后一个文本) - if conn.llm_finish_task and text_index == conn.tts_last_text_index: - await send_tts_message(conn, 'stop', None) - if conn.close_after_chat: - await conn.close() async def send_tts_message(conn, state, text=None): """发送 TTS 状态消息""" @@ -62,14 +69,14 @@ async def send_tts_message(conn, state, text=None): # TTS播放结束 if state == "stop": + # 播放提示音 + tts_notify = conn.config.get("enable_stop_tts_notify", False) + if tts_notify: + stop_tts_notify_voice = conn.config.get("stop_tts_notify_voice", "config/assets/tts_notify.mp3") + audios, duration = conn.tts.audio_to_opus_data(stop_tts_notify_voice) + await sendAudio(conn, audios) # 清除服务端讲话状态 conn.clearSpeakStatus() - # 播放提示音 - tts_notify = conn.config.get("tts_notify", "") - if tts_notify: - opus_packets, duration = conn.tts.audio_to_opus_data(tts_notify) - for opus_packet in opus_packets: - await conn.websocket.send(opus_packet) # 发送消息到客户端 await conn.websocket.send(json.dumps(message)) diff --git a/main/xiaozhi-server/data/tts_notify.mp3 b/main/xiaozhi-server/data/tts_notify.mp3 deleted file mode 100644 index fd75353057abd0e7b3056ed6d16279e925b16327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18858 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≈^17h&wE!<;^ANLxQp_`hhFwR_4MIG?*|r{6uiSD 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