Qwen3-TTSで10秒の音声で自分の声をクローン
Qwen3-TTSという音声合成モデルを使って、自分の声をクローンしてみました。たった10秒程度の音声サンプルから、かなりそれっぽい声が生成できました。
試してみた様子です
私の声を知らないと…ですが、音声配信とかと比較してもらえましたら。
DGX Sparkで動かしたのですが、動かし方をメモしておきます。なお、以降の動かし方はAI作成の動作方法の記録をもとに作成しています。
Qwen3-TTSとは
Qwen3-TTSは、Alibaba Cloud(Qwenチーム)が開発したオープンソースのTTSモデルです。
主な特徴は以下の通りです。
- 1.7Bパラメータのモデル(Base版)
- 3秒程度の音声サンプルでボイスクローン可能
- 日本語を含む多言語対応
- Apache 2.0ライセンスで商用利用可能
動作環境
今回は以下の環境で試しました。
- NVIDIA DGX Spark(Grace CPU 72コア / NVIDIA GB10 GPU / 128GB統合メモリ)
- Ubuntu 24.04 LTS(ARM64 / aarch64)
- CUDA 13.0 / Driver 580.95.05
- Python 3.12
DGX Sparkでの基本的な環境構築については、以下の記事にまとめています。
環境構築
仮想環境の作成
Python環境管理にはuvを使います。
$ mkdir qwen3-tts && cd qwen3-tts
$ uv venv -p 3.12
$ source .venv/bin/activate
PyTorchのインストール
uvを使ってインストールするのがポイントです。
$ uv pip install "torch==2.9.1" torchaudio --index-url https://download.pytorch.org/whl/cu130
CUDAが認識されているか確認しましょう。
$ python3 -c "import torch; print('CUDA available:', torch.cuda.is_available()); print('CUDA version:', torch.version.cuda); print('Device:', torch.cuda.get_device_name(0))"
以下のように表示されればOKです。
CUDA available: True
CUDA version: 13.0
Device: NVIDIA GB10
Qwen3-TTSのインストール
$ uv pip install qwen-tts soundfile openai-whisper
ボイスクローンの実行
1. 音声サンプルの準備
3〜10秒程度のクリアな音声サンプルを用意します。自分はポッドキャストの音声から切り出しました。
# 3秒目から10秒間を切り出し、モノラル24kHzに変換
$ ffmpeg -y -i input.mp3 -ss 3 -t 10 -ac 1 -ar 24000 voice_sample.wav
ポイントとしては以下の通りです。
- ノイズが少ない音声を選ぶ
- BGMが入っていない部分を使う
- 話者が1人だけの部分を使う
2. 音声サンプルの文字起こし(ref_text)
ボイスクローンには、音声サンプルに対応するテキスト(ref_text)が必要です。Whisperで文字起こしできます。
import whisper
model = whisper.load_model("base")
result = model.transcribe("voice_sample.wav", language="ja")
print(result["text"])
3. ボイスクローンの実行
以下のコードでボイスクローンを実行します。
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
import os
# DGX Sparkの統合メモリ向け設定(後述)
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
# モデル読み込み(初回はHugging Faceからダウンロード)
model = Qwen3TTSModel.from_pretrained(
"Qwen/Qwen3-TTS-12Hz-1.7B-Base",
device_map="cuda:0",
dtype=torch.float16,
low_cpu_mem_usage=True,
max_memory={0: "60GiB"},
)
# 声クローン元の音声とテキスト
ref_audio = "voice_sample.wav"
ref_text = "ここに音声サンプルの文字起こし結果を入れる"
# 生成したいテキスト
text = "最近DGX Sparkを買いまして、色々遊んでいるんですが、これがなかなか面白いんですよ。"
# 生成
wavs, sr = model.generate_voice_clone(
text=text,
language="Japanese",
ref_audio=ref_audio,
ref_text=ref_text,
)
# 保存
sf.write("output_voice_clone.wav", wavs[0], sr)
print(f"Saved! Duration: {len(wavs[0])/sr:.1f}s, Sample rate: {sr}Hz")
実行結果
冒頭で示したとおりです。
自然な口語体の日本語テキスト(「〜なんですが」「〜ですよね」など)を入力した方が、日本語らしいイントネーションで生成される印象でした。英語とか多めだと、海外の人っぽい話し方になったりします。短いテキストよりも、2〜3文程度ある方が品質が安定する印象です。
注意点
CUDA OOM(メモリ不足)
DGX Sparkは128GBの統合メモリを搭載していますが、CUDAのメモリアロケータのデフォルト設定ではうまく活用できないことがあります。以下の設定を入れることで解決しました。
# 環境変数でメモリアロケータの挙動を変更
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
# モデル読み込み時にメモリ上限を明示
model = Qwen3TTSModel.from_pretrained(
...,
low_cpu_mem_usage=True,
max_memory={0: "60GiB"},
)
これがないと CUDA error: out of memory で落ちることがあります。
pyproject.tomlで管理する場合
プロジェクトとして管理したい場合は、以下のように書けます。
[project]
name = "qwen3-tts-project"
requires-python = ">=3.12"
dependencies = [
"qwen-tts",
"soundfile",
"openai-whisper",
]
[[tool.uv.index]]
name = "pytorch-cu130"
url = "https://download.pytorch.org/whl/cu130"
explicit = true
[tool.uv.sources]
torch = { index = "pytorch-cu130" }
torchaudio = { index = "pytorch-cu130" }
まとめ
Qwen3-TTSを使って、DGX Spark上で自分の声をクローンしました。そんなにモデル大きくないので、DGX Sparkでなくてもローカルで動くかと思います。
音声配信とか動画の作成も、これで作れたりしそうだなと思いつつ、簡単にクローンできてしまうのは、ちょっと怖いくらいの性能ですね。
参考リンク
Discussion