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 00000000..ff071501 Binary files /dev/null and b/main/xiaozhi-server/config/assets/tts_notify.mp3 differ 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 fd753530..00000000 Binary files a/main/xiaozhi-server/data/tts_notify.mp3 and /dev/null differ