|
import torch |
|
import gradio as gr |
|
import soundfile as sf |
|
import tempfile |
|
import librosa |
|
|
|
from transformers import ( |
|
SpeechT5Processor, |
|
SpeechT5ForSpeechToSpeech, |
|
SpeechT5HifiGan |
|
) |
|
from datasets import load_dataset |
|
|
|
|
|
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_vc") |
|
model = SpeechT5ForSpeechToSpeech.from_pretrained("microsoft/speecht5_vc") |
|
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan") |
|
|
|
|
|
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation") |
|
speaker_embeddings = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0) |
|
|
|
|
|
def voice_conversion(audio_file): |
|
audio, sr = librosa.load(audio_file, sr=16000) |
|
inputs = processor(audio=audio, sampling_rate=16000, return_tensors="pt") |
|
with torch.no_grad(): |
|
speech = model.generate_speech(inputs["input_values"], speaker_embeddings, vocoder=vocoder) |
|
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: |
|
sf.write(f.name, speech.numpy(), samplerate=16000) |
|
return f.name |
|
|
|
|
|
interface = gr.Interface( |
|
fn=voice_conversion, |
|
inputs=gr.Audio(type="filepath", label="Sube un audio (voz hablada)"), |
|
outputs=gr.Audio(type="filepath", label="Voz convertida"), |
|
title="SpeechT5 Voice Conversion", |
|
description="Convierte una voz hablada en otra con SpeechT5 de Microsoft" |
|
) |
|
|
|
interface.launch() |
|
|