Views
No views yet

fishaudio/s2-pro.
It keeps the base model's multilingual ability and voice cloning intact, and adds
native Hebrew synthesis driven by IPA rather than nikud.| File | What it is |
|---|---|
hebrew_lora_step2200.safetensors | LoRA deltas + the trained ipa_embeddings table (67M params, bf16) |
hebrew_lora_step2200.ckpt | Same weights as a Lightning checkpoint, with optimizer state — use this to resume training |
config.json | S2-Pro config extended with num_ipa_tokens: 26, ipa_token_start: 155774 |
ipa_token_map.json | IPA symbol → atomic token (e.g. ʃ → <ipa_u0283>) |
ipa_embeddings.pt | Initial IPA embedding table (mean of the symbol's BPE pieces); the trained one lives in the adapter |
tokenizer/ | S2-Pro tokenizer extended 155,774 → 155,800 tokens |
samples/ | Generated audio (see below) |
1git clone https://github.com/maxmelichov/fish-speech
2cd fish-speech && uv sync --python 3.12 --extra cu129
3pip install renikud-plus # Hebrew grapheme-to-phoneme
4
5bash tools/hebrew/setup_hebrew.sh # base weights + this adapter + IPA checkpoint
6
7python tools/hebrew/infer_hebrew.py \
8 --text "שלום, מה שלומך היום?" \
9 --lora-checkpoint checkpoints/hebrew/hebrew_lora_step2200.safetensors \
10 --output out.wav--ref-audio my_voice.wav --ref-text "..." to clone a voice.infer_hebrew.py runs plain unvocalized Hebrew through
RenikudPlus G2P, maps the
IPA to the atomic tokens, and chunks long inputs on sentence boundaries.
--lora-scale scales the delta (0.0 = pure base model) if you want to dial the
adaptation down.*.wav plus sibling .lab transcripts:AUDIO_ROOT=my_audio tools/hebrew/run_hebrew_pipeline.shtools/hebrew/README.md
for the full guide.י phonemized as j was read as the English letter
jay. So each of the 26 Hebrew IPA symbols gets a dedicated input-only token
(<ipa_j>, <ipa_u0283>, …) in a separate trainable nn.Embedding, initialized
to the mean of the symbol's original BPE pieces. The output vocabulary is
untouched — these tokens are never predicted, only read.attention + mlp, plus the IPA embedding
table — 66.9M parameters total: 60.2M in the slow transformer, 6.7M in the fast
transformer, 0.03M IPA embeddings. Frozen are the direct interfaces to codebook
space — fast_embeddings, fast_output, and the tied slow embeddings/output —
which is what keeps timbre close to the base model. Note α/r = 0.5, not the usual
2.0; see Caveats. The residual-codebook loss is down-weighted to 0.3
(Qwen3-TTS's sub-talker coefficient) so the gradient stays on the text→semantic
mapping.generate_long() inference format. bf16, lr 5e-5 constant with 100-step
warmup, effective batch 12, 2200 optimizer steps.scale_codebook_embeddings=True. At inference, forward_generate()
divides semantic-position embeddings by sqrt(num_codebooks + 1) = 3.317; the
training path in embed() did not. Every fine-tune therefore learned against
embeddings 3.3× larger than the ones it would see at generation time. Teacher-
forced CE looked fine while free-running generation collapsed after the first
word — the classic symptom in fishaudio/fish-speech issues
#1136 (Japanese gibberish),
#682 (Hindi noise) and
#814.| sample RMS | energy decay over the utterance | |
|---|---|---|
| before | 0.008 – 0.022 | 0.07× |
| after | 0.171 – 0.205 | 1.02× |
| base model reference | 0.181 | — |
fish_speech/models/text2semantic/llama.py in the fork above and
applies to any S2-Pro fine-tune, Hebrew or not.00_base_out_of_the_box.wav — stock fishaudio/s2-pro, no adapter, no
G2P — plain Hebrew script straight in. S2-Pro is multilingual and does
produce Hebrew-shaped speech, but it isn't accurate: this sample of
"שלום, מה שלומך היום?" ("hello, how are you today?") comes out as "סלום
מהשלום חיום" — שלום → סלום, שלומך garbled into משלום. Not a cherry-pick: an
8-seed sweep on a different sentence in this fork's eval found the same
failure every time, and a stock-model WER of 0.383 across 11 sentences,
worse than real human speech scores on the same metric. This is the gap
the adapter below closes.samples/ is generated with this adapter:01_podcast_2hosts_63s.wav — 63s two-host Hebrew conversation, cloned voices03_longform_15s.wav — multi-sentence long-form04_yod_BASE.wav / 05_yod_LORA.wav — the י → English jay failure, before and after atomic IPA tokens07_clone_LORA_ranlevi.wav — voice clone from a real Hebrew speaker referencefast_layers entirely is
the obvious next experiment.[whisper], [excited], …) do not work — and this is not a
regression from the LoRA. Measured on the base model in English: plain /
whisper / shouting produced RMS 0.0655 / 0.0652 / 0.0689, i.e. no response at
all. The released S2-Pro weights simply lack the tag alignment.infer_hebrew.py, which handles it.NOTICE and LICENSE in this repo for the
full text and the required attribution.