2023-04-27 00:28:36 +05:00
< script lang = "ts" >
2023-04-29 14:58:16 +05:00
// IMPORTS
2023-04-27 00:28:36 +05:00
import { invoke } from "@tauri-apps/api/tauri"
import { goto } from '@roxi/routify'
2023-04-29 14:58:16 +05:00
import { onMount } from 'svelte'
import { startListening , stopListening } from "@/functions";
import { setTimeout } from 'worker-timers';
2023-04-27 00:28:36 +05:00
2023-04-29 14:58:16 +05:00
// COMPONENTS & STUFF
2023-04-27 00:28:36 +05:00
import HDivider from "@/components/elements/HDivider.svelte"
import Footer from "@/components/Footer.svelte"
import { Notification , Button , Text , Tabs , Space , Alert , Input , InputWrapper , NativeSelect } from '@svelteuidev/core';
2023-04-29 14:58:16 +05:00
import { Check , Mix , Cube , Code , Gear , QuestionMarkCircled } from 'radix-icons-svelte';
2023-04-27 00:28:36 +05:00
2023-04-29 14:58:16 +05:00
// VARIABLES
2023-04-27 00:28:36 +05:00
let available_microphones = [];
let settings_saved = false;
let assistant_voice_val = ""; // shared
let selected_microphone = "";
2023-04-29 14:58:16 +05:00
let selected_wake_word_engine = "";
2023-04-27 00:28:36 +05:00
let api_key__picovoice = "";
let api_key__openai = "";
2023-04-29 14:58:16 +05:00
// SHARED VALUES
2023-04-27 00:28:36 +05:00
import { assistant_voice } from "@/stores"
assistant_voice.subscribe(value => {
assistant_voice_val = value;
});
2023-04-29 14:58:16 +05:00
// FUNCTIONS
async function save_settings() {
settings_saved = false; // hide alert
await invoke("db_write", { key : "assistant_voice" , val : assistant_voice_val } );
await invoke("db_write", { key : "selected_microphone" , val : selected_microphone } );
await invoke("db_write", { key : "selected_wake_word_engine" , val : selected_wake_word_engine } );
await invoke("db_write", { key : "api_key__picovoice" , val : api_key__picovoice } );
await invoke("db_write", { key : "api_key__openai" , val : api_key__openai } );
// update shared
assistant_voice.set(assistant_voice_val);
settings_saved = true; // show alert
setTimeout(() => {
settings_saved = false; // hide alert again after N seconds
}, 5000);
// restart listening everytime new settings is saved
stopListening(() => {
startListening();
});
}
// CODE
onMount(async () => {
2023-04-27 00:28:36 +05:00
// preload some vars
let _available_microphones: Array< Number > = await invoke("pv_get_audio_devices");
Object.entries(_available_microphones).forEach(entry => {
const [k, v] = entry;
available_microphones.push({
label: v,
value: k
});
});
available_microphones = available_microphones; // update component options
// load values from db
// assistant_voice.set(await invoke("db_read", { key : "assistant_voice" } ));
selected_microphone = await invoke("db_read", { key : "selected_microphone" } );
2023-04-29 14:58:16 +05:00
selected_wake_word_engine = await invoke("db_read", { key : "selected_wake_word_engine" } );
2023-04-27 00:28:36 +05:00
api_key__picovoice = await invoke("db_read", { key : "api_key__picovoice" } );
api_key__openai = await invoke("db_read", { key : "api_key__openai" } );
2023-04-29 14:58:16 +05:00
});
2023-04-27 00:28:36 +05:00
< / script >
< Space h = "xl" / >
2023-04-29 14:58:16 +05:00
< Notification title = 'БЕТА версия!' icon = { QuestionMarkCircled } color='blue' withCloseButton = { false } >
2023-04-27 00:28:36 +05:00
Часть функций может работать некорректно.< br / >
Сообщайте о б о всех найденных б а г а х в < a href = "https://t.me/hhsharebot" target = "_blank" > наш телеграм бот< / a > .
2023-04-29 14:58:16 +05:00
< / Notification >
2023-04-27 00:28:36 +05:00
< Space h = "xl" / >
{ #if settings_saved }
< Notification title = 'Настройки сохранены!' icon = { Check } color='teal' on:close = " {() => { settings_saved = false }} " ></ Notification >
< Space h = "xl" / >
2023-04-29 14:58:16 +05:00
{ /if }
2023-04-27 00:28:36 +05:00
2023-04-29 14:58:16 +05:00
< Tabs class = "form" color = '#8AC832' position = "left" >
2023-04-27 00:28:36 +05:00
< Tabs.Tab label = 'Общее' icon = { Gear } >
2023-04-29 14:58:16 +05:00
< Space h = "sm" / >
2023-04-27 00:28:36 +05:00
< NativeSelect data = {[
{ label : 'Jarvis ремейк (от Хауди)' , value : 'jarvis-remake' } ,
{ label : 'Jarvis OG (из фильмов)' , value : 'jarvis-og' }
]}
label="Голос ассистента"
description="Н е все команды работают с о всеми звуковыми пакетами."
variant="filled"
bind:value={ assistant_voice_val }
/>
< / Tabs.Tab >
< Tabs.Tab label = 'Устройства' icon = { Mix } >
2023-04-29 14:58:16 +05:00
< Space h = "sm" / >
2023-04-27 00:28:36 +05:00
< NativeSelect data = { available_microphones }
label="Выберите микрофон"
description="Е г о будет слушать ассистент."
variant="filled"
bind:value={ selected_microphone }
/>
< / Tabs.Tab >
2023-04-29 14:58:16 +05:00
< Tabs.Tab label = 'Нейросети' icon = { Cube } >
< Space h = "sm" / >
< NativeSelect data = {[
{ label : 'Rustpotter' , value : 'rustpotter' } ,
{ label : 'Picovoice Porcupine (требует API ключ)' , value : 'picovoice' }
]}
label="Распознавание активационной фразы (Wake Word)"
description="Выберите, какая нейросеть будет отвечать за распознавание активационной фразы."
variant="filled"
bind:value={ selected_wake_word_engine }
/>
{ #if selected_wake_word_engine == "picovoice" }
2023-04-27 00:28:36 +05:00
< Space h = "sm" / >
2023-04-29 14:58:16 +05:00
< Alert title = "Внимание!" color = "#868E96" variant = "outline" >
< Text size = 'sm' color = "gray" > Введите сюда свой ключ Picovoice.< br / > Он выдается бесплатно при регистрации в < a href = 'https://console.picovoice.ai/' target = "_blank" > Picovoice Console< / a > .< / Text >
< Space h = "sm" / >
< Input icon = { Code } placeholder='Ключ Picovoice ' variant = 'filled' autocomplete = "off" bind:value = { api_key__picovoice } / >
< / Alert >
{ /if }
2023-04-27 00:28:36 +05:00
< Space h = "xl" / >
2023-04-29 14:58:16 +05:00
2023-04-27 00:28:36 +05:00
< InputWrapper label = "Ключ OpenAI" >
2023-04-29 14:58:16 +05:00
<!-- <Text size='sm' color="gray">Введите сюда свой ключ OpenAI, он требуется для работы ChatGPT.<br />Получить е г о можно <a href="https://chat.openai.com/auth/login" target="_blank">на официальном сайте OpenAI</a>.</Text> -->
< Text size = 'sm' color = "gray" > В данный момент ChatGPT < u > не поддерживается< / u > . Он будет добавлен в ближайших обновлениях.< / Text >
2023-04-27 00:28:36 +05:00
< Space h = "sm" / >
2023-04-29 14:58:16 +05:00
< Input icon = { Code } placeholder='Ключ OpenAI ' variant = 'filled' autocomplete = "off" bind:value = { api_key__openai } disabled/ >
2023-04-27 00:28:36 +05:00
< / InputWrapper >
< / Tabs.Tab >
< / Tabs >
< Space h = "xl" / >
< Button color = "lime" radius = "md" size = "sm" uppercase ripple fullSize on:click = { save_settings } >
Сохранить
< / Button >
< Space h = "sm" / >
< Button color = "gray" radius = "md" size = "sm" uppercase fullSize on:click = {() => { $goto ( '/' )}} >
Назад
< / Button >
< HDivider / >
< Footer / >