Text-to-Speech
Transformers
ONNX
teratts_onnx
feature-extraction
onnxruntime
russian
english
custom-code
custom_code
Instructions to use TeraSpace/TeraTTSv2 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use TeraSpace/TeraTTSv2 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-to-speech", model="TeraSpace/TeraTTSv2", trust_remote_code=True)# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("TeraSpace/TeraTTSv2", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
Add TeraTTS remote-code interface
Browse files- .gitattributes +1 -34
- README.md +78 -0
- __pycache__/configuration_teratts.cpython-312.pyc +0 -0
- __pycache__/modeling_teratts.cpython-312.pyc +0 -0
- config.json +10 -0
- configuration_teratts.py +17 -0
- modeling_teratts.py +120 -0
- requirements.txt +6 -0
.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 |
-
*.
|
| 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
|