diff --git a/librechat.yaml b/librechat.yaml index f0c50ef..2f329a9 100644 --- a/librechat.yaml +++ b/librechat.yaml @@ -133,27 +133,48 @@ interface: rgb-border-light: '74 82 64' -# Speech (STT/TTS) via the co-op gateway. Uses a dedicated LiteLLM virtual key -# (alias: librechat-speech, $5/30d budget, restricted to the audio models) so -# speech never runs on the gateway master key. The gateway is a public +# Speech (STT/TTS) via the co-op gateway. LibreChat POSTs to `url` VERBATIM +# (no path is appended), so the FULL endpoint paths are required here. +# Uses a dedicated LiteLLM virtual key (alias: librechat-speech, $5/30d +# budget, restricted to the audio models) injected as STT_API_KEY/TTS_API_KEY +# app env — speech never runs on the master key. The gateway is a public # endpoint, so no SSRF allowedAddresses exemption is needed. +# STT: tinfoil/voxtral-small-24b — token-priced (~$0.00008/typical dictation +# request on the gateway) vs the flat $0.01/request of +# tinfoil/whisper-large-v3-turbo; same TEE provider, equal quality on short +# clips (verified round-trip 2026-11-07). Whisper stays allowed on the key as +# a one-line fallback swap. TTS: tinfoil/voxtral-tts, $0.002/request at cost; +# voices are the provider's supported speakers (an unknown name 400s). speech: tts: openai: - url: "https://gateway.inference.coop/v1" - apiKey: "${TTS_API_KEY}" + url: "https://gateway.inference.coop/v1/audio/speech" + apiKey: ${TTS_API_KEY} model: "tinfoil/voxtral-tts" - voices: ["casual_female"] + voices: ["ar_male", "casual_female", "casual_male", "cheerful_female", "de_female", "de_male", "es_female", "es_male", "fr_female", "fr_male", "hi_female", "hi_male", "it_female", "it_male", "neutral_female", "neutral_male", "nl_female", "nl_male", "pt_female", "pt_male"] stt: openai: - url: "https://gateway.inference.coop/v1" - apiKey: "${STT_API_KEY}" - model: "tinfoil/whisper-large-v3-turbo" + url: "https://gateway.inference.coop/v1/audio/transcriptions" + apiKey: ${STT_API_KEY} + model: "tinfoil/voxtral-small-24b" + # Seeded client defaults (Settings -> Speech): members who never saved + # their own speech settings get the External engines out of the box; + # a member's own saved settings always win. "Automatic playback" stays + # opt-in per member (set textToSpeech.automaticPlayback: true to change). speechTab: conversationMode: false advancedMode: false - speechToText: true - textToSpeech: true + speechToText: + engineSTT: external + # Pin the transcription LANGUAGE default to English. Without it the + # client sends no language param and voxtral-small-24b auto-detects — + # which misfired once as Spanish on a short first mic press (reported + # 2026-11-07). Members who save their own language in Settings -> Speech + # always override this default. + languageSTT: "en" + textToSpeech: + engineTTS: external + voice: casual_female # Web search: self-hosted SearXNG (search.inference.coop, keyless JSON API) # for search, keyless Keenable for page scraping, no reranker. The instance