Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
0a2c978
feat: add @qvac/tts-ggml package (Chatterbox English on qvac-tts.cpp)
GustavoA1604 Apr 21, 2026
a6d0776
chore: point tts-ggml vcpkg baseline at the tts-cpp-bearing registry …
GustavoA1604 Apr 21, 2026
c450ba5
chore: tts-ggml: trim tests + examples to Chatterbox English, restore…
GustavoA1604 Apr 21, 2026
42104a5
Add streaming support
GustavoA1604 Apr 22, 2026
41914ab
Update ggml backend to use separate ggml repo
GustavoA1604 Apr 22, 2026
598e97f
tts-ggml: consume renamed tts-cpp library (2026-04-24#1)
GustavoA1604 Apr 24, 2026
d020c4c
Merge branch 'main' into feat/tts-ggml
GustavoA1604 May 7, 2026
124096e
tts-ggml: bump tts-cpp port to 2026-05-07 + registry baseline
GustavoA1604 May 7, 2026
6e59ea5
Add chatterbox multilingual and supertonic
GustavoA1604 May 7, 2026
ed663a4
Add mobile integration tests
GustavoA1604 May 7, 2026
f13e97c
Merge branch 'main' into feat/tts-ggml
GustavoA1604 May 7, 2026
036b4e3
tts-ggml: drop clang-19 pin in linux-clang toolchain
GustavoA1604 May 7, 2026
4fd2db2
Add C++ tests and coverage; fix linux build
GustavoA1604 May 7, 2026
2ac4716
tts-ggml: address PR review feedback
GustavoA1604 May 7, 2026
c9f88ac
tts-ggml: unblock CI integration tests on every desktop runner
GustavoA1604 May 7, 2026
ecd51a5
tts-ggml: drop Chatterbox from mobile bundle (Metro V8 string limit)
GustavoA1604 May 7, 2026
0a2c007
Bump hash of vcpkg
GustavoA1604 May 7, 2026
f189366
Consume vcpkg from tetherto repository
GustavoA1604 May 7, 2026
7e9020d
Fix integration tests failures in all platforms
GustavoA1604 May 7, 2026
425188a
Further fix tests
GustavoA1604 May 7, 2026
7924042
fix: Make useGPU flag more meaningful (#1953)
ishanvohra2 May 11, 2026
253b606
Update dependencies after monorepo directory changes
GustavoA1604 May 11, 2026
9c7d9d3
Merge branch 'main' into feat/tts-ggml
GustavoA1604 May 11, 2026
08f471e
Further drop qvac-lib- prefix
GustavoA1604 May 11, 2026
23c12bc
Add CHANGELOG.md
GustavoA1604 May 11, 2026
d3ad8f4
Merge branch 'main' into feat/tts-ggml
GustavoA1604 May 11, 2026
6224b08
Merge branch 'main' into feat/tts-ggml
GustavoA1604 May 11, 2026
57aea62
Merge remote-tracking branch 'origin/main' into feat/tts-ggml
GustavoA1604 May 11, 2026
4e9b59c
Merge branch 'feat/tts-ggml' of https://github.com/tetherto/qvac into…
GustavoA1604 May 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
262 changes: 242 additions & 20 deletions .github/workflows/cpp-test-coverage-tts-ggml.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,10 @@
name: CPP Tests (TTS GGML)

# Stub workflow. packages/tts-ggml's CMakeLists.txt currently has no C++
# test executables wired up (BUILD_TESTING block is documented as a
# placeholder for the future qvac::ttsggml::* unit suite). Until those
# tests land, this workflow exposes a workflow_call entry point so
# on-pr-tts-ggml.yml can reference it without 404'ing, and prints a clear
# "no tests yet" notice instead of silently passing.
#
# When the C++ suite is added, replace the body of `cpp-tests` with the
# real ccache + vcpkg + npm run coverage:cpp:build/run/report sequence
# (mirror cpp-test-coverage-transcription-parakeet.yml).

on:
workflow_call:
inputs:
ref:
description: "ref"
description: 'ref'
type: string
repository:
type: string
Expand All @@ -24,17 +13,250 @@ on:
permissions:
contents: read

env:
BUILD_TYPE: Debug
ENABLE_COVERAGE: ON
PKG_DIR: packages/tts-ggml

jobs:
cpp-tests:
name: tts-ggml C++ tests (stub)
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
checks: write
runs-on: ${{ matrix.os }}
environment: release
name: ${{ matrix.platform }}-${{ matrix.arch }}-cpp-tests
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-22.04
platform: linux
arch: x64
coverage: true
env:
VCPKG_BINARY_SOURCES: "clear;files,${{ github.workspace }}/vcpkg/cache,readwrite"

steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # 6.0.2
with:
repository: ${{ inputs.repository || github.repository }}
ref: ${{ inputs.ref || github.ref }}
token: ${{ secrets.PAT_TOKEN }}
lfs: true

- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # 6.3.0
with:
node-version: lts/*

- name: Setup LLVM
if: matrix.platform == 'linux'
uses: tetherto/qvac/.github/actions/setup-llvm@0c819dd1110e4902223b1f7646cc0f1be2c9bc5c

- name: Setup ccache
if: matrix.platform == 'linux'
run: |
sudo apt-get install -y ccache
ccache -z
echo "CMAKE_C_COMPILER_LAUNCHER=ccache" >> $GITHUB_ENV
echo "CMAKE_CXX_COMPILER_LAUNCHER=ccache" >> $GITHUB_ENV

- name: Get ccache cache
if: matrix.platform == 'linux'
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # 5.0.4
with:
key: ccache-cpp-coverage-tts-ggml-${{ matrix.platform }}-${{ matrix.arch }}-${{ hashFiles(format('{0}/vcpkg.json', env.PKG_DIR)) }}
path: ~/.cache/ccache
restore-keys: ccache-cpp-coverage-tts-ggml-${{ matrix.platform }}-${{ matrix.arch }}-

- name: Install NPM dependencies
working-directory: ${{ env.PKG_DIR }}
run: |
npm install
npm install -g bare bare-make

- if: ${{ matrix.os == 'ubuntu-22.04' }}
name: Configure vcpkg in linux
run: echo "VCPKG_ROOT=$VCPKG_INSTALLATION_ROOT" >> $GITHUB_ENV

- name: Setup Vulkan SDK
uses: tetherto/qvac/.github/actions/setup-vulkan-sdk@0bbdca93da303a0b1634ba14a89cec085621078d
env:
MODEL_S3_BUCKET: ${{ secrets.MODEL_S3_BUCKET }}
with:
platform: ${{ matrix.platform }}
arch: ${{ matrix.arch }}
aws-role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: eu-central-1

- name: Generate and build C++ unit tests (with coverage)
working-directory: ${{ env.PKG_DIR }}
run: |
npm run coverage:cpp:build

- name: Setup Python (HF -> .gguf conversion for QVAC_TEST_* gates)
uses: actions/setup-python@v5
with:
python-version: '3.12'

# Mirrors parakeet's cpp-test-coverage flow. The C++ suite has two
# tiers of tests:
# - Pure validation / static-helper tests (no GGUF needed).
# - QVAC_TEST_CHATTERBOX_T3_GGUF + QVAC_TEST_CHATTERBOX_S3GEN_GGUF
# and QVAC_TEST_SUPERTONIC_GGUF gated round-trip tests.
# We provision the multilingual Chatterbox (q4_0) + English
# Supertonic (q4_0 -> f16 per supertonic_ftype) GGUFs because they
# exercise the most code paths per byte downloaded. Cache hit
# skips the full HF download + conversion (~15 min cold, ~0s warm).
- name: Cache TTS GGML venv + q4 GGUFs
id: cache-tts-ggml-models
uses: actions/cache@v4
with:
path: |
${{ env.PKG_DIR }}/venv
${{ env.PKG_DIR }}/models/chatterbox-t3-mtl.gguf
${{ env.PKG_DIR }}/models/chatterbox-s3gen-mtl.gguf
${{ env.PKG_DIR }}/models/supertonic.gguf
key: tts-ggml-cpp-mtl-supertonic-en-q4-v1-${{ hashFiles(format('{0}/scripts/convert-models.sh', env.PKG_DIR), format('{0}/scripts/setup-venv.sh', env.PKG_DIR), format('{0}/scripts/requirements.txt', env.PKG_DIR), format('{0}/scripts/convert-t3-mtl-to-gguf.py', env.PKG_DIR), format('{0}/scripts/convert-s3gen-to-gguf.py', env.PKG_DIR), format('{0}/scripts/convert-supertonic2-to-gguf.py', env.PKG_DIR)) }}
restore-keys: |
tts-ggml-cpp-mtl-supertonic-en-q4-v1-

- name: Convert HF -> q4_0 GGUFs (cache miss)
if: steps.cache-tts-ggml-models.outputs.cache-hit != 'true'
working-directory: ${{ env.PKG_DIR }}
shell: bash
run: |
set -euo pipefail
echo "Cache miss -- provisioning Python venv and converting models..."
bash scripts/setup-venv.sh
bash scripts/convert-models.sh -t multilingual -q q4_0
bash scripts/convert-models.sh -t supertonic-en -q q4_0
ls -lh models/

- name: Verify GGUFs for C++ tests
working-directory: ${{ env.PKG_DIR }}
shell: bash
run: |
set -euo pipefail
for f in chatterbox-t3-mtl.gguf chatterbox-s3gen-mtl.gguf supertonic.gguf; do
if [ ! -s "models/$f" ]; then
echo "WARN: missing or empty models/$f -- gated tests will skip" >&2
ls -la models/ || true
else
echo "OK: models/$f"
fi
done

- name: Run C++ Unit Tests
id: cpp-tests
working-directory: ${{ env.PKG_DIR }}
env:
QVAC_TEST_CHATTERBOX_T3_GGUF: ${{ github.workspace }}/${{ env.PKG_DIR }}/models/chatterbox-t3-mtl.gguf
QVAC_TEST_CHATTERBOX_S3GEN_GGUF: ${{ github.workspace }}/${{ env.PKG_DIR }}/models/chatterbox-s3gen-mtl.gguf
QVAC_TEST_SUPERTONIC_GGUF: ${{ github.workspace }}/${{ env.PKG_DIR }}/models/supertonic.gguf
run: |
echo "=== Running TTS GGML C++ tests ==="
pwd
ls -la models/ || true
npm run test:cpp:run
continue-on-error: true

- name: Debug - List test output files
if: always()
working-directory: ${{ env.PKG_DIR }}
run: |
echo "Contents of build/:"
ls -la build/ || echo "Directory not found"
echo "Profiling files:"
ls -la build/*.profraw || echo "No profraw files"

- name: Generate Coverage Report
if: matrix.coverage
working-directory: ${{ env.PKG_DIR }}
run: |
npm run coverage:cpp:report
COVERAGE=$(grep 'TOTAL' build/coverage-summary.txt | awk '{print $10}')
echo "LINE_COVERAGE_PERCENTAGE=${COVERAGE}" >> $GITHUB_ENV
echo "Line Coverage: ${COVERAGE}" > coverage-badge.txt

- name: Show ccache statistics
if: matrix.platform == 'linux'
run: ccache -s

- name: Archive Coverage Results
if: matrix.coverage
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # 7.0.0
with:
name: coverage-report-tts-ggml-${{ matrix.platform }}-${{ matrix.arch }}
path: |
${{ env.PKG_DIR }}/build/coverage-html/
${{ env.PKG_DIR }}/build/lcov.info
${{ env.PKG_DIR }}/build/coverage-summary.txt
${{ env.PKG_DIR }}/build/cpp-test-results.xml
retention-days: 30

- name: Check if test results exist
id: check-test-results
working-directory: ${{ env.PKG_DIR }}
run: |
if [ -f build/cpp-test-results.xml ]; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
continue-on-error: true

- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040 # 2.23.0
if: always() && steps.check-test-results.outputs.exists == 'true'
with:
files: ${{ env.PKG_DIR }}/build/cpp-test-results.xml
comment_mode: off
check_name: "C++ Test Results (${{ matrix.platform }}-${{ matrix.arch }})"

- name: Coverage Summary
if: matrix.coverage
working-directory: ${{ env.PKG_DIR }}
run: |
echo "## C++ Coverage Summary (TTS GGML)" >> $GITHUB_STEP_SUMMARY
echo "**Platform:** ${{ matrix.platform }}-${{ matrix.arch }}" >> $GITHUB_STEP_SUMMARY
echo "**Coverage:** ${{ env.LINE_COVERAGE_PERCENTAGE }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ -f build/coverage-summary.txt ]; then
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
cat build/coverage-summary.txt >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
fi

coverage-report:
permissions:
contents: read
actions: read
needs: cpp-tests
runs-on: ubuntu-latest
if: always()
steps:
- name: Explain
- name: Download all coverage reports
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # 8.0.1
with:
path: coverage-reports

- name: Combine Coverage Reports
run: |
echo "packages/tts-ggml has no C++ unit tests today."
echo "CMakeLists.txt's BUILD_TESTING block is reserved for a future"
echo "qvac::ttsggml::* suite; this workflow will be expanded into"
echo "the real ccache + vcpkg + coverage pipeline at that point"
echo "(mirror cpp-test-coverage-transcription-parakeet.yml)."
echo "## TTS GGML C++ Code Coverage Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Test Suite:** ChatterboxModel + SupertonicModel + AddonCpp" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
for report in coverage-reports/*/coverage-summary.txt; do
if [ -f "$report" ]; then
platform=$(basename $(dirname "$report"))
echo "### $platform" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
cat "$report" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
fi
done
Loading
Loading