Mac M1 optimizations, fix train pipeline, add Hey Cosmo wake word model
- Fix install_mac.sh: use venv + Python 3.12 (3.14 incompatible with ML libs) - Fix run_mac.sh: activate venv, add CPU thread optimization env vars - Fix agent.py: remove f-string from SYSTEM_PROMPT template (NameError on import) - Add missing deps: sounddevice, pydub, imageio-ffmpeg, omegaconf - Optimize for M1: torch.inference_mode, set_num_threads, OMP/MKL tuning - Switch to qwen2.5:3b for faster LLM responses on Mac - Switch Whisper to medium model with auto compute (small+int8 had poor Russian) - Add initial_prompt for better Russian transcription - Add open_app tool for native macOS app launching - Fix TTS: sanitize Latin text to Cyrillic for Silero compatibility - Fix wake word echo: add cooldown after TTS, reset model state, raise threshold - Make "Слушаю" TTS synchronous to avoid mic interference - Fix train Dockerfile: remove tensorflow/onnx2tf (only ONNX needed), fix deps - Fix train.sh: use wget for dataset download, add --shm-size=2g - Add trained hey_cosmo.onnx wake word model - Add TODO section to CLAUDE.md (ChatterBox TTS, Ollama Modelfile ideas) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ Wake word detector для Cosmo.
|
||||
|
||||
import os
|
||||
import glob
|
||||
import time
|
||||
import threading
|
||||
import queue
|
||||
import numpy as np
|
||||
@@ -31,7 +32,8 @@ class WakeWordDetector:
|
||||
self._thread = None
|
||||
|
||||
# Порог уверенности для срабатывания (0.0 – 1.0)
|
||||
self.threshold = 0.5
|
||||
# 0.7 — баланс между надёжностью и защитой от ложных срабатываний/эха TTS
|
||||
self.threshold = 0.7
|
||||
|
||||
logger.info("Загружаю wake word модель openwakeword...")
|
||||
|
||||
@@ -88,14 +90,18 @@ class WakeWordDetector:
|
||||
"""Приостановить детект (пока идёт запись команды)."""
|
||||
self._paused = True
|
||||
|
||||
def resume(self):
|
||||
"""Возобновить детект после записи команды."""
|
||||
# Очищаем очередь, чтобы не срабатывать на эхо
|
||||
def resume(self, cooldown: float = 1.5):
|
||||
"""Возобновить детект после записи команды с защитой от эха."""
|
||||
# Ждём пока эхо от TTS затухнет
|
||||
time.sleep(cooldown)
|
||||
# Очищаем очередь — там буферизованный звук TTS
|
||||
while not self._audio_queue.empty():
|
||||
try:
|
||||
self._audio_queue.get_nowait()
|
||||
except queue.Empty:
|
||||
break
|
||||
# Сбрасываем внутреннее состояние модели (накопленные скоры)
|
||||
self.model.reset()
|
||||
self._paused = False
|
||||
logger.debug("Wake word детектор возобновлён")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user