mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-28 01:53:53 +08:00
fix: 提示尾音播放和单模块第一次唤醒时等待tts初始化
This commit is contained in:
@@ -56,7 +56,16 @@ async def checkWakeupWords(conn, text):
|
|||||||
"enable_wakeup_words_response_cache"
|
"enable_wakeup_words_response_cache"
|
||||||
]
|
]
|
||||||
|
|
||||||
if not enable_wakeup_words_response_cache or not conn.tts:
|
# 等待tts初始化,最多等待3秒
|
||||||
|
start_time = time.time()
|
||||||
|
while time.time() - start_time < 3:
|
||||||
|
if conn.tts:
|
||||||
|
break
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not enable_wakeup_words_response_cache:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
_, filtered_text = remove_punctuation_and_length(text)
|
_, filtered_text = remove_punctuation_and_length(text)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import json
|
|||||||
import time
|
import time
|
||||||
import asyncio
|
import asyncio
|
||||||
from core.utils import textUtils
|
from core.utils import textUtils
|
||||||
|
from core.utils.util import audio_to_data_stream
|
||||||
from core.providers.tts.dto.dto import SentenceType
|
from core.providers.tts.dto.dto import SentenceType
|
||||||
|
|
||||||
TAG = __name__
|
TAG = __name__
|
||||||
@@ -30,7 +31,7 @@ async def sendAudioMessage(conn, sentenceType, audios, text):
|
|||||||
|
|
||||||
|
|
||||||
# 播放音频
|
# 播放音频
|
||||||
async def sendAudio(conn, audios, pre_buffer=False, frame_duration=60):
|
async def sendAudio(conn, audios, frame_duration=60):
|
||||||
"""
|
"""
|
||||||
发送单个opus包,支持流控
|
发送单个opus包,支持流控
|
||||||
Args:
|
Args:
|
||||||
@@ -46,11 +47,6 @@ async def sendAudio(conn, audios, pre_buffer=False, frame_duration=60):
|
|||||||
if conn.client_abort:
|
if conn.client_abort:
|
||||||
return
|
return
|
||||||
|
|
||||||
# 短音频直接发送(例如:提示音)
|
|
||||||
if pre_buffer:
|
|
||||||
await conn.websocket.send(audios)
|
|
||||||
return
|
|
||||||
|
|
||||||
conn.last_activity_time = time.time() * 1000
|
conn.last_activity_time = time.time() * 1000
|
||||||
|
|
||||||
# 获取或初始化流控状态
|
# 获取或初始化流控状态
|
||||||
@@ -78,7 +74,7 @@ async def sendAudio(conn, audios, pre_buffer=False, frame_duration=60):
|
|||||||
flow_control["packet_count"] += 1
|
flow_control["packet_count"] += 1
|
||||||
flow_control["last_send_time"] = time.perf_counter()
|
flow_control["last_send_time"] = time.perf_counter()
|
||||||
else:
|
else:
|
||||||
# 流控参数优化
|
# 提示音和唤醒音频走普通播放
|
||||||
start_time = time.perf_counter()
|
start_time = time.perf_counter()
|
||||||
play_position = 0
|
play_position = 0
|
||||||
|
|
||||||
@@ -124,12 +120,13 @@ async def send_tts_message(conn, state, text=None):
|
|||||||
stop_tts_notify_voice = conn.config.get(
|
stop_tts_notify_voice = conn.config.get(
|
||||||
"stop_tts_notify_voice", "config/assets/tts_notify.mp3"
|
"stop_tts_notify_voice", "config/assets/tts_notify.mp3"
|
||||||
)
|
)
|
||||||
conn.tts.audio_to_opus_data_stream(
|
# 获取音频数据
|
||||||
stop_tts_notify_voice,
|
audios = []
|
||||||
callback=lambda audio_data: asyncio.run_coroutine_threadsafe(
|
def handle_audio_frame(frame_data):
|
||||||
sendAudio(conn, audio_data, True), conn.loop
|
audios.append(frame_data)
|
||||||
),
|
|
||||||
)
|
audio_to_data_stream(stop_tts_notify_voice, is_opus=True, callback=handle_audio_frame)
|
||||||
|
await sendAudio(conn, audios)
|
||||||
# 清除服务端讲话状态
|
# 清除服务端讲话状态
|
||||||
conn.clearSpeakStatus()
|
conn.clearSpeakStatus()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user