// Model configuration fields are checked against the installed QVAC 0.19 SDK. export const TTS_PRESETS = Object.freeze({ 'supertonic-en': { model: 'TTS_EN_SUPERTONIC_Q8_0', engine: 'supertonic', sampleRate: 44100 }, supertonic3: { model: 'TTS_MULTILINGUAL_SUPERTONIC3_Q8_0', engine: 'supertonic', sampleRate: 44100 }, chatterbox: { model: 'TTS_T3_TURBO_EN_CHATTERBOX_Q8_0', engine: 'chatterbox', sampleRate: 24000 }, parler: { model: 'TTS_MINI_V1_EN_PARLER_TTS_Q8_0', engine: 'parler', sampleRate: 44100 }, }); export function ttsConfiguration(settings) { const preset = TTS_PRESETS[settings.ttsPreset]; if (!preset) throw new Error('Unknown speech model preset'); const config = { ttsEngine: preset.engine, useGPU: settings.ttsUseGpu }; if (preset.engine === 'supertonic') { Object.assign(config, { language: settings.ttsPreset === 'supertonic3' ? settings.ttsLanguage : 'en', voice: settings.voiceId, ttsSpeed: settings.ttsSpeed, ttsNumInferenceSteps: settings.ttsSteps }); } else { Object.assign(config, { threads: settings.ttsThreads, seed: settings.ttsSeed }); if (preset.engine === 'chatterbox') { Object.assign(config, { language: 'en', s3genModelSrc: 'TTS_S3GEN_EN_CHATTERBOX', cfmSteps: settings.ttsCfmSteps }); if (settings.ttsReferenceAudio) config.referenceAudioSrc = settings.ttsReferenceAudio; } else { if (!settings.ttsDescription) throw new Error('Describe the Parler voice before applying settings'); Object.assign(config, { description: settings.ttsDescription, temperature: settings.ttsTemperature }); } } return { model: settings.ttsModel || preset.model, sampleRate: preset.sampleRate, config }; } export function scaleSpeech(samples, volume = 100) { if (volume === 100) return samples; const output = new Int16Array(samples.length); const gain = Math.max(0, Math.min(100, volume)) / 100; for (let i = 0; i < samples.length; i++) output[i] = Math.round(samples[i] * gain); return output; }