mirror of
https://github.com/agent0ai/agent-zero.git
synced 2026-07-09 17:08:29 +00:00
Split the legacy core speech stack into two built-in, independently toggleable plugins: `_kokoro_tts` for TTS and `_whisper_stt` for STT. This refactor keeps dependency installation and bootstrap concerns in Docker/bootstrap/preload, while moving speech-specific tooling, APIs, prompts, UI, and runtime behavior into the plugins. Core now exposes engine-agnostic `tts-service` and `stt-service` brokers, with browser-native TTS preserved as the fallback when Kokoro is disabled. Included in this change: - add built-in `_kokoro_tts` plugin with plugin-owned synth API, config, status UI, and provider registration - add built-in `_whisper_stt` plugin with plugin-owned transcribe API, mic runtime, device UI, prompt injection, and provider registration - remove legacy core speech APIs/helpers/settings/UI and delete unused `webui/js/speech_browser.js` - replace the old hardcoded speech settings section with a generic voice surface backed by plugin extensions - update preload/docs/tests to match the new plugin-owned speech architecture Behavioral intent: - both plugins are built-in but not `always_enabled` - users can now hot-switch TTS and STT independently - browser TTS remains available when `_kokoro_tts` is off - Whisper mic UI only appears when `_whisper_stt` is enabled
66 lines
1.3 KiB
CSS
66 lines
1.3 KiB
CSS
#microphone-button {
|
|
color: var(--color-background);
|
|
transition:
|
|
background-color 0.2s ease,
|
|
box-shadow 0.12s ease-in-out,
|
|
filter 0.12s ease-in-out,
|
|
opacity 0.12s ease-in-out;
|
|
}
|
|
|
|
#microphone-button.mic-disabled {
|
|
background-color: #5f6368;
|
|
cursor: not-allowed;
|
|
opacity: 0.58;
|
|
}
|
|
|
|
#microphone-button.mic-inactive {
|
|
background-color: grey;
|
|
}
|
|
|
|
#microphone-button.mic-activating {
|
|
background-color: silver;
|
|
animation: whisper-stt-mic-pulse 0.8s infinite;
|
|
}
|
|
|
|
#microphone-button.mic-listening {
|
|
background-color: red;
|
|
}
|
|
|
|
#microphone-button.mic-recording {
|
|
background-color: green;
|
|
}
|
|
|
|
#microphone-button.mic-waiting {
|
|
background-color: teal;
|
|
}
|
|
|
|
#microphone-button.mic-processing {
|
|
background-color: darkcyan;
|
|
animation: whisper-stt-mic-pulse 0.8s infinite;
|
|
transform-origin: center;
|
|
}
|
|
|
|
@media (hover: hover) {
|
|
#microphone-button:not(.mic-disabled):hover {
|
|
filter: brightness(1.08);
|
|
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08),
|
|
0 6px 14px rgba(0, 0, 0, 0.18);
|
|
}
|
|
}
|
|
|
|
#microphone-button:not(.mic-disabled):active {
|
|
filter: brightness(0.92);
|
|
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
|
|
}
|
|
|
|
@keyframes whisper-stt-mic-pulse {
|
|
0% {
|
|
transform: scale(1);
|
|
}
|
|
50% {
|
|
transform: scale(1.1);
|
|
}
|
|
100% {
|
|
transform: scale(1);
|
|
}
|
|
}
|