首页
/ 5分钟上手Spark-TTS API:从本地部署到实时语音合成服务全攻略

5分钟上手Spark-TTS API:从本地部署到实时语音合成服务全攻略

2026-02-04 04:09:20作者:翟江哲Frasier

你是否还在为语音合成API的复杂部署而烦恼?是否需要一个简单易用且功能强大的语音合成解决方案?本文将带你快速掌握Spark-TTS API的部署与使用,只需5分钟即可搭建属于自己的实时语音合成服务。读完本文,你将能够:部署Spark-TTS服务、使用Python调用API实现语音合成、自定义语音参数、构建简单的语音合成应用。

1. 项目简介

Spark-TTS是一个高效的语音合成(Text-to-Speech, TTS)推理框架,支持多种语音合成场景,包括语音克隆和语音创建。项目提供了多种调用方式,包括命令行工具、Web UI和API接口,满足不同用户的需求。

项目主要结构如下:

2. 环境准备与部署

2.1 安装依赖

首先,确保你的环境中已安装所需的依赖包。项目的依赖项列在requirements.txt中,可以使用以下命令安装:

pip install -r requirements.txt

2.2 启动服务

Spark-TTS提供了两种服务部署方式:Triton Inference Server和本地Web UI。

2.2.1 使用Triton Inference Server

Triton Inference Server是一个高性能的推理服务,支持gRPC和HTTP两种协议。项目中提供了Triton的配置文件和启动脚本,位于runtime/triton_trtllm/目录下。

使用以下命令启动Triton服务:

cd runtime/triton_trtllm && ./run.sh

2.2.2 使用Web UI

如果你需要一个简单的图形界面来测试语音合成功能,可以启动项目提供的Gradio Web界面:

python webui.py --model_dir pretrained_models/Spark-TTS-0.5B --device 0

启动后,在浏览器中访问http://localhost:7860即可打开Web界面。Web界面支持语音克隆和语音创建两种模式,用户可以上传参考音频或录制音频,输入文本后生成相应的语音。

Gradio控制界面

3. API接口调用详解

Spark-TTS提供了gRPC和HTTP两种API接口,方便开发者集成到自己的应用中。

3.1 gRPC接口调用

gRPC接口适用于需要高性能、低延迟的场景。项目中提供了gRPC客户端示例代码runtime/triton_trtllm/client_grpc.py

以下是一个简单的gRPC客户端调用示例:

import grpc
import tritonclient.grpc as grpcclient
from tritonclient.utils import np_to_triton_dtype
import numpy as np
import soundfile as sf

# 准备输入数据
waveform, sample_rate = sf.read("example/prompt_audio.wav")
reference_text = "吃燕窝就选燕之屋,本节目由26年专注高品质燕窝的燕之屋冠名播出。"
target_text = "身临其境,换新体验。塑造开源语音合成新范式,让智能语音更自然。"

# 创建输入
inputs = [
    grpcclient.InferInput("reference_wav", waveform.shape, np_to_triton_dtype(waveform.dtype)),
    grpcclient.InferInput("reference_text", [1, 1], "BYTES"),
    grpcclient.InferInput("target_text", [1, 1], "BYTES")
]
inputs[0].set_data_from_numpy(waveform.reshape(1, -1).astype(np.float32))
inputs[1].set_data_from_numpy(np.array([[reference_text]], dtype=object))
inputs[2].set_data_from_numpy(np.array([[target_text]], dtype=object))

# 创建输出
outputs = [grpcclient.InferRequestedOutput("waveform")]

# 连接服务器并发送请求
with grpcclient.InferenceServerClient("localhost:8001") as client:
    response = client.infer(model_name="spark_tts", inputs=inputs, outputs=outputs)
    audio = response.as_numpy("waveform").reshape(-1)
    sf.write("output.wav", audio, 16000)

3.2 HTTP接口调用

HTTP接口使用更加简单,适用于对延迟要求不高的场景。项目中提供了HTTP客户端示例代码runtime/triton_trtllm/client_http.py

以下是一个简单的HTTP客户端调用示例:

import requests
import soundfile as sf
import numpy as np

# 准备输入数据
waveform, sample_rate = sf.read("example/prompt_audio.wav")
reference_text = "吃燕窝就选燕之屋,本节目由26年专注高品质燕窝的燕之屋冠名播出。"
target_text = "身临其境,换新体验。塑造开源语音合成新范式,让智能语音更自然。"

# 构建请求数据
data = {
    "inputs": [
        {
            "name": "reference_wav",
            "shape": waveform.reshape(1, -1).shape,
            "datatype": "FP32",
            "data": waveform.tolist()
        },
        {
            "name": "reference_text",
            "shape": [1, 1],
            "datatype": "BYTES",
            "data": [reference_text]
        },
        {
            "name": "target_text",
            "shape": [1, 1],
            "datatype": "BYTES",
            "data": [target_text]
        }
    ]
}

