Qwen3 TTS vs. ElevenLabs

通过 vLLM 使用 Qwen3 TTS 超越 ElevenLabs:开源 - 自定义语音生成和语音克隆

Qwen3 TTS vs. ElevenLabs
AI编程/Vibe Coding 遇到问题需要帮助的,联系微信 ezpoda,免费咨询。

通过 Qwen3-Audio 模型的强大功能,超越 ElevenLabs 的语音合成能力,该模型现在支持文本到语音(TTS)。我将其与 vLLM 一起部署,以实现最快的推理,并展示了如何进行自定义语音克隆。

ElevenLabs 一直被认为是语音合成的基准产品,有着其先进的语音克隆和高质量音频生成能力。但开源模型已经追平了,特别是在 Qwen3-Audio 发布之后。这个模型不仅支持 ASR(自动语音识别)和音频理解,现在还包含了 TTS 功能。

在这篇文章中,我将向你展示如何使用 Qwen3-Audio 的 TTS 能力,使用 vLLM 进行部署(以获得超快的推理速度),以及如何克隆你自己的声音或生成自定义的声音,而无需依赖昂贵的专有服务。

1、为什么 Qwen3-Audio 用于 TTS?

ElevenLabs 以其卓越的音质和简单的语音克隆界面而闻名,但它有明显的限制:

  • 成本: 随着使用量的增加会变得昂贵
  • API 依赖: 你受到其 API 限制的约束
  • 闭源: 你无法访问模型或对其进行微调

Qwen3-Audio 通过提供免费的、可在本地部署的替代方案解决了这些问题,它具有以下特点:

  • 高性能: Qwen 团队在音频任务方面的表现可媲美顶级专有模型
  • 开源: 完全开放源代码,可本地部署和微调任何用途
  • 灵活性: 你可以通过提供音频样本来克隆任何声音

与 ElevenLabs 的比较

特性 ElevenLabs Qwen3-Audio
价格 昂贵 免费且开源
部署 仅限云 本地部署选项
音质 优秀 与 ElevenLabs 相当
自定义 文本/语音输入 文本/语音输入 + 微调
API 速率 受限 受限于你的硬件

2、配置步骤

我推荐使用 Anaconda 管理环境以避免冲突。

conda create -n qwen_tts python=3.10
conda activate qwen_tts
pip install vllm

2.1 使用 vLLM 进行 Qwen3 TTS 部署

vLLM 是进行高性能模型推理的完美工具。它通过其连续批处理和 PagedAttention 技术实现了高吞吐量。

首先克隆 Qwen-Audio 仓库以获取模型权重和必要的配置文件。

git clone https://github.com/QwenLM/Qwen-Audio
cd Qwen-Audio

现在从 Hugging Face 下载 Qwen3-Audio-Chat 模型。这个版本专门为对话和交互场景进行了优化。

pip install huggingface_hub
from huggingface_hub import snapshot_download

model_path = snapshot_download("Qwen/Qwen3-Audio-Chat")

注意:该模型约 10GB,所以下载可能需要一些时间。

2.2 启动 vLLM 服务器

使用 vLLM 的 OpenAI 兼容 API 服务器进行部署,这使得集成变得容易。

python -m vllm.entrypoints.openai.api_server \
    --model Qwen/Qwen3-Audio-Chat \
    --served-model-name Qwen3-Audio-TTS \
    --dtype auto \
    --max-model-len 8000 \
    --trust-remote-code \
    --limit-mm-per-prompt audio=1 \
    --host 0.0.0.0 \
    -p 8000
Preview image

启动 vLLM 服务器的过程

3、体验 TTS

现在服务器已经运行,我们可以测试 TTS。

3.1 基础文本转语音

import openai
from IPython.display import Audio

client = openai.OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="dummy",
)

# 基础 TTS 请求
response = client.chat.completions.create(
    model="Qwen3-Audio-TTS",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Tell me a joke about cats"
                }
            ]
        }
    ],
    audio={"voice": "Chelsie"},
)

# 保存音频
audio_data = response.choices[0].message.audio.data
with open("output.wav", "wb") as f:
    f.write(audio_data)

print("音频已保存到 output.wav")

# 在笔记本中播放
Audio("output.wav")

Qwen3-Audio 包含多个预定义的声音,如 Chelsie、Mitchell 等。你也可以在推理过程中使用 --audio-template-prompt 参数加载自定义语音模板。

3.2 语音克隆

真正的魔法从语音克隆开始。通过提供简短的音频样本,Qwen 会在输出中复制说话者的音色、语气和细微差别。

克隆你自己的声音

import openai
import base64

client = openai.OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="dummy",
)

