Commit Graph
66 Commits
Author SHA1 Message Date
Pascal 4536dcdce2 cleaning 2026-06-21 17:30:21 +02:00
Pascal 26fcea5468 ggml: fork update 2026-06-19 16:01:29 +02:00
Pascal 0bf4a18b22 codec: add pre-encoded voice reference (--ref-spk / --ref-rvq)
qwen-codec --talker extracts the speaker embedding (.spk, raw f32)
and the ICL codes (.rvq) in one pass, encode truncated to the hop
boundary conforming to the --ref-wav path. qwen-tts loads them via
--ref-spk / --ref-rvq and skips the speaker encoder and codec encode
on every synthesis: TTFA 205 ms -> 89 ms. Extends qt_tts_params with
ABI v2 latent fields, adds qt_num_codebooks(), ships freeman.spk +
freeman.rvq and switches clone scripts to the latent path. Output is
bit-identical to the raw path at fixed seed.
2026-06-11 21:45:13 +02:00
Pascal e8e33629c1 graph: reset scheduler before remaining shared-sched graph allocs
The talker path already resets the scheduler before allocating its graph
(thanks Andi Marafioti, #4 of qwentts.cpp). The same shared scheduler is
also allocated elsewhere without a reset first.

The scheduler keeps split and tensor->backend assignments from the
previous graph. Allocating a different graph topology on a dirty
scheduler can reuse stale assignments, which is exactly the CPU
divergence Andi fixed for the talker. Resetting before alloc_graph is
the canonical GGML contract and is idempotent when the scheduler is
already clean.

Suggested-by: Andres Marafioti <andimarafioti@gmail.com>
2026-06-09 19:53:56 +02:00
PascalandGitHub f79b23a567 Merge pull request #4 from andimarafioti/reset-scheduler-before-talker-alloc
Reset scheduler before talker graph allocation
2026-06-09 12:01:12 +02:00
Andres Marafioti d862d0e10a Reset scheduler before talker graph allocation 2026-06-09 11:44:59 +02:00
PascalandJeffrey van Binsbergen df66c67706 tts: add --stream-by-line, one utterance and one WAV header per line
With -o '-', stdin is read line by line and every line synthesises
immediately as its own utterance, model and speaker staying resident
across lines. Each utterance after the first opens with a fresh RIFF
header, armed at end of line and consumed lazily at the next audio,
so a client can split the stream into standalone WAV clips on the
RIFF magic. Port of the feature contributed to omnivoice.cpp in
ServeurpersoCom/omnivoice.cpp#11.

Co-authored-by: Jeffrey van Binsbergen <comgenie@comgenie.com>
2026-06-06 23:13:46 +02:00
Pascal ed8052eeb3 clang-format 2026-06-06 22:46:56 +02:00
Pascal ca0c779f49 tts: default language to auto, NULL lang selects auto, reject NULL text 2026-06-06 13:31:51 +02:00
Pascal f3cfa5cf47 server: add OpenAI compatible TTS server (chunked PCM streaming, WAV one-shot) 2026-06-06 12:47:10 +02:00
Pascal eda8b59092 docs 2026-05-31 19:20:57 +02:00
Pascal 8aba0f012a logs 2026-05-31 17:49:31 +02:00
Pascal 08b79d1209 prompt: cut TTFA by projecting text and ICL codec embeds on the backend
What we gain: lower TTFA (time to first audio), the latency before the
first frame is emitted. The win is entirely in the one shot prompt build;
per frame inference throughput (talker + code predictor) is unchanged.

How:
- Fuse projection: non ICL projects [instruct ; role] in one pass, ICL
  projects [ref_text ; utterance] in one pass. Trailing utterance keeps
  its own pass.
- ICL codec stream on the backend: the per frame per codebook host
  embed_row_to_f32 + vec_add sum becomes num_code_groups ggml_get_rows
  summed on the GPU in one graph (codebook 0 from talker.codec_embedding,
  rest from code_predictor.codec_embedding, any quant via get_rows).
- Drop the host text projection (linear_f32, silu, read_tensor_f32,
  text_projection_*, PromptTextProjection). tts_bos/eos/pad are projected
  once on the backend in prompt_cache_load, now run after backend_sched_new.

No regression: direct prompt embed outputs match the host path within 2e-6
cosine on all 32 cells, bit exact in BF16/F32. The per frame AR loop is
untouched (ms/frame flat).

TTFA gain, CUDA0 RTX PRO 6000, greedy, 64 frames (old -> new):

  mode/quant      BF16     F32       Q8_0     Q4_K_M
  base            -18%     ~flat     -27%     -37%
  clone           -36%      -7%      -26%     -41%
  customvoice     +11%      -1%      -26%     -32%
  tts             -25%     -11%      -24%      +5%
2026-05-31 17:48:43 +02:00
Pascal 199a65813a logs 2026-05-31 15:41:34 +02:00
Pascal 5442c2f84c perf: add per-stage timer instrumentation to qwentts and omnivoice
Add steady_clock Timer (backend agnostic) and emit [Perf] lines per
synthesis stage: prompt build, prefill, TTFA, talker decode, code
predictor, host compose, codec decode, total with RTF. omnivoice logs
generate, codec decode and total for the one chunk path. Spans end on a
device readback so GPU work is covered, no cudaEvent dependency.
2026-05-31 15:05:48 +02:00
Pascal 127bde4eea docs 2026-05-31 14:09:28 +02:00
Pascal 1c62494faa docs 2026-05-31 13:45:25 +02:00
Pascal 29a7fa0f97 test logs 2026-05-31 02:39:03 +02:00
Pascal a62fde62e6 prompt: drop dead host projection fallback, qt_throw on backend failure 2026-05-30 16:44:16 +02:00
Pascal cea3260b64 clang-format 2026-05-30 16:15:31 +02:00
PascalandGitHub 300bb09944 Merge pull request #3 from andimarafioti/optimize-prompt-ttfa
Optimize prompt TTFA with cached prefixes and batched projection
2026-05-30 16:13:12 +02:00
Pascal 207da32e75 nits 2026-05-30 16:10:10 +02:00
Andres Marafioti a0f504ce4c Optimize prompt TTFA 2026-05-30 15:41:29 +02:00
Pascal b7d601ff66 nits 2026-05-20 14:15:09 +02:00
PascalandGitHub 85ad801950 Merge pull request #1 from smashingtags/master
cmake: add Intel Arc GPU support via SYCL backend
2026-05-20 14:10:11 +02:00
smashingtags dc8d2d59a5 tests: add Intel Arc A310 SYCL generation log
Captured from LXC 140 on Proxmox 49: Intel Arc A310 (DG2, 4 GB),
oneAPI 2026.0, Level Zero 1.6.33578+15, Ubuntu 24.04.
0.6B-Base Q8_0, seed 42, 63 frames -> 5.04s WAV on SYCL0 backend.
2026-05-19 19:40:48 -04:00
smashingtags 8608504a5e cmake: add Intel Arc GPU support via SYCL backend
- Add sycl to the backend link loop so ggml-sycl links when built statically
- Add -fsycl link option for consumer executables (ggml-sycl links the
  SYCL runtime PRIVATE, so consumers need it on their own link line)
- Gate _FORTIFY_SOURCE=2 with NOT GGML_SYCL: the fortified __memcpy_chk
  symbol is unresolvable in SPIR-V device code and aborts kernel compilation
- Add buildsycl.sh convenience script (icx/icpx compilers)

Tested on Intel Arc A310 (DG2) with oneAPI 2026.0 + Level Zero: full TTS
generation produces correct audio output on the GPU.
2026-05-19 16:15:49 -04:00
Pascal 55b7234d21 cmake: scope /utf-8 to C and C++ so nvcc does not treat it as an input file 2026-05-17 14:41:39 +02:00
Pascal 8e1df7329a ggml: sync 2026-05-17 14:19:59 +02:00
Pascal 50b97b12fc ggml: address 0cc4m review for Vulkan fused snake activation
snake.comp is renamed to follow the ggml DATA_A_* / A_TYPE convention.
A_TYPE now applies to the activation tensor data_a instead of the
broadcast multiplier, and the bindings become data_a (A_TYPE), data_b
(float), data_c (float) and data_d (D_TYPE). A header at the top of
the shader maps each buffer to its role in y = x + sin(b * x)^2 * c.

On the C++ side, ggml_vk_can_fuse_snake reuses the existing snake_pattern
constant instead of duplicating the op list, sin_node is extracted as a
named local alongside the other chain nodes, and the broadcast operands
a and inv_b are now required to be GGML_TYPE_F32 to match the hardcoded
float bindings on data_b and data_c (the previous a->type == x->type
would silently reject any future BF16 or F16 chain once the supports_op
gate for SIN / SQR is lifted). ggml_vk_snake_dispatch_fused gets an
explicit GGML_TYPE_F32 case and GGML_ABORT on default in place of the
silent f32 fallback, and a stale comment about data_a[i1] / data_inv_b[i1]
is refreshed to match the new binding names.
2026-05-17 11:38:29 +02:00
Pascal 5523143942 tests 2026-05-15 00:02:37 +02:00
Pascal 4bf578ec7b qwen-tts: drop --text, align help on omnivoice style 2026-05-14 23:48:27 +02:00
Pascal f9f4a0c820 cleanup: remove dead code and DRY pre_conv release via wctx_free 2026-05-14 23:27:09 +02:00
Pascal dda50c2225 codec: add chunked decode with rolling left context 2026-05-14 22:53:28 +02:00
Pascal d99eececc8 nits 2026-05-14 22:26:28 +02:00
Pascal b1339f7cae abi: drop QT_CODEC_SAMPLE_RATE macro, hardcode 24000 like omnivoice 2026-05-14 21:55:23 +02:00
Pascal 38bf6d762a abi, pipeline, cli: conform qwentts on omnivoice convention 2026-05-14 21:42:52 +02:00
Pascal 259e7059f6 align symbol naming on omnivoice convention 2026-05-14 18:09:07 +02:00
Pascal e55ba50b75 src: fuse 3 .cpp into header-only modules to match omnivoice 2026-05-14 17:14:30 +02:00
Pascal e8f1c2a053 nits 2026-05-14 16:47:45 +02:00
Pascal b1e864cb8d cli, facade: rename --ref-audio to --ref-wav, align with omnivoice convention 2026-05-14 15:46:46 +02:00
Pascal 6ad6a7db7a facade, abi: thin CLI on top of qwen_* public ABI, lock contract with C99 probe 2026-05-14 15:31:47 +02:00
Pascal 552aa93f98 refactor: ABI 2026-05-14 15:13:45 +02:00
Pascal eb48f33f09 utf8: portable Windows UTF-8 boundary for argv, fopen and CreateFile 2026-05-14 14:10:26 +02:00
Pascal 57d12ba4e5 ggml: sync from llama.cpp 2026-05-13 10:03:56 +02:00
Pascal d5f1e20c08 pipeline: zero-init qenc_host_ready, value-init PipelineTTS
The lazy-init flag started on stack garbage. When non-zero the encode
path skipped the codebook load and silently returned empty RVQ codes.
2026-05-11 18:27:06 +02:00
Pascal 7f532f1ed0 cli, pipeline: decode --ref-audio once at the CLI, pipeline takes a mono buffer
Clone mode used to read the same WAV twice (speaker encoder then codec
encoder), which failed silently on Windows where pipeline_codec_encode
returned empty on the second pass. PipelineTTSSynthesizeParams now takes
ref_audio_24k + ref_n_samples instead of a path. The CLI calls
audio_read_mono once, holds the buffer in a unique_ptr until synthesis
returns, and feeds the same pointer to both encoders.
2026-05-11 18:14:59 +02:00
Pascal d700ffea43 cli: --ref-text takes a file path instead of inline string content 2026-05-11 17:57:40 +02:00
Pascal eefb13043e tests logs 2026-05-11 16:27:12 +02:00
Pascal 32560ea597 talker, code-predictor: fused flash attention, fix Vulkan autoregressive decode 2026-05-11 15:29:24 +02:00