5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qwen3-TTSで自分の声をクローンしてみた

5
Last updated at Posted at 2026-01-26

ChatGPT Image 2026年1月26日 14_38_28.png

背景

音声合成技術は日々進歩しており、2026年1月にはQwen3-TTSというモデルが公開されました。このモデルはわずか3秒の音声サンプルで声のクローンが可能で、日本語を含む10言語以上に対応し、完全オープンソース(Apache 2.0ライセンス)として提供されています。
理解を深めるには自分で手を動かすのが一番ということで、Google Colab上で実際に試してみることにしました。

Qwen3-TTSとは

概要

Qwen3-TTSは、2026年1月にAlibaba CloudのQwenチームが発表した最先端のテキスト音声合成(Text-to-Speech)モデルで、500万時間以上の音声データで学習、10言語以上に対応した多機能な音声生成システムです。

アーキテクチャの概要

Qwen3-TTSの全体構成を以下の図に示します:

この図が示すように、Qwen3-TTSはテキストトークン(紫)と音声コーデックトークン(黄緑)を同時に扱うデュアルトラック構造を採用しています。モデルが音声トークンを逐次予測し、Streaming Codec Decoderが即座に波形へ復元することで、リアルタイムのストリーミング音声合成を実現します。さらに12Hz系では、MTPにより複数コードブックを効率的に生成し、低遅延化を可能にしています。

2種類の音声トークナイザー

また、Qwen3-TTSは用途に応じて2種類のトークナイザーを提供しています:

(a) Qwen-TTS-Tokenizer-25Hz

音声をエンコーダで処理し、VQで離散トークン(単一コードブック)に変換します。復元時はトークンからメルスペクトログラムを再構成し、最終的に音声波形を生成します。

(b) Qwen-TTS-Tokenizer-12Hz
意味(セマンティック)+音の細かさ(音響)を分けて表す、階層型のマルチコードブック(12.5Hz)です。軽量な因果ConvNetだけで波形を逐次復元できるため、超低遅延のストリーミングに向きます。

そのほかの特徴

Qwen3-TTSは、3秒の短い音声からのボイスクローンと、文章による指示(description-based control)で声質や話し方を細かく調整できるのが大きな特徴です。さらに、10言語・500万時間超の大規模データで学習され、ストリーミング前提の低遅延設計によりリアルタイム合成に強いモデルです。最後に、モデルとトークナイザーがApache 2.0で公開されており、研究・開発に使いやすい点も特徴です。

実装:Google Colabで声のクローニングを試す

それでは、実際にQwen3-TTSを使って自分の声をクローンしてみましょう。Google Colabを使えば、GPUを無料で利用でき、環境構築も不要です。なお、私はプランの都合上T4 GPUを使用しています。

必要なもの

  • Googleアカウント(Colab使用のため)
  • 3秒以上の自分の音声ファイル(MP3、WAV、M4Aなど)
  • GPU環境

ステップ1:環境セットアップとモデルロード

まず、必要なパッケージをインストールします。

# ffmpegのインストール(MP3/MPEG形式の変換に必要)
!apt-get -qq install -y ffmpeg

# 必要なPythonパッケージのインストール
!pip install -q qwen-tts soundfile pydub librosa

print("インストール完了")

2. ライブラリのインポート

必要なライブラリをインポートし、GPUが利用可能か確認します。

import torch
import soundfile as sf
from IPython.display import Audio, display
from qwen_tts import Qwen3TTSModel
import os
import librosa
import numpy as np

# GPU/CPUの自動検出
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"\n使用デバイス: {device}")
if torch.cuda.is_available():
    print(f"GPU名: {torch.cuda.get_device_name(0)}")

3. 音声形式変換用のヘルパー関数

MP3などの圧縮形式をWAVに変換する関数を定義します。

def convert_to_wav_if_needed(audio_path):
    """MP3/MPEG形式の場合はWAVに変換する"""
    file_ext = os.path.splitext(audio_path)[1].lower()
    
    if file_ext in ['.wav', '.wave']:
        print(f"✓ WAV形式を検出: {audio_path}")
        return audio_path
    
    if file_ext in ['.mp3', '.mpeg', '.mpga', '.m4a']:
        print(f"🔄 {file_ext}形式を検出: WAV形式に変換中...")
        audio_data, sample_rate = librosa.load(audio_path, sr=None, mono=True)
        wav_path = audio_path.rsplit('.', 1)[0] + '_converted.wav'
        sf.write(wav_path, audio_data, sample_rate)
        print(f"変換完了: {wav_path}")
        return wav_path
    
    return audio_path

