この記事の対象読者
- Pythonの基本(pip、conda)を使える方
- 音声合成・ボイスクローンに興味がある方
- WindowsでAI開発をしている方
- 「ElevenLabsは高いけど、ローカルで動かしたい」と思っている方
この記事で得られること
- CosyVoiceの概念と、なぜ今注目されているかの理解
- Windowsでの環境構築手順(RTX 5090対応含む)
- 3秒の音声からボイスクローンを実行する方法
- Whisperと連携した自動文字起こしワークフロー
この記事で扱わないこと
- Linuxでの環境構築(公式ドキュメントを参照)
- モデルのファインチューニング
- 商用利用に関する法的アドバイス
1. CosyVoiceとの出会い
「3秒の音声で、誰の声でもクローンできる」
最初にこれを聞いたとき、正直信じられませんでした。
ElevenLabsやVOICEVOXは知っていましたが、たった3秒で?しかもオープンソース?
実際に試してみると、その品質に驚きました。
中国語・英語はもちろん、日本語もかなり自然に発音します。
ただ、一つ大きな問題がありました。
「Linux専用じゃん...」
私はWindows + RTX 5090という環境で開発しています。
Dockerやwslで動かすのは面倒だし、GPUのパススルー設定も煩雑です。
「なんとかWindowsネイティブで動かせないか」
そう思って格闘すること数日。
DLLエラー、torchcodecエラー、APIの破壊的変更...
一つ一つ解決して、ついにWindowsで完全動作するフォーク版を完成させました。
ここまでで、私がなぜこの記事を書いているか、なんとなく伝わったでしょうか。
次は、CosyVoiceがどんな技術なのか、その背景から見ていきましょう。
2. 前提知識の確認
本題に入る前に、この記事で使う用語を整理しておきます。
TTS(Text-to-Speech)とは
テキストを音声に変換する技術です。
VOICEVOXやCoeFont、商用ではElevenLabsが有名です。
ボイスクローンとは
既存の音声から声質を抽出し、任意のテキストをその声で読み上げる技術です。
従来は数時間分の音声データが必要でしたが、最新技術では数秒で可能になりました。
ゼロショット音声合成とは
事前学習なしで、参照音声だけから声をクローンする技術です。
CosyVoiceはこの「ゼロショット」に特化しています。
LLM(Large Language Model)ベースTTSとは
GPTのような大規模言語モデルの技術をTTSに応用したものです。
文脈を理解して、より自然なイントネーションや感情表現が可能になります。
これらの用語が押さえられたら、次に進みましょう。
3. CosyVoiceが生まれた背景
3.1 Alibaba FunAudioLLMチームの挑戦
CosyVoiceは、Alibaba CloudのFunAudioLLMチームが開発しました。
2024年7月にバージョン1.0がリリースされ、急速に進化を続けています。
| バージョン | リリース | 特徴 |
|---|---|---|
| CosyVoice 1.0 | 2024/07 | 初期リリース、300Mパラメータ |
| CosyVoice 2.0 | 2024/12 | 25Hz対応、ストリーミング |
| CosyVoice 3.0 | 2025/05 | 9言語対応、18方言、SOTA性能 |
3.2 なぜCosyVoiceが注目されているか
他のオープンソースTTSと比較してみましょう。
| モデル | サイズ | 中国語WER↓ | 英語WER↓ | オープンソース |
|---|---|---|---|---|
| Seed-TTS | 非公開 | 1.12 | 2.25 | No |
| F5-TTS | 0.3B | 1.52 | 2.00 | Yes |
| CosyVoice2 | 0.5B | 1.45 | 2.57 | Yes |
| CosyVoice3 | 0.5B | 0.81 | 1.68 | Yes |
WER(Word Error Rate)は低いほど良い指標です。
CosyVoice3は、オープンソースでありながらクローズドなSeed-TTSを超える性能を達成しています。
背景がわかったところで、抽象的な概念から順に、具体的な仕組みを見ていきましょう。
4. CosyVoiceの基本概念
4.1 アーキテクチャ概要
CosyVoiceは以下の3つのコンポーネントで構成されています。
テキスト → [Text Encoder] → [LLM] → [Flow Matching Decoder] → 音声
↑
[Speech Tokenizer] ← 参照音声
- Text Encoder: テキストを意味ベクトルに変換
- Speech Tokenizer: 参照音声から声質を抽出
- LLM: 両者を統合して音声トークンを生成
- Flow Matching Decoder: トークンを波形に変換
4.2 3つの推論モード
CosyVoice3は用途に応じて3つのモードを提供しています。
| モード | 用途 | 特徴 |
|---|---|---|
| zero_shot | 3秒ボイスクローン | 最も高品質な声質再現 |
| cross_lingual | 多言語クローン | 日本語→英語など言語をまたぐ |
| instruct2 | 自然言語制御 | 「優しく話して」などの指示対応 |
4.3 <|endofprompt|>トークンの重要性
CosyVoice3では、この特殊トークンが重要な役割を果たします。
# 悪い例(中国語っぽくなる)
text = "こんにちは、音声合成のテストです。"
# 良い例(正しく日本語で発音)
text = "こんにちは、音声合成のテストです。<|endofprompt|>"
このトークンがないと、モデルが「まだプロンプトが続く」と解釈してしまいます。
私のフォーク版では、この処理を自動化しています。
基本概念が理解できたところで、これらの抽象的な概念を具体的なコードで実装していきましょう。
5. Windowsでの環境構築
5.1 私がハマったポイント
最初に、私が遭遇したエラーとその原因を共有します。
OSError: Error loading c10.dll
「なんでDLLエラー?PyTorchは正しく入ってるのに...」
原因は、GradioがPyTorchより先にインポートされるとDLL依存関係が壊れること。
Pythonのimport順序がこんな影響を与えるとは思いませんでした。
5.2 環境構築手順
Conda環境の作成
conda create -n cosyvoice3 python=3.10 -y
conda activate cosyvoice3
PyTorchのインストール(RTX 5090対応)
RTX 5090(Blackwell / sm_120)を使う場合、PyTorch nightlyが必須です。
# RTX 5090 / RTX 50シリーズの場合(CUDA 12.8)
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128
# RTX 40シリーズ以前の場合(CUDA 12.4)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
依存関係のインストール
# リポジトリのクローン
git clone --recursive https://github.com/hiroki-abe-58/CosyVoice-JP.git
cd CosyVoice-JP
git submodule update --init --recursive
# 依存関係
pip install -r requirements.txt
# Windows互換性のための追加パッケージ
pip install soundfile
pip install "ruamel.yaml>=0.15.0,<0.18.0"
# Whisper(自動文字起こし用)
pip install openai-whisper
5.3 設定ファイルテンプレート
以下の3種類の設定を用途に応じて使い分けてください。
開発環境用(config_dev.yaml)
# config_dev.yaml - 開発環境用(このままコピーして使える)
model:
name: "Fun-CosyVoice3-0.5B-2512"
local_dir: "pretrained_models/Fun-CosyVoice3-0.5B-2512"
device: "cuda:0"
dtype: "float16"
whisper:
model_size: "small" # 開発中は軽量モデルで高速化
language: "auto"
server:
port: 7865
auto_open_browser: true
debug: true # デバッグログ出力
本番環境用(config_prod.yaml)
# config_prod.yaml - 本番環境用(高品質設定)
model:
name: "Fun-CosyVoice3-0.5B-2512"
local_dir: "pretrained_models/Fun-CosyVoice3-0.5B-2512"
device: "cuda:0"
dtype: "float16"
whisper:
model_size: "large" # 本番は高精度モデル
language: "auto"
server:
port: 8080
auto_open_browser: false
debug: false
低VRAMマシン用(config_lowvram.yaml)
# config_lowvram.yaml - VRAM 8GB以下のマシン用
model:
name: "Fun-CosyVoice3-0.5B-2512"
local_dir: "pretrained_models/Fun-CosyVoice3-0.5B-2512"
device: "cuda:0"
dtype: "float32" # 安定性重視
whisper:
model_size: "tiny" # 軽量モデル
language: "ja" # 言語固定でメモリ節約
server:
port: 7865
auto_open_browser: true
debug: false
5.4 モデルのダウンロード
"""
CosyVoice3モデルダウンロードスクリプト
使い方: python download_model.py
"""
from huggingface_hub import snapshot_download
import os
def download_cosyvoice3():
"""CosyVoice3モデルをダウンロード"""
model_id = "FunAudioLLM/Fun-CosyVoice3-0.5B-2512"
local_dir = "pretrained_models/Fun-CosyVoice3-0.5B-2512"
print(f"Downloading {model_id}...")
snapshot_download(
model_id,
local_dir=local_dir,
resume_download=True # 中断しても再開可能
)
print(f"Downloaded to {local_dir}")
# ダウンロード確認
if os.path.exists(os.path.join(local_dir, "config.json")):
print("Download successful!")
else:
print("Download may have failed. Please check.")
if __name__ == "__main__":
download_cosyvoice3()
5.5 起動
# ワンクリック起動(推奨)
# run.bat をダブルクリック
# または、コマンドラインから
python launcher.py
5.6 実行結果
$ python launcher.py
[INFO] Checking port 7865... Available
[INFO] Starting CosyVoice-JP WebUI...
[INFO] Loading model: Fun-CosyVoice3-0.5B-2512
[INFO] Model loaded successfully
[INFO] Opening browser in 8 seconds...
Running on local URL: http://localhost:7865
5.7 よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
OSError: Error loading c10.dll |
GradioがPyTorchより先にロード | フォーク版を使用(import順序修正済み) |
TorchCodec is required |
torchaudioのAPI変更 |
pip install soundfile で代替 |
'Loader' object has no attribute 'max_depth' |
ruamel.yaml互換性問題 | pip install "ruamel.yaml>=0.15.0,<0.18.0" |
CUDA out of memory |
VRAM不足 | config_lowvram.yaml を使用 |
| 音声が中国語っぽい | endofpromptトークン欠落 | フォーク版を使用(自動付与) |
基本的な使い方をマスターしたので、次は応用例を見ていきましょう。
6. ユースケース別ガイド
6.1 ユースケース1: YouTubeナレーション用の声を作る
想定読者: 動画制作者、ポッドキャスター
推奨構成: 3秒ボイスクローン + 高品質設定
サンプルコード:
"""
YouTubeナレーション用の音声を生成
"""
import sys
sys.path.append(".")
from cosyvoice.cli.cosyvoice import CosyVoice
import torchaudio
def generate_narration():
# モデル読み込み
model = CosyVoice(
"pretrained_models/Fun-CosyVoice3-0.5B-2512",
load_jit=False
)
# ナレーション原稿
script = """
皆さんこんにちは。今日は音声合成AIの最新技術について解説します。
たった3秒の音声から、誰の声でもクローンできる時代が来ました。
"""
# 参照音声(自分の声を3秒録音したもの)
ref_audio = "my_voice_sample.wav"
ref_text = "これは私の声のサンプルです。"
# 音声生成
for i, result in enumerate(model.inference_zero_shot(
tts_text=script + "<|endofprompt|>",
prompt_text=ref_text,
prompt_speech_16k=ref_audio
)):
torchaudio.save(
f"narration_output_{i}.wav",
result["tts_speech"],
22050
)
print(f"Generated: narration_output_{i}.wav")
if __name__ == "__main__":
generate_narration()
6.2 ユースケース2: 多言語コンテンツの制作
想定読者: 国際的なコンテンツ制作者
推奨構成: 多言語クローンモード
サンプルコード:
"""
日本語の声で英語を話させる(多言語クローン)
"""
from cosyvoice.cli.cosyvoice import CosyVoice
import torchaudio
def cross_lingual_synthesis():
model = CosyVoice(
"pretrained_models/Fun-CosyVoice3-0.5B-2512",
load_jit=False
)
# 日本語の参照音声
ref_audio = "japanese_speaker.wav"
# 英語のテキストを日本語話者の声で
english_text = "Hello everyone. Welcome to my channel.<|endofprompt|>"
for result in model.inference_cross_lingual(
tts_text=english_text,
prompt_speech_16k=ref_audio
):
torchaudio.save("english_with_japanese_voice.wav",
result["tts_speech"], 22050)
print("Generated: english_with_japanese_voice.wav")
if __name__ == "__main__":
cross_lingual_synthesis()
6.3 ユースケース3: 感情表現のコントロール
想定読者: ゲーム開発者、オーディオブック制作者
推奨構成: 自然言語制御モード
サンプルコード:
"""
感情を指定して音声を生成
"""
from cosyvoice.cli.cosyvoice import CosyVoice
import torchaudio
def emotional_synthesis():
model = CosyVoice(
"pretrained_models/Fun-CosyVoice3-0.5B-2512",
load_jit=False
)
ref_audio = "neutral_voice.wav"
text = "今日は本当に素晴らしい一日でした。<|endofprompt|>"
# 異なる感情で同じテキストを生成
emotions = [
"嬉しそうに、明るく話して",
"悲しそうに、ゆっくり話して",
"怒っているように、早口で話して",
"囁くように、優しく話して"
]
for i, emotion in enumerate(emotions):
for result in model.inference_instruct2(
tts_text=text,
instruct_text=emotion,
prompt_speech_16k=ref_audio
):
filename = f"emotion_{i}_{emotion[:4]}.wav"
torchaudio.save(filename, result["tts_speech"], 22050)
print(f"Generated: {filename}")
if __name__ == "__main__":
emotional_synthesis()
ユースケースが把握できたところで、この記事を読んだ後の学習パスを確認しましょう。
7. 学習ロードマップ
この記事を読んだ後、次のステップとして以下をおすすめします。
初級者向け(まずはここから)
- WebUIで遊ぶ: run.batでGUIを起動し、いろいろな音声を試す
- Whisperと連携: 自動文字起こし機能を使って効率的にクローン
- CosyVoice公式デモを試す
中級者向け(実践に進む)
- Pythonスクリプトで自動化: 上記のサンプルコードをカスタマイズ
- バッチ処理の実装: 複数のテキストを一括で音声化
- vLLMで高速化
上級者向け(さらに深く)
- CosyVoice3論文を読む
- ファインチューニングに挑戦
- TensorRT-LLMでの本番デプロイ
8. まとめ
この記事では、CosyVoiceについて以下を解説しました:
- CosyVoiceとは: Alibaba発のオープンソース音声クローンAI
- Windows対応の課題: DLLエラー、torchcodec問題などを解決
- 環境構築: RTX 5090含む最新GPUでの動作手順
- 3つの推論モード: zero_shot、cross_lingual、instruct2の使い分け
- 実践的なユースケース: ナレーション、多言語、感情制御
私の所感
正直、CosyVoice3の品質には驚きました。
オープンソースでここまでできるのかと。
特に日本語の発音は、商用サービスと比べても遜色ありません。
ただし、Windowsで動かすまでの道のりは険しかった...。
今回のフォーク版が、同じ悩みを持つ方の助けになれば幸いです。
お役に立ちましたら是ぜひGitHubリポジトリにスターをお願いします!