From 75c27e3f808aa76d8080fc9f368519e79e5b1480 Mon Sep 17 00:00:00 2001 From: rammohan-y <37395033+rammohan-y@users.noreply.github.com> Date: Fri, 13 Dec 2024 03:36:45 +0530 Subject: [PATCH] feat/982: fixed issue where vendor's API is not called if vendor is defined at service provider level, and also made format of name consistent (#365) --- lib/models/speech-credential.js | 7 +++-- lib/utils/speech-data/tts-verbio.js | 6 ---- lib/utils/speech-utils.js | 43 +++++++++++++++++++---------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/lib/models/speech-credential.js b/lib/models/speech-credential.js index f4bf005..c4bd4a5 100644 --- a/lib/models/speech-credential.js +++ b/lib/models/speech-credential.js @@ -22,14 +22,17 @@ class SpeechCredential extends Model { static async getSpeechCredentialsByVendorAndLabel(service_provider_sid, account_sid, vendor, label) { let sql; + let rows = []; if (account_sid) { sql = `SELECT * FROM speech_credentials WHERE account_sid = ? AND vendor = ? AND label ${label ? '= ?' : 'is NULL'}`; - } else { + [rows] = await promisePool.query(sql, [account_sid, vendor, label]); + } + if (rows.length === 0) { sql = `SELECT * FROM speech_credentials WHERE service_provider_sid = ? AND vendor = ? AND label ${label ? '= ?' : 'is NULL'}`; + [rows] = await promisePool.query(sql, [service_provider_sid, vendor, label]); } - const [rows] = await promisePool.query(sql, [account_sid ? account_sid : service_provider_sid, vendor, label]); return rows; } diff --git a/lib/utils/speech-data/tts-verbio.js b/lib/utils/speech-data/tts-verbio.js index 08ccf27..2286bc0 100644 --- a/lib/utils/speech-data/tts-verbio.js +++ b/lib/utils/speech-data/tts-verbio.js @@ -27,12 +27,6 @@ module.exports = [ value: 'miguel_es_pe', name: 'Miguel-Male', }, - ], - }, - { - value: 'es-PE', - name: 'Peruvian Spanish', - voices: [ { value: 'luz_es_pe', name: 'Luz-Female', diff --git a/lib/utils/speech-utils.js b/lib/utils/speech-utils.js index ad72b58..1ef160d 100644 --- a/lib/utils/speech-utils.js +++ b/lib/utils/speech-utils.js @@ -821,27 +821,35 @@ async function getLanguagesVoicesForElevenlabs(credential) { }).sort((a, b) => a.name.localeCompare(b.name)) : []; if (languages && languages.length > 0) { + // using if condition to avoid \n character in name const voices = voiceResp ? voiceResp.voices.map((v) => { - let name = `${v.name}${v.category !== 'premade' ? ` (${v.category})` : ''} - - ${v.labels.accent ? ` ${v.labels.accent},` : ''} - ${v.labels.description ? ` ${v.labels.description},` : ''} - ${v.labels.age ? ` ${v.labels.age},` : ''} - ${v.labels.gender ? ` ${v.labels.gender},` : ''} - ${v.labels['use case'] ? ` ${v.labels['use case']},` : ''} - `; + let name = `${v.name}${v.category !== 'premade' ? ` (${v.category.trim()})` : ''} - (`; + if (v.labels.accent) name += `${v.labels.accent}, `; + if (v.labels.description) name += `${v.labels.description}, `; + if (v.labels.age) name += `${v.labels.age}, `; + if (v.labels.gender) name += `${v.labels.gender}, `; + if (v.labels['use case']) name += `${v.labels['use case']}, `; + const lastIndex = name.lastIndexOf(','); if (lastIndex !== -1) { name = name.substring(0, lastIndex); } + name += ')'; return { value: v.voice_id, name }; }).sort((a, b) => a.name.localeCompare(b.name)) : []; - languages[0].voices = voices; + for (const language of languages) { + language.voices = voices; + } } return tranform(languages, undefined, TtsModelElevenLabs); } else { + const voices = TtsElevenlabsLanguagesVoices[0].voices; + for (const language of TtsElevenlabsLanguagesVoices) { + language.voices = voices; + } return tranform(TtsElevenlabsLanguagesVoices, undefined, TtsModelElevenLabs); } } @@ -876,10 +884,12 @@ async function getLanguagesVoicesForPlayHT(credential) { const list_voices = [...cloned_voice, ...voices]; const buildVoice = (d) => { - let name = `${d.name} -${concat(d.accent)}${concat(d.age)}${concat(d.gender)}${concat(d.loudness)}` + + let name = `${d.name} - (${concat(d.accent)}${concat(d.age)}${concat(d.gender)}${concat(d.loudness)}` + `${concat(d.style)}${concat(d.tempo)}${concat(d.texture)}` ; name = name.endsWith(',') ? name.trim().slice(0, -1) : name; name += !d.language_code ? ' - Custom Voice' : ''; + name += ')'; + name = name.replaceAll('( ', '('); return { value: `${d.id}`, @@ -965,15 +975,18 @@ async function getLanguagesVoicesForWhisper(credential) { async function getLanguagesVoicesForVerbio(credentials, getTtsVoices, logger) { const stt = SttVerbioLanguagesVoices.reduce((acc, v) => { - if (!v.version || credentials.engine_version === v.version) { + if (!v.version || (credentials && credentials.engine_version === v.version)) { acc.push(v); } return acc; }, []); try { - const data = await getTtsVoices({vendor: 'verbio', credentials}); - const voices = parseVerbioLanguagesVoices(data); - return tranform(voices, stt, undefined); + if (credentials) { + const data = await getTtsVoices({vendor: 'verbio', credentials}); + const voices = parseVerbioLanguagesVoices(data); + return tranform(voices, stt, undefined); + } + return tranform(TtsVerbioLanguagesVoices, stt, undefined); } catch (err) { logger.info({err}, 'there is error while fetching verbio speech voices'); return tranform(TtsVerbioLanguagesVoices, stt, undefined); @@ -1043,7 +1056,7 @@ function parseAwsLanguagesVoices(data) { if (existingLanguage) { existingLanguage.voices.push({ value: voice.Id, - name: `(${voice.Gender}) ${voice.Name}` + name: `${voice.Name} (${voice.Gender})` }); } else { acc.push({ @@ -1051,7 +1064,7 @@ function parseAwsLanguagesVoices(data) { name: voice.LanguageName, voices: [{ value: voice.Id, - name: `(${voice.Gender}) ${voice.Name}` + name: `${voice.Name} (${voice.Gender})` }] }); }