diff --git a/api/services/configuration/registry.py b/api/services/configuration/registry.py index 6b70c1a..c9e3675 100644 --- a/api/services/configuration/registry.py +++ b/api/services/configuration/registry.py @@ -372,39 +372,89 @@ TTSConfig = Annotated[ ###################################################### STT ######################################################################## -DEEPGRAM_STT_MODELS = ["nova-2", "nova-3-general", "flux-general-en"] +DEEPGRAM_STT_MODELS = ["nova-3-general", "flux-general-en"] DEEPGRAM_LANGUAGES = [ "multi", + "ar", + "ar-AE", + "ar-SA", + "ar-QA", + "ar-KW", + "ar-SY", + "ar-LB", + "ar-PS", + "ar-JO", + "ar-EG", + "ar-SD", + "ar-TD", + "ar-MA", + "ar-DZ", + "ar-TN", + "ar-IQ", + "ar-IR", + "be", + "bn", + "bs", + "bg", + "ca", + "cs", + "da", + "da-DK", + "de", + "de-CH", + "el", "en", "en-US", - "en-GB", "en-AU", + "en-GB", "en-IN", + "en-NZ", "es", "es-419", + "et", + "fa", + "fi", "fr", "fr-CA", - "de", + "he", + "hi", + "hr", + "hu", + "id", "it", + "ja", + "kn", + "ko", + "ko-KR", + "lt", + "lv", + "mk", + "mr", + "ms", + "nl", + "nl-BE", + "no", + "pl", "pt", "pt-BR", - "nl", - "hi", - "ja", - "ko", - "zh-CN", - "zh-TW", + "pt-PT", + "ro", "ru", - "pl", + "sk", + "sl", + "sr", + "sv", + "sv-SE", + "ta", + "te", + "th", + "tl", "tr", "uk", + "ur", "vi", - "sv", - "da", - "no", - "fi", - "id", - "th", + "zh-CN", + "zh-TW", ] @@ -415,7 +465,14 @@ class DeepgramSTTConfiguration(BaseSTTConfiguration): default="nova-3-general", json_schema_extra={"examples": DEEPGRAM_STT_MODELS} ) language: str = Field( - default="multi", json_schema_extra={"examples": DEEPGRAM_LANGUAGES} + default="multi", + json_schema_extra={ + "examples": DEEPGRAM_LANGUAGES, + "model_options": { + "nova-3-general": DEEPGRAM_LANGUAGES, + "flux-general-en": ["en"], + }, + }, ) api_key: str @@ -440,39 +497,7 @@ class OpenAISTTConfiguration(BaseSTTConfiguration): # Dograh STT Service DOGRAH_STT_MODELS = ["default"] -DOGRAH_STT_LANGUAGES = [ - "multi", - "en", - "en-US", - "en-GB", - "en-AU", - "en-IN", - "es", - "es-419", - "fr", - "fr-CA", - "de", - "it", - "pt", - "pt-BR", - "nl", - "hi", - "ja", - "ko", - "zh-CN", - "zh-TW", - "ru", - "pl", - "tr", - "uk", - "vi", - "sv", - "da", - "no", - "fi", - "id", - "th", -] +DOGRAH_STT_LANGUAGES = DEEPGRAM_LANGUAGES @register_stt diff --git a/ui/src/components/ServiceConfiguration.tsx b/ui/src/components/ServiceConfiguration.tsx index bda9e21..f52be71 100644 --- a/ui/src/components/ServiceConfiguration.tsx +++ b/ui/src/components/ServiceConfiguration.tsx @@ -47,38 +47,89 @@ const TAB_CONFIG: { key: ServiceSegment; label: string }[] = [ // Display names for language codes (Deepgram + Sarvam) const LANGUAGE_DISPLAY_NAMES: Record = { - // Deepgram languages "multi": "Multilingual (Auto-detect)", + // Arabic + "ar": "Arabic", + "ar-AE": "Arabic (UAE)", + "ar-SA": "Arabic (Saudi Arabia)", + "ar-QA": "Arabic (Qatar)", + "ar-KW": "Arabic (Kuwait)", + "ar-SY": "Arabic (Syria)", + "ar-LB": "Arabic (Lebanon)", + "ar-PS": "Arabic (Palestine)", + "ar-JO": "Arabic (Jordan)", + "ar-EG": "Arabic (Egypt)", + "ar-SD": "Arabic (Sudan)", + "ar-TD": "Arabic (Chad)", + "ar-MA": "Arabic (Morocco)", + "ar-DZ": "Arabic (Algeria)", + "ar-TN": "Arabic (Tunisia)", + "ar-IQ": "Arabic (Iraq)", + "ar-IR": "Arabic (Iran)", + // Other languages + "be": "Belarusian", + "bn": "Bengali", + "bs": "Bosnian", + "bg": "Bulgarian", + "ca": "Catalan", + "cs": "Czech", + "da": "Danish", + "da-DK": "Danish (Denmark)", + "de": "German", + "de-CH": "German (Switzerland)", + "el": "Greek", "en": "English", "en-US": "English (US)", - "en-GB": "English (UK)", "en-AU": "English (Australia)", + "en-GB": "English (UK)", "en-IN": "English (India)", + "en-NZ": "English (New Zealand)", "es": "Spanish", "es-419": "Spanish (Latin America)", + "et": "Estonian", + "fa": "Persian", + "fi": "Finnish", "fr": "French", "fr-CA": "French (Canada)", - "de": "German", + "he": "Hebrew", + "hi": "Hindi", + "hr": "Croatian", + "hu": "Hungarian", + "id": "Indonesian", "it": "Italian", + "ja": "Japanese", + "kn": "Kannada", + "ko": "Korean", + "ko-KR": "Korean (South Korea)", + "lt": "Lithuanian", + "lv": "Latvian", + "mk": "Macedonian", + "mr": "Marathi", + "ms": "Malay", + "nl": "Dutch", + "nl-BE": "Flemish", + "no": "Norwegian", + "pl": "Polish", "pt": "Portuguese", "pt-BR": "Portuguese (Brazil)", - "nl": "Dutch", - "hi": "Hindi", - "ja": "Japanese", - "ko": "Korean", - "zh-CN": "Chinese (Simplified)", - "zh-TW": "Chinese (Traditional)", + "pt-PT": "Portuguese (Portugal)", + "ro": "Romanian", "ru": "Russian", - "pl": "Polish", + "sk": "Slovak", + "sl": "Slovenian", + "sr": "Serbian", + "sv": "Swedish", + "sv-SE": "Swedish (Sweden)", + "ta": "Tamil", + "te": "Telugu", + "th": "Thai", + "tl": "Tagalog", "tr": "Turkish", "uk": "Ukrainian", + "ur": "Urdu", "vi": "Vietnamese", - "sv": "Swedish", - "da": "Danish", - "no": "Norwegian", - "fi": "Finnish", - "id": "Indonesian", - "th": "Thai", + "zh-CN": "Chinese (Simplified)", + "zh-TW": "Chinese (Traditional)", // Sarvam Indian languages "bn-IN": "Bengali", "gu-IN": "Gujarati", @@ -227,6 +278,20 @@ export default function ServiceConfiguration() { } }, [ttsModel, serviceProviders.tts, setValue, getValues, schemas]); + // Reset language when STT model changes if the provider has model-dependent language options + const sttModel = watch("stt_model"); + useEffect(() => { + const languageSchema = schemas?.stt?.[serviceProviders.stt]?.properties?.language; + const modelOptions = languageSchema?.model_options; + if (!modelOptions || !sttModel) return; + + const validLanguages = modelOptions[sttModel as string]; + const currentLanguage = getValues("stt_language") as string; + if (validLanguages && currentLanguage && !validLanguages.includes(currentLanguage)) { + setValue("stt_language", validLanguages[0], { shouldDirty: true }); + } + }, [sttModel, serviceProviders.stt, setValue, getValues, schemas]); + const handleProviderChange = (service: ServiceSegment, providerName: string) => { if (!providerName) { return; @@ -340,15 +405,6 @@ export default function ServiceConfiguration() { field => field !== "provider" && field !== "api_key" ); - // For Deepgram STT, hide language field when flux-general-en model is selected - // Flux model is English-only and doesn't support language selection - if (service === "stt" && currentProvider === "deepgram") { - const currentModel = watch("stt_model") as string; - if (currentModel === "flux-general-en") { - return fields.filter(field => field !== "language"); - } - } - return fields; };