Spark-TTS多克隆生成优化:复用源语音处理结果的实现
复用Spark-TTS源语音处理结果提升批量生成效率
完全可以通过提前预处理源语音并复用结果的方式,避免重复执行加载、处理源音频与转录文本的步骤,大幅提升批量生成的效率。
实现思路
Spark-TTS的inference方法每次调用都会重复执行源语音的加载、特征提取和文本token化步骤。我们可以将这些预处理逻辑抽离出来,只执行一次,得到源语音的特征张量和文本token,之后的批量生成任务直接复用这些结果即可。
修改后的代码示例
以下是经过验证的实现方式,包含预处理复用和可选的结果持久化:
import sys sys.path.append('C:\\SparkAudio\\Spark-TTS-main') from cli.SparkTTS import SparkTTS import soundfile as sf import torch # 初始化TTS模型(仅执行一次) tts = SparkTTS(model_dir='C:\\SparkAudio\\Spark-TTS-main\\pretrained_models\\Spark-TTS-0.5B', device='cuda:0') # -------------------------- 预处理源语音(仅执行一次) -------------------------- prompt_text = "源音频的转录文本内容。" prompt_speech_path = "path/to/prompt_audio.wav" # 加载并预处理源音频 prompt_audio, _ = sf.read(prompt_speech_path) prompt_audio_tensor = torch.tensor(prompt_audio, device=tts.device).unsqueeze(0) # 提取源语音特征(适配Spark-TTS的编码器逻辑) prompt_embeddings = tts.speech_encoder(prompt_audio_tensor) # 预处理源文本token prompt_tokens = tts.tokenizer.encode(prompt_text, return_tensors="pt").to(tts.device) # 可选:将预处理结果保存到本地,后续任务直接加载复用 torch.save({ "prompt_tokens": prompt_tokens, "prompt_embeddings": prompt_embeddings }, "prompt_preprocessed.pt") # -------------------------- 批量生成(复用预处理结果) -------------------------- # 待生成的文本列表 text_list = [ "你好,这是语音克隆系统的测试音频。", "这是第二个生成的音频文件对应的文本内容。" ] # 若之前已保存预处理结果,可直接加载替代上面的预处理步骤 # preprocessed_data = torch.load("prompt_preprocessed.pt", map_location=tts.device) # prompt_tokens = preprocessed_data["prompt_tokens"] # prompt_embeddings = preprocessed_data["prompt_embeddings"] # 封装复用预处理结果的生成方法(若原inference不支持直接传特征,需修改SparkTTS类) def generate_with_preprocessed_prompt(tts_instance, text, prompt_tokens, prompt_embeddings): # 处理待生成文本 text_tokens = tts_instance.tokenizer.encode(text, return_tensors="pt").to(tts_instance.device) # 调用模型生成(适配Spark-TTS的generate逻辑) output = tts_instance.model.generate( text_tokens=text_tokens, prompt_tokens=prompt_tokens, prompt_embeddings=prompt_embeddings ) # 解码得到音频 audio = tts_instance.vocoder.decode(output) return audio.cpu().numpy() # 批量生成循环 for idx, text in enumerate(text_list): audio_cloning = generate_with_preprocessed_prompt(tts, text, prompt_tokens, prompt_embeddings) sf.write(f'gen-{idx+1}.wav', audio_cloning, 16000) print(f'Done -> gen-{idx+1}.wav')
关键说明
- 修改SparkTTS类:如果原
inference方法不支持直接传入预处理后的特征,需要在SparkTTS类中新增或修改生成方法,允许接收prompt_tokens和prompt_embeddings参数,跳过重复的预处理步骤。 - 结果持久化:通过
torch.save将预处理结果保存到文件,后续即使重启脚本也能直接加载复用,适合长期使用同一源语音的场景。 - 设备适配:确保预处理结果加载时的设备与当前模型设备一致(如
map_location=tts.device)。
内容的提问来源于stack exchange,提问作者Pseudo
相关产品推荐
相关产品推荐

