hans00 commited on
Commit
864d330
·
verified ·
1 Parent(s): a5b7c54

README: user-facing model card (files, run with codec.cpp tts-cli, license as upstream)

Browse files
Files changed (1) hide show
  1. README.md +67 -84
README.md CHANGED
@@ -1,117 +1,100 @@
1
  ---
2
- license: other
 
 
3
  language:
4
  - en
5
  tags:
 
6
  - gguf
 
7
  - tts
8
  - neutts
9
- - text-to-speech
10
- base_model: neuphonic/neutts-nano
11
  ---
12
 
13
- # NeuTTS Nano GGUF
14
 
15
- GGUF conversions of [Neuphonic's NeuTTS Nano](https://huggingface.co/neuphonic/neutts-nano) — a compact (~228 M params, ~117 M active) on-device TTS LM with instant voice cloning.
16
 
17
- The stack is split so each runtime owns the part it's good at:
18
-
19
- - **LLM-part** — text-and-reference-codes to speech token IDs, stock `llama` arch, runs in **llama.cpp**.
20
- - **Codec-part** — speech token IDs to/from 24 kHz PCM via [NeuCodec](https://huggingface.co/neuphonic/neucodec), runs in [codec.cpp](https://github.com/mybigday/codec.cpp).
21
 
22
  ## Files
23
 
24
- ### LLM-part (llama arch, vocab 194256, RoPE θ=500000 + linear scaling x32)
25
-
26
- `neutts-nano-<quant>.gguf`
27
-
28
- | File | Size |
29
- | ----------------- | ------- |
30
- | `neutts-nano-f32.gguf` | 925 MB |
31
- | `neutts-nano-f16.gguf` | 467 MB |
32
- | `neutts-nano-bf16.gguf` | 467 MB |
33
- | `neutts-nano-q8_0.gguf` | 253 MB |
34
- | `neutts-nano-q6_k.gguf` | 245 MB |
35
- | `neutts-nano-q5_k_m.gguf` | 217 MB |
36
- | `neutts-nano-q5_k_s.gguf` | 214 MB |
37
- | `neutts-nano-q5_1.gguf` | 216 MB |
38
- | `neutts-nano-q5_0.gguf` | 209 MB |
39
- | `neutts-nano-q4_k_m.gguf` | 210 MB |
40
- | `neutts-nano-q4_k_s.gguf` | 205 MB |
41
- | `neutts-nano-q4_1.gguf` | 202 MB |
42
- | `neutts-nano-q4_0.gguf` | 194 MB |
43
- | `neutts-nano-q3_k_l.gguf` | 200 MB |
44
- | `neutts-nano-q3_k_m.gguf` | 196 MB |
45
- | `neutts-nano-q3_k_s.gguf` | 190 MB |
46
- | `neutts-nano-q2_k.gguf` | 190 MB |
47
-
48
- ### Codec-part (distill NeuCodec, `distill_neucodec` arch, 65536 codebook, 24 kHz, 50 Hz token rate)
49
-
50
- `codec-<quant>.gguf`
51
-
52
- | File | Size |
53
- | ------------------- | ------- |
54
- | `codec-f32.gguf` | 1050 MB |
55
- | `codec-f16.gguf` | 526 MB |
56
- | `codec-q8_0.gguf` | 381 MB |
57
- | `codec-q5_k_m.gguf` | 323 MB |
58
- | `codec-q4_k_m.gguf` | 303 MB |
59
 
60
- [neuphonic/distill-neucodec](https://huggingface.co/neuphonic/distill-neucodec): the decoder is
61
- bit-identical to NeuCodec's; the distill encoder (SQCodec + DistilHuBERT) gives codec.cpp an encode
62
- path, so reference voices can be cloned from audio (`codec_speaker_from_audio`, any sample rate).
63
- Every precision was checked end to end (Whisper CER 0 on a test sentence).
 
64
 
65
- ## Voices
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
- The codec GGUF carries upstream's `samples/` voices as builtin codec speakers:
68
 
69
- - `ref_codes` (I32 tensor `spk.<name>.ref_codes`): NeuCodec tokens of the reference clip
70
- (upstream's `.pt`);
71
- - `ref_text` (metadata `distill_neucodec.spk.<name>.ref_text`): its transcript phonemized as
72
- neutts does (espeak-ng, stress + punctuation, the voice's language).
73
 
74
- Read them with `codec_get_speaker` / `codec_speaker_get_slot` / `codec_speaker_ref_text`. Use a voice
75
- in the backbone's language.
76
 
77
- | Voice | Language | ref codes |
78
- |---|---|---|
79
- | `jo` (default) | en-us | 653 |
80
- | `dave` | en-us | 372 |
81
- | `emily` | en-us | 402 |
82
- | `paul` | en-us | 286 |
83
- | `sophie` | en-us | 175 |
84
- | `steven` | en-us | 258 |
85
- | `mateo` | es | 318 |
86
- | `greta` | de | 199 |
87
- | `juliette` | fr-fr | 405 |
88
 
89
  ```bash
90
- tts-cli synthesize --backbone <llm>.gguf --model codec-f16.gguf --voice dave \
 
 
 
91
  --text "ðə bˈɜːtʃ kənˈuː slˈɪd ɔnðə smˈuːð plˈæŋks." --output out.wav
92
- tts-cli synthesize ... --ref-audio ref.wav --ref-text "<phonemes>" --save-speaker my_voice.gguf
93
  ```
94
 
95
- See [docs/models/neutts.md](https://github.com/mybigday/codec.cpp/blob/main/docs/models/neutts.md).
96
 
97
- ## Prompt format
 
 
 
98
 
99
- The reference flow (from `neuphonic/neutts`):
100
 
101
- ```
102
- user: Convert the text to speech:<|TEXT_PROMPT_START|>{ref_phones} {input_phones}<|TEXT_PROMPT_END|>
103
- assistant:<|SPEECH_GENERATION_START|>{ref_codes_as_speech_tokens}
 
 
 
 
 
 
 
104
  ```
105
 
106
- - `{ref_phones}` / `{input_phones}` — IPA-phonemized text (espeak-ng / phonemizer).
107
- - `{ref_codes_as_speech_tokens}` — concatenation of `<|speech_N|>` strings for each NeuCodec token of a reference clip.
108
- - Generation continues with more `<|speech_N|>` tokens until `<|SPEECH_GENERATION_END|>`.
109
 
110
- Speech-token vocab range: `<|speech_0|>` = id 128262 … `<|speech_65535|>` = id 193797.
111
- Stop token: `<|SPEECH_GENERATION_END|>` = id 128261.
 
112
 
113
- ## Notes
114
 
115
- - Reference encoding (audio → speech tokens): `codec_speaker_from_audio` / `tts-cli --ref-audio` with this codec.
116
- - Phonemization isn't part of the GGUF — apply espeak-ng (or equivalent) on the host before tokenizing prompts; raw English text will be off-distribution.
117
- - Source weights: `neuphonic/neutts-nano` (LLM) and `neuphonic/distill-neucodec` (codec), voices from `neuphonic/neutts` `samples/`.
 
1
  ---
2
+ license: apache-2.0
3
+ base_model: neuphonic/neutts-air
4
+ pipeline_tag: text-to-speech
5
  language:
6
  - en
7
  tags:
8
+ - codec.cpp
9
  - gguf
10
+ - text-to-speech
11
  - tts
12
  - neutts
13
+ - voice-cloning
 
14
  ---
15
 
16
+ # NeuTTS Air — GGUF
17
 
18
+ [Neuphonic's NeuTTS Air](https://huggingface.co/neuphonic/neutts-air): compact English TTS with builtin voices and voice cloning.
19
 
20
+ Runs offline with [codec.cpp](https://github.com/mybigday/codec.cpp) on CPU or GPU (CUDA, Vulkan, Metal).
 
 
 
21
 
22
  ## Files
23
 
24
+ Every run needs **one model file + one codec file** from this repo.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
+ | | `--backbone` | `--model` (codec) | Total |
27
+ |---|---|---|---|
28
+ | Recommended | `neutts-air-q8_0.gguf` | `codec-q8_0.gguf` | 1.2 GB |
29
+ | Smallest | `neutts-air-q4_k_m.gguf` | `codec-q4_k_m.gguf` | 900 MB |
30
+ | Best quality | `neutts-air-f16.gguf` | `codec-f16.gguf` | 2.0 GB |
31
 
32
+ <details>
33
+ <summary>Other files</summary>
34
+
35
+ | File | Size |
36
+ |---|---|
37
+ | `codec-f32.gguf` | 1.0 GB |
38
+ | `codec-q5_k_m.gguf` | 323 MB |
39
+ | `neutts-air-bf16.gguf` | 1.5 GB |
40
+ | `neutts-air-f32.gguf` | 3.0 GB |
41
+ | `neutts-air-q2_k.gguf` | 513 MB |
42
+ | `neutts-air-q3_k_l.gguf` | 543 MB |
43
+ | `neutts-air-q3_k_m.gguf` | 530 MB |
44
+ | `neutts-air-q3_k_s.gguf` | 512 MB |
45
+ | `neutts-air-q4_0.gguf` | 526 MB |
46
+ | `neutts-air-q4_1.gguf` | 561 MB |
47
+ | `neutts-air-q4_k_s.gguf` | 584 MB |
48
+ | `neutts-air-q5_0.gguf` | 595 MB |
49
+ | `neutts-air-q5_1.gguf` | 630 MB |
50
+ | `neutts-air-q5_k_m.gguf` | 631 MB |
51
+ | `neutts-air-q5_k_s.gguf` | 623 MB |
52
+ | `neutts-air-q6_k.gguf` | 777 MB |
53
 
54
+ </details>
55
 
 
 
 
 
56
 
57
+ ## Run
 
58
 
59
+ With [codec.cpp](https://github.com/mybigday/codec.cpp)'s `tts-cli` ([build it](https://github.com/mybigday/codec.cpp#text-to-speech), then):
 
 
 
 
 
 
 
 
 
 
60
 
61
  ```bash
62
+ hf download BricksDisplay/NeuTTS-Air-GGUF neutts-air-q8_0.gguf codec-q8_0.gguf --local-dir NeuTTS-Air
63
+
64
+ ./build/tts-cli synthesize --backbone NeuTTS-Air/neutts-air-q8_0.gguf --model NeuTTS-Air/codec-q8_0.gguf \
65
+ --voice dave \
66
  --text "ðə bˈɜːtʃ kənˈuː slˈɪd ɔnðə smˈuːð plˈæŋks." --output out.wav
 
67
  ```
68
 
69
+ Clone a voice (the transcript is given in phonemes too):
70
 
71
+ ```bash
72
+ ./build/tts-cli synthesize ... --ref-audio my_voice.wav --ref-text "<phonemes of the clip>" \
73
+ --save-speaker my_voice.gguf --text "<phonemes>" --output out.wav
74
+ ```
75
 
76
+ All `tts-cli` options (voices, voice cloning, sampling, GPU) are described in the [codec.cpp README](https://github.com/mybigday/codec.cpp#text-to-speech).
77
 
78
+
79
+ ## Input text
80
+
81
+ The model reads **IPA phonemes**, not plain text. Convert your text with
82
+ espeak-ng (stress marks and punctuation kept), e.g. with Python's `phonemizer`:
83
+
84
+ ```python
85
+ from phonemizer.backend import EspeakBackend
86
+ g2p = EspeakBackend("en-us", preserve_punctuation=True, with_stress=True)
87
+ print(g2p.phonemize(["The birch canoe slid on the smooth planks."])[0])
88
  ```
89
 
90
+ Or build codec.cpp with `-DCODEC_TTS_ESPEAK=ON` and pass English text directly.
91
+
92
+ ## Voices
93
 
94
+ Builtin: `jo` (default), `dave`, `emily`, `paul`, `sophie`, `steven` (English),
95
+ plus `mateo` (Spanish), `greta` (German), `juliette` (French) for Neuphonic's
96
+ other-language models. Voice cloning: `--ref-audio` with `--ref-text`.
97
 
98
+ ## License
99
 
100
+ `apache-2.0`, the same as the [original model](https://huggingface.co/neuphonic/neutts-air).