diff --git a/lib/utils/speech-data/stt-deepgram.js b/lib/utils/speech-data/stt-deepgram.js index 5c59c10..4c7e0bb 100644 --- a/lib/utils/speech-data/stt-deepgram.js +++ b/lib/utils/speech-data/stt-deepgram.js @@ -1,56 +1,153 @@ module.exports = [ { name: 'Multilingual', value: 'multi' }, + { name: 'Afrikaans', value: 'af' }, + { name: 'Amharic', value: 'am' }, + { name: 'Arabic', value: 'ar' }, + { name: 'Assamese', value: 'as' }, + { name: 'Azerbaijani', value: 'az' }, + { name: 'Bashkir', value: 'ba' }, + { name: 'Belarusian', value: 'be' }, { name: 'Bulgarian', value: 'bg' }, + { name: 'Bengali', value: 'bn' }, + { name: 'Tibetan', value: 'bo' }, + { name: 'Breton', value: 'br' }, + { name: 'Bosnian', value: 'bs' }, { name: 'Catalan', value: 'ca' }, - { name: 'Chinese (Mandarin, Simplified)', value: 'zh' }, - { name: 'Chinese (Mandarin, Simplified - China)', value: 'zh-CN' }, - { name: 'Chinese (Mandarin, Simplified - Hans)', value: 'zh-Hans' }, - { name: 'Chinese (Mandarin, Traditional)', value: 'zh-TW' }, - { name: 'Chinese (Mandarin, Traditional - Hant)', value: 'zh-Hant' }, - { name: 'Chinese (Cantonese, Traditional - Hong Kong)', value: 'zh-HK' }, { name: 'Czech', value: 'cs' }, + { name: 'Welsh', value: 'cy' }, { name: 'Danish', value: 'da' }, { name: 'Danish (Denmark)', value: 'da-DK' }, - { name: 'Dutch', value: 'nl' }, - { name: 'English', value: 'en' }, - { name: 'English (United States)', value: 'en-US' }, - { name: 'English (Australia)', value: 'en-AU' }, - { name: 'English (United Kingdom)', value: 'en-GB' }, - { name: 'English (New Zealand)', value: 'en-NZ' }, - { name: 'English (India)', value: 'en-IN' }, - { name: 'Estonian', value: 'et' }, - { name: 'Finnish', value: 'fi' }, - { name: 'Flemish', value: 'nl-BE' }, - { name: 'French', value: 'fr' }, - { name: 'French (Canada)', value: 'fr-CA' }, { name: 'German', value: 'de' }, + { name: 'German (Austria)', value: 'de-AT' }, { name: 'German (Switzerland)', value: 'de-CH' }, - { name: 'Greek', value: 'el' }, + { name: 'German (Germany)', value: 'de-DE' }, + { name: 'Modern Greek', value: 'el' }, + { name: 'English', value: 'en' }, + { name: 'English (Australia)', value: 'en-AU' }, + { name: 'English (Canada)', value: 'en-CA' }, + { name: 'English (United Kingdom)', value: 'en-GB' }, + { name: 'English (Ireland)', value: 'en-IE' }, + { name: 'English (India)', value: 'en-IN' }, + { name: 'English (Malaysia)', value: 'en-MY' }, + { name: 'English (New Zealand)', value: 'en-NZ' }, + { name: 'English (Philippines)', value: 'en-PH' }, + { name: 'English (United States)', value: 'en-US' }, + { name: 'English (South Africa)', value: 'en-ZA' }, + { name: 'Spanish', value: 'es' }, + { name: 'Spanish (Latin America and the Caribbean)', value: 'es-419' }, + { name: 'Spanish (Argentina)', value: 'es-AR' }, + { name: 'Spanish (Colombia)', value: 'es-CO' }, + { name: 'Spanish (Spain)', value: 'es-ES' }, + { name: 'Spanish (Latin America)', value: 'es-LATAM' }, + { name: 'Spanish (Mexico)', value: 'es-MX' }, + { name: 'Spanish (United States)', value: 'es-US' }, + { name: 'Estonian', value: 'et' }, + { name: 'Basque', value: 'eu' }, + { name: 'Persian', value: 'fa' }, + { name: 'Finnish', value: 'fi' }, + { name: 'Faroese', value: 'fo' }, + { name: 'French', value: 'fr' }, + { name: 'French (Belgium)', value: 'fr-BE' }, + { name: 'French (Canada)', value: 'fr-CA' }, + { name: 'French (Switzerland)', value: 'fr-CH' }, + { name: 'French (France)', value: 'fr-FR' }, + { name: 'French (Canada)', value: 'fr-ca' }, + { name: 'Galician', value: 'gl' }, + { name: 'Gujarati', value: 'gu' }, + { name: 'Hausa', value: 'ha' }, + { name: 'Hawaiian', value: 'haw' }, + { name: 'Hebrew', value: 'he' }, { name: 'Hindi', value: 'hi' }, + { name: 'Hindi (Latin)', value: 'hi-Latn' }, + { name: 'Croatian', value: 'hr' }, + { name: 'Haitian', value: 'ht' }, { name: 'Hungarian', value: 'hu' }, + { name: 'Armenian', value: 'hy' }, { name: 'Indonesian', value: 'id' }, + { name: 'Indonesian (Indonesia)', value: 'id-ID' }, + { name: 'Icelandic', value: 'is' }, { name: 'Italian', value: 'it' }, + { name: 'Italian (Italy)', value: 'it-IT' }, { name: 'Japanese', value: 'ja' }, + { name: 'Japanese (Japan)', value: 'ja-JP' }, + { name: 'Javanese', value: 'jw' }, + { name: 'Georgian', value: 'ka' }, + { name: 'Kazakh', value: 'kk' }, + { name: 'Khmer', value: 'km' }, + { name: 'Kannada', value: 'kn' }, { name: 'Korean', value: 'ko' }, - { name: 'Korean (South Korea)', value: 'ko-KR' }, - { name: 'Latvian', value: 'lv' }, + { name: 'Korean (Republic of Korea)', value: 'ko-KR' }, + { name: 'Latin', value: 'la' }, + { name: 'Luxembourgish', value: 'lb' }, + { name: 'Lingala', value: 'ln' }, + { name: 'Lao', value: 'lo' }, { name: 'Lithuanian', value: 'lt' }, + { name: 'Latvian', value: 'lv' }, + { name: 'Malagasy', value: 'mg' }, + { name: 'Maori', value: 'mi' }, + { name: 'Macedonian', value: 'mk' }, + { name: 'Malayalam', value: 'ml' }, + { name: 'Mongolian', value: 'mn' }, + { name: 'Marathi', value: 'mr' }, { name: 'Malay', value: 'ms' }, + { name: 'Malay (Malaysia)', value: 'ms-MY' }, + { name: 'Malay (Singapore)', value: 'ms-SG' }, + { name: 'Maltese', value: 'mt' }, + { name: 'Burmese', value: 'my' }, + { name: 'Nepali', value: 'ne' }, + { name: 'Dutch', value: 'nl' }, + { name: 'Dutch (Belgium)', value: 'nl-BE' }, + { name: 'Dutch (Netherlands)', value: 'nl-NL' }, + { name: 'Norwegian Nynorsk', value: 'nn' }, { name: 'Norwegian', value: 'no' }, + { name: 'Norwegian (Norway)', value: 'no-NO' }, + { name: 'Occitan', value: 'oc' }, + { name: 'Panjabi', value: 'pa' }, { name: 'Polish', value: 'pl' }, + { name: 'Polish (Poland)', value: 'pl-PL' }, + { name: 'Pushto', value: 'ps' }, { name: 'Portuguese', value: 'pt' }, { name: 'Portuguese (Brazil)', value: 'pt-BR' }, { name: 'Portuguese (Portugal)', value: 'pt-PT' }, { name: 'Romanian', value: 'ro' }, + { name: 'Romanian (Moldova)', value: 'ro-MD' }, { name: 'Russian', value: 'ru' }, + { name: 'Russian (Latin)', value: 'ru-Latn' }, + { name: 'Russian (Russian Federation)', value: 'ru-RU' }, + { name: 'Sanskrit', value: 'sa' }, + { name: 'Sindhi', value: 'sd' }, + { name: 'Sinhala', value: 'si' }, { name: 'Slovak', value: 'sk' }, - { name: 'Spanish', value: 'es' }, - { name: 'Spanish (Latin America)', value: 'es-419' }, + { name: 'Slovenian', value: 'sl' }, + { name: 'Shona', value: 'sn' }, + { name: 'Somali', value: 'so' }, + { name: 'Albanian', value: 'sq' }, + { name: 'Serbian', value: 'sr' }, + { name: 'Sundanese', value: 'su' }, { name: 'Swedish', value: 'sv' }, { name: 'Swedish (Sweden)', value: 'sv-SE' }, + { name: 'Swahili', value: 'sw' }, + { name: 'Tamil', value: 'ta' }, + { name: 'Tamasheq', value: 'taq' }, + { name: 'Telugu', value: 'te' }, + { name: 'Tajik', value: 'tg' }, { name: 'Thai', value: 'th' }, { name: 'Thai (Thailand)', value: 'th-TH' }, + { name: 'Turkmen', value: 'tk' }, + { name: 'Tagalog', value: 'tl' }, { name: 'Turkish', value: 'tr' }, + { name: 'Turkish (Türkiye)', value: 'tr-TR' }, + { name: 'Tatar', value: 'tt' }, { name: 'Ukrainian', value: 'uk' }, - { name: 'Vietnamese', value: 'vi' } + { name: 'Urdu', value: 'ur' }, + { name: 'Uzbek', value: 'uz' }, + { name: 'Vietnamese', value: 'vi' }, + { name: 'Yiddish', value: 'yi' }, + { name: 'Yoruba', value: 'yo' }, + { name: 'Chinese (Mandarin, Mainland)', value: 'zh' }, + { name: 'Chinese (China)', value: 'zh-CN' }, + { name: 'Chinese (Cantonese, Hong Kong)', value: 'zh-HK' }, + { name: 'Chinese (Han (Simplified variant))', value: 'zh-Hans' }, + { name: 'Chinese (Han (Traditional variant))', value: 'zh-Hant' }, + { name: 'Chinese (Traditional, Taiwan)', value: 'zh-TW' } ]; diff --git a/lib/utils/speech-utils.js b/lib/utils/speech-utils.js index 73575a6..09439af 100644 --- a/lib/utils/speech-utils.js +++ b/lib/utils/speech-utils.js @@ -935,8 +935,30 @@ async function getLanguagesVoicesForDeepgram(credential, getTtsVoices, logger) { logger.error({response}, 'Error fetching Deepgram voices'); throw new Error('failed to list voices'); } - const {stt, tts} = await response.json(); - let sttLangs = SttDeepgramLanguagesVoices; + const {stt, tts, languages} = await response.json(); + // Helper function to get language name + const getLanguageName = (langCode) => { + if (languages && languages[langCode]) { + return languages[langCode]; + } + const existingLang = SttDeepgramLanguagesVoices.find((l) => l.value === langCode); + return existingLang ? existingLang.name : capitalizeFirst(langCode); + }; + // Collect unique languages from selected models + const allSttLanguages = new Set(); + const modelsToProcess = model_id ? + stt.filter((m) => m.canonical_name === model_id) : + stt; + modelsToProcess.forEach((model) => { + if (model.languages && Array.isArray(model.languages)) { + model.languages.forEach((lang) => allSttLanguages.add(lang)); + } + }); + // Convert to expected format + const sttLangs = Array.from(allSttLanguages).map((langCode) => ({ + name: getLanguageName(langCode), + value: langCode + })).sort((a, b) => a.name.localeCompare(b.name)); const sttModels = Array.from( new Map( stt.map((m) => [m.canonical_name, { name: capitalizeFirst(m.canonical_name), value: m.canonical_name }]) @@ -947,16 +969,6 @@ async function getLanguagesVoicesForDeepgram(credential, getTtsVoices, logger) { tts.map((m) => [m.canonical_name, { name: capitalizeFirst(m.canonical_name), value: m.canonical_name }]) ).values() ).sort((a, b) => a.name.localeCompare(b.name)); - // if model_id is not provided, return all models, all voices, all languages - if (!model_id) { - return tranform(TtsLanguagesDeepgram, sttLangs, ttsModels, sttModels); - } - - const selectedSttModel = stt.find((m) => m.canonical_name === model_id); - const selectedSttLangs = selectedSttModel ? selectedSttModel.languages : []; - sttLangs = SttDeepgramLanguagesVoices.filter((l) => { - return selectedSttLangs.includes(l.value); - }); return tranform(TtsLanguagesDeepgram, sttLangs, ttsModels, sttModels); } }