Edit tts mode
This commit is contained in:
@@ -8,8 +8,18 @@ from .config import AGENTS, log
|
||||
from .text import clean_for_speech, find_sentence_end
|
||||
from .tts import speak, play_error_sound
|
||||
|
||||
SYSTEM_PROMPT = "Отвечай кратко, 1-2 предложения, без markdown, без эмодзи."
|
||||
SYSTEM_PROMPT = (
|
||||
"Отвечай кратко, 1-2 предложения, без markdown, без эмодзи. "
|
||||
"Ответ будет озвучен голосом, поэтому: "
|
||||
"числа пиши прописью (двадцать три, а не 23), "
|
||||
"единицы измерения пиши полностью (километров в час, а не км/ч), "
|
||||
"не используй спецсимволы (+, -, /, %, °) — заменяй словами (плюс, минус, из, процентов, градусов). "
|
||||
"Температуру пиши так: 'плюс девять градусов', а не '+9°C'."
|
||||
)
|
||||
MAX_HISTORY = int(os.getenv("MAX_HISTORY", "20"))
|
||||
# "stream" — режем по предложениям (быстро, но рваная интонация)
|
||||
# "full" — собираем весь ответ, потом TTS (естественно, но пауза перед началом)
|
||||
TTS_MODE = os.getenv("TTS_MODE", "full")
|
||||
|
||||
RESET_PATTERNS = re.compile(
|
||||
r"(начни|начать|создай|открой|давай).{0,10}(новую|новый|чистую|чистый).{0,10}(сессию|сессия|диалог|разговор|чат)"
|
||||
@@ -65,7 +75,10 @@ def ask_agent_stream(text: str, conv: "Conversation | None" = None, agent_id: st
|
||||
try:
|
||||
resp = session.post(
|
||||
f"{gateway_url}/v1/chat/completions",
|
||||
headers={"x-openclaw-model": cfg["voice_model"]},
|
||||
headers={
|
||||
"x-openclaw-model": cfg["voice_model"],
|
||||
"x-openclaw-session-key": cfg["session_key"],
|
||||
},
|
||||
json={
|
||||
"model": agent,
|
||||
"stream": True,
|
||||
@@ -115,13 +128,14 @@ def ask_agent_stream(text: str, conv: "Conversation | None" = None, agent_id: st
|
||||
full_text += delta
|
||||
buffer += delta
|
||||
|
||||
last_punct = find_sentence_end(buffer, min_len=60)
|
||||
if last_punct > -1:
|
||||
sentence = clean_for_speech(buffer[:last_punct + 1])
|
||||
if sentence.strip():
|
||||
print(f"🔊 Говорю: {sentence}")
|
||||
speak(sentence, agent_id)
|
||||
buffer = buffer[last_punct + 1:].lstrip()
|
||||
if TTS_MODE == "stream":
|
||||
last_punct = find_sentence_end(buffer, min_len=120)
|
||||
if last_punct > -1:
|
||||
sentence = clean_for_speech(buffer[:last_punct + 1])
|
||||
if sentence.strip():
|
||||
print(f"🔊 Говорю: {sentence}")
|
||||
speak(sentence, agent_id)
|
||||
buffer = buffer[last_punct + 1:].lstrip()
|
||||
|
||||
except (json.JSONDecodeError, KeyError, IndexError):
|
||||
continue
|
||||
@@ -129,17 +143,24 @@ def ask_agent_stream(text: str, conv: "Conversation | None" = None, agent_id: st
|
||||
log.exception("Ошибка при чтении стрима")
|
||||
print(f"⚠️ Стрим прервался: {e}")
|
||||
|
||||
# Остаток
|
||||
if buffer.strip():
|
||||
sentence = clean_for_speech(buffer)
|
||||
if sentence:
|
||||
speak(sentence, agent_id)
|
||||
|
||||
if not full_text:
|
||||
msg = "Не получил ответ, попробуй ещё раз."
|
||||
speak(msg, agent_id)
|
||||
return msg
|
||||
|
||||
result = clean_for_speech(full_text)
|
||||
|
||||
if TTS_MODE == "full":
|
||||
# LLM уже доcтримил — озвучиваем весь ответ одним куском с цельной интонацией
|
||||
if result.strip():
|
||||
print(f"🔊 Говорю: {result}")
|
||||
speak(result, agent_id)
|
||||
else:
|
||||
# остаток буфера в stream-режиме
|
||||
if buffer.strip():
|
||||
tail = clean_for_speech(buffer)
|
||||
if tail:
|
||||
speak(tail, agent_id)
|
||||
|
||||
conv.add_assistant(full_text)
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user