Edit tts mode

This commit is contained in:
2026-04-13 18:33:19 +03:00
parent 780f6f0084
commit 7239f85506
6 changed files with 98 additions and 22 deletions

View File

@@ -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 уже доримил — озвучиваем весь ответ одним куском с цельной интонацией
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