TeraSpace commited on
Commit
1f90181
·
verified ·
1 Parent(s): 96dd6a1

Add TeraTTS remote-code interface

Browse files
.gitattributes CHANGED
@@ -1,35 +1,2 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
  *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  *.onnx filter=lfs diff=lfs merge=lfs -text
2
+ *.npy filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ library_name: transformers
3
+ pipeline_tag: text-to-speech
4
+ tags:
5
+ - onnxruntime
6
+ - text-to-speech
7
+ - russian
8
+ - english
9
+ - custom-code
10
+ ---
11
+
12
+ # TeraTTSv2 ONNX
13
+
14
+ TeraTTSv2 text-to-speech with ONNX Runtime, selectable teacher/distilled
15
+ diffusion samplers, precomputed voice styles, CPU/CUDA execution, and streamed
16
+ audio chunks.
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ pip install -r requirements.txt
22
+ ```
23
+
24
+ `sounddevice` is only required for direct speaker playback. On Linux, install
25
+ the system PortAudio library if it is not already present.
26
+
27
+ ## Load with Transformers
28
+
29
+ ```python
30
+ from transformers import AutoModel
31
+
32
+ tts = AutoModel.from_pretrained(
33
+ "TeraSpace/TeraTTSv2",
34
+ trust_remote_code=True,
35
+ provider="CPUExecutionProvider",
36
+ threads=6
37
+ )
38
+
39
+ waveform = tts.generate_speech(
40
+ "<en>Hello from TeraTTS.</en>",
41
+ voice="en_female",
42
+ )
43
+ ```
44
+
45
+ Russian `<ru>…</ru>` text is automatically stress-marked by the bundled
46
+ RUAccent-derived ONNX runtime before inference. It makes no secondary model
47
+ download and does not require the `ruaccent` package. Manual `+` markers
48
+ remain unchanged:
49
+
50
+ ```python
51
+ waveform = tts.generate_speech(
52
+ "<ru>На двери висит замок.</ru>",
53
+ voice="ru_female",
54
+ )
55
+ ```
56
+
57
+ Use `diffusion_model="teacher"` to load the adjustable-CFG teacher sampler.
58
+ The default distilled sampler has CFG 3 baked into its weights.
59
+
60
+ ## Stream audio
61
+
62
+ ```python
63
+ for chunk in tts.generate_speech_stream(
64
+ "<en>Streaming speech is ready.</en>",
65
+ voice="en_female",
66
+ ):
67
+ # Send float32 mono chunks (44,100 Hz) to a player or network client.
68
+ consume(chunk)
69
+ ```
70
+
71
+ The remote code loads only the selected sampler graph plus shared ONNX graphs.
72
+ For security, pin a specific Hub commit when using `trust_remote_code=True`.
73
+
74
+ ## Attribution
75
+
76
+ The local Russian stress annotator and its assets are adapted from
77
+ [RUAccent](https://github.com/Den4ikAI/ruaccent), Copyright 2026 Denis Petrov,
78
+ under the MIT License. See `RUACCENT_NOTICE.txt`.
__pycache__/configuration_teratts.cpython-312.pyc ADDED
Binary file (935 Bytes). View file
 
__pycache__/modeling_teratts.cpython-312.pyc ADDED
Binary file (5 kB). View file
 
config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": ["TeraTTSModel"],
3
+ "auto_map": {
4
+ "AutoConfig": "configuration_teratts.TeraTTSConfig",
5
+ "AutoModel": "modeling_teratts.TeraTTSModel"
6
+ },
7
+ "default_diffusion_model": "distilled",
8
+ "model_type": "teratts_onnx",
9
+ "sample_rate": 44100
10
+ }
configuration_teratts.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Transformers configuration for the ONNX Runtime TeraTTS release."""
2
+
3
+ from transformers import PretrainedConfig
4
+
5
+
6
+ class TeraTTSConfig(PretrainedConfig):
7
+ model_type = "teratts_onnx"
8
+
9
+ def __init__(
10
+ self,
11
+ sample_rate: int = 44_100,
12
+ default_diffusion_model: str = "distilled",
13
+ **kwargs,
14
+ ) -> None:
15
+ super().__init__(**kwargs)
16
+ self.sample_rate = sample_rate
17
+ self.default_diffusion_model = default_diffusion_model
modeling_teratts.py ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Hugging Face remote-code entry point for the ONNX Runtime TeraTTS release."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ from typing import Iterator
7
+
8
+ import numpy as np
9
+ from transformers import PreTrainedModel
10
+
11
+ from .configuration_teratts import TeraTTSConfig
12
+ # Keep the bundled stress-runtime module in Transformers' remote-code module
13
+ # dependency set. ``teratts.py`` imports it at runtime after this entry point
14
+ # has been loaded.
15
+ from .teratts_ruaccent import RUAccent as _BundledRUAccent
16
+ from .teratts import LoadedTTS, generate_speech, generate_speech_stream, load_model
17
+
18
+
19
+ class TeraTTSModel(PreTrainedModel):
20
+ """A reusable ONNX Runtime speech generator loaded through ``AutoModel``."""
21
+
22
+ config_class = TeraTTSConfig
23
+
24
+ def __init__(self, config: TeraTTSConfig) -> None:
25
+ super().__init__(config)
26
+ self.runtime: LoadedTTS | None = None
27
+
28
+ @classmethod
29
+ def from_pretrained(
30
+ cls,
31
+ pretrained_model_name_or_path: str | Path,
32
+ *model_args: object,
33
+ config: TeraTTSConfig | None = None,
34
+ provider: str = "CPUExecutionProvider",
35
+ threads: int | None = None,
36
+ diffusion_model: str | None = None,
37
+ russian_stress: bool = True,
38
+ ruaccent_model_size: str = "turbo3.1",
39
+ ruaccent_device: str = "CPU",
40
+ **kwargs: object,
41
+ ) -> "TeraTTSModel":
42
+ """Download/load the release and initialize reusable ONNX sessions.
43
+
44
+ ``provider``, ``threads``, and ``diffusion_model`` are TeraTTS-specific
45
+ arguments. Standard Hub arguments such as ``revision``, ``token``,
46
+ ``cache_dir``, and ``local_files_only`` are forwarded to the snapshot
47
+ download when a Hub model ID is supplied.
48
+ """
49
+ if model_args:
50
+ raise TypeError("TeraTTSModel.from_pretrained accepts no positional model arguments")
51
+ source = Path(pretrained_model_name_or_path)
52
+ if source.is_dir():
53
+ release = source
54
+ else:
55
+ from huggingface_hub import snapshot_download
56
+
57
+ download_keys = {"revision", "token", "cache_dir", "local_files_only", "force_download"}
58
+ download_kwargs = {key: kwargs.pop(key) for key in list(kwargs) if key in download_keys}
59
+ if kwargs:
60
+ unexpected = ", ".join(sorted(kwargs))
61
+ raise TypeError(f"unexpected TeraTTS loading arguments: {unexpected}")
62
+ release = Path(
63
+ snapshot_download(repo_id=str(pretrained_model_name_or_path), **download_kwargs)
64
+ )
65
+ if config is None:
66
+ config = TeraTTSConfig.from_pretrained(release)
67
+ instance = cls(config)
68
+ instance.runtime = load_model(
69
+ release,
70
+ model=diffusion_model or config.default_diffusion_model,
71
+ provider=provider,
72
+ threads=threads,
73
+ russian_stress=russian_stress,
74
+ ruaccent_model_size=ruaccent_model_size,
75
+ ruaccent_device=ruaccent_device,
76
+ )
77
+ return instance
78
+
79
+ def _runtime(self) -> LoadedTTS:
80
+ if self.runtime is None:
81
+ raise RuntimeError("load this model with from_pretrained() before generating speech")
82
+ return self.runtime
83
+
84
+ def generate_speech(
85
+ self,
86
+ text: str,
87
+ voice: str,
88
+ *,
89
+ duration_scale: float = 1.0,
90
+ guidance: float = 3.0,
91
+ seed: int = 1234,
92
+ ) -> np.ndarray:
93
+ return generate_speech(
94
+ self._runtime(),
95
+ text,
96
+ voice,
97
+ duration_scale=duration_scale,
98
+ guidance=guidance,
99
+ seed=seed,
100
+ )
101
+
102
+ def generate_speech_stream(
103
+ self,
104
+ text: str,
105
+ voice: str,
106
+ *,
107
+ duration_scale: float = 1.0,
108
+ guidance: float = 3.0,
109
+ seed: int = 1234,
110
+ chunk_frames: int = 16,
111
+ ) -> Iterator[np.ndarray]:
112
+ yield from generate_speech_stream(
113
+ self._runtime(),
114
+ text,
115
+ voice,
116
+ duration_scale=duration_scale,
117
+ guidance=guidance,
118
+ seed=seed,
119
+ chunk_frames=chunk_frames,
120
+ )
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ numpy>=1.24
2
+ onnxruntime>=1.16
3
+ torch>=2.1
4
+ transformers>=4.40
5
+ huggingface_hub>=0.23
6
+ sounddevice>=0.5