mamba-cot-tts / code /tests /test_stop_supervision.py
maxpicy's picture
Add files using upload-large-folder tool
6e802a4 verified
Raw History Blame Contribute Delete
2.36 kB
# test_stop_supervision.py: The stop-head supervision.
import pathlib
import sys
import pytest
import torch
sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent.parent))
IGNORE_INDEX = -100
def _tok():
from tokenizer import TokenRegistry, expand_tokenizer, load_base_tokenizer
tokenizer = load_base_tokenizer()
expand_tokenizer(tokenizer)
return tokenizer, TokenRegistry(tokenizer)
@pytest.fixture(scope="module")
def build():
from delay_dataset import DelayMimiDataset
def _make(tmpdir, weight):
import json
tok, reg = _tok()
p = pathlib.Path(tmpdir) / "rows.jsonl"
nlev = __import__("delay_dataset").NUM_LEVELS
row = {"prompt": "hello there friend",
"speech_tokens": [5, 6, 7, 8],
"residual_codes": [[1, 2, 3, 4] for _ in range(nlev - 1)],
"speaker_id": 1}
p.write_text(json.dumps(row) + "\n", encoding="utf-8")
return DelayMimiDataset(str(p), tok, reg, stage=1, lazy=False,
audio_continue_weight=weight)
return _make
def _audio_span(item, reg):
ids = item["input_ids"].tolist()
start = ids.index(reg.audio_start_id) + 1
end = ids.index(reg.audio_end_id)
return start, end
def test_default_is_the_old_behaviour(build, tmp_path):
_, reg = _tok()
it = build(tmp_path, 0.0)[0]
s, e = _audio_span(it, reg)
assert (it["labels"][s:e] == IGNORE_INDEX).all()
def test_enabled_supervises_every_audio_frame(build, tmp_path):
_, reg = _tok()
it = build(tmp_path, 0.1)[0]
s, e = _audio_span(it, reg)
assert e > s
assert (it["labels"][s:e] != IGNORE_INDEX).all()
assert (it["labels"][s:e] == reg.audio_start_id).all()
def test_stop_token_stays_supervised_either_way(build, tmp_path):
_, reg = _tok()
for w in (0.0, 0.1):
it = build(tmp_path, w)[0]
ids = it["input_ids"].tolist()
assert it["labels"][ids.index(reg.audio_end_id)] == reg.audio_end_id
def test_audio_weight_is_small_relative_to_text(build, tmp_path):
_, reg = _tok()
it = build(tmp_path, 0.1)[0]
s, e = _audio_span(it, reg)
lw = it["loss_weights"]
assert torch.allclose(lw[s:e], torch.tensor(0.1))
assert lw[ids_end := it["input_ids"].tolist().index(reg.audio_end_id)] == 1.0
assert lw[ids_end] > lw[s]