support resemble TTS (#488)

* support resemble TTS

* wip

* wip

* update speech utils version

* update resemble voice list
This commit is contained in:
Hoan Luu Huu
2025-08-13 19:18:08 +07:00
committed by GitHub
parent 2b66a121a0
commit fd9dc77a58
6 changed files with 766 additions and 51 deletions
+30 -3
View File
@@ -15,7 +15,8 @@ const {decryptCredential, testWhisper, testDeepgramTTS,
testCartesia,
testVoxistStt,
testOpenAiStt,
testInworld} = require('../../utils/speech-utils');
testInworld,
testResembleTTS} = require('../../utils/speech-utils');
const {DbErrorUnprocessableRequest, DbErrorForbidden, DbErrorBadRequest} = require('../../utils/errors');
const {
testGoogleTts,
@@ -132,6 +133,8 @@ const encryptCredential = (obj) => {
deepgram_stt_use_tls,
deepgram_tts_uri,
playht_tts_uri,
resemble_tts_uri,
resemble_tts_use_tls,
use_custom_tts,
custom_tts_endpoint,
custom_tts_endpoint_url,
@@ -226,6 +229,15 @@ const encryptCredential = (obj) => {
deepgram_stt_use_tls, deepgram_tts_uri, model_id});
return encrypt(deepgramData);
case 'resemble':
assert(api_key, 'invalid resemble speech credential: api_key is required');
const resembleData = JSON.stringify({
api_key,
...(resemble_tts_uri && {resemble_tts_uri}),
...(resemble_tts_use_tls && {resemble_tts_use_tls})
});
return encrypt(resembleData);
case 'deepgramriver':
assert(api_key, 'invalid deepgram river speech credential: api_key is required');
const deepgramriverData = JSON.stringify({api_key});
@@ -523,7 +535,9 @@ router.put('/:sid', async(req, res) => {
playht_tts_uri,
engine_version,
service_version,
speechmatics_stt_uri
speechmatics_stt_uri,
resemble_tts_use_tls,
resemble_tts_uri
} = req.body;
const newCred = {
@@ -556,7 +570,9 @@ router.put('/:sid', async(req, res) => {
playht_tts_uri,
engine_version,
service_version,
speechmatics_stt_uri
speechmatics_stt_uri,
resemble_tts_uri,
resemble_tts_use_tls
};
logger.info({o, newCred}, 'updating speech credential with this new credential');
obj.credential = encryptCredential(newCred);
@@ -756,6 +772,17 @@ router.get('/:sid/test', async(req, res) => {
SpeechCredential.sttTestResult(sid, false);
}
}
} else if (cred.vendor === 'resemble') {
if (cred.use_for_tts) {
try {
await testResembleTTS(logger, synthAudio, credential);
results.tts.status = 'ok';
SpeechCredential.ttsTestResult(sid, true);
} catch (err) {
results.tts = {status: 'fail', reason: err.message};
SpeechCredential.ttsTestResult(sid, false);
}
}
} else if (cred.vendor === 'deepgram') {
const {api_key} = credential;
if (cred.use_for_tts) {