package main import ( "git.yeij.top/AskaEth/Cyrene_v2/internal/logger" "git.yeij.top/AskaEth/Cyrene_v2/internal/runtime/multimodal/voice" ) // wireVoice builds the voice STT/TTS degrading chain from config and stores it // on the app for the WebSocket voice_input/voice_output paths to consume. The // chain degrades cloud → local → edge-tts/espeak → silent, so a missing endpoint // or API key never blocks startup (the design accepts the silent fallback). func (a *app) wireVoice() { a.voice = voice.New(a.cfg.Voice) logger.WithSource(a.log, "cmd/cyrene").Info("voice chain ready", "tts_provider", a.cfg.Voice.TTSProvider, "stt_provider", a.cfg.Voice.STTProvider, "dashscope_configured", a.cfg.Voice.DashscopeAPIKey != "") }