Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Jan 24, 2026 - 日記

Qwen3-TTS: Apple Silicon M3で試したら日本語品質に驚いた——VoiceDesignで権利フリーの声を作る

Qwen3-TTS voice design and clone workflow cover image

「オープンソースのTTSで、ここまで自然な日本語が出るのか」——正直、驚きました。

2026年1月22日に Alibaba Cloud のQwen Teamが公開した Qwen3-TTS を、手元のMacBook Air(Apple Silicon M3)で試してみました。結論から言うと、日本語の読み上げ品質がかなり良い。そして何より、VoiceDesign機能で「自分だけの声」を作れるのが面白い。権利的にもクリーンな声を、自然言語の指示だけで生成できます。

この記事では、Apple Silicon(MPS)での動作確認結果と、VoiceDesign→Cloneワークフローの実用性をまとめます。動作確認に使ったコードは GitHub に置いてあります。

Qwen3-TTSとは

Qwen3-TTS は、Apache License 2.0 で公開されているオープンソースのTTS(Text-to-Speech)モデル群です。商用利用も可能。公式ブログ(Qwen公式ブログ )も出ています。

モデルは用途別に分かれていて、ざっくり次の3系統を押さえると理解しやすいです。

  • CustomVoice: あらかじめ用意された「プレミアム話者」から選び、指示文(instruct)でスタイルを調整する
  • VoiceDesign: 指示文(instruct)で声の音色・感情・韻律を設計する(これが面白い
  • Base: 参照音声から3秒程度でボイスクローンする

モデルは Hugging Face の Qwen3-TTS collection にまとまっています。対応言語は中/英/日/韓/独/仏/露/葡/西/伊の10言語です。

Apple Silicon M3で動かしてみた

環境

項目
マシンMacBook Air (Apple Silicon M3)
OSmacOS
Python3.13.1
PyTorch2.10.0
バックエンドMPS (Metal Performance Shaders)

インストール

1
2
3
python3 -m venv .venv
source .venv/bin/activate
pip install -U qwen-tts soundfile

FlashAttentionはMacでは使えませんが、以下の警告が出るだけで問題なく動作します。

1
Warning: flash-attn is not installed. Will only run the manual PyTorch version.

モデルファイルの保存場所

モデルは初回実行時に自動でダウンロードされ、Hugging Faceのキャッシュに保存されます。

1
2
# キャッシュの確認
ls -la ~/.cache/huggingface/hub/ | grep -i qwen
モデルサイズ
Qwen3-TTS-12Hz-0.6B-Base2.3GB
Qwen3-TTS-12Hz-1.7B-VoiceDesign4.2GB

両方使う場合は合計 約6.5GB になります。Voice Cloneだけなら0.6B-Baseの2.3GBで済みます。

不要になったら以下で削除できます(再実行時に自動で再ダウンロード)。

1
rm -rf ~/.cache/huggingface/hub/models--Qwen--Qwen3-TTS-*

ちなみにCUDA版だとFlashAttentionなど追加のライブラリが必要になりますが、Mac版はその辺が不要なのでセットアップはシンプルです。

動作確認結果

モデル動作備考
Qwen3-TTS-12Hz-1.7B-VoiceDesignfloat16でOK
Qwen3-TTS-12Hz-1.7B-Basefloat32が必須
Qwen3-TTS-12Hz-0.6B-Basefloat32が必須

重要: Voice Clone(Baseモデル)は float32 が必須です。float16 だと RuntimeError: probability tensor contains either inf, nan or element < 0 が発生します。

CUDAとの設定差分

設定CUDA(公式README)Mac(MPS)
device_map"cuda:0""mps"
dtype(VoiceDesign)torch.bfloat16torch.float16
dtype(Voice Clone)torch.bfloat16torch.float32
attn_implementation"flash_attention_2"省略

VoiceDesign: 声を「設計」する

この記事で一番伝えたいのが VoiceDesign です。

従来のTTSは「用意された声から選ぶ」のが基本でした。VoiceDesignは「声を自然言語で設計する」方向に寄せています。

例えば、次のような指示(instruct)で声を定義します。

1
落ち着いた若い男性の声。少し低めで穏やか。
1
若い女性。声は高すぎず、少し息成分がある。控えめで緊張している。

これだけで、その場で新しい声が生成されます。既存の声をクローンするわけではないので、権利的にクリーンな声を作れるのが大きい。

実装例(Mac向け)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

# VoiceDesignモデルをロード(Mac MPS)
model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
    device_map="mps",
    dtype=torch.float16,
)

# 日本語で試す
wavs, sr = model.generate_voice_design(
    text="こんにちは、これはMacでの音声合成テストです。",
    language="Japanese",
    instruct="落ち着いた若い男性の声。少し低めで穏やか。",
)

sf.write("test_voicedesign_ja.wav", wavs[0], sr)

実際に生成してみると、日本語のイントネーションがかなり自然です。「合成音声っぽさ」が少なく、普通に聞いていられるレベル。

instruct の書き方