4. CustomVoiceモデルのテスト(任意)

まず、プリセットボイスを試してモデルの動作を確認します(この部分はスキップ可能)

print("CustomVoiceモデルをロード中...")
model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
    device_map="cuda:0" if torch.cuda.is_available() else "cpu",
    dtype=torch.bfloat16,
)
print("モデルのロード完了")

# プリセットボイスで音声生成のテスト
japanese_texts = [
    "こんにちは。私はQwen3-TTSです。自然な音声で10言語以上を話すことができます。",
]

for i, text in enumerate(japanese_texts, 1):
    print(f"\n▶ テキスト {i}: {text[:40]}...")
    
    wavs, sr = model.generate_custom_voice(
        text=text,
        language="Japanese",
        speaker="Ono_Anna",
    )
    
    output_path = f"japanese_{i}.wav"
    sf.write(output_path, wavs[0], sr)
    display(Audio(wavs[0], rate=sr, autoplay=False))

print("\n音声生成完了")

5. Baseモデルのロード(声のクローニング用)

声のクローニング用のBaseモデルをロードします。

print("\nBaseモデルをロード中...")
clone_model = Qwen3TTSModel.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-1.7B-Base",
    device_map="cuda:0" if torch.cuda.is_available() else "cpu",
    dtype=torch.bfloat16,
)
print("Baseモデルのロード完了")

6. 参照音声のアップロード

クローン元となる音声ファイルをアップロードします。

from google.colab import files

print("\n📁 音声ファイルをアップロードしてください")
print("   ・対応形式: mp3, wav, flac, m4a など")
print("   ・推奨長さ: 3秒以上")

uploaded = files.upload()
ref_audio_path = list(uploaded.keys())[0]
print(f"\nアップロードされたファイル: {ref_audio_path}")

# 必要に応じてWAV形式に変換
ref_audio_path = convert_to_wav_if_needed(ref_audio_path)

7. 参照音声のテキスト入力

アップロードした音声で話している内容を入力します。

print("\n📝 アップロードした音声で実際に話している内容を入力してください")
print("   例: 'こんにちは、今日はいい天気ですね。'")

ref_text = input("\n参照テキスト: ")
print(f"\n参照テキスト: {ref_text}")

8. 声のクローニング実行

クローンした声で新しいテキストを読み上げます。

print("\n声のクローニング実行中...")

test_texts = [
    "おはよう",
    "今日も一日頑張りましょう",
]

for i, text in enumerate(test_texts, 1):
    print(f"\n▶ テキスト {i}: {text}")
    
    wavs, sr = clone_model.generate_voice_clone(
        text=text,
        language="Japanese",
        ref_audio=ref_audio_path,
        ref_text=ref_text,
    )
    
    output_path = f"cloned_{i}.wav"
    sf.write(output_path, wavs[0], sr)
    print(f"   💾 保存: {output_path}")
    display(Audio(wavs[0], rate=sr, autoplay=False))

print("\n声のクローニング完了")

安全性と倫理的配慮

音声クローニング技術は便利で強力なツールですが、同時に悪用のリスクも伴います。2024年のMcAfee調査によると、成人の4人に1人がAI音声詐欺を経験しており、10人に1人が直接的な標的になっていると報告されています。これは、ソーシャルメディアの投稿やポッドキャストなどから簡単に音声サンプルを収集できるため、攻撃の障壁が極めて低くなっていることが一因です。

本記事で紹介した技術を使用する際は、必ず本人の同意を得た上で、なりすましや詐欺などの悪用は絶対に避けてください。音声クローニング技術は強力なツールであり、使用者一人ひとりが責任を持って倫理的に扱うことが求められています。

さいごに

最後までお読みいただきありがとうございました。
技術の進歩は目覚ましいものがありますが、倫理的な配慮を忘れずに、責任を持って活用していきましょう。

参考文献

5
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?