開発未分類メモ
Qwen3-TTS セットアップ & 使い方ガイド
概要
Qwen3-TTSはAlibabaのQwenチームが開発したオープンソースのText-to-Speechモデル。10言語対応(日本語含む)で、以下の機能を持つ:
- Voice Clone: 3秒の音声サンプルから声をクローン
- Voice Design: 自然言語で声の特徴を指定して生成
- Custom Voice: プリセット9種類の声 + 感情・話し方の制御
動作環境
| 項目 | 要件 |
|---|---|
| Python | 3.12 推奨(3.10以上) |
| GPU | CUDA対応GPU(VRAM 8GB以上推奨) |
| OS | Windows / 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を正確に書く
参考リンク
- GitHub: https://github.com/QwenLM/Qwen3-TTS
- Hugging Face: https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-Base
- 技術レポート: https://arxiv.org/abs/2601.15621