Реалізація Speech-to-Speech із збереженням голосу мовника Speech-to-Speech із збереженням голосу (Voice Preservation S2S) перекладає мову іншою мовою, зберігаючи тембр, акцент і характеристики голосу оригінального мовця. Це принципово складніше за стандартний S2S, де використовується фіксований TTS-голос. ### Компоненти voice preservation pipeline```
Source Audio
↓
[1] Speaker Encoder → Speaker Embedding (d-vector)
↓
[2] STT → Transcript (source language)
↓
[3] Machine Translation → Transcript (target language)
↓
[4] TTS with Voice Conversion → Output Audio
(использует speaker embedding из шага 1)
### Вилучення speaker embeddingpython
from speechbrain.pretrained import EncoderClassifier
import torchaudio
import torch
encoder = EncoderClassifier.from_hparams( source="speechbrain/spkrec-ecapa-voxceleb", savedir="tmp_encoder" )
def extract_speaker_embedding(audio_path: str) -> torch.Tensor:
signal, sr = torchaudio.load(audio_path)
if sr != 16000:
signal = torchaudio.functional.resample(signal, sr, 16000)
embedding = encoder.encode_batch(signal)
return embedding.squeeze() # (192,) вектор
### Zero-shot TTS з conditioning на embedding XTTS v2 приймає референсне аудіо і кондиціонується на нього при синтезі:python
from TTS.api import TTS
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to("cuda")
async def voice_preserving_translate(
source_audio: str,
target_language: str,
target_text: str
) -> np.ndarray:
# XTTS использует source_audio для извлечения голосовых характеристик
wav = tts.tts(
text=target_text,
speaker_wav=source_audio, # исходное аудио как референс голоса
language=target_language
)
return np.array(wav)
### SeamlessM4T (Meta) — end-to-end підхід Meta SeamlessM4T підтримує S2ST з частковим збереженням просодики:python
from transformers import SeamlessM4Tv2ForSpeechToSpeech, AutoProcessor
import torchaudio
processor = AutoProcessor.from_pretrained("facebook/seamless-m4t-v2-large") model = SeamlessM4Tv2ForSpeechToSpeech.from_pretrained( "facebook/seamless-m4t-v2-large" ).to("cuda")
audio, sr = torchaudio.load("source.wav") inputs = processor(audios=audio, src_lang="rus", return_tensors="pt").to("cuda")
with torch.no_grad(): output = model.generate(**inputs, tgt_lang="eng")
translated_audio = output[0].cpu().numpy().squeeze()