instruct パラメータで声を制御します。以下の要素を組み合わせると効果的です。

要素説明
音色(timbre)声質低め、高め、ハスキー、息成分多め
感情(emotion)気持ち落ち着いた、緊張している、明るい
韻律(prosody)リズム・速度ゆっくり、早口、語尾を上げる
キャラクター年齢・性別若い女性、中年男性、お年寄り
1
2
3
4
5
6
7
8
# 落ち着いたナレーター
instruct = "落ち着いた中年男性。声は低めで安定している。ゆっくり話す。"

# 元気な若い女性
instruct = "元気な若い女性。声は明るく高め。テンポは早め。"

# 緊張しているキャラクター
instruct = "若い女性。声は高すぎず、少し息成分がある。控えめで緊張している。語尾は弱め。"

VoiceDesign→Clone ワークフロー

VoiceDesignの弱点は「同じ指示でも毎回微妙に声が揺れる」ことです。単発の読み上げなら自然で良いのですが、キャラクターのセリフを何十行も生成したいときは、揺れが"別人感"として積み上がります。

そこで、VoiceDesignで作った参照音声を、Baseモデルでクローンして再利用可能にするというワークフローが効きます。

  1. VoiceDesignで「声の設計図」から参照音声を作る
  2. 参照音声+書き起こしから create_voice_clone_prompt を作る
  3. 以降は generate_voice_clone(..., voice_clone_prompt=...) で量産する

実装例(Mac向け、完全版)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

# Step 1: VoiceDesignで参照音声を生成
print("Step 1: Loading VoiceDesign model...")
design_model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
    device_map="mps",
    dtype=torch.float16,
)

ref_text = "えっと……その、ちょっとだけ相談があるんですが……。"
ref_instruct = (
    "若い女性。声は高すぎず、少し息成分がある。"
    "控えめで緊張しているが、話しているうちに少しずつ落ち着く。"
)

ref_wavs, sr = design_model.generate_voice_design(
    text=ref_text,
    language="Japanese",
    instruct=ref_instruct,
)
sf.write("ref_voice.wav", ref_wavs[0], sr)
print("Reference audio saved: ref_voice.wav")

# メモリ解放
del design_model
torch.mps.empty_cache()

# Step 2: Baseモデルで声プロンプトを作成
print("Step 2: Loading Base model for cloning...")
clone_model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-0.6B-Base",
    device_map="mps",
    dtype=torch.float32,  # ⚠️ float32が必須!
)

voice_clone_prompt = clone_model.create_voice_clone_prompt(
    ref_audio=(ref_wavs[0], sr),
    ref_text=ref_text,
)

# Step 3: クローンした声で量産
print("Step 3: Generating speech with cloned voice...")
lines = [
    "あ、ありがとうございます。少し安心しました。",
    "じゃあ、まず状況を整理してもいいですか?",
    "……うん。たぶん、今なら言えます。",
]

for i, line in enumerate(lines):
    wavs, sr = clone_model.generate_voice_clone(
        text=line,
        language="Japanese",
        voice_clone_prompt=voice_clone_prompt,
    )
    sf.write(f"clone_line_{i}.wav", wavs[0], sr)
    print(f"  clone_line_{i}.wav saved")

print("Done!")

これで、VoiceDesignで作った声を「資産化」して、一貫性のある音声を量産できます。

3秒クローンとの使い分け

Qwen3-TTSには「既存の音声を3秒でクローンする」機能もあります。使い分けの基準を整理します。

観点3秒クローンVoiceDesign→Clone
目的既存の声を再現したい新しい声を作る
入力参照音声(+書き起こし)設計文(instruct)
権利元の声の権利に直結(許諾が重要)権利的にクリーン
一貫性参照音声の品質に依存プロンプト化すると安定

自分の結論:

  • 誰かの声を再現したいなら3秒クローン(ただし許諾は必須)
  • 自分のプロダクトのキャラクター音声を作りたいなら VoiceDesign→Clone

VoiceDesignで作った声は「誰の声でもない」ので、著作権や肖像権の問題を回避しやすいのが大きなメリットです。

日本語品質の感想

実際に試して驚いたポイント:

  1. イントネーションが自然: 「合成音声っぽさ」が少ない
  2. 漢字の読みが正確: 専門用語でなければほぼ問題なし
  3. 感情表現が効く: instruct で「緊張している」と指定すると、本当にそう聞こえる
  4. 句読点の間が自然: 「……」や「、」の扱いが上手い

まとめ

Qwen3-TTSを Apple Silicon M3 で試してみて、以下の点に驚きました。

  • 日本語品質が高い: オープンソースでここまで自然な読み上げは初めて
  • VoiceDesignで声を作れる: 権利フリーの声を自然言語で設計できる
  • Macでも動く: MPS対応で、float32の制約はあるが実用レベル

「声を選ぶ」から「声を作る」へ。TTSの使い方が変わる可能性を感じるツールです。

興味のある方は、ぜひ手元で試してみてください。VoiceDesignで「自分だけの声」を作る体験は、なかなか面白いですよ。

参考リンク