feat: switch wake word to waltron

This commit is contained in:
2026-03-15 02:59:13 +03:00
parent 6c2702d5e3
commit e1a94c68db
11 changed files with 58 additions and 29 deletions

View File

@@ -21,6 +21,8 @@ from .config import (
OPENROUTER_API_KEY,
OPENROUTER_API_URL,
OPENROUTER_MODEL,
WAKE_WORD,
WAKE_WORD_ALIASES,
ZAI_API_KEY,
ZAI_API_URL,
ZAI_MODEL,
@@ -29,15 +31,18 @@ from .config import (
_HTTP = requests.Session()
# Системный промпт
SYSTEM_PROMPT = """Ты — Александр, умный голосовой ассистент с человеческим поведением.
_wake_word_aliases_text = ", ".join(WAKE_WORD_ALIASES)
SYSTEM_PROMPT = f"""Ты — умный голосовой ассистент с человеческим поведением.
Веди себя как живой человек: будь дружелюбным, естественным и немного эмоциональным, где это уместно.
Твоя главная цель — помогать пользователю и поддерживать интересный диалог.
Отвечай кратко и по существу, на русском языке.
Избегай длинных списков, сложного форматирования и спецсимволов, так как твои ответы озвучиваются голосом.
Пиши в разговорном стиле, как при живом общении, но не забывай о вежливости и правильности твоих ответов.
ВАЖНО: Не используй в ответах панибратские или сленговые приветствия и обращения, такие как "Эй", "Хэй", "Слушай" в начале фразы и подобные."""
ВАЖНО: Не используй в ответах панибратские или сленговые приветствия и обращения, такие как "Эй", "Хэй", "Слушай" в начале фразы и подобные.
Тебя активируют словом "{WAKE_WORD}". Никогда не произноси это слово и его варианты ({_wake_word_aliases_text}) ни в каком ответе.
Если пользователь спрашивает, как тебя зовут или как к тебе обращаться, отвечай нейтрально: "Я ваш голосовой ассистент"."""
SYSTEM_PROMPT += (
'\nROLE_JSON: {"name":"Александр","role":"умный голосовой ассистент",'
'\nROLE_JSON: {"name":"голосовой ассистент","role":"умный голосовой ассистент",'
'"language":"ru","style":["дружелюбный","естественный","краткий"],"format":"plain"}'
)

View File

@@ -3,6 +3,7 @@
import re
import pymorphy3
from num2words import num2words
from .config import WAKE_WORD, WAKE_WORD_ALIASES
from .roman import roman_to_int
morph = pymorphy3.MorphAnalyzer()
@@ -83,6 +84,10 @@ MONTHS_GENITIVE = [
# Время
TIME_UNIT_LEMMAS = {"час", "минута", "секунда"}
WAKE_WORD_BLOCKED_PATTERNS = [
re.compile(rf"\b{re.escape(alias)}\b", flags=re.IGNORECASE)
for alias in set(WAKE_WORD_ALIASES) | {WAKE_WORD.lower()}
]
# Суффиксы порядковых
_ORDINAL_SUFFIX_MAP = {
@@ -419,6 +424,10 @@ def clean_response(text: str, language: str = "ru") -> str:
flags=re.IGNORECASE | re.MULTILINE,
)
# Запрет на произнесение wake word в любых ответах ассистента.
for pattern in WAKE_WORD_BLOCKED_PATTERNS:
text = pattern.sub("ассистент", text)
# Числа в слова
if language == "ru":
text = roman_numerals_to_words(text)

View File

@@ -66,8 +66,17 @@ DEEPGRAM_API_KEY = os.getenv("DEEPGRAM_API_KEY")
# --- Настройки активации голосом (Porcupine) ---
# Ключ доступа PicoVoice
PORCUPINE_ACCESS_KEY = os.getenv("PORCUPINE_ACCESS_KEY")
# Wake word label and common ASR aliases.
WAKE_WORD = "Waltron"
WAKE_WORD_ALIASES = (
"waltron",
"voltron",
"волтрон",
"уолтрон",
"валтрон",
)
# Путь к файлу модели ключевого слова (.ppn), который лежит в папке assets/models
PORCUPINE_KEYWORD_PATH = BASE_DIR / "assets" / "models" / "Alexandr_en_linux_v4_0_0.ppn"
PORCUPINE_KEYWORD_PATH = BASE_DIR / "assets" / "models" / "Waltron_en_linux_v4_0_0.ppn"
# Чувствительность wake word (0..1). Выше = ловит легче, но больше ложных срабатываний.
PORCUPINE_SENSITIVITY = float(os.getenv("PORCUPINE_SENSITIVITY", "0.8"))