it does not work.

#1
by ZeroWw - opened

./build/bin/crispasr --backend indextts -m indextts-gpt-q8_0.gguf --codec-model indextts-bigvgan.gguf --voice annap.wav --tts "Hello world, this is IndexTTS speaking."

crispasr 0.8.8 (git 0a7643f1, Release) [backends: cpu]
indextts: GPT-2 24L d=1280 h=20 hd=64 ff=5120 text_vocab=12001 mel_vocab=8194
indextts: tokenizer loaded from GGUF (12000 tokens)
indextts: c_attn.w ne=(1280,3840) text_emb ne=(1280,12001) mel_head ne=(1280,8194)
indextts-voc: BigVGAN gpt_dim=1280 init_ch=1536 ups=6 kernels=3 spk=512 sr=24000 hop=256
indextts-voc: upsample_rates=[4,4,4,4,2,2] kernels=[8,8,4,4,4,4]
indextts-voc: resblock_kernels=[3,7,11] dilations=[1,3,5]
indextts-voc: GPU disabled for vocoder — AA SnakeBeta custom op is CPU-only;
Metal↔CPU sync per AMP block makes GPU slower. Override knobs:
INDEXTTS_VOC_FORCE_GPU=1 (keep mixed-backend custom op on GPU),
or INDEXTTS_VOCODER_RAW=1 (aliased fully-GPU; audibly clicks).
indextts-voc: loaded 882 tensors from 'indextts-bigvgan.gguf'
indextts-voc: SnakeBeta = anti-aliased (CPU; default)
indextts: BigVGAN vocoder loaded from 'indextts-bigvgan.gguf'
crispasr[indextts]: vocoder path = 'indextts-bigvgan.gguf'
crispasr: error: voice cloning requires the --i-have-rights flag.

By passing --i-have-rights you attest:
"I have the consent of the speaker whose voice this clones,
or it is my own voice."

Usage: crispasr --tts "text" --voice speaker.wav --i-have-rights
root@runnervmkkn4f:~/CrispASR# ./build/bin/crispasr --backend indextts -m indextts-gpt-q8_0.gguf --codec-model indextts-bigvgan.gguf --voice annap.wav --tts "Hello world, this is IndexTTS speaking." --i-have-rights
crispasr 0.8.8 (git 0a7643f1, Release) [backends: cpu]
indextts: GPT-2 24L d=1280 h=20 hd=64 ff=5120 text_vocab=12001 mel_vocab=8194
indextts: tokenizer loaded from GGUF (12000 tokens)
indextts: c_attn.w ne=(1280,3840) text_emb ne=(1280,12001) mel_head ne=(1280,8194)
indextts-voc: BigVGAN gpt_dim=1280 init_ch=1536 ups=6 kernels=3 spk=512 sr=24000 hop=256
indextts-voc: upsample_rates=[4,4,4,4,2,2] kernels=[8,8,4,4,4,4]
indextts-voc: resblock_kernels=[3,7,11] dilations=[1,3,5]
indextts-voc: GPU disabled for vocoder — AA SnakeBeta custom op is CPU-only;
Metal↔CPU sync per AMP block makes GPU slower. Override knobs:
INDEXTTS_VOC_FORCE_GPU=1 (keep mixed-backend custom op on GPU),
or INDEXTTS_VOCODER_RAW=1 (aliased fully-GPU; audibly clicks).
indextts-voc: loaded 882 tensors from 'indextts-bigvgan.gguf'
indextts-voc: SnakeBeta = anti-aliased (CPU; default)
indextts: BigVGAN vocoder loaded from 'indextts-bigvgan.gguf'
crispasr[indextts]: vocoder path = 'indextts-bigvgan.gguf'
[CONSENT] ts=2026-07-07T03:09:11+0300 voice=annap.wav attestation="CLI --i-have-rights flag"
crispasr[indextts]: resampled reference audio from 44100 Hz to 24000 Hz
crispasr[indextts]: loaded reference audio 'annap.wav' (3944336 samples, 24000 Hz)
indextts: ref mel: 15408 frames x 100 bands
indextts: mel values rms=1.7268 nan=0/1540800 min=-9.2480 max=5.6385
/root/CrispASR/ggml/src/ggml.c:1760: GGML_ASSERT(view_src == NULL || data_size == 0 || data_size + view_offs <= ggml_nbytes(view_src)) failed
/root/CrispASR/build/ggml/src/libggml-base.so.0(+0x1bddb)[0x7fbde152bddb]
/root/CrispASR/build/ggml/src/libggml-base.so.0(ggml_print_backtrace+0x21c)[0x7fbde152c25c]
/root/CrispASR/build/ggml/src/libggml-base.so.0(ggml_abort+0x15b)[0x7fbde152c43b]
/root/CrispASR/build/ggml/src/libggml-base.so.0(+0x1d9aa)[0x7fbde152d9aa]
/root/CrispASR/build/ggml/src/libggml-base.so.0(ggml_view_2d+0x45)[0x7fbde1533815]
/root/CrispASR/build/src/libcrispasr.so.1(+0x51bd12)[0x7fbde0f1bd12]
/root/CrispASR/build/src/libcrispasr.so.1(+0x520a18)[0x7fbde0f20a18]
/root/CrispASR/build/src/libcrispasr.so.1(indextts_generate_mel_codes+0x95)[0x7fbde0f234e5]
/root/CrispASR/build/src/libcrispasr.so.1(indextts_synthesize+0xc8)[0x7fbde0f27188]
./build/bin/crispasr(+0xf2fda)[0x55a632d7afda]
./build/bin/crispasr(+0x17fd0e)[0x55a632e07d0e]
./build/bin/crispasr(+0x49505)[0x55a632cd1505]
/lib/x86_64-linux-gnu/libc.so.6(+0x2a1ca)[0x7fbde002a1ca]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x8b)[0x7fbde002a28b]
./build/bin/crispasr(+0x4e505)[0x55a632cd6505]
Aborted (core dumped)

Thanks for the report and the full backtrace — that pinpointed it.

Root cause: your reference annap.wav is ~164 s, which becomes ~15,400 mel frames. The conditioning (Conformer) encoder subsamples that to T_enc = (T_mel-3)/2 + 1 ≈ 7,700, then indexes that many rows out of the fixed-length relative-position table pe, which only has 5,000 rows. So the ggml_view_2d reads past the end of the tensor and trips GGML_ASSERT(data_size + view_offs <= ggml_nbytes(...)). A short reference (a few seconds) stays well under the limit, which is why it only shows up with long clips.

Fixed on main (729d5e53): the encoder now reads the pe table length at runtime and, only when the reference is long enough to overflow it, truncates the conditioning mel to the longest length the table supports (~107 s) instead of aborting. References that already fit are untouched. Verified with a 170 s reference — it now clips and synthesizes cleanly.

No GGUF re-download needed; just rebuild from main. In practice you don't need a 164 s reference anyway — a clean ~5–15 s clip of the target voice conditions just as well and runs much faster.

Follow-up: since long references are slow to encode (that Conformer/Perceiver conditioning + the ECAPA speaker embedding both scale with reference length), I added reference-conditioning caching on main.

Now when you pass --voice ref.wav, the encoded conditioning is cached next to it as ref.wav.idxcond; later runs load it and skip the reference encode entirely (no re-running the Conformer/ECAPA over your clip). It also reuses the conditioning across text chunks within one run, and auto-invalidates if you edit the wav (CRISPASR_TTS_REF_CACHE=0 disables it). Verified the cached path produces byte-identical output. Combined with the length-cap fix from before, long references are now both safe and fast to reuse. Rebuild from main.

Sign up or log in to comment