CoolFace
Datasetpublic

sw-voice/swamiji-artifact-abc-grid

Where does the end-of-clip artifact come from? Reported symptom: short polite replies "mess up at the end", and a "huge high" is audible after the words finish — sometimes even when the sentence ends in a full stop. Three candidate causes: the model, the streaming, or the Opus codec. Each phrase here is generated twice — ending in ! and ending in . — and each generation is rendered three ways, so exactly one variable moves at a time. Six players per row. rendering what it… See the full description on the dataset page: https://huggingface.co/datasets/sw-voice/swamiji-artifact-abc-grid.

sourceHugging Faceotherupdated 2mo agoView on Hugging Face
0likes11downloads
Dataset Card

Where does the end-of-clip artifact come from?

Reported symptom: short polite replies "mess up at the end", and a "huge high" is audible after the words finish — sometimes even when the sentence ends in a full stop. Three candidate causes: the model, the streaming, or the Opus codec.

Each phrase here is generated twice — ending in ! and ending in . — and each generation is rendered three ways, so exactly one variable moves at a time. Six players per row.

renderingwhat it isisolates
*_directthe engine's PCM straight to WAV, nothing else touches itthe model
*_streamingthe same PCM rebuilt on the browser's scheduler using real chunk arrival times and the same 80 ms lead tts.js uses, so a late chunk leaves audible dead airstream timing
*_opusdirect encoded to Opus 48 kbps/48 kHz and decoded back — the codec LiveKit puts every agent reply throughthe transport

The TTS tab sends raw PCM and never touches Opus; the Conversation tab is Opus. So direct vs opus is exactly the difference between the two tabs.

Model: sw-voice/swamiji-voxcpm2-ft-src0-lr0.0001-10ep-deva (src0), cfg_value=1.5, inference_timesteps=10, non-fp16.

Verdict

1. Streaming is not the cause. Every generation came back stream_identical = True with zero scheduler gaps. The engine runs at RTF ~0.13, far ahead of realtime, so chunks always arrive before their slot.

2. Opus is not the cause either. It raises the noise floor in the trailing silence — worst tail peak -43.7 dBFS direct vs -40.2 dBFS through Opus — but that is a codec ring-out down at −70 to −80 dBFS. Real, and far too quiet to be a "huge high".

3. The model is the cause, and the trigger is an utterance-final `!`. Mean trailing silence is 0.61 s on the ! arm against 0.26 s on the . arm. More tellingly, the loud transient only ever appears in the ! arm, sitting inside that longer tail:

  • —welcome_short / bang → -43.7 dBFS in the trailing silence
  • —scope / bang → -48.7 dBFS in the trailing silence

A transient at −44 dBFS after a second of silence is clearly audible. Their . counterparts end at about −90 dBFS, i.e. true digital silence.

It is also intermittent, not deterministic: sampling is unseeded, and a ! phrase that is clean on one draw produces the artifact on another. That matches ! appearing in only 0.1% of the fine-tune's training labels — the model has barely seen it and its behaviour there is unstable.

Note the pattern is specifically utterance-final. A ! in the middle ("You are very welcome! Jaya Guru Datta.") is harmless; the tail is clean.

Per-phrase detail

phrasetexttrail (direct)tail peak directtail peak opus
welcomeYou are very welcome! Jaya Guru Datta.0.29 s-89.5-80.8
welcomeYou are very welcome. Jaya Guru Datta.0.32 s-74.2-72.4
welcome_shortYou're welcome!0.97 s-43.7-40.2
welcome_shortYou're welcome.0.21 s-89.7-83.3
doingwellI am doing well, thank you for asking! How can I hel0.27 s-89.6-90.0
doingwellI am doing well, thank you for asking. How can I hel0.20 s-89.6-89.7
gladGlad you think so!0.28 s-89.9-76.0
gladGlad you think so.0.29 s-89.4-74.4
scopeI can only answer about Sri Ganapati Sachchidananda1.25 s-48.7-48.6
scopeI can only answer about Sri Ganapati Sachchidananda0.29 s-89.9-82.8

The fix this implies

Do not chase the codec. Strip or replace utterance-final ! before synthesis — the orchestrator writes these acks, so the cheapest correct fix is to normalise terminal ! to . in the text that reaches TTS. Trimming trailing silence at the engine output would also remove the transient, since it lives entirely inside the tail.