# 读取你的语音样本(~10 秒)
with open("your_voice_sample.wav", "rb") as f:
    voice_sample_b64 = base64.b64encode(f.read()).decode("utf-8")

# 创建 TTS 请求,使用你的语音样本
response = client.chat.completions.create(
    model="Qwen3-Audio-TTS",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Hello! This is my cloned voice speaking. How cool is that?"
                },
                {
                    "type": "audio_url",
                    "audio_url": {
                        "url": f"data:audio/wav;base64,{voice_sample_b64}"
                    }
                }
            ]
        }
    ],
    audio={"voice": "Chelsie"},
)

# 保存音频
audio_data = response.choices[0].message.audio.data
with open("cloned_voice_output.wav", "wb") as t:
    t.write(audio_data)
Preview image

语音克隆工作流程说明

3.3 修复常见问题

如果克隆效果不好,请确保:

  • 音频质量: 使用清晰、无噪音的录音。背景噪音会显著降低性能
  • 音频长度: 一段 5-15 秒的清晰音频样本效果最好
  • 采样率: 16kHz 或 44.1kHz 采样率通常兼容性最好
Preview image

音频质量对克隆效果的影响(左:高质量,右:低质量)

4、微调声音

如果预设的语音模板不能满足你的需求,你可以微调模型以更好地匹配特定的说话者风格。

微调步骤:

# 训练数据准备
# 1. 收集目标声音样本(1-2 小时的音频)
# 2. 准备对应的文本转录
# 3. 转换为所需的格式

python scripts/prepare_audio_data.py \
    --audio_dir ./my_voice_samples \
    --output_dir ./training_data \
    --target_sr 16000

# 微调
python scripts/finetune_tts.py \
    --model_name_or_path Qwen/Qwen3-Audio-Chat \
    --data_path ./training_data \
    --output_dir ./my_tuned_model \
    --num_train_epochs 3 \
    --learning_rate 5e-5

微调后的模型将捕捉特定说话者的细微差别,如停顿、语调和方言特征。

5、性能指标

在我的 RTX 4090 上的测试结果:

指标
推理速度 ~10-15 秒音频 ~1-2 秒
端到端延迟 ~3-5 秒
MOS(平均意见分数) 4.2/5(相比 ElevenLabs 的 4.4/5)

注意:性能取决于你的硬件配置

6、生产部署

Docker 集成

为了生产部署,最好将 vLLM 服务器容器化。

FROM nvidia/cuda:12.1.0-devel-ubuntu22.04

RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip install vllm

COPY . /app
WORKDIR /app

EXPOSE 8000

CMD ["python", "-m", "vllm.entrypoints.openai.api_server", \
     "--model", "Qwen/Qwen3-Audio-Chat", \
     "--served-model-name", "Qwen3-Audio-TTS", \
     "--dtype", "auto", \
     "--max-model-len", "8000", \
     "--trust-remote-code", \
     "--limit-mm-per-prompt", "audio=1", \
     "--host", "0.0.0.0", "-p", "8000"]

Docker Compose 部署

version: '3.8'
services:
  qwen_tts:
    build: .
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    ports:
      - "8000:8000"
    environment:
      - CUDA_VISIBLE_DEVICES=0

保存为 docker-compose.yml 并运行:

docker-compose up -d

7、集成示例

Flask API 封装器

from flask import Flask, request, send_file
import openai
import tempfile
import os

app = Flask(__name__)

client = openai.OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="dummy",
)

@app.route("/tts", methods=["POST"])
def text_to_speech():
    text = request.json.get("text")
    voice = request.json.get("voice", "Chelsie")
    
    if not text:
        return {"error": "No text provided"}, 400
    
    # 调用 Qwen3-Audio 模型
    response = client.chat.completions.create(
        model="Qwen3-Audio-TTS",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": text
                    }
                ]
            }
        ],
        audio={"voice": voice},
    )
    
    # 保存输出音频
    temp_file = tempfile.NamedTemporaryFile(delete=True, suffix=".wav")
    temp_file.write(response.choices[0].message.audio.data)
    temp_file.flush()
    
    return send_file(temp_file.name, mimetype="audio/wav")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

8、结束语

Qwen3-Audio 提供了一个真正可与 ElevenLabs 竞争的开源替代方案,具备高质量 TTS、语音克隆和本地部署的优势。使用 vLLM 部署确保了快速的推理,使其适用于实时应用。

关键要点:

  • 设置简单,只需几行代码
  • 音质可媲美 ElevenLabs
  • 支持自定义语音克隆和微调
  • 通过 vLLM 高性能推理
  • 无 API 限制或订阅成本的本地部署

原文链接: Qwen3 TTS over ElevenLabs: Open Source - Custom Voice Generation and Voice Cloning via vLLM

汇智网翻译整理,转载请标明出处