Create tts_transformers_stream.py
Browse files- tts_transformers_stream.py +58 -0
tts_transformers_stream.py
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan
|
3 |
+
from datasets import load_dataset
|
4 |
+
import torch
|
5 |
+
import soundfile as sf
|
6 |
+
import random
|
7 |
+
import time
|
8 |
+
|
9 |
+
st.title('Multiply TTS Generator')
|
10 |
+
|
11 |
+
text = st.text_input(
|
12 |
+
label="write your word or sentence",
|
13 |
+
value="Hi,duino"
|
14 |
+
)
|
15 |
+
|
16 |
+
num_random_voices = st.number_input(
|
17 |
+
label="Enter the number of random voices",
|
18 |
+
min_value=1,
|
19 |
+
value=1,
|
20 |
+
step=1
|
21 |
+
)
|
22 |
+
|
23 |
+
output_filename = ""
|
24 |
+
|
25 |
+
def generate_speech():
|
26 |
+
global output_filename
|
27 |
+
|
28 |
+
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts")
|
29 |
+
model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts")
|
30 |
+
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
|
31 |
+
inputs = processor(text=text, return_tensors="pt")
|
32 |
+
|
33 |
+
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation")
|
34 |
+
total_voices = len(embeddings_dataset)
|
35 |
+
|
36 |
+
random_voices = random.sample(range(total_voices), num_random_voices)
|
37 |
+
|
38 |
+
combined_speech = []
|
39 |
+
for index, voice_index in enumerate(random_voices):
|
40 |
+
speaker_embeddings = torch.tensor(embeddings_dataset[voice_index]["xvector"]).unsqueeze(0)
|
41 |
+
speech = model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=vocoder)
|
42 |
+
combined_speech.extend(speech.numpy())
|
43 |
+
|
44 |
+
if index != len(random_voices) - 1:
|
45 |
+
# Add a pause of 2 seconds between voices
|
46 |
+
pause_samples = int(16000 * 2) # 2 seconds at 16kHz sample rate
|
47 |
+
pause = torch.zeros(pause_samples)
|
48 |
+
combined_speech.extend(pause)
|
49 |
+
|
50 |
+
output_filename = "_".join(text.split()) + "_speech.wav"
|
51 |
+
sf.write(output_filename, combined_speech, samplerate=16000)
|
52 |
+
|
53 |
+
if st.button("Generate"):
|
54 |
+
generate_speech()
|
55 |
+
audio_file = open(output_filename, 'rb')
|
56 |
+
audio_bytes = audio_file.read()
|
57 |
+
st.audio(audio_bytes, format="audio/wav")
|
58 |
+
st.write("Speech generated and saved as: " + output_filename)
|