From 0bf0b0d381b195b165273d4108584fb4f088bee8 Mon Sep 17 00:00:00 2001 From: Jad Date: Sun, 23 Mar 2025 01:08:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20TTS=E6=92=AD=E6=94=BE=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E6=8F=90=E7=A4=BA=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + main/xiaozhi-server/config.yaml | 2 ++ .../core/handle/sendAudioHandle.py | 12 +++++++++++- main/xiaozhi-server/data/tts_notify.mp3 | Bin 0 -> 18858 bytes 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 main/xiaozhi-server/data/tts_notify.mp3 diff --git a/.gitignore b/.gitignore index a25b3401..f6264b6d 100644 --- a/.gitignore +++ b/.gitignore @@ -145,6 +145,7 @@ 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 ac62f988..953b60eb 100644 --- a/main/xiaozhi-server/config.yaml +++ b/main/xiaozhi-server/config.yaml @@ -57,6 +57,8 @@ delete_audio: true close_connection_no_voice_time: 120 # TTS请求超时时间(秒) tts_timeout: 10 +# TTS播放结束提示音 +tts_notify: "data/tts_notify.mp3" CMD_exit: - "退出" diff --git a/main/xiaozhi-server/core/handle/sendAudioHandle.py b/main/xiaozhi-server/core/handle/sendAudioHandle.py index 8999bf08..545a9286 100644 --- a/main/xiaozhi-server/core/handle/sendAudioHandle.py +++ b/main/xiaozhi-server/core/handle/sendAudioHandle.py @@ -60,9 +60,19 @@ async def send_tts_message(conn, state, text=None): if text is not None: message["text"] = text - await conn.websocket.send(json.dumps(message)) + # TTS播放结束 if state == "stop": + # 清除服务端讲话状态 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)) async def send_stt_message(conn, text): diff --git a/main/xiaozhi-server/data/tts_notify.mp3 b/main/xiaozhi-server/data/tts_notify.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fd75353057abd0e7b3056ed6d16279e925b16327 GIT binary patch literal 18858 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≈^17h&wE!<;^ANLxQp_`hhFwR_4MIG?*|r{6uiSD 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 Date: Sun, 23 Mar 2025 01:13:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E5=BC=80=E5=9C=BA=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=9B=9E=E5=A4=8D=E5=94=A4=E9=86=92=E8=AF=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/config.yaml | 2 ++ main/xiaozhi-server/core/handle/textHandle.py | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/main/xiaozhi-server/config.yaml b/main/xiaozhi-server/config.yaml index 953b60eb..3a730b46 100644 --- a/main/xiaozhi-server/config.yaml +++ b/main/xiaozhi-server/config.yaml @@ -59,6 +59,8 @@ close_connection_no_voice_time: 120 tts_timeout: 10 # TTS播放结束提示音 tts_notify: "data/tts_notify.mp3" +# 开场是否回复唤醒词 +enable_greeting: true CMD_exit: - "退出" diff --git a/main/xiaozhi-server/core/handle/textHandle.py b/main/xiaozhi-server/core/handle/textHandle.py index c63b9a33..f1356068 100644 --- a/main/xiaozhi-server/core/handle/textHandle.py +++ b/main/xiaozhi-server/core/handle/textHandle.py @@ -3,6 +3,7 @@ import json from core.handle.abortHandle import handleAbortMessage from core.handle.helloHandle import handleHelloMessage from core.handle.receiveAudioHandle import startToChat, handleAudioMessage +from core.handle.sendAudioHandle import send_stt_message, send_tts_message from core.handle.iotHandle import handleIotDescriptors, handleIotStatus TAG = __name__ @@ -38,7 +39,13 @@ async def handleTextMessage(conn, message): conn.client_have_voice = False conn.asr_audio.clear() if "text" in msg_json: - await startToChat(conn, msg_json["text"]) + if conn.config.get("enable_greeting", True): + # 启用开场白 通过llm回复唤醒词 + await startToChat(conn, msg_json["text"]) + else: + # 不启用 直接转为聆听状态 + await send_stt_message(conn, msg_json["text"]) + await send_tts_message(conn, "stop", None) elif msg_json["type"] == "iot": if "descriptors" in msg_json: await handleIotDescriptors(conn, msg_json["descriptors"])