Этап 2: озвучка ответов через Silero

- Потоковая озвучка: ответ режется на фразы, синтез и воспроизведение в отдельных потоках
- Подготовка текста: числа словами, без markdown, ссылок и блоков кода
- Модель Silero скачивается в LOCALAPPDATA и прогревается при старте
- Состояние «говорю», переключатель озвучки в трее, «Стоп» прерывает речь
- Тесты нарезки текста и оркестратора озвучки

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nid
2026-09-17 03:20:07 +03:00
co-authored by Claude Opus 5
parent 7933613234
commit fec52dd1c2
19 changed files with 1512 additions and 18 deletions
+6
View File
@@ -34,6 +34,11 @@ class TrayIcon(QSystemTrayIcon):
provider_menu.addAction(action)
self._provider_actions[name] = action
self._speech_action = QAction("Озвучивать ответы", self, checkable=True)
self._speech_action.setChecked(assistant.speech_enabled)
self._speech_action.toggled.connect(assistant.set_speech_enabled)
menu.addAction(self._speech_action)
menu.addAction("Новый диалог", assistant.clear_history)
menu.addSeparator()
menu.addAction("Выход", QApplication.quit)
@@ -45,6 +50,7 @@ class TrayIcon(QSystemTrayIcon):
self.messageClicked.connect(window.show_and_raise)
assistant.state_changed.connect(self._on_state_changed)
assistant.provider_changed.connect(self._on_provider_changed)
assistant.speech_enabled_changed.connect(self._speech_action.setChecked)
assistant.reply_finished.connect(self._on_reply_finished)
assistant.error_occurred.connect(self._on_error)