👄

Qwen3-TTSで10秒の音声で自分の声をクローン

に公開

Qwen3-TTSという音声合成モデルを使って、自分の声をクローンしてみました。たった10秒程度の音声サンプルから、かなりそれっぽい声が生成できました。

試してみた様子です
https://x.com/karaage0703/status/2027961203482628352

私の声を知らないと…ですが、音声配信とかと比較してもらえましたら。

https://karaage-empire-radio.pages.dev/

DGX Sparkで動かしたのですが、動かし方をメモしておきます。なお、以降の動かし方はAI作成の動作方法の記録をもとに作成しています。

Qwen3-TTSとは

Qwen3-TTSは、Alibaba Cloud(Qwenチーム)が開発したオープンソースのTTSモデルです。

主な特徴は以下の通りです。

  • 1.7Bパラメータのモデル(Base版)
  • 3秒程度の音声サンプルでボイスクローン可能
  • 日本語を含む多言語対応
  • Apache 2.0ライセンスで商用利用可能

https://github.com/QwenLM/Qwen3-TTS

動作環境

今回は以下の環境で試しました。

  • 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での基本的な環境構築については、以下の記事にまとめています。

https://zenn.dev/karaage0703/articles/985ddbd8fa15d3

環境構築

仮想環境の作成

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でなくてもローカルで動くかと思います。

音声配信とか動画の作成も、これで作れたりしそうだなと思いつつ、簡単にクローンできてしまうのは、ちょっと怖いくらいの性能ですね。

参考リンク

https://github.com/QwenLM/Qwen3-TTS

https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-Base

https://zenn.dev/karaage0703/articles/985ddbd8fa15d3

https://docs.nvidia.com/dgx/dgx-spark/dgx-spark.pdf

Discussion