はじめに
Alibaba の Qwen チームが公開しているオープンな音声合成(TTS)モデル Qwen3-TTS を、手元の GPU で動かしてみました。試したのは次の2パターンです。
- 用意された基本の声(プリセット話者)で日本語を読ませる(CustomVoice)
- 声のトーンを文章で指定して読ませる(VoiceDesign)
実際に生成した音声と、合成にかかった時間を載せます。
使ったモデル
| モデル | 内容 |
|---|---|
Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice |
9種類のプリセット話者で読み上げるモデル。今回は日本語ネイティブ話者の Ono_Anna を使用 |
Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice |
上の小型版 |
Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign |
「どんな声で、どんな調子で話すか」を自然文で指定して読み上げるモデル |
いずれも QwenLM/Qwen3-TTS で公開されており、重みは初回実行時に Hugging Face から自動でダウンロードされます。
使ったハードウェア・環境
| 項目 | 内容 |
|---|---|
| OS | Windows 11 |
| CPU | Intel Core i7-14700KF |
| メモリ | 96GB |
| GPU | NVIDIA GeForce RTX 4060 Ti(VRAM 8GB) |
| Python / PyTorch | 3.12 / 2.11.0+cu128 |
| パッケージ | qwen-tts 0.1.1(bfloat16、flash-attn なし) |
セットアップ
mkdir qwen3-tts-test
cd qwen3-tts-test
uv venv --python 3.12
.venv\Scripts\activate
uv pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128
uv pip install qwen-tts
先に CUDA 版の PyTorch を入れてから qwen-tts を入れます。
パターン1:基本の声(プリセット話者)で読ませる
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
model = Qwen3TTSModel.from_pretrained(
"Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice", # 0.6B 版は 0.6B-CustomVoice
device_map="cuda:0",
dtype=torch.bfloat16,
)
wavs, sr = model.generate_custom_voice(
text="こんにちは。今日はQwen3-TTSを使って、手元のGPUで日本語の音声合成を試してみます。",
language="Japanese",
speaker="Ono_Anna",
)
sf.write("sample1_customvoice.wav", wavs[0], sr)
生成された音声(1.7B-CustomVoice)
「こんにちは。今日はQwen3-TTSを使って、手元のGPUで日本語の音声合成を試してみます。」
生成された音声(0.6B-CustomVoice、同じ文)
パターン2:声のトーンを文章で指定する(VoiceDesign)
VoiceDesign モデルでは、instruct に声の特徴や話し方を自然文で書きます。日本語で書いてもちゃんと効きました。同じ文章のまま、instruct だけを変えて3種類作ってみました。
| instruct(トーンの指定) | |
|---|---|
| A | 落ち着いた低めの声の30代男性。技術解説をするように、ゆっくり、はっきりと話す。 |
| B | 明るく元気な20代の女性。新機能を紹介するように、テンション高めで楽しそうに話す。 |
| C | 眠そうな若い男性。小さめの声で、だるそうに、ゆっくりぼそぼそと話す。 |
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,
)
text = "ビルドが通らないときは、まずエラーメッセージを最後まで落ち着いて読んでみましょう。"
tones = {
"calm": "落ち着いた低めの声の30代男性。技術解説をするように、ゆっくり、はっきりと話す。",
"bright": "明るく元気な20代の女性。新機能を紹介するように、テンション高めで楽しそうに話す。",
"sleepy": "眠そうな若い男性。小さめの声で、だるそうに、ゆっくりぼそぼそと話す。",
}
for name, instruct in tones.items():
wavs, sr = model.generate_voice_design(text=text, language="Japanese", instruct=instruct)
sf.write(f"design_{name}.wav", wavs[0], sr)
読ませた文章:「ビルドが通らないときは、まずエラーメッセージを最後まで落ち着いて読んでみましょう。」
A:落ち着いた男性
B:明るく元気な女性
C:眠そうな男性
性別や年齢、テンションの指定は聞いてすぐわかるくらい素直に反映され、同じ文章でもまったく別人の読み上げになりました。
合成にかかった時間
モデル読み込み後の生成部分だけを、各3回生成した平均で測りました。RTF = 生成時間 ÷ 音声の長さで、1 より小さければリアルタイムより速く生成できています。
| パターン | モデル | 生成時間 | RTF | VRAM ピーク |
|---|---|---|---|---|
| 1 | 1.7B-CustomVoice | 17.8 秒 | 2.09 | 4.3 GiB |
| 1 | 0.6B-CustomVoice | 26.6 秒 | 2.51 | 2.5 GiB |
| 2-A 落ち着いた男性 | 1.7B-VoiceDesign | 16.6 秒 | 2.10 | 4.2 GiB |
| 2-B 明るい女性 | 1.7B-VoiceDesign | 12.0 秒 | 2.12 | 4.1 GiB |
| 2-C 眠そうな男性 | 1.7B-VoiceDesign | 19.9 秒 | 2.12 | 4.4 GiB |
- VRAM 8GB の RTX 4060 Ti で、1.7B モデルも余裕を持って動きました
- ただし公式パッケージのままだと、どれも音声の長さの約2倍の時間がかかります
- 0.6B にしても速くはなりませんでした
高速化:faster-qwen3-tts
コミュニティ製の faster-qwen3-tts を使うと高速化できます。仮想環境を分けて入れます。
uv venv --python 3.12 .venv-fast
.venv-fast\Scripts\activate
uv pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128
uv pip install faster-qwen3-tts "transformers==5.15.1"
transformers は 5.15.1 に固定しないと、検証時点ではモデル読み込みでエラーになりました。
import soundfile as sf
from faster_qwen3_tts import FasterQwen3TTS
model = FasterQwen3TTS.from_pretrained("Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice")
wavs, sr = model.generate_custom_voice(
text="こんにちは。今日はQwen3-TTSを使って、手元のGPUで日本語の音声合成を試してみます。",
language="Japanese",
speaker="ono_anna",
)
sf.write("sample1_fast.wav", wavs[0], sr)
VoiceDesign も同様に、VoiceDesign モデルを読み込んで generate_voice_design(text=..., instruct=..., language=...) を呼ぶだけです。
| モデル | 生成時間 | RTF | 公式比 |
|---|---|---|---|
| 1.7B-CustomVoice | 3.96 秒 | 0.45 | 約4.6倍速 |
| 0.6B-CustomVoice | 3.29 秒 | 0.37 | 約6.8倍速 |
| 1.7B-VoiceDesign | 2.98 秒 | 0.46 | 約4.6倍速 |
- RTF 0.37〜0.46 で、すべてリアルタイムより速くなりました
- ストリーミング生成(
generate_custom_voice_streaming)では、最初の音声が出るまで約0.3〜0.4秒でした
まとめ
- Qwen3-TTS は、プリセット話者での読み上げも、文章でのトーン指定も数行の Python で試せる
- 文章でのトーン指定は素直に効き、同じ文章でも別人のような読み上げを作れた
- RTX 4060 Ti(VRAM 8GB)で 1.7B モデルが動作。公式パッケージでは RTF 約2だが、faster-qwen3-tts を使うと RTF 0.37〜0.46 まで速くなった
