• #qwen3-tts
  • #tts
  • #voice-clone
  • #alibaba
  • #python
  • #ai
開発未分類メモ

Qwen3-TTS セットアップ & 使い方ガイド

概要

Qwen3-TTSはAlibabaのQwenチームが開発したオープンソースのText-to-Speechモデル。10言語対応(日本語含む)で、以下の機能を持つ:

  • Voice Clone: 3秒の音声サンプルから声をクローン
  • Voice Design: 自然言語で声の特徴を指定して生成
  • Custom Voice: プリセット9種類の声 + 感情・話し方の制御

動作環境

項目要件
Python3.12 推奨(3.10以上)
GPUCUDA対応GPU(VRAM 8GB以上推奨)
OSWindows / Linux

モデル別VRAM目安

モデルVRAM使用量(bfloat16)
1.7B約3.4GB
0.6B約1.2GB

セットアップ(uv使用)

1. プロジェクト作成

cd C:\Users\numbe
mkdir qwen-tts-test
cd qwen-tts-test

uv init
uv python install 3.12
uv python pin 3.12

2. 依存関係インストール

uv add qwen-tts

3. (オプション)FlashAttention 2

高速化・VRAM節約のためのオプション。Windowsでは少し面倒なので、まずはなしで試してOK。

uv add flash-attn --no-build-isolation

※ビルドに時間がかかる & 失敗することもある。なくても動作する。


使い方

Voice Clone(音声クローン)

3秒程度の音声サンプルから声をクローンして、任意のテキストを読み上げる。

サンプル音声でテスト

voice_clone_test.py:

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

# モデルロード(初回はダウンロードに数分かかる)
model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-Base",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

# 公式サンプル音声
ref_audio = "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-TTS-Repo/clone.wav"
ref_text = "Okay. Yeah. I resent you. I love you. I respect you. But you know what? You blew it! And thanks to you."

wavs, sr = model.generate_voice_clone(
    text="Hello! This is a test of voice cloning.",
    language="English",
    ref_audio=ref_audio,
    ref_text=ref_text,
)

sf.write("output_clone_test.wav", wavs[0], sr)
print("Done! Check output_clone_test.wav")

実行:

uv run python voice_clone_test.py

自分の声でクローン

my_voice_clone.py:

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-Base",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

# 自分の音声ファイル(3秒程度のwav)
ref_audio = "my_voice_sample.wav"
ref_text = "ここに音声ファイルで話している内容を書く"

# 日本語で生成
wavs, sr = model.generate_voice_clone(
    text="こんにちは、これは音声クローンのテストです。私の声で読み上げています。",
    language="Japanese",
    ref_audio=ref_audio,
    ref_text=ref_text,
)

sf.write("my_cloned_voice.wav", wavs[0], sr)
print("Done!")

音声サンプルの準備tips

  • 長さ:3秒程度でOK(短すぎると品質低下)
  • 形式:WAV推奨
  • 内容:はっきり話している音声
  • ノイズ:少ないほど良い

Windows標準の「ボイスレコーダー」で録音 → m4aで保存される場合は、ffmpegでwavに変換:

ffmpeg -i recording.m4a -ar 16000 my_voice_sample.wav

Voice Design(声をデザイン)

自然言語で声の特徴を指定して生成。クローン元の音声が不要。

voice_design_test.py:

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

# 日本語
wavs, sr = model.generate_voice_design(
    text="おはようございます。今日も一日頑張りましょう。",
    language="Japanese",
    instruct="落ち着いた30代男性の声。低めのトーンで、穏やかに話す。",
)
sf.write("designed_voice_jp.wav", wavs[0], sr)

# 英語
wavs, sr = model.generate_voice_design(
    text="Good morning! Let's have a great day today.",
    language="English",
    instruct="Energetic young female voice with a bright and cheerful tone.",
)
sf.write("designed_voice_en.wav", wavs[0], sr)

print("Done!")

Custom Voice(プリセット音声)

9種類のプリセット音声から選択。感情や話し方を指示で制御可能。

custom_voice_test.py:

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

# 利用可能なスピーカー確認
print("Speakers:", model.get_supported_speakers())
print("Languages:", model.get_supported_languages())

# 日本語スピーカー(Ono_Anna)で生成
wavs, sr = model.generate_custom_voice(
    text="こんにちは!今日はいい天気ですね。",
    language="Japanese",
    speaker="Ono_Anna",
    instruct="明るく元気な感じで",
)
sf.write("custom_voice_jp.wav", wavs[0], sr)

# 英語スピーカー(Ryan)で生成
wavs, sr = model.generate_custom_voice(
    text="Welcome to our presentation today.",
    language="English",
    speaker="Ryan",
    instruct="Professional and confident tone.",
)
sf.write("custom_voice_en.wav", wavs[0], sr)

print("Done!")

利用可能なスピーカー

Speaker説明ネイティブ言語
Vivian明るく少しエッジのある若い女性中国語
Serena温かく優しい若い女性中国語
Uncle_Fu低く落ち着いた年配男性中国語
Dylan自然で明瞭な北京方言の若い男性中国語(北京)
Eric少しハスキーで明るい成都方言の男性中国語(四川)
Ryanダイナミックでリズミカルな男性英語
Aiden明るいアメリカ英語の男性英語
Ono_Anna軽やかで可愛らしい日本語女性日本語
Sohee感情豊かな温かい韓国語女性韓国語

バッチ処理(複数テキスト一括生成)

# 複数テキストを一括で生成
wavs, sr = model.generate_voice_clone(
    text=[
        "最初の文章です。",
        "二番目の文章です。",
        "三番目の文章です。",
    ],
    language=["Japanese", "Japanese", "Japanese"],
    ref_audio=ref_audio,
    ref_text=ref_text,
)

for i, wav in enumerate(wavs):
    sf.write(f"output_{i}.wav", wav, sr)

再利用可能なプロンプト(高速化)

同じ参照音声で複数回生成する場合、プロンプトを事前に作成しておくと高速化できる:

# プロンプトを一度だけ作成
prompt = model.create_voice_clone_prompt(
    ref_audio="my_voice.wav",
    ref_text="参照音声のテキスト",
)

# 複数回の生成で再利用
for text in ["文章1", "文章2", "文章3"]:
    wavs, sr = model.generate_voice_clone(
        text=text,
        language="Japanese",
        voice_clone_prompt=prompt,
    )
    # ...

トラブルシューティング

CUDA out of memory

  • 0.6Bモデルを使う:Qwen/Qwen3-TTS-12Hz-0.6B-Base
  • 他のGPUを使うアプリを閉じる
  • バッチサイズを小さくする

モデルダウンロードが遅い

中国国内ならModelScope、それ以外ならHugging Faceから自動ダウンロードされる。手動ダウンロードも可能:

pip install -U "huggingface_hub[cli]"
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-Base --local-dir ./models/Qwen3-TTS-12Hz-1.7B-Base

ローカルパスを指定してロード:

model = Qwen3TTSModel.from_pretrained(
    "./models/Qwen3-TTS-12Hz-1.7B-Base",
    device_map="cuda:0",
    dtype=torch.bfloat16,
)

音質が悪い

  • 参照音声のノイズを減らす
  • 参照音声を3〜5秒程度にする
  • ref_textを正確に書く

参考リンク