Qwen3-ttsを試す

お試し Qwen3-tts

はじめに

Qwen3-ttsを試してみます。

Tty!!

Qwen/Qwen3-TTS-12Hz-0.6B-Base · Hugging Faceを参考にして試します。

環境設定

実行環境ではpython3.12.0を用いました(仮想環境の作成にはuvを用いました)。

また、GPUにはNVIDIA A100を使用しCudaのバージョンは13です。

環境を設定します:

mkdir -p ~/qwen3-tts
cd ~/qwen3-tts
uv init
uv venv --python 3.12

Huggingfaceに従って必要なパッケージをインストールしてみます。今回はgithubの方からcloneしてきてインストールします:

git clone https://github.com/QwenLM/Qwen3-TTS.git
cd Qwen3-TTS
uv pip install -e .

flash-attnに関してはインストールしようとしたのですが、cudaのバージョン周りのエラーが出たので一旦断念しました。 FlashAttentionのインストールには uv pip install flash-attn --no-build-isolation で行えるようです。 これはオプショナルなので、なくても動作します。

実装

次の二つを試してみます。

  1. Custom Voice Generate
  2. Voice Clone

Custom Voice Generate

For custom voice models (Qwen3-TTS-12Hz-1.7B/0.6B-CustomVoice), you just need to call generate_custom_voice, passing a single string or a batch list, along with language, speaker, and optional instruct. You can also call model.get_supported_speakers() and model.get_supported_languages() to see which speakers and languages the current model supports.

と説明されています。 今回は日本語話者として紹介されているOno_Annaを使ってみます。

以下のコードを動かしてみます。このコードはHuggingfaceで公開されているものを日本語を発話させるために変更したものです。

custom_voice_generate.py

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
import time


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

t0 = time.time()
wavs, sr = model.generate_custom_voice(
    text="やっぱり新しい言語モデルや発話モデルが登場すると、早く試してみたくなりますよね",
    language="Japanese",
    speaker="Ono_Anna",
    instruct="ゆっくりと話す。",
)
t1 = time.time()
print(f"Time: {t1 - t0:.3f}s")
sf.write("output_custom_voice.wav", wavs[0], sr)

## > Time: 15.078s

生成時かかる時間は(モデルのロードやダウンロードを除いて)15秒ほどでした。

また、生成された音声はこちらです:


Voice Clone

For voice cloning (Qwen3-TTS-12Hz-1.7B-Base), you need to call generate_voice_clone, passing a single string or a batch list, along with language, ref_audio, and ref_text. You can also call model.get_supported_languages() to see which languages the current model supports.

と説明されています。これは参照音声をもとに、その話者埋め込みを利用して音声を生成するものです。

今回は自分の読み上げ音声を参照音声として利用します。こちらの自分の発話音声を用いました。

voice_clone.py

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
import time

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

ref_audio = "./me.wav" # 12秒ほどの読み上げ
ref_text  = "親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。"

t0 = time.time()
wavs, sr = model.generate_voice_clone(
    text="やっぱり新しい言語モデルや発話モデルが登場すると、早く試してみたくなりますよね",
    language="Japanese",
    ref_audio=ref_audio,
    ref_text=ref_text,
)
t1 = time.time()
print(f"Time: {t1 - t0:.3f}s")
sf.write("output_voice_clone.wav", wavs[0], sr)

## > Time: 14.153s

生成時かかる時間は(モデルのロードやダウンロードを除いて)14秒ほどでした。

また、生成された音声はこちらです:

まとめ

Qwen3-ttsを試しました。

今回はCustom Voice GenerateとVoice Cloneを試してみました。

Custom Voice Generateは日本語話者の音声を生成することができました。

Voice Cloneは自分の読み上げ音声をもとに、その話者埋め込みを利用して音声を生成することができました。 クローンではかなり自分の声に近い音声が生成されているように感じています。

「やっぱり新しい言語モデルや発話モデルが登場すると、早く試してみたくなりますよね」という文章を読み上げるのに15秒ほどの生成時間がかかりました。(FlashAttentionを入れれてないものあり)

他の機能もあるようなので今後ゆっくりと試してみます〜🙌

参考文献

Qwen3-TTS

Qwen3-TTS-12Hz-1.7B-CustomVoice

Qwen3-TTS-12Hz-1.7B-Base