オープンソースTTSモデル完全比較2026:Qwen3-TTS・Chatterbox・Fish Speech・CosyVoice・IndexTTS2を実際に動かして検証した

この記事では、2026年に注目を集めるオープンソースTTS(音声合成)モデル5種を実際にローカル環境で動作確認した上で、ライセンス・多言語対応・ゼロショットクローン・感情制御・レイテンシの観点から比較します。動作確認済みのコードも掲載しているため、すぐに試せます。

結論を先に

  • 商用プロジェクト・日本語品質重視 → Qwen3-TTS(Apache-2.0、日本語対応、感情制御あり)
  • ライセンスを完全にクリアにしたい + 多言語クローン → CosyVoice 3.0(Apache-2.0、cross-lingualが最強クラス)
  • 動画吹き替えで尺を合わせたい → IndexTTS2(duration control搭載、ただしライセンス要精読)
  • 英語コンテンツ + paralinguistic表現(笑い声・咳など) → Chatterbox Turbo
  • とにかく音質と多言語カバレッジ → Fish Speech S2 Pro(ただしライセンスが複雑)

オープンソースTTSモデルとは何か、なぜ今注目されるのか

TTS(Text-to-Speech) とは、テキストを音声に変換する技術です。クラウドAPIとして提供されるElevenLabsやOpenAI TTSは高品質ですが、APIコスト・データプライバシー・カスタマイズ性の面で制約があります。

2026年、オープンソースTTSの品質はクラウドAPIに肉薄してきました。特に以下の機能がローカルで実現できるようになった点が大きな変化です。

  • Zero-shot Voice Cloning(ゼロショット音声クローン):3〜10秒の参照音声だけで話者を模倣。事前ファインチューニング不要。
  • Emotion Control(感情制御):怒り・喜び・悲しみなどを自然言語の指示で切り替え。
  • Streaming生成:初音まで100ms未満で到達。リアルタイム応用が可能。
  • Duration Control(尺制御):動画の尺に合わせて読み上げ速度を自動調整。

これらをクラウドに頼らずローカルで回せることは、動画吹き替え・バーチャルYouTuber・コールセンターAI・多言語ポッドキャストなど多くのユースケースで競争優位になります。


各モデルの詳細比較

今回は音声クローンの参照音声として、日本声優統計学会から以下の音声を使用させていただきます。

Qwen3-TTS

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

Alibaba QwenチームがリリースしたTTSモデル。LLMで実績のあるQwenアーキテクチャをTTSに応用した点が特徴です。

項目内容
対応言語10言語(中英日韓独仏露葡西伊)+中国方言
ライセンスApache-2.0(コード・重みとも)
モデルサイズ0.6B / 1.7B
Zero-shot Cloneあり(約3秒の参照音声)
感情制御あり(自然言語instruction)
Streamingあり(初音約97ms)

3つのモードがある点を押さえておく

Qwen3-TTSには用途別に3つのモードがあります。

  • VoiceDesign:「落ち着いた中年男性の声」のように声質をテキストで記述して生成
  • CustomVoice:プリセット9種から選ぶ。安定した品質が得られる
  • Base(Clone用):参照音声を渡してゼロショットクローンを行う

音声クローンと感情制御は同時に使えません。 Baseモード(クローン)使用時は感情instructionが無効になります。どちらを優先するか設計時に決めておく必要があります。

音声クローンの結果はこちら。

日本語の実用性について

対応10言語に日本語が含まれており、他の中国系モデルと比べて日本語の自然さは高い水準にあります。ただし英語・中国語が一番品質が安定しており、日本語は実際に参照音声を与えたクローンモードで使うのがおすすめです。日本語の音声でファインチューニングをすれば改善されるかもしれません。


Chatterbox(3バリアント構成)

Github: https://github.com/resemble-ai/chatterbox

Resemble AIが公開したMITライセンスのTTSモデル。英語中心ですが、Multilingualバリアントで23言語に対応。

バリアントサイズ言語主な特徴
Original0.5B英語emotion exaggeration control
Multilingual0.5B23言語emotion exaggeration + 多言語clone
Turbo350M英語paralinguistic tags + 超低レイテンシ

バリアント選択の落とし穴

[laugh] [cough] などの paralinguistic tags(パラ言語タグ)はTurboバリアント専用です。Multilingualには存在しません。多言語対応と笑い声・咳などの表現を両立したい場合は現時点では不可能で、要件の優先順位を決める必要があります。

MITライセンスは商用利用・派生モデル作成ともに最も制約が少ない選択肢のひとつです。ライセンスリスクをゼロに近づけたい案件でチェックする価値があります。

