💬 feat: Improve speech recognition UX for unsupported browsers

Show helpful error message when browser doesn't support speech recognition,
suggesting external STT option only when it's configured on the server.
This commit is contained in:
Marco Beretta 2025-12-14 19:07:26 +01:00
parent 3213f574c6
commit b879a52bc4
No known key found for this signature in database
GPG key ID: D918033D8E74CC11
2 changed files with 12 additions and 2 deletions

View file

@ -2,16 +2,21 @@ import { useEffect, useRef, useMemo } from 'react';
import { useRecoilState } from 'recoil'; import { useRecoilState } from 'recoil';
import { useToastContext } from '@librechat/client'; import { useToastContext } from '@librechat/client';
import SpeechRecognition, { useSpeechRecognition } from 'react-speech-recognition'; import SpeechRecognition, { useSpeechRecognition } from 'react-speech-recognition';
import { useGetCustomConfigSpeechQuery } from 'librechat-data-provider/react-query';
import useGetAudioSettings from './useGetAudioSettings'; import useGetAudioSettings from './useGetAudioSettings';
import { useLocalize } from '~/hooks';
import store from '~/store'; import store from '~/store';
const useSpeechToTextBrowser = ( const useSpeechToTextBrowser = (
setText: (text: string) => void, setText: (text: string) => void,
onTranscriptionComplete: (text: string) => void, onTranscriptionComplete: (text: string) => void,
) => { ) => {
const localize = useLocalize();
const { showToast } = useToastContext(); const { showToast } = useToastContext();
const { speechToTextEndpoint } = useGetAudioSettings(); const { speechToTextEndpoint } = useGetAudioSettings();
const isBrowserSTTEnabled = speechToTextEndpoint === 'browser'; const isBrowserSTTEnabled = speechToTextEndpoint === 'browser';
const { data: speechConfig } = useGetCustomConfigSpeechQuery({ enabled: true });
const sttExternal = Boolean(speechConfig?.sttExternal);
const lastTranscript = useRef<string | null>(null); const lastTranscript = useRef<string | null>(null);
const lastInterim = useRef<string | null>(null); const lastInterim = useRef<string | null>(null);
@ -71,7 +76,9 @@ const useSpeechToTextBrowser = (
const toggleListening = () => { const toggleListening = () => {
if (!browserSupportsSpeechRecognition) { if (!browserSupportsSpeechRecognition) {
showToast({ showToast({
message: 'Browser does not support SpeechRecognition', message: sttExternal
? localize('com_ui_speech_not_supported_use_external')
: localize('com_ui_speech_not_supported'),
status: 'error', status: 'error',
}); });
return; return;
@ -79,7 +86,7 @@ const useSpeechToTextBrowser = (
if (!isMicrophoneAvailable) { if (!isMicrophoneAvailable) {
showToast({ showToast({
message: 'Microphone is not available', message: localize('com_ui_microphone_unavailable'),
status: 'error', status: 'error',
}); });
return; return;

View file

@ -1295,6 +1295,9 @@
"com_ui_special_variables": "Special variables:", "com_ui_special_variables": "Special variables:",
"com_ui_special_variables_more_info": "You can select special variables from the dropdown: `{{current_date}}` (today's date and day of week), `{{current_datetime}}` (local date and time), `{{utc_iso_datetime}}` (UTC ISO datetime), and `{{current_user}}` (your account name).", "com_ui_special_variables_more_info": "You can select special variables from the dropdown: `{{current_date}}` (today's date and day of week), `{{current_datetime}}` (local date and time), `{{utc_iso_datetime}}` (UTC ISO datetime), and `{{current_user}}` (your account name).",
"com_ui_speech_while_submitting": "Can't submit speech while a response is being generated", "com_ui_speech_while_submitting": "Can't submit speech while a response is being generated",
"com_ui_speech_not_supported": "Your browser does not support speech recognition",
"com_ui_speech_not_supported_use_external": "Your browser does not support speech recognition. Try switching to External STT in Settings > Speech.",
"com_ui_microphone_unavailable": "Microphone is not available",
"com_ui_sr_actions_menu": "Open actions menu for \"{{0}}\" prompt", "com_ui_sr_actions_menu": "Open actions menu for \"{{0}}\" prompt",
"com_ui_sr_global_prompt": "Global prompt group", "com_ui_sr_global_prompt": "Global prompt group",
"com_ui_stack_trace": "Stack Trace", "com_ui_stack_trace": "Stack Trace",