|
--- |
|
language: |
|
- ru |
|
tags: |
|
- vits |
|
license: apache-2.0 |
|
pipeline_tag: text-to-speech |
|
widget: |
|
- example_title: text to speech |
|
text: > |
|
прив+ет, как дел+а? всё +очень хорош+о! а у тебя как? |
|
--- |
|
|
|
# Text to Speech Russian free multispeaker model |
|
|
|
This is a multiple speakers text-to-speech model for the Russian language. It works on plain text with punctuation separation, and does not require prior conversion of the text into phonemes. |
|
The model with multiple speakers has two voices: 0 - woman, 1 - man. |
|
|
|
The size of the model is only 15.1 million parameters. |
|
|
|
The text accepts lowercase. |
|
|
|
For better generation quality, we recommend putting accents in the text before the vowel letters. |
|
|
|
We recommend using the "ruaccent" library for accentuation. |
|
|
|
To install "ruaccent", use: |
|
|
|
```bash |
|
pip install -y ruaccent |
|
``` |
|
|
|
|
|
|
|
For test inference use Spaces: |
|
|
|
https://huggingface.co/spaces/utrobinmv/tts_ru_free_hf_vits_low_multispeaker |
|
|
|
|
|
|
|
Usage example using PyTorch: |
|
|
|
```python |
|
from transformers import VitsModel, AutoTokenizer, set_seed |
|
import torch |
|
import scipy |
|
from ruaccent import RUAccent |
|
|
|
device = 'cuda' # 'cpu' or 'cuda' |
|
|
|
speaker = 0 # 0-woman, 1-man |
|
|
|
set_seed(555) # make deterministic |
|
|
|
# load model |
|
model_name = "utrobinmv/tts_ru_free_hf_vits_low_multispeaker" |
|
|
|
model = VitsModel.from_pretrained(model_name).to(device) |
|
tokenizer = AutoTokenizer.from_pretrained(model_name) |
|
model.eval() |
|
|
|
# load accentizer |
|
accentizer = RUAccent() |
|
accentizer.load(omograph_model_size='turbo', use_dictionary=True, device=device) |
|
|
|
# text |
|
text = """Ночью двадцать третьего июня начал извергаться самый высокий |
|
действующий вулкан в Евразии - Кл+ючевской. Об этом сообщила руководитель |
|
Камчатской группы реагирования на вулканические извержения, ведущий |
|
научный сотрудник Института вулканологии и сейсмологии ДВО РАН Ольга Гирина. |
|
«Зафиксированное ночью не просто свечение, а вершинное эксплозивное |
|
извержение стромболианского типа. Пока такое извержение никому не опасно: |
|
ни населению, ни авиации» пояснила ТАСС госпожа Гирина.""" |
|
|
|
# the placement of accents |
|
text = accentizer.process_all(text) |
|
print(text) |
|
# н+очью дв+адцать тр+етьего и+юня н+ачал изверг+аться с+амый выс+окий |
|
# д+ействующий вулк+ан в евр+азии - ключевск+ой. об +этом сообщ+ила |
|
# руковод+итель камч+атской гр+уппы реаг+ирования на вулкан+ические |
|
# изверж+ения, вед+ущий на+учный сотр+удник инстит+ута вулканол+огии |
|
# и сейсмол+огии дво ран +ольга г+ирина. « зафикс+ированное н+очью не |
|
# пр+осто свеч+ение, а верш+инное эксплоз+ивное изверж+ение |
|
# стромболи+анского т+ипа. пок+а так+ое изверж+ение ником+у не оп+асно: |
|
# ни насел+ению, ни ави+ации » поясн+ила тасс госпож+а г+ирина. |
|
|
|
inputs = tokenizer(text, return_tensors="pt") |
|
|
|
with torch.no_grad(): |
|
output = model(**inputs.to(device), speaker_id=speaker).waveform |
|
output = output.detach().cpu().numpy() |
|
|
|
scipy.io.wavfile.write("tts_audio.wav", rate=model.config.sampling_rate, |
|
data=output[0]) |
|
``` |
|
|
|
|
|
|
|
For displayed in a Jupyter Notebook / Google Colab: |
|
|
|
```python |
|
from IPython.display import Audio |
|
|
|
Audio(output, rate=model.config.sampling_rate) |
|
``` |
|
|
|
## |
|
|
|
Usage example using ONNX: |
|
|
|
First copy the model.onnx file to the folder "tts_ru_free_hf_vits_low_multispeaker". |
|
|
|
```python |
|
import numpy as np |
|
import scipy |
|
import onnxruntime |
|
from ruaccent import RUAccent |
|
from transformers import AutoTokenizer |
|
|
|
speaker = 0 # 0-woman, 1-man |
|
|
|
# load model |
|
model_path = "tts_ru_free_hf_vits_low_multispeaker/model.onnx" |
|
|
|
sess_options = onnxruntime.SessionOptions() |
|
model = onnxruntime.InferenceSession(model_path, sess_options=sess_options) |
|
tokenizer = AutoTokenizer.from_pretrained("utrobinmv/tts_ru_free_hf_vits_low_multispeaker") |
|
|
|
# text |
|
text = """Ночью двадцать третьего июня начал извергаться самый высокий |
|
действующий вулкан в Евразии - Кл+ючевской. Об этом сообщила руководитель |
|
Камчатской группы реагирования на вулканические извержения, ведущий |
|
научный сотрудник Института вулканологии и сейсмологии ДВО РАН Ольга Гирина. |
|
«Зафиксированное ночью не просто свечение, а вершинное эксплозивное |
|
извержение стромболианского типа. Пока такое извержение никому не опасно: |
|
ни населению, ни авиации» пояснила ТАСС госпожа Гирина.""" |
|
|
|
# load accentizer |
|
accentizer = RUAccent() |
|
accentizer.load(omograph_model_size='turbo', use_dictionary=True) |
|
|
|
# the placement of accents |
|
text = accentizer.process_all(text) |
|
|
|
# inference |
|
inputs = tokenizer(text, return_tensors="np") |
|
sid = np.array([speaker]) |
|
sampling_rate = 16000 |
|
|
|
output = model.run( |
|
None, |
|
{ |
|
"input_ids": inputs['input_ids'], |
|
"attention_mask": inputs['attention_mask'], |
|
"sid": sid, |
|
}, |
|
)[0] |
|
|
|
scipy.io.wavfile.write("tts_audio.wav", rate=sampling_rate, |
|
data=output[0]) |
|
``` |
|
|
|
|
|
|
|
For displayed in a Jupyter Notebook / Google Colab: |
|
|
|
```python |
|
from IPython.display import Audio |
|
|
|
Audio(output, rate=sampling_rate) |
|
``` |
|
|
|
## |
|
|
|
|
|
|
|
## Languages covered |
|
|
|
Russian (ru_RU) |
|
|