音声クローンの結果はこちら。


Fish Speech

Github: https://github.com/fishaudio/fish-speech

Fish Audioが開発する高品質多言語TTS。S1が13言語以上、最新のS2 Proは80言語以上に対応し、言語カバレッジでは今回の5モデル中トップです。

項目内容
対応言語S1: 13言語以上、S2 Pro: 80言語以上
ライセンスコード: Fish Audio Research License、重み: モデルごとに異なる
Zero-shot Cloneあり(短い参照音声)
感情制御prosody / emotion / inline emotion tags

ライセンスが非常に複雑です。 コードと重みでライセンスが異なり、モデルバージョンによってCC-BY-NC-SA-4.0など商用不可のものが混在します。「Fish Speechは商用OK」という雑なまとめを見かけますが、使用するモデルバージョンのライセンスを必ず個別確認してください。 商用プロジェクトへの安易な採用は法的リスクを伴います。

品質面では5モデルの中でも高水準にあり、inline emotion tagsによる細かい感情制御も可能です。非商用・研究用途であれば最有力候補のひとつです。

Fish Speechはコマンドラインで動作させる場合、2ステップのパイプライン(semantic token生成 → wav変換)になる点が他モデルと異なります。後述のコードセクションで詳しく解説します。

音声クローンの結果はこちら。


CosyVoice 3.0

Github: https://github.com/FunAudioLLM/CosyVoice

Alibaba FunAudioLLMチームによるTTS。Cross-lingual cloning(異言語間クローン) が特に強力で、「中国語話者の声で日本語を読ませる」といった用途に向いています。

項目内容
対応言語9言語 + 18以上の中国方言・アクセント
ライセンスApache-2.0
モデルサイズ0.5B
Zero-shot Cloneあり(multilingual / cross-lingual)
感情制御emotion cloningの評価セットあり

Apache-2.0でライセンスが明快、かつcross-lingual cloning性能が高い点から、多言語コンテンツ制作での実用性が高いモデルです。

感情制御については、明示的な自然言語instructionよりも参照音声の感情をそのまま引き継ぐemotion cloningが主な仕組みです。「この声で怒って読んで」という指示型よりも「この怒った声と同じトーンで」という引き継ぎ型に近い動作と理解しておくと実装時にギャップが生まれません。

音声クローンの結果はこちら。


IndexTTS2

Github: https://github.com/index-tts/index-tts

ByteDance傘下のチームが公開。Emotion と Speaker Identity の独立制御、および Duration Control(尺合わせ) が最大の特徴です。動画吹き替えワークフローとの相性が特に良いモデルです。

項目内容
対応言語英語・中国語中心(cross-lingualを掲げるが詳細は非公開)
ライセンスApache-2.0表記(ただし制限条項あり)
Zero-shot Cloneあり
感情制御emotion / speaker identityを独立制御。参照音声または自然言語で指定
Duration Controlあり(尺合わせ)

ライセンスに注意が必要です。 Apache-2.0と表記されていますが、ライセンス文中に「本モデルを他のAIモデルの改善目的に使用してはならない」という制限条項があります。これは標準のApache-2.0にない制約であり、単純なApache-2.0とは言えません。他モデルのファインチューニング用データ生成や、モデル蒸留に使う予定がある場合は特に注意が必要です。

Duration Controlは動画吹き替えにおいて非常に重要な機能です。元の映像の尺に合わせて読み上げ速度を自動調整できるため、口パクや字幕のズレを最小化できます。

音声クローンの結果はこちら。(中国語になっています。)


ライセンス早見表

モデルコード重み商用利用
Qwen3-TTSApache-2.0Apache-2.0
ChatterboxMITMIT
Fish SpeechFish Audio Research Licenseモデルごとに異なる(CC-BY-NC-SA-4.0等)⚠️ 要確認
CosyVoice 3.0Apache-2.0Apache-2.0
IndexTTS2Apache-2.0(制限条項あり)Apache-2.0(制限条項あり)⚠️ 要精読

機能比較マトリクス

機能Qwen3-TTSChatterboxFish SpeechCosyVoice 3.0IndexTTS2
対応言語数1023(MTL)80以上(S2 Pro)9英中心
Zero-shot Clone
感情制御(instruction)✅(exaggeration)△(cloning寄り)✅(独立制御)
Streaming✅(97ms)---
Duration Control
Paralinguistic Tags✅(Turboのみ)✅(inline)
モデルサイズ0.6B〜1.7B0.35B〜0.5B4B0.5B~0.5B

動作確認済みコード

以下は実際に動作確認したコードです。環境差異によって動作しない場合は、各リポジトリのREADMEを参照してください。

