Commit Graph
126 Commits
Author SHA1 Message Date
Pascal c9d9fa1c6b ggml: fork update 2026-07-04 21:19:51 +02:00
Pascal 3ee7bdd8c8 tts: persistent graph arenas and padded attention windows
Rebuild each forward into a persistent arena per graph shape class (one
for the talker, two for the code predictor prefill and step flavors that
alternate within a frame) so nodes keep stable addresses and the CUDA
graph cache replays its executable instead of reinstantiating. Pad the
talker attention window to 256 and fix the predictor window to the frame
cache size so decode shapes hold across steps, with the causal mask
carrying neg inf over the padded tail. Drop the per step ggml context
churn and the trailing sched resets: one talker step plus 15 predictor
micro steps per frame no longer pay a full build/alloc/free cycle each.
2026-07-04 14:14:59 +02:00
Pascal 46c99d5889 cmake: default GGML_CUDA_GRAPHS to ON
Standalone ggml ships CUDA graphs off. Capture/replay batches every
kernel launch of a graph into a single submission. Override with
-DGGML_CUDA_GRAPHS=OFF or at runtime with GGML_CUDA_DISABLE_GRAPHS=1
2026-07-04 13:45:08 +02:00
Pascal 0b4ef05d4c ggml: fork update 2026-07-04 10:55:26 +02:00
Pascal 3676f0dc41 doc 2026-07-04 01:54:23 +02:00
Pascal 3a3069b8fd utf8: normalize inbound text bytes to UTF-8
Same gap as omnivoice.cpp: the UTF-8 boundary covers argv, console
output, and fopen but not the bytes arriving from stdin or text files.
Windows shells and editors hand those over as UTF-16 with BOM
(PowerShell redirection, Notepad, Out-File) or the ANSI codepage (cmd
pipes), and the raw bytes reach the tokenizer as garbage.

utf8_normalize() closes the gap: UTF-8 BOM stripped on every platform,
UTF-16 BOM losslessly recoded to UTF-8, bytes failing UTF-8 validation
decoded from the ANSI codepage. Valid UTF-8 passes through untouched.
Wired into read_stdin_text (binary mode stdin so CRLF translation
cannot eat UTF-16 0x0D bytes) and read_text_file, which also moves
from raw fopen to utf8_fopen so a non-ASCII --ref-text path opens.
2026-07-04 01:14:00 +02:00
Pascal 09d3bc90ab ggml: fork update 2026-07-03 22:38:45 +02:00
Pascal 9dbe7ea26a tests: absolute paths are prohibited 2026-06-24 19:00:33 +02:00
PascalandGitHub c7fb781937 Merge pull request #5 from andimarafioti/codex/voice-ref-abi
Add voice reference extraction ABI
2026-06-24 17:33:58 +02:00
Andres Marafioti 5ce30d34a4 Add voice reference extraction ABI 2026-06-24 17:18:32 +02:00
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