|
@@ -3,6 +3,7 @@
|
|
|
import { user, settings } from '$lib/stores';
|
|
|
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
|
|
import { toast } from 'svelte-sonner';
|
|
|
+ import Switch from '$lib/components/common/Switch.svelte';
|
|
|
const dispatch = createEventDispatcher();
|
|
|
|
|
|
const i18n = getContext('i18n');
|
|
@@ -20,6 +21,7 @@
|
|
|
let conversationMode = false;
|
|
|
let speechAutoSend = false;
|
|
|
let responseAutoPlayback = false;
|
|
|
+ let nonLocalVoices = false;
|
|
|
|
|
|
let TTSEngines = ['', 'openai'];
|
|
|
let TTSEngine = '';
|
|
@@ -105,6 +107,7 @@
|
|
|
|
|
|
STTEngine = $settings?.audio?.STTEngine ?? '';
|
|
|
TTSEngine = $settings?.audio?.TTSEngine ?? '';
|
|
|
+ nonLocalVoices = $settings.audio?.nonLocalVoices ?? false;
|
|
|
speaker = $settings?.audio?.speaker ?? '';
|
|
|
model = $settings?.audio?.model ?? '';
|
|
|
|
|
@@ -139,7 +142,8 @@
|
|
|
STTEngine: STTEngine !== '' ? STTEngine : undefined,
|
|
|
TTSEngine: TTSEngine !== '' ? TTSEngine : undefined,
|
|
|
speaker: speaker !== '' ? speaker : undefined,
|
|
|
- model: model !== '' ? model : undefined
|
|
|
+ model: model !== '' ? model : undefined,
|
|
|
+ nonLocalVoices: nonLocalVoices
|
|
|
}
|
|
|
});
|
|
|
dispatch('save');
|
|
@@ -290,16 +294,27 @@
|
|
|
<select
|
|
|
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
|
|
bind:value={speaker}
|
|
|
- placeholder="Select a voice"
|
|
|
>
|
|
|
- <option value="" selected>{$i18n.t('Default')}</option>
|
|
|
- {#each voices.filter((v) => v.localService === true) as voice}
|
|
|
- <option value={voice.name} class="bg-gray-100 dark:bg-gray-700">{voice.name}</option
|
|
|
+ <option value="" selected={speaker !== ''}>{$i18n.t('Default')}</option>
|
|
|
+ {#each voices.filter((v) => nonLocalVoices || v.localService === true) as voice}
|
|
|
+ <option
|
|
|
+ value={voice.name}
|
|
|
+ class="bg-gray-100 dark:bg-gray-700"
|
|
|
+ selected={speaker === voice.name}>{voice.name}</option
|
|
|
>
|
|
|
{/each}
|
|
|
</select>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="flex items-center justify-between mb-1">
|
|
|
+ <div class="text-sm">
|
|
|
+ {$i18n.t('Allow non-local voices')}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="mt-1">
|
|
|
+ <Switch bind:state={nonLocalVoices} />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
{:else if TTSEngine === 'openai'}
|
|
|
<div>
|