Qwen3-TTS:Voice Clone

qwen_tts パッケージをインストール後に実行します。--modelQwen/Qwen3-TTS-12Hz-0.6B-Base を指定するとCloneモードになります。

python
#!/usr/bin/env python3
from __future__ import annotations

import argparse
import importlib.util
from pathlib import Path

import soundfile as sf
import torch
from qwen_tts import Qwen3TTSModel


DEFAULT_REF_AUDIO = (
    "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-TTS-Repo/clone.wav"
)
DEFAULT_REF_TEXT = (
    "Okay. Yeah. I resent you. I love you. I respect you. But you know what? "
    "You blew it! And thanks to you."
)


def resolve_device(device: str) -> str:
    if device == "cuda":
        return "cuda:0" if torch.cuda.is_available() else "cpu"
    if device.startswith("cuda") and not torch.cuda.is_available():
        return "cpu"
    return device


def resolve_dtype(device: str) -> torch.dtype:
    if not device.startswith("cuda"):
        return torch.float32
    bf16_supported = bool(
        hasattr(torch.cuda, "is_bf16_supported") and torch.cuda.is_bf16_supported()
    )
    return torch.bfloat16 if bf16_supported else torch.float16


def resolve_attention(device: str, requested: str) -> str:
    if requested != "auto":
        return requested
    if device.startswith("cuda") and importlib.util.find_spec("flash_attn") is not None:
        return "flash_attention_2"
    return "sdpa" if device.startswith("cuda") else "eager"


def main() -> int:
    p = argparse.ArgumentParser()
    p.add_argument(
        "--text",
        default="これはQwen3のvoice clone動作確認です。参照音声に近い声で読み上げます。",
    )
    p.add_argument("--out", default="outputs/qwen3_voice_clone.wav")
    p.add_argument("--device", default="cuda")
    p.add_argument("--language", default="Japanese")
    p.add_argument("--model", default="Qwen/Qwen3-TTS-12Hz-0.6B-Base")
    p.add_argument("--ref-audio", default=DEFAULT_REF_AUDIO)
    p.add_argument("--ref-text", default=DEFAULT_REF_TEXT)
    p.add_argument("--x-vector-only-mode", action="store_true")
    p.add_argument(
        "--attn-implementation",
        default="auto",
        choices=["auto", "flash_attention_2", "sdpa", "eager"],
    )
    args = p.parse_args()

    device = resolve_device(args.device)
    dtype = resolve_dtype(device)
    attn_implementation = resolve_attention(device, args.attn_implementation)

    if args.x_vector_only_mode:
        ref_text = None
    else:
        ref_text = args.ref_text.strip()
        if not ref_text:
            raise SystemExit("--ref-text is required unless --x-vector-only-mode is set")

    model = Qwen3TTSModel.from_pretrained(
        args.model,
        device_map=device,
        dtype=dtype,
        attn_implementation=attn_implementation,
    )
    wavs, sr = model.generate_voice_clone(
        text=args.text,
        language=args.language,
        ref_audio=args.ref_audio,
        ref_text=ref_text,
        x_vector_only_mode=args.x_vector_only_mode,
    )

    out = Path(args.out)
    out.parent.mkdir(parents=True, exist_ok=True)
    sf.write(out, wavs[0], sr)
    print(out)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

ポイント:--x-vector-only-mode フラグ

このフラグを立てると、参照音声のテキスト起こし(--ref-text)なしに話者スタイルだけを抽出する x-vector モードで動作します。参照音声の書き起こしを用意できない場合に便利ですが、クローン品質は通常モードより下がる傾向があります。


Chatterbox:Multilingualバリアントで日本語クローン

python
#!/usr/bin/env python3
from __future__ import annotations

import argparse
from pathlib import Path

import torch
import torchaudio as ta
from chatterbox.mtl_tts import ChatterboxMultilingualTTS
from chatterbox.tts import ChatterboxTTS


def main() -> int:
    p = argparse.ArgumentParser()
    p.add_argument("--text", default="Hello, this is a Chatterbox test.")
    p.add_argument("--out", default="outputs/chatterbox.wav")
    p.add_argument("--device", default="cuda")
    p.add_argument(
        "--variant", choices=["turbo", "multilingual"], default="multilingual"
    )
    p.add_argument("--language-id", default="ja")
    p.add_argument("--audio-prompt-path", default=None)
    args = p.parse_args()

    device = (
        "cuda:0"
        if args.device.startswith("cuda") and torch.cuda.is_available()
        else "cpu"
    )

    if args.variant == "multilingual":
        model = ChatterboxMultilingualTTS.from_pretrained(device=device)
        wav = model.generate(
            args.text,
            language_id=args.language_id,
            audio_prompt_path=args.audio_prompt_path,
        )
    else:
        model = ChatterboxTTS.from_pretrained(device=device)
        wav = model.generate(args.text, audio_prompt_path=args.audio_prompt_path)

    out = Path(args.out)
    out.parent.mkdir(parents=True, exist_ok=True)
    ta.save(str(out), wav, model.sr)
    print(out)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

