diff --git a/.gitea/workflows/rolling-release.yml b/.gitea/workflows/rolling-release.yml index 41b50e1..6b244f6 100644 --- a/.gitea/workflows/rolling-release.yml +++ b/.gitea/workflows/rolling-release.yml @@ -11,6 +11,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Install native QVAC runtime libraries + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends libvulkan1 mesa-vulkan-drivers - uses: actions/setup-node@v4 with: node-version: 22 diff --git a/docs/voice-pipeline.md b/docs/voice-pipeline.md index 8ed0283..55b29f8 100644 --- a/docs/voice-pipeline.md +++ b/docs/voice-pipeline.md @@ -60,8 +60,8 @@ QVAC TTS numeric arrays contain signed 16-bit samples, not bytes. Supertonic plays at 44.1 kHz. Captured utterances use the non-streaming transcription API because local VAD already supplies utterance boundaries. -CI pins the native engines, verifies their registration inside the staged -release, and synthesizes a sentence then transcribes it with Whisper. Voice +CI installs the Vulkan runtime required by the native addons, pins the native +engines, verifies their registration inside the staged release, and synthesizes a sentence then transcribes it with Whisper. Voice models download into a temporary CI cache. Both the archive and Debian package include the validated Bare runtime and native dependencies. The release gate requires model download access; it fails rather than publishing an untested diff --git a/packaging/voice-runtime-smoke.js b/packaging/voice-runtime-smoke.js index c9a70a4..54462b8 100644 --- a/packaging/voice-runtime-smoke.js +++ b/packaging/voice-runtime-smoke.js @@ -1,5 +1,10 @@ import { qvacSdk } from '../daemon/qvac-master.js'; -const sdk = await qvacSdk(); +let sdk; +try { + sdk = await qvacSdk(); +} catch (error) { + throw new Error(`Voice runtime could not initialize native QVAC plugins. Install libvulkan1 and a Vulkan driver on the build host. ${error.message}`, { cause: error }); +} for (const type of ['llamacpp-completion', 'whispercpp-transcription', 'tts-ggml']) { if (!sdk.hasPlugin(type)) throw new Error(`Release is missing registered plugin: ${type}`); }