# 发送请求
response = requests.post(
    "http://localhost:8000/v2/models/spark_tts/infer",
    headers={"Content-Type": "application/json"},
    json=data
)

# 处理响应
result = response.json()
audio = np.array(result["outputs"][0]["data"], dtype=np.float32)
sf.write("output.wav", audio, 16000)

4. 命令行工具使用

除了API接口,Spark-TTS还提供了命令行工具cli/inference.py,方便快速测试语音合成功能。

4.1 基本用法

使用以下命令调用语音合成功能:

python cli/inference.py --model_dir pretrained_models/Spark-TTS-0.5B --text "你好,欢迎使用Spark-TTS。" --prompt_speech_path example/prompt_audio.wav --prompt_text "这是参考音频的文本。"

4.2 参数说明

命令行工具支持多种参数来自定义语音合成结果:

参数 说明
--model_dir 模型目录路径
--text 需要合成的文本
--prompt_speech_path 参考音频路径(用于语音克隆)
--prompt_text 参考音频对应的文本
--gender 性别(male/female)
--pitch 音调(very_low/low/moderate/high/very_high)
--speed 语速(very_low/low/moderate/high/very_high)

5. Web界面使用

Spark-TTS提供了基于Gradio的Web界面webui.py,方便用户通过图形界面进行语音合成操作。

5.1 启动Web界面

使用以下命令启动Web界面:

python webui.py --model_dir pretrained_models/Spark-TTS-0.5B --device 0

启动后,在浏览器中访问http://localhost:7860即可打开Web界面。

5.2 语音克隆

在Web界面的"Voice Clone"标签页中,你可以上传或录制参考音频,输入需要合成的文本,然后点击"Generate"按钮生成语音。

语音克隆界面

5.3 语音创建

在"Voice Creation"标签页中,你可以通过调整性别、音调和语速等参数来创建自定义语音。

语音创建界面

6. 自定义语音合成应用

下面我们将通过一个简单的示例,展示如何使用Spark-TTS的API接口构建一个自定义的语音合成应用。

6.1 实时语音合成服务

以下是一个基于Flask的简单语音合成服务,它接收文本和语音参数,调用Spark-TTS API生成语音,并返回合成结果。

from flask import Flask, request, send_file
import requests
import numpy as np
import soundfile as sf
import os
from datetime import datetime

app = Flask(__name__)
SPARK_TTS_URL = "http://localhost:8000/v2/models/spark_tts/infer"

@app.route('/synthesize', methods=['POST'])
def synthesize():
    data = request.json
    text = data.get('text', '')
    reference_text = data.get('reference_text', '')
    reference_audio = data.get('reference_audio', '')  # 参考音频路径
    gender = data.get('gender', 'male')
    pitch = data.get('pitch', 'moderate')
    speed = data.get('speed', 'moderate')
    
    # 读取参考音频
    waveform, sample_rate = sf.read(reference_audio)
    
    # 构建请求数据
    request_data = {
        "inputs": [
            {
                "name": "reference_wav",
                "shape": waveform.reshape(1, -1).shape,
                "datatype": "FP32",
                "data": waveform.tolist()
            },
            {
                "name": "reference_text",
                "shape": [1, 1],
                "datatype": "BYTES",
                "data": [reference_text]
            },
            {
                "name": "target_text",
                "shape": [1, 1],
                "datatype": "BYTES",
                "data": [text]
            }
        ]
    }
    
    # 调用Spark-TTS API
    response = requests.post(
        SPARK_TTS_URL,
        headers={"Content-Type": "application/json"},
        json=request_data
    )
    
    # 处理响应
    result = response.json()
    audio = np.array(result["outputs"][0]["data"], dtype=np.float32)
    
    # 保存音频
    timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
    output_path = f"output_{timestamp}.wav"
    sf.write(output_path, audio, 16000)
    
    return send_file(output_path, as_attachment=True)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

6.2 运行应用

使用以下命令运行上述应用:

python app.py

然后,你可以使用curl或其他HTTP客户端发送请求:

curl -X POST http://localhost:5000/synthesize -H "Content-Type: application/json" -d '{"text": "你好,这是一个自定义的语音合成应用。", "reference_text": "这是参考音频的文本。", "reference_audio": "example/prompt_audio.wav"}' --output result.wav

7. 总结与展望

通过本文的介绍,你已经了解了Spark-TTS的部署方法和API使用方式。Spark-TTS提供了灵活的部署选项和丰富的功能,能够满足不同场景下的语音合成需求。未来,Spark-TTS将继续优化模型性能,增加更多语音风格和语言支持,为用户提供更好的语音合成体验。

如果你在使用过程中遇到问题,可以参考项目的官方文档docs/residual_fsq_guide.md或查看源代码获取更多帮助。

希望本文对你有所帮助,祝你使用Spark-TTS愉快!

登录后查看全文
热门项目推荐
相关项目推荐