日本語テキストを読み上げる場合は --language-id ja--text に日本語を渡します。--audio-prompt-path に参照音声ファイルパスを渡すとクローンモードになります。


Fish Speech:2ステップパイプライン

Fish Speechは他のモデルと異なり、semantic token生成 → wav変換の2ステップが必要です。

セットアップ

bash
sudo apt-get install -y portaudio19-dev libsox-dev ffmpeg build-essential
uv sync --python 3.12 --extra cu129
hf download fishaudio/s2-pro --local-dir checkpoints/s2-pro

参照音声なしで生成

bash
# Step 1: semantic tokens を生成
uv run python fish_speech/models/text2semantic/inference.py \
  --text 'こんにちは。Fish Speech のコマンドライン推論を確認しています。' \
  --output-dir output/demo \
  --device cuda

# Step 2: tokens を wav に変換
uv run python fish_speech/models/dac/inference.py \
  -i output/demo/codes_0.npy \
  -o output/demo/generated.wav \
  --checkpoint-path checkpoints/s2-pro/codec.pth \
  -d cuda

参照音声ありでボイスクローン

Fish Speechのクローンは参照音声だけでなく、その音声の書き起こしテキストも必要です。

bash
# 1. Whisperで参照音声を書き起こし
python - <<'PY'
from transformers import pipeline
pipe = pipeline(
    "automatic-speech-recognition",
    model="openai/whisper-large-v3-turbo",
    device="cuda:0",
)
res = pipe("path/to/reference.wav")
print(res["text"])
PY

# 2. クローン用 semantic token を生成
uv run python fish_speech/models/text2semantic/inference.py \
  --text '読み上げたいテキスト' \
  --prompt-text '参照音声の書き起こしテキスト' \
  --prompt-audio path/to/reference.wav \
  --output-dir output/clone \
  --device cuda

# 3. wav に変換
uv run python fish_speech/models/dac/inference.py \
  -i output/clone/codes_0.npy \
  -o output/clone/clone.wav \
  --checkpoint-path checkpoints/s2-pro/codec.pth \
  -d cuda

参照音声の書き起こしはWhisper large-v3-turboで自動生成するのが現実的です。手書き書き起こしとの差はほとんどありません。


CosyVoice 2:Zero-shot Cross-lingual Clone

python
#!/usr/bin/env python3
from __future__ import annotations

import argparse
import sys
from pathlib import Path

import torchaudio


def main() -> int:
    p = argparse.ArgumentParser()
    p.add_argument("--text", default="こんにちは。CosyVoiceのテストです。")
    p.add_argument("--out", default="outputs/cosyvoice.wav")
    p.add_argument("--model", default="pretrained_models/CosyVoice2-0.5B")
    p.add_argument("--prompt-text", default="希望你以后能够做的比我还好呦。")
    p.add_argument("--prompt-wav", required=True)
    args = p.parse_args()

    vendor = Path(__file__).resolve().parents[1] / "vendors" / "cosyvoice"
    sys.path.insert(0, str(vendor))
    sys.path.insert(0, str(vendor / "third_party" / "Matcha-TTS"))
    from cosyvoice.cli.cosyvoice import AutoModel

    model = AutoModel(model_dir=args.model)
    out = Path(args.out)
    out.parent.mkdir(parents=True, exist_ok=True)
    for i, chunk in enumerate(model.inference_zero_shot(args.text, args.prompt_text, args.prompt_wav, stream=False)):
        torchaudio.save(str(out), chunk["tts_speech"], model.sample_rate)
        if i == 0:
            break
    print(out)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())


IndexTTS2:感情制御 + 尺合わせ

python
#!/usr/bin/env python3
from __future__ import annotations

import argparse
import sys
from pathlib import Path


