Этап 3: голосовой ввод по горячей клавише

- Глобальная горячая клавиша через RegisterHotKey (по умолчанию Win+Alt+Space)
- Запись с микрофона, конец фразы по паузе через Silero VAD, звуковые сигналы
- Распознавание faster-whisper large-v3-turbo на GPU, CUDA-библиотеки из pip-пакетов nvidia-*
- Состояния «слушаю» и «распознаю», кнопка «Говорить» в чате и пункт в трее
- Голосовая команда прерывает текущий ответ и озвучку
- Тесты горячей клавиши, детектора конца фразы и сеанса голосового ввода

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nid
2026-09-17 03:34:09 +03:00
co-authored by Claude Opus 5
parent fec52dd1c2
commit 513d010c19
19 changed files with 1298 additions and 12 deletions
+6 -1
View File
@@ -15,13 +15,18 @@ _NOTIFICATION_TIMEOUT_MS = 6000
class TrayIcon(QSystemTrayIcon):
def __init__(self, assistant: Assistant, window: ChatWindow) -> None:
def __init__(self, assistant: Assistant, window: ChatWindow, hotkey: str = "") -> None:
super().__init__(state_icon(assistant.state))
self._assistant = assistant
self._window = window
menu = QMenu()
menu.addAction("Открыть чат", window.show_and_raise)
if assistant.voice_available:
# Текст после табуляции QMenu выравнивает по правому краю, как подсказку клавиши
label = f"Говорить\t{hotkey.title()}" if hotkey else "Говорить"
menu.addAction(label, assistant.toggle_listening)
menu.addSeparator()
provider_menu = menu.addMenu("Провайдер LLM")
provider_group = QActionGroup(self)