You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

关键说明

  1. 修改SparkTTS类:如果原inference方法不支持直接传入预处理后的特征,需要在SparkTTS类中新增或修改生成方法,允许接收prompt_tokens和prompt_embeddings参数,跳过重复的预处理步骤。
  2. 结果持久化:通过torch.save将预处理结果保存到文件,后续即使重启脚本也能直接加载复用,适合长期使用同一源语音的场景。
  3. 设备适配:确保预处理结果加载时的设备与当前模型设备一致(如map_location=tts.device)。

内容的提问来源于stack exchange,提问作者Pseudo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:46:21