def main() -> int:
    p = argparse.ArgumentParser()
    p.add_argument("--text", default="こんにちは。IndexTTSのテストです。")
    p.add_argument("--out", default="outputs/index_tts.wav")
    p.add_argument("--model-dir", default="checkpoints")
    p.add_argument("--prompt-wav", required=True)
    p.add_argument("--device", default="cuda")
    p.add_argument("--emo", default="")   # 感情ベクトルまたは自然言語テキスト
    args = p.parse_args()

    vendor = Path(__file__).resolve().parents[1] / "vendors" / "index-tts"
    model_dir = Path(args.model_dir)
    if not model_dir.is_absolute():
        model_dir = (Path.cwd() / model_dir).resolve()
    cfg_path = model_dir / "config.yaml"

    sys.path.insert(0, str(vendor))
    sys.path.insert(0, str(vendor / "indextts"))
    from indextts.infer_v2 import IndexTTS2

    tts = IndexTTS2(
        model_dir=str(model_dir),
        cfg_path=str(cfg_path),
        use_fp16=args.device.startswith("cuda"),
        device=args.device,
    )
    out = Path(args.out)
    out.parent.mkdir(parents=True, exist_ok=True)
    tts.infer(
        spk_audio_prompt=args.prompt_wav,
        text=args.text,
        output_path=str(out),
        emo_vector=args.emo or None,
    )
    print(out)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

--emo 引数に感情を指定します。emo_vector=None にすると参照音声から感情を自動継承します。


よく使う用語の解説

用語説明
Zero-shot Clone事前ファインチューニングなしに数秒の参照音声だけで話者を模倣する技術
Emotion Exaggeration感情の強度を誇張するパラメータ。1.0が通常で、2.0にすると喜怒哀楽が強調される
Paralinguistic Tags[laugh] [cough] のように非言語的な音声表現をテキストで指示するタグ
Duration Control生成音声の長さ(尺)を指定時間に合わせる機能。動画吹き替えで有効
Cross-lingual Cloning参照音声と異なる言語でその話者の声を再現する技術
x-vector話者の声質を表す固定長の特徴ベクトル。発話内容に依存しない話者表現
Semantic Tokenテキストの意味情報を圧縮したトークン列。Fish Speechではwav変換の中間表現として使用

FAQ

Q. GPU VRAMはどのくらい必要ですか?

0.5B〜1.7Bのモデルがほとんどなので、fp16・bf16で動かす場合は概ね4〜8GB VRAMがあれば動きます。Chatterbox Turbo(350M)は最も軽量で、4GBのGPUでも余裕があります。Qwen3-TTS 1.7Bをbf16で動かすには8〜12GBが目安です。

Q. CPUのみで動きますか?

動きますが、実用的な速度になりません。リアルタイム生成(入力テキストの長さに対して等倍以下の生成時間)には基本的にGPUが必要です。品質確認目的での試用ならCPUでも可能です。

Q. 日本語品質が最も高いのはどれですか?

本記事で比較した範囲では、Qwen3-TTS(日本語を正式サポート)とFish Speech S2 Pro(80言語対応)の2択になります。ただし日本語音声の評価は参照音声や読み上げテキストに強く依存するため、自分のユースケースで実際に試すのが最も正確です。

Q. 参照音声に最適な長さはありますか?

モデルによって異なりますが、3〜10秒程度が実用的な範囲です。短すぎると話者特徴が不足し、長すぎても精度向上の効果は頭打ちになります。ノイズのない明瞭な発話が含まれていることの方が長さより重要です。

Q. Qwen3-TTSのVoiceDesignモードはどう使うのですか?

CustomVoiceモードまたはVoiceDesignモードのモデルを使い、textフィールドに音声設計の自然言語記述を渡します。例:"A calm, middle-aged male voice with a slight husky tone."。Cloneモードのモデル(*-Base)では使えません。

Q. Fish Speechの商用ライセンスはどこで確認できますか?

HuggingFaceの各モデルカード(fishaudio/fish-speech-1.5 など)の LICENSE ファイルを直接確認してください。モデルによってCC-BY-NC-SA-4.0(非商用)とFish Audio Research License(条件付き商用可)が混在しています。「バージョン = ライセンス」の関係が変わることがあるため、HuggingFaceの最新のライセンスファイルを必ず参照してください。


まとめ

オープンソースTTSは2026年に入り「クラウドAPIの代替」として十分な品質水準に達しました。ただし、品質・ライセンス・機能の三軸でモデルごとに大きな差があるため、ユースケースとライセンス要件を整理してから選定することが重要です。

特にFish SpeechとIndexTTS2はライセンスに落とし穴があるため、商用プロジェクトへの採用前に必ずライセンス原文を精読してください。品質重視かつライセンスを明快にしたいなら、Qwen3-TTS(Apache-2.0)またはCosyVoice 3.0(Apache-2.0)を起点にするのが現時点での安全な選択です。

関連するブログ

この記事に近いテーマのブログをピックアップしています。