diff --git a/apps/gnome-extension/jarvis@qvac.local/schemas/gschemas.compiled b/apps/gnome-extension/jarvis@qvac.local/schemas/gschemas.compiled new file mode 100644 index 0000000..3a62264 Binary files /dev/null and b/apps/gnome-extension/jarvis@qvac.local/schemas/gschemas.compiled differ diff --git a/daemon/qvac-master.js b/daemon/qvac-master.js index 50db71e..28dc732 100644 --- a/daemon/qvac-master.js +++ b/daemon/qvac-master.js @@ -99,16 +99,18 @@ function resolveModelConfigAssets(sdk, config) { /** Load ASR/TTS models in the same SDK worker and under the same master lock. * These are auxiliary model IDs; they do not create another QVAC runtime. */ -export async function loadAuxiliaryModel(name, modelConfig = {}) { +export async function loadAuxiliaryModel(name, modelConfig = {}, modelType = undefined) { if (!name) throw new Error('auxiliary QVAC model name is required'); const existing = auxiliaryModels.get(String(name)); if (existing) return existing; const sdk = await qvacSdk(); if (typeof sdk.loadModel !== 'function') throw new Error('QVAC SDK does not expose loadModel()'); - const modelId = await withQvacMaster(() => sdk.loadModel({ + const loadOptions = { modelSrc: resolveSdkAsset(sdk, name), modelConfig: { ...resolveModelConfigAssets(sdk, modelConfig), device: 'gpu', gpu_layers: QVAC_MASTER.gpuLayers, 'mmproj-use-gpu': true }, - })); + }; + if (modelType) loadOptions.modelType = modelType; + const modelId = await withQvacMaster(() => sdk.loadModel(loadOptions)); auxiliaryModels.set(String(name), modelId); return modelId; } diff --git a/daemon/voice-adapters.js b/daemon/voice-adapters.js index c424d90..790270d 100644 --- a/daemon/voice-adapters.js +++ b/daemon/voice-adapters.js @@ -11,8 +11,8 @@ export class QvacVoiceAdapter extends EventEmitter { assertSdkVersion(); await acquireQvac(); this.acquired = true; try { - this.asrId = await loadAuxiliaryModel(this.asrModel, { vadModelSrc: 'VAD_SILERO_5_1_2', audio_format: 's16le', language: 'en', no_timestamps: true, vad_params: { threshold: 0.6, min_speech_duration_ms: 300, min_silence_duration_ms: 700, max_speech_duration_s: 15, speech_pad_ms: 200 } }); - this.ttsId = await loadAuxiliaryModel(this.ttsModel, { ttsEngine: 'supertonic', language: 'en', voice: 'F1', ttsSpeed: 1.05, ttsNumInferenceSteps: 5 }); + this.asrId = await loadAuxiliaryModel(this.asrModel, { vadModelSrc: 'VAD_SILERO_5_1_2', audio_format: 's16le', language: 'en', no_timestamps: true, vad_params: { threshold: 0.6, min_speech_duration_ms: 300, min_silence_duration_ms: 700, max_speech_duration_s: 15, speech_pad_ms: 200 } }, 'whisper'); + this.ttsId = await loadAuxiliaryModel(this.ttsModel, { ttsEngine: 'supertonic', language: 'en', voice: 'F1', ttsSpeed: 1.05, ttsNumInferenceSteps: 5 }, 'tts'); } catch (error) { await this.stop(); throw error; } } diff --git a/packaging/build-extension.sh b/packaging/build-extension.sh index 7292562..c9b4488 100755 --- a/packaging/build-extension.sh +++ b/packaging/build-extension.sh @@ -4,6 +4,9 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" OUT_DIR="${ROOT_DIR}/dist" mkdir -p "${OUT_DIR}" rm -f "${OUT_DIR}/jarvis-qvac-extension.zip" +if command -v glib-compile-schemas >/dev/null; then + glib-compile-schemas "${ROOT_DIR}/apps/gnome-extension/jarvis@qvac.local/schemas" >/dev/null +fi ( cd "${ROOT_DIR}/apps/gnome-extension" && zip -q -r "${OUT_DIR}/jarvis-qvac-extension.zip" "jarvis@qvac.local" -x '*/__pycache__/*' -x '*.pyc' ) test -s "${OUT_DIR}/jarvis-qvac-extension.zip" echo "${OUT_DIR}/jarvis-qvac-extension.zip" diff --git a/packaging/install.sh b/packaging/install.sh index 9d19ed0..39de0ac 100755 --- a/packaging/install.sh +++ b/packaging/install.sh @@ -3,7 +3,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" command -v zip >/dev/null || { echo "zip is required to register the GNOME extension" >&2; exit 1; } APP_DIR="${HOME}/.local/share/jarvis-qvac" -EXT_DIR="${HOME}/.local/share/gnome-shell/extensions/jarvis@qvac.local" +EXT_DIR="${XDG_DATA_HOME:-${HOME}/.local/share}/gnome-shell/extensions/jarvis@qvac.local" CONFIG_DIR="${HOME}/.config/jarvis" CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/jarvis/models" mkdir -p "${APP_DIR}" "${EXT_DIR}" "${CONFIG_DIR}" "${HOME}/.config/systemd/user" "${CACHE_DIR}" @@ -35,6 +35,9 @@ if command -v gnome-extensions >/dev/null && gnome-extensions install --force "$ else cp -a "${ROOT_DIR}/apps/gnome-extension/jarvis@qvac.local/." "${EXT_DIR}/" fi +if command -v glib-compile-schemas >/dev/null && [[ -d "${EXT_DIR}/schemas" ]]; then + glib-compile-schemas "${EXT_DIR}/schemas" >/dev/null +fi sed "s#__JARVIS_BARE__#${BARE_BIN}#" "${ROOT_DIR}/packaging/jarvisd.service" > "${HOME}/.config/systemd/user/jarvisd.service" if [[ ! -f "${CONFIG_DIR}/qvac.config.json" ]]; then sed "s#__JARVIS_CACHE__#${CACHE_DIR}#g" "${ROOT_DIR}/packaging/qvac.config.template.json" > "${CONFIG_DIR}/qvac.config.json"