Update TTS providers and story markup

This commit is contained in:
2026-05-20 22:13:31 +02:00
parent b911c40d89
commit 8258ea2321
36 changed files with 1482 additions and 197 deletions
+41 -5
View File
@@ -35,10 +35,20 @@ class PersistenceManagerModule extends BaseModule {
speed: 1.0,
language: 'en_US',
voice: '',
'browser-tts_timeout_ms': 60000,
'kokoro-tts_timeout_ms': 60000,
'elevenlabs-tts_api_key': '',
'elevenlabs-tts_api_url': 'https://api.elevenlabs.io/v1',
'elevenlabs-tts_timeout_ms': 60000,
'openai-tts_api_key': '',
'openai-tts_api_url': 'https://api.openai.com/v1'
'openai-tts_api_url': 'https://api.openai.com/v1',
'openai-tts_model': 'tts-1-hd',
'openai-tts_timeout_ms': 60000,
'local-openai-tts_api_key': '',
'local-openai-tts_api_url': 'http://localhost:8000/v1',
'local-openai-tts_voice': 'alloy',
'local-openai-tts_model': 'tts-1',
'local-openai-tts_timeout_ms': 60000
},
audio: {
masterVolume: 1.0,
@@ -629,13 +639,39 @@ class PersistenceManagerModule extends BaseModule {
// Check if it's a range transformer in format 'range:min,max'
if (element.dataset.prefTransform === 'centered-speed') {
transformer = {
toElement: (value) => Math.round(((Number(value) || 1) * 50) + 50),
toPreference: (value) => Math.max(0.5, Math.min(2.0, (parseInt(value, 10) - 50) / 50))
toElement: (value) => Math.round(Math.max(0.5, Math.min(2.0, Number(value) || 1)) * 100),
toPreference: (value) => {
const percent = parseInt(value, 10);
return Math.max(0.5, Math.min(2.0, (Number.isFinite(percent) ? percent : 100) / 100));
}
};
} else if (element.dataset.prefTransform === 'multiplier-percent') {
transformer = {
toElement: (value) => Math.round((Number(value) || 1) * 100),
toPreference: (value) => Math.max(0.25, Math.min(4.0, parseInt(value, 10) / 100))
toElement: (value) => Math.round(Math.max(0.5, Math.min(2.0, Number(value) || 1)) * 100),
toPreference: (value) => {
const percent = parseInt(value, 10);
return Math.max(0.5, Math.min(2.0, (Number.isFinite(percent) ? percent : 100) / 100));
}
};
} else if (element.dataset.prefTransform.startsWith('integer:')) {
const rangeValues = element.dataset.prefTransform.substring(8).split(',');
const min = Number.parseInt(rangeValues[0], 10);
const max = Number.parseInt(rangeValues[1], 10);
transformer = {
toElement: (value) => Number.parseInt(value, 10),
toPreference: (value) => {
const parsed = Number.parseInt(value, 10);
if (!Number.isFinite(parsed)) {
return Number.isFinite(min) ? min : 0;
}
if (Number.isFinite(min) && parsed < min) {
return min;
}
if (Number.isFinite(max) && parsed > max) {
return max;
}
return parsed;
}
};
} else if (element.dataset.prefTransform.startsWith('range:')) {
const rangeValues = element.dataset.prefTransform.substring(6).split(',');