すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Model Studio:Qwen 音声クローン API リファレンス

最終更新日:Feb 12, 2026

Qwen 音声クローンは、学習を必要としない特徴量抽出モデルを用いて音声をクローンします。10~20 秒の音声を提供することで、元の音声に極めて近似し、自然な発話品質を持つカスタム音声を生成できます。音声クローンと音声合成は、順次実行される 2 つのステップです。本ドキュメントでは、音声クローンのパラメーターおよびインターフェイス仕様について説明します。音声合成については、「リアルタイム音声合成 - Qwen」または「音声合成 - Qwen」をご参照ください。

ユーザーガイド:モデルの概要および選択推奨事項については、「リアルタイム音声合成 - Qwen」または「音声合成 - Qwen」をご参照ください。

重要

本ドキュメントは、Qwen 音声クローンインターフェイスにのみ適用されます。CosyVoice モデルを使用する場合は、「CosyVoice 音声クローン API」をご参照ください。

オーディオ要件

最適なクローン結果を得るには、高品質な入力音声が不可欠です。

項目

要件

対応フォーマット

WAV (16 ビット)、MP3、M4A

音声長

推奨:10~20 秒。最大:60 秒。

ファイルサイズ

< 10 MB

サンプルレート

≥ 24 kHz

音声チャンネル

モノラル

内容

音声には、少なくとも 3 秒間の連続的かつ明瞭な発話(バックグラウンドノイズなし)が含まれている必要があります。残りの部分には、短い一時停止(≤ 2 秒)を含めることができます。高品質なコア音声コンテンツを確保するため、クリップ全体でバックグラウンド音楽、ノイズ、または他の人物の音声を避けてください。通常の会話音声を入力として使用してください。正確で実用的なクローン結果を得るために、楽曲や歌唱音声のアップロードは行わないでください。

言語

中国語 (zh)、英語 (en)、ドイツ語 (de)、イタリア語 (it)、ポルトガル語 (pt)、スペイン語 (es)、日本語 (ja)、韓国語 (ko)、フランス語 (fr)、ロシア語 (ru)

クイックスタート:クローンから合成へ

image

1. ワークフロー

音声クローンと音声合成は、別個の処理ですが密接に関連しており、「まず作成して、その後利用する」というワークフローに従います。

  1. 音声の作成

    音声の作成 インターフェイスを呼び出し、音声クリップをアップロードします。システムが音声を解析し、カスタムクローン音声を作成します。必ず target_model を指定する必要があります。これは、作成された音声を駆動する音声合成モデルを定義します。

    すでに音声をお持ちの場合は(音声の一覧表示 インターフェイスを呼び出して確認)、このステップをスキップして次のステップに進んでください。

  2. 音声合成への音声の利用

    音声合成インターフェイスを呼び出し、前ステップで作成した音声を渡します。ここで指定する音声合成モデルは、前ステップで指定した target_model と一致している必要があります。

2. モデル構成および事前準備

適切なモデルを選択し、必要な準備を完了してください。

モデル構成

音声クローンのために、以下の 2 つのモデルを指定します。

  • 音声クローンモデル:qwen-voice-enrollment

  • 音声を駆動する音声合成モデル:

事前準備

  1. API キーの取得:「API キーの取得」をご参照ください。セキュリティのため、API キーを環境変数として設定することを推奨します。

  2. SDK のインストール:最新版 DashScope SDK がインストール済みであることを確認してください。「最新版 DashScope SDK のインストール」をご参照ください。

  3. クローン用音声の準備:音声は「音声入力要件」を満たす必要があります。

3. 端から端までの実行例

以下の例では、カスタムクローン音声を音声合成で使用して、元の音声に極めて近似した出力を生成する方法を示します。

  • 基本原則:音声クローン時に指定する target_model(音声を駆動する音声合成モデル)は、音声合成呼び出しで使用するモデルと一致している必要があります。一致しない場合、合成は失敗します。

  • この例では、音声クローン用にローカルの音声ファイル voice.mp3 を使用しています。コードを実行する際は、ご自身のファイルに置き換えてください。

双方向ストリーミング合成

Qwen3-TTS-VC-Realtime シリーズモデルに適用されます。詳細については、「リアルタイム音声合成 - Qwen」をご参照ください。

Python

# coding=utf-8
# pyaudio のインストール手順:
# APPLE Mac OS X
#   brew install portaudio
#   pip install pyaudio
# Debian/Ubuntu
#   sudo apt-get install python-pyaudio python3-pyaudio
#   または
#   pip install pyaudio
# CentOS
#   sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# Microsoft Windows
#   python -m pip install pyaudio

import pyaudio
import os
import requests
import base64
import pathlib
import threading
import time
import dashscope  # DashScope Python SDK のバージョンは 1.23.9 以降である必要があります。
from dashscope.audio.qwen_tts_realtime import QwenTtsRealtime, QwenTtsRealtimeCallback, AudioFormat

# ======= 定数 =======
DEFAULT_TARGET_MODEL = "qwen3-tts-vc-realtime-2026-01-15"  # 音声クローンと音声合成で同じモデルを使用
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3"  # 音声クローン用のローカル音声ファイルへの相対パス

TEXT_TO_SYNTHESIZE = [
    'そうですね?このようなスーパーが大好きです。',
    '特に中国の旧正月の時期には、',
    '買い物に行くと、',
    'とてもとても嬉しい気分になります!',
    '買いたいものがたくさんあります!'
]

def create_voice(file_path: str,
                 target_model: str = DEFAULT_TARGET_MODEL,
                 preferred_name: str = DEFAULT_PREFERRED_NAME,
                 audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
    """
    音声を作成し、音声パラメーターを返します。
    """
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数が設定されていない場合は、次の行を置き換えてください:api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")

    file_path_obj = pathlib.Path(file_path)
    if not file_path_obj.exists():
        raise FileNotFoundError(f"音声ファイルが見つかりません:{file_path}")

    base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
    data_uri = f"data:{audio_mime_type};base64,{base64_str}"

    # シンガポールリージョンの URL。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
    payload = {
        "model": "qwen-voice-enrollment", # この値を変更しないでください
        "input": {
            "action": "create",
            "target_model": target_model,
            "preferred_name": preferred_name,
            "audio": {"data": data_uri}
        }
    }
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }

    resp = requests.post(url, json=payload, headers=headers)
    if resp.status_code != 200:
        raise RuntimeError(f"音声の作成に失敗しました:{resp.status_code}、{resp.text}")

    try:
        return resp.json()["output"]["voice"]
    except (KeyError, ValueError) as e:
        raise RuntimeError(f"音声応答の解析に失敗しました:{e}")

def init_dashscope_api_key():
    """
    DashScope SDK の API キーを初期化します。
    """
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数が設定されていない場合は、次の行を置き換えてください:dashscope.api_key = "sk-xxx"
    dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

# ======= コールバッククラス =======
class MyCallback(QwenTtsRealtimeCallback):
    """
    カスタム TTS ストリーミングコールバック
    """
    def __init__(self):
        self.complete_event = threading.Event()
        self._player = pyaudio.PyAudio()
        self._stream = self._player.open(
            format=pyaudio.paInt16, channels=1, rate=24000, output=True
        )

    def on_open(self) -> None:
        print('[TTS] 接続が確立されました')

    def on_close(self, close_status_code, close_msg) -> None:
        self._stream.stop_stream()
        self._stream.close()
        self._player.terminate()
        print(f'[TTS] 接続が閉じられました。コード={close_status_code}、メッセージ={close_msg}')

    def on_event(self, response: dict) -> None:
        try:
            event_type = response.get('type', '')
            if event_type == 'session.created':
                print(f'[TTS] セッションが開始されました:{response["session"]["id"]}')
            elif event_type == 'response.audio.delta':
                audio_data = base64.b64decode(response['delta'])
                self._stream.write(audio_data)
            elif event_type == 'response.done':
                print(f'[TTS] 応答が完了しました。応答 ID:{qwen_tts_realtime.get_last_response_id()}')
            elif event_type == 'session.finished':
                print('[TTS] セッションが終了しました')
                self.complete_event.set()
        except Exception as e:
            print(f'[エラー] コールバックイベントの処理中にエラーが発生しました:{e}')

    def wait_for_finished(self):
        self.complete_event.wait()

# ======= メイン実行ロジック =======
if __name__ == '__main__':
    init_dashscope_api_key()
    print('[システム] Qwen TTS Realtime を初期化中...')

    callback = MyCallback()
    qwen_tts_realtime = QwenTtsRealtime(
        model=DEFAULT_TARGET_MODEL,
        callback=callback,
        # シンガポールリージョンの URL。北京リージョンのモデルを使用する場合は、wss://dashscope.aliyuncs.com/api-ws/v1/realtime に置き換えてください。
        url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime'
    )
    qwen_tts_realtime.connect()
    
    qwen_tts_realtime.update_session(
        voice=create_voice(VOICE_FILE_PATH), # 音声パラメーターをクローンされたカスタム音声に置き換えます。
        response_format=AudioFormat.PCM_24000HZ_MONO_16BIT,
        mode='server_commit'
    )

    for text_chunk in TEXT_TO_SYNTHESIZE:
        print(f'[テキスト送信中]:{text_chunk}')
        qwen_tts_realtime.append_text(text_chunk)
        time.sleep(0.1)

    qwen_tts_realtime.finish()
    callback.wait_for_finished()

    print(f'[メトリクス] session_id={qwen_tts_realtime.get_session_id()}, '
          f'first_audio_delay={qwen_tts_realtime.get_first_audio_delay()}秒')

Java

Gson 依存関係をインポートする必要があります。Maven または Gradle を使用する場合は、以下の依存関係を追加してください。

Maven

次の内容を pom.xml に追加します。

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.13.1</version>
</dependency>

Gradle

次の内容を build.gradle に追加します。

// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation("com.google.code.gson:gson:2.13.1")
import com.alibaba.dashscope.audio.qwen_tts_realtime.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

import javax.sound.sampled.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Queue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;

public class Main {
    // ===== 定数 =====
    // 音声クローンと音声合成で同じモデルを使用
    private static final String TARGET_MODEL = "qwen3-tts-vc-realtime-2026-01-15";
    private static final String PREFERRED_NAME = "guanyu";
    // 音声クローン用のローカル音声ファイルへの相対パス
    private static final String AUDIO_FILE = "voice.mp3";
    private static final String AUDIO_MIME_TYPE = "audio/mpeg";
    private static String[] textToSynthesize = {
            "そうですね?このようなスーパーが大好きです。",
            "特に中国の旧正月の時期には、",
            "買い物に行くと、",
            "とてもとても嬉しい気分になります!",
            "買いたいものがたくさんあります!"
    };

    // データ URI を生成
    public static String toDataUrl(String filePath) throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(filePath));
        String encoded = Base64.getEncoder().encodeToString(bytes);
        return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
    }

    // 音声を作成する API を呼び出す
    public static String createVoice() throws Exception {
        // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 環境変数が設定されていない場合は、次の行を置き換えてください:String apiKey = "sk-xxx"
        String apiKey = System.getenv("DASHSCOPE_API_KEY");

        String jsonPayload =
                "{"
                        + "\"model\": \"qwen-voice-enrollment\"," // この値を変更しないでください
                        + "\"input\": {"
                        +     "\"action\": \"create\","
                        +     "\"target_model\": \"" + TARGET_MODEL + "\","
                        +     "\"preferred_name\": \"" + PREFERRED_NAME + "\","
                        +     "\"audio\": {"
                        +         "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\""
                        +     "}"
                        + "}"
                        + "}";

        HttpURLConnection con = (HttpURLConnection) new URL("https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization").openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("Authorization", "Bearer " + apiKey);
        con.setRequestProperty("Content-Type", "application/json");
        con.setDoOutput(true);

        try (OutputStream os = con.getOutputStream()) {
            os.write(jsonPayload.getBytes(StandardCharsets.UTF_8));
        }

        int status = con.getResponseCode();
        System.out.println("HTTP ステータスコード:" + status);

        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(),
                        StandardCharsets.UTF_8))) {
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                response.append(line);
            }
            System.out.println("応答内容:" + response);

            if (status == 200) {
                JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
                return jsonObj.getAsJsonObject("output").get("voice").getAsString();
            }
            throw new IOException("音声の作成に失敗しました:" + status + " - " + response);
        }
    }

    // リアルタイム PCM 音声プレーヤークラス
    public static class RealtimePcmPlayer {
        private int sampleRate;
        private SourceDataLine line;
        private AudioFormat audioFormat;
        private Thread decoderThread;
        private Thread playerThread;
        private AtomicBoolean stopped = new AtomicBoolean(false);
        private Queue<String> b64AudioBuffer = new ConcurrentLinkedQueue<>();
        private Queue<byte[]> RawAudioBuffer = new ConcurrentLinkedQueue<>();

        // 音声フォーマットおよび音声ラインを初期化するコンストラクター
        public RealtimePcmPlayer(int sampleRate) throws LineUnavailableException {
            this.sampleRate = sampleRate;
            this.audioFormat = new AudioFormat(this.sampleRate, 16, 1, true, false);
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
            line = (SourceDataLine) AudioSystem.getLine(info);
            line.open(audioFormat);
            line.start();
            decoderThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (!stopped.get()) {
                        String b64Audio = b64AudioBuffer.poll();
                        if (b64Audio != null) {
                            byte[] rawAudio = Base64.getDecoder().decode(b64Audio);
                            RawAudioBuffer.add(rawAudio);
                        } else {
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }
            });
            playerThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (!stopped.get()) {
                        byte[] rawAudio = RawAudioBuffer.poll();
                        if (rawAudio != null) {
                            try {
                                playChunk(rawAudio);
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        } else {
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }
            });
            decoderThread.start();
            playerThread.start();
        }

        // 音声チャンクを再生し、再生完了までブロック
        private void playChunk(byte[] chunk) throws IOException, InterruptedException {
            if (chunk == null || chunk.length == 0) return;

            int bytesWritten = 0;
            while (bytesWritten < chunk.length) {
                bytesWritten += line.write(chunk, bytesWritten, chunk.length - bytesWritten);
            }
            int audioLength = chunk.length / (this.sampleRate*2/1000);
            // バッファー内の音声の再生が完了するまで待機
            Thread.sleep(audioLength - 10);
        }

        public void write(String b64Audio) {
            b64AudioBuffer.add(b64Audio);
        }

        public void cancel() {
            b64AudioBuffer.clear();
            RawAudioBuffer.clear();
        }

        public void waitForComplete() throws InterruptedException {
            while (!b64AudioBuffer.isEmpty() || !RawAudioBuffer.isEmpty()) {
                Thread.sleep(100);
            }
            line.drain();
        }

        public void shutdown() throws InterruptedException {
            stopped.set(true);
            decoderThread.join();
            playerThread.join();
            if (line != null && line.isRunning()) {
                line.drain();
                line.close();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        QwenTtsRealtimeParam param = QwenTtsRealtimeParam.builder()
                .model(TARGET_MODEL)
                // シンガポールリージョンの URL。北京リージョンのモデルを使用する場合は、wss://dashscope.aliyuncs.com/api-ws/v1/realtime に置き換えてください。
                .url("wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime")
                // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 環境変数が設定されていない場合は、次の行を置き換えてください:.apikey("sk-xxx")
                .apikey(System.getenv("DASHSCOPE_API_KEY"))
                .build();
        AtomicReference<CountDownLatch> completeLatch = new AtomicReference<>(new CountDownLatch(1));
        final AtomicReference<QwenTtsRealtime> qwenTtsRef = new AtomicReference<>(null);

        // リアルタイム音声プレーヤーインスタンスを作成
        RealtimePcmPlayer audioPlayer = new RealtimePcmPlayer(24000);

        QwenTtsRealtime qwenTtsRealtime = new QwenTtsRealtime(param, new QwenTtsRealtimeCallback() {
            @Override
            public void onOpen() {
                // 接続確立時の処理
            }
            @Override
            public void onEvent(JsonObject message) {
                String type = message.get("type").getAsString();
                switch(type) {
                    case "session.created":
                        // セッション作成時の処理
                        break;
                    case "response.audio.delta":
                        String recvAudioB64 = message.get("delta").getAsString();
                        // 音声をリアルタイムで再生
                        audioPlayer.write(recvAudioB64);
                        break;
                    case "response.done":
                        // 応答完了時の処理
                        break;
                    case "session.finished":
                        // セッション終了時の処理
                        completeLatch.get().countDown();
                    default:
                        break;
                }
            }
            @Override
            public void onClose(int code, String reason) {
                // 接続閉じられたときの処理
            }
        });
        qwenTtsRef.set(qwenTtsRealtime);
        try {
            qwenTtsRealtime.connect();
        } catch (NoApiKeyException e) {
            throw new RuntimeException(e);
        }
        QwenTtsRealtimeConfig config = QwenTtsRealtimeConfig.builder()
                .voice(createVoice()) // 音声パラメーターをクローンされたカスタム音声に置き換えます。
                .responseFormat(QwenTtsRealtimeAudioFormat.PCM_24000HZ_MONO_16BIT)
                .mode("server_commit")
                .build();
        qwenTtsRealtime.updateSession(config);
        for (String text:textToSynthesize) {
            qwenTtsRealtime.appendText(text);
            Thread.sleep(100);
        }
        qwenTtsRealtime.finish();
        completeLatch.get().await();

        // 音声再生の完了を待ってプレーヤーをシャットダウン
        audioPlayer.waitForComplete();
        audioPlayer.shutdown();
        System.exit(0);
    }
}

非ストリーミング/単方向ストリーミング合成

Qwen3-TTS-VC シリーズモデルに適用されます。詳細については、「音声合成 - Qwen」をご参照ください。

この例では、システム音声を使用した音声合成のための DashScope SDK 非ストリーミングサンプルコードを参照しています。また、voice パラメーターをカスタムクローン音声に置き換えています。単方向ストリーミング合成については、「音声合成 - Qwen」をご参照ください。

Python

import os
import requests
import base64
import pathlib
import dashscope

# ======= 定数設定 =======
DEFAULT_TARGET_MODEL = "qwen3-tts-vc-2026-01-22"  # 音声クローンと音声合成で同じモデルを使用
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3"  # 音声クローン用のローカル音声ファイルへの相対パス


def create_voice(file_path: str,
                 target_model: str = DEFAULT_TARGET_MODEL,
                 preferred_name: str = DEFAULT_PREFERRED_NAME,
                 audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
    """
    音声を作成し、音声パラメーターを返します。
    """
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数が設定されていない場合は、次の行を置き換えてください:api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")

    file_path_obj = pathlib.Path(file_path)
    if not file_path_obj.exists():
        raise FileNotFoundError(f"音声ファイルが存在しません:{file_path}")

    base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
    data_uri = f"data:{audio_mime_type};base64,{base64_str}"

    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
    payload = {
        "model": "qwen-voice-enrollment", # この値を変更しないでください
        "input": {
            "action": "create",
            "target_model": target_model,
            "preferred_name": preferred_name,
            "audio": {"data": data_uri}
        }
    }
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }

    resp = requests.post(url, json=payload, headers=headers)
    if resp.status_code != 200:
        raise RuntimeError(f"音声の作成に失敗しました:{resp.status_code}、{resp.text}")

    try:
        return resp.json()["output"]["voice"]
    except (KeyError, ValueError) as e:
        raise RuntimeError(f"音声応答の解析に失敗しました:{e}")


if __name__ == '__main__':
    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
    dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

    text = "今日の天気はどうですか?"
    # SpeechSynthesizer インターフェイスの使用方法:dashscope.audio.qwen_tts.SpeechSynthesizer.call(...)
    response = dashscope.MultiModalConversation.call(
        model=DEFAULT_TARGET_MODEL,
        # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        # 環境変数が設定されていない場合は、次の行を置き換えてください:api_key = "sk-xxx"
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        text=text,
        voice=create_voice(VOICE_FILE_PATH), # 音声パラメーターをクローンによって生成されたカスタム音声に置き換えます。
        stream=False
    )
    print(response)

Java

Gson 依存関係を追加してください。Maven または Gradle を使用する場合は、以下の依存関係を追加してください。

Maven

次の内容を pom.xml に追加します。

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.13.1</version>
</dependency>

Gradle

次の内容を build.gradle に追加します。

// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation("com.google.code.gson:gson:2.13.1")
重要

音声クローンによって生成されたカスタム音声を音声合成で使用する場合、音声を以下のように設定します。

MultiModalConversationParam param = MultiModalConversationParam.builder()
                .parameter("voice", "your_voice") // 音声パラメーターをクローンによって生成されたカスタム音声に置き換えます。
                .build();
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.utils.Constants;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Main {
    // ===== 定数定義 =====
    // 音声クローンと音声合成で同じモデルを使用
    private static final String TARGET_MODEL = "qwen3-tts-vc-2026-01-22";
    private static final String PREFERRED_NAME = "guanyu";
    // 音声クローン用のローカル音声ファイルへの相対パス
    private static final String AUDIO_FILE = "voice.mp3";
    private static final String AUDIO_MIME_TYPE = "audio/mpeg";

    // データ URI を生成
    public static String toDataUrl(String filePath) throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(filePath));
        String encoded = Base64.getEncoder().encodeToString(bytes);
        return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
    }

    // 音声を作成する API を呼び出す
    public static String createVoice() throws Exception {
        // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 環境変数が設定されていない場合は、次の行を置き換えてください:String apiKey = "sk-xxx"
        String apiKey = System.getenv("DASHSCOPE_API_KEY");

        String jsonPayload =
                "{"
                        + "\"model\": \"qwen-voice-enrollment\"," // この値を変更しないでください
                        + "\"input\": {"
                        +     "\"action\": \"create\","
                        +     "\"target_model\": \"" + TARGET_MODEL + "\","
                        +     "\"preferred_name\": \"" + PREFERRED_NAME + "\","
                        +     "\"audio\": {"
                        +         "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\""
                        +     "}"
                        + "}"
                        + "}";

        // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
        String url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization";
        HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("Authorization", "Bearer " + apiKey);
        con.setRequestProperty("Content-Type", "application/json");
        con.setDoOutput(true);

        try (OutputStream os = con.getOutputStream()) {
            os.write(jsonPayload.getBytes(StandardCharsets.UTF_8));
        }

        int status = con.getResponseCode();
        System.out.println("HTTP ステータスコード:" + status);

        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(),
                        StandardCharsets.UTF_8))) {
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                response.append(line);
            }
            System.out.println("応答内容:" + response);

            if (status == 200) {
                JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
                return jsonObj.getAsJsonObject("output").get("voice").getAsString();
            }
            throw new IOException("音声の作成に失敗しました:" + status + " - " + response);
        }
    }

    public static void call() throws Exception {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 環境変数が設定されていない場合は、次の行を置き換えてください:.apikey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model(TARGET_MODEL)
                .text("今日の天気はどうですか?")
                .parameter("voice", createVoice()) // 音声パラメーターをクローンによって生成されたカスタム音声に置き換えます。
                .build();
        MultiModalConversationResult result = conv.call(param);
        String audioUrl = result.getOutput().getAudio().getUrl();
        System.out.print(audioUrl);

        // 音声ファイルをローカルにダウンロード
        try (InputStream in = new URL(audioUrl).openStream();
             FileOutputStream out = new FileOutputStream("downloaded_audio.wav")) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
            System.out.println("\n音声ファイルをローカルにダウンロードしました:downloaded_audio.wav");
        } catch (Exception e) {
            System.out.println("\n音声ファイルのダウンロード中にエラーが発生しました:" + e.getMessage());
        }
    }
    public static void main(String[] args) {
        try {
            // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
            Constants.baseHttpApiUrl = "https://dashscope-intl.aliyuncs.com/api/v1";
            call();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

API リファレンス

異なる API を使用する場合、必ず同一のアカウントを使用してください。

音声の作成

音声クローン用の音声をアップロードし、カスタム音声を作成します。

  • URL

    中国本土:

    POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

    国際:

    POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
  • リクエストヘッダー

    パラメーター

    必須

    説明

    Authorization

    string

    対応

    形式 Bearer <your_api_key> の認証トークン。"<your_api_key>" を実際の API キーに置き換えてください。

    Content-Type

    string

    対応

    リクエストボディで送信されるデータのメディアタイプ。固定値:application/json

  • リクエストボディ

    リクエストボディにはすべてのリクエストパラメーターが含まれます。不要なオプションフィールドは省略可能です。

    重要

    以下のパラメーターに注意してください。

    • model:音声クローンモデル。固定値:qwen-voice-enrollment

    • target_model:音声を駆動する音声合成モデル。後続の音声合成呼び出しで使用する音声合成モデルと一致している必要があります。一致しない場合、合成は失敗します。

    {
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "create",
            "target_model": "qwen3-tts-vc-realtime-2026-01-15",
            "preferred_name": "guanyu",
            "audio": {
                "data": "https://xxx.wav"
            },
            "text": "任意。audio.data に対応するテキストを入力します。",
            "language": "任意。audio.data の言語を入力します(例:zh)。"
        }
    }
  • リクエストパラメーター

    パラメーター

    デフォルト

    必須

    説明

    model

    string

    -

    対応

    音声クローンモデル。固定値:qwen-voice-enrollment

    action

    string

    -

    対応

    操作タイプ。固定値:create

    target_model

    string

    -

    対応

    音声を駆動する音声合成モデル。対応するモデルは以下の通りです(2 種類)。

    後続の音声合成呼び出しで使用する音声合成モデルと一致している必要があります。一致しない場合、合成は失敗します。

    preferred_name

    string

    -

    対応

    音声に認識可能な名前を割り当てます(最大 16 文字:数字、英字、アンダースコアのみ可)。役割やシナリオに関連した識別子を使用してください。

    このキーワードはクローン音声の名前に表示されます。たとえば、キーワードが「guanyu」の場合、最終的な音声名は「qwen-tts-vc-guanyu-voice-20250812105009984-838b」になります。

    audio.data

    string

    -

    対応

    クローン用の音声(録音ガイドに従って録音し、「録音ガイド」および「音声入力要件」を満たしていることを確認してください)。

    音声データは以下のいずれかの方法で送信します。

    1. Data URL

      形式:data:<mediatype>;base64,<data>

      • <mediatype>:MIME タイプ

        • WAV:audio/wav

        • MP3:audio/mpeg

        • M4A:audio/mp4

      • <data>:音声の Base64 エンコーディング文字列

        Base64 エンコーディングによりファイルサイズが増加します。エンコード後のデータサイズが 10 MB を超えないよう、元のファイルサイズを制御してください。

      • 例:data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9

        サンプルコードを表示

        import base64, pathlib
        
        # input.mp3 は音声クローン用のローカル音声ファイルです。ご自身の音声ファイルパスに置き換え、音声要件を満たしていることを確認してください。
        file_path = pathlib.Path("input.mp3")
        base64_str = base64.b64encode(file_path.read_bytes()).decode()
        data_uri = f"data:audio/mpeg;base64,{base64_str}"
        import java.nio.file.*;
        import java.util.Base64;
        
        public class Main {
            /**
             * filePath は音声クローン用のローカル音声ファイルです。ご自身の音声ファイルパスに置き換え、音声要件を満たしていることを確認してください。
             */
            public static String toDataUrl(String filePath) throws Exception {
                byte[] bytes = Files.readAllBytes(Paths.get(filePath));
                String encoded = Base64.getEncoder().encodeToString(bytes);
                return "data:audio/mpeg;base64," + encoded;
            }
        
            // 使用例
            public static void main(String[] args) throws Exception {
                System.out.println(toDataUrl("input.mp3"));
            }
        }
    2. 音声 URL(OSS への音声アップロード を推奨)

      • ファイルサイズは 10 MB を超えてはなりません。

      • URL は公開可能で、認証を必要としないものである必要があります。

    text

    string

    -

    未対応

    audio.data の内容と一致するテキストです。

    指定した場合、サーバーが音声とこのテキストを比較します。両者が大きく異なる場合、Audio.PreprocessError を返します。

    language

    string

    -

    いいえ

    audio.data の音声の言語です。

    対応言語:zh(中国語)、en(英語)、de(ドイツ語)、it(イタリア語)、pt(ポルトガル語)、es(スペイン語)、ja(日本語)、ko(韓国語)、fr(フランス語)、ru(ロシア語)。

    このパラメーターを使用する場合は、指定した言語が音声の言語と一致していることを確認してください。

  • レスポンスパラメーター

    レスポンス例を表示

    {
        "output": {
            "voice": "yourVoice",
            "target_model": "qwen3-tts-vc-realtime-2026-01-15"
        },
        "usage": {
            "count": 1
        },
        "request_id": "yourRequestId"
    }

    主なパラメーター:

    パラメーター

    説明

    voice

    string

    音声名。音声合成インターフェイスの voice パラメーターとして直接使用します。

    target_model

    string

    音声を駆動する音声合成モデル。対応するモデルは以下の通りです(2 種類)。

    後続の音声合成呼び出しで使用する音声合成モデルと一致している必要があります。一致しない場合、合成は失敗します。

    request_id

    string

    リクエスト ID。

    count

    integer

    このリクエストに対して課金される「音声の作成」操作の回数。料金は $ です。

    音声の作成では、count は常に 1 です。

  • サンプルコード

    重要

    以下のパラメーターに注意してください。

    • model:音声クローンモデル。固定値:qwen-voice-enrollment

    • target_model:音声を駆動する音声合成モデル。後続の音声合成呼び出しで使用する音声合成モデルと一致している必要があります。一致しない場合、合成は失敗します。

    cURL

    API キーを環境変数として設定していない場合は、例中の $DASHSCOPE_API_KEY を実際の API キーに置き換えてください。

    https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization<a data-init-id="9f104f338c7kz" href="https://poc-dashscope.aliyuncs.com/api/v1/services/audio/tts/customization" id="35ebbc67890ds">https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization</a># ======= 重要なお知らせ =======
    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # === 実行前にこのコメントを削除してください ===
    
    curl -X POST <a data-init-id="9f104f338c7kz" href="https://poc-dashscope.aliyuncs.com/api/v1/services/audio/tts/customization" id="35ebbc67890ds">https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization</a> \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "create",
            "target_model": "qwen3-tts-vc-realtime-2026-01-15",
            "preferred_name": "guanyu",
            "audio": {
                "data": "https://xxx.wav"
            }
        }
    }'

    Python

    import os
    import requests
    import base64, pathlib
    
    target_model = "qwen3-tts-vc-realtime-2026-01-15"
    preferred_name = "guanyu"
    audio_mime_type = "audio/mpeg"
    
    file_path = pathlib.Path("input.mp3")
    base64_str = base64.b64encode(file_path.read_bytes()).decode()
    data_uri = f"data:{audio_mime_type};base64,{base64_str}"
    
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数が設定されていない場合は、次の行を置き換えてください:api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")
    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
    
    payload = {
        "model": "qwen-voice-enrollment", # この値を変更しないでください
        "input": {
            "action": "create",
            "target_model": target_model,
            "preferred_name": preferred_name,
            "audio": {
                "data": data_uri
            }
        }
    }
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    # POST リクエストを送信
    resp = requests.post(url, json=payload, headers=headers)
    
    if resp.status_code == 200:
        data = resp.json()
        voice = data["output"]["voice"]
        print(f"生成された音声パラメーター:{voice}")
    else:
        print("リクエストに失敗しました:", resp.status_code, resp.text)

    Java

    import com.google.gson.Gson;
    import com.google.gson.JsonObject;
    
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.nio.file.*;
    import java.util.Base64;
    
    public class Main {
        private static final String TARGET_MODEL = "qwen3-tts-vc-realtime-2026-01-15";
        private static final String PREFERRED_NAME = "guanyu";
        private static final String AUDIO_FILE = "input.mp3";
        private static final String AUDIO_MIME_TYPE = "audio/mpeg";
    
        public static String toDataUrl(String filePath) throws Exception {
            byte[] bytes = Files.readAllBytes(Paths.get(filePath));
            String encoded = Base64.getEncoder().encodeToString(bytes);
            return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
        }
    
        public static void main(String[] args) {
            // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
            // 環境変数が設定されていない場合は、次の行を置き換えてください:String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
            // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
            String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization";
    
            try {
                // JSON リクエストボディを構築(内部の引用符をエスケープ)
                String jsonPayload =
                        "{"
                                + "\"model\": \"qwen-voice-enrollment\"," // この値を変更しないでください
                                + "\"input\": {"
                                +     "\"action\": \"create\","
                                +     "\"target_model\": \"" + TARGET_MODEL + "\","
                                +     "\"preferred_name\": \"" + PREFERRED_NAME + "\","
                                +     "\"audio\": {"
                                +         "\"data\": \"" + toDataUrl(AUDIO_FILE) + "\""
                                +     "}"
                                + "}"
                                + "}";
    
                HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection();
                con.setRequestMethod("POST");
                con.setRequestProperty("Authorization", "Bearer " + apiKey);
                con.setRequestProperty("Content-Type", "application/json");
                con.setDoOutput(true);
    
                // リクエストボディを送信
                try (OutputStream os = con.getOutputStream()) {
                    os.write(jsonPayload.getBytes("UTF-8"));
                }
    
                int status = con.getResponseCode();
                InputStream is = (status >= 200 && status < 300)
                        ? con.getInputStream()
                        : con.getErrorStream();
    
                StringBuilder response = new StringBuilder();
                try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
                    String line;
                    while ((line = br.readLine()) != null) {
                        response.append(line);
                    }
                }
    
                System.out.println("HTTP ステータスコード:" + status);
                System.out.println("応答内容:" + response.toString());
    
                if (status == 200) {
                    // JSON を解析
                    Gson gson = new Gson();
                    JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class);
                    String voice = jsonObj.getAsJsonObject("output").get("voice").getAsString();
                    System.out.println("生成された音声パラメーター:" + voice);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

音声の一覧表示

ページングクエリを実行して、作成した音声を一覧表示します。

  • URL

    中国本土:

    POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

    国際:

    POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
  • リクエストヘッダー

    パラメーター

    必須

    説明

    Authorization

    string

    対応

    形式 Bearer <your_api_key> の認証トークン。"<your_api_key>" を実際の API キーに置き換えてください。

    Content-Type

    string

    対応

    リクエストボディで送信されるデータのメディアタイプ。固定値:application/json

  • リクエストボディ

    リクエストボディにはすべてのリクエストパラメーターが含まれます。不要なオプションフィールドは省略可能です。

    重要

    model:音声クローンモデル。固定値:qwen-voice-enrollment。変更しないでください。

    {
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "list",
            "page_size": 2,
            "page_index": 0
        }
    }
  • リクエストパラメーター

    パラメーター

    デフォルト

    必須

    説明

    model

    string

    -

    対応

    音声クローンモデル。固定値:qwen-voice-enrollment

    action

    string

    -

    対応

    操作タイプ。固定値:list

    page_index

    integer

    0

    未対応

    ページインデックス。範囲:[0, 1000000]。

    page_size

    integer

    10

    いいえ

    ページあたりのエントリ数。範囲:[0, 1000000]。

  • レスポンスパラメーター

    レスポンス例を表示

    {
        "output": {
            "voice_list": [
                {
                    "voice": "yourVoice1",
                    "gmt_create": "2025-08-11 17:59:32",
                    "target_model": "qwen3-tts-vc-realtime-2026-01-15"
                },
                {
                    "voice": "yourVoice2",
                    "gmt_create": "2025-08-11 17:38:10",
                    "target_model": "qwen3-tts-vc-realtime-2026-01-15"
                }
            ]
        },
        "usage": {
            "count": 0
        },
        "request_id": "yourRequestId"
    }

    主なパラメーター:

    パラメーター

    説明

    voice

    string

    音声名。音声合成インターフェイスの voice パラメーターとして直接使用します。

    gmt_create

    string

    音声の作成時刻。

    target_model

    string

    音声を駆動する音声合成モデル。対応するモデルは以下の通りです(2 種類)。

    後続の音声合成呼び出しで使用する音声合成モデルと一致している必要があります。一致しない場合、合成は失敗します。

    request_id

    string

    リクエスト ID。

    count

    integer

    このリクエストに対して課金される「音声の作成」操作の回数。料金は $ です。

    音声の一覧表示は無料です。そのため、count は常に 0 です。

  • サンプルコード

    重要

    model:音声クローンモデル。固定値:qwen-voice-enrollment。変更しないでください。

    cURL

    API キーを環境変数として設定していない場合は、例中の $DASHSCOPE_API_KEY を実際の API キーに置き換えてください。

    # ======= 重要なお知らせ =======
    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # === 実行前にこのコメントを削除してください ===
    
    curl --location --request POST 'https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization' \
    --header 'Authorization: Bearer $DASHSCOPE_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "list",
            "page_size": 10,
            "page_index": 0
        }
    }'

    Python

    import os
    import requests
    
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数が設定されていない場合は、次の行を置き換えてください:api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")
    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
    
    payload = {
        "model": "qwen-voice-enrollment", # この値を変更しないでください
        "input": {
            "action": "list",
            "page_size": 10,
            "page_index": 0
        }
    }
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    response = requests.post(url, json=payload, headers=headers)
    
    print("HTTP ステータスコード:", response.status_code)
    
    if response.status_code == 200:
        data = response.json()
        voice_list = data["output"]["voice_list"]
    
        print("見つかった音声のリスト:")
        for item in voice_list:
            print(f"- 音声:{item['voice']}  作成時刻:{item['gmt_create']}  モデル:{item['target_model']}")
    else:
        print("リクエストに失敗しました:", response.text)

    Java

    import com.google.gson.Gson;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonObject;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class Main {
        public static void main(String[] args) {
            // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
            // 環境変数が設定されていない場合は、次の行を置き換えてください:String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
            // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
            String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization";
    
            // JSON リクエストボディ(古い Java バージョンは """ 複数行文字列をサポートしていません)
            String jsonPayload =
                    "{"
                            + "\"model\": \"qwen-voice-enrollment\"," // この値を変更しないでください
                            + "\"input\": {"
                            +     "\"action\": \"list\","
                            +     "\"page_size\": 10,"
                            +     "\"page_index\": 0"
                            + "}"
                            + "}";
    
            try {
                HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection();
                con.setRequestMethod("POST");
                con.setRequestProperty("Authorization", "Bearer " + apiKey);
                con.setRequestProperty("Content-Type", "application/json");
                con.setDoOutput(true);
    
                try (OutputStream os = con.getOutputStream()) {
                    os.write(jsonPayload.getBytes("UTF-8"));
                }
    
                int status = con.getResponseCode();
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(), "UTF-8"));
    
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    response.append(line);
                }
                br.close();
    
                System.out.println("HTTP ステータスコード:" + status);
                System.out.println("応答 JSON:" + response.toString());
    
                if (status == 200) {
                    Gson gson = new Gson();
                    JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class);
                    JsonArray voiceList = jsonObj.getAsJsonObject("output").getAsJsonArray("voice_list");
    
                    System.out.println("\n 見つかった音声のリスト:");
                    for (int i = 0; i < voiceList.size(); i++) {
                        JsonObject voiceItem = voiceList.get(i).getAsJsonObject();
                        String voice = voiceItem.get("voice").getAsString();
                        String gmtCreate = voiceItem.get("gmt_create").getAsString();
                        String targetModel = voiceItem.get("target_model").getAsString();
    
                        System.out.printf("- 音声:%s  作成時刻:%s  モデル:%s\n",
                                voice, gmtCreate, targetModel);
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

音声の削除

指定した音声を削除し、クォータを解放します。

  • URL

    中国本土:

    POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

    国際:

    POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
  • リクエストヘッダー

    パラメーター

    必須

    説明

    Authorization

    string

    対応

    形式 Bearer <your_api_key> の認証トークン。"<your_api_key>" を実際の API キーに置き換えてください。

    Content-Type

    string

    対応

    リクエストボディで送信されるデータのメディアタイプ。固定値:application/json

  • メッセージボディ

    リクエストボディにはすべてのリクエストパラメーターが含まれます。不要なオプションフィールドは省略可能です。

    重要

    model:音声クローンモデル。固定値:qwen-voice-enrollment。変更しないでください。

    {
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "delete",
            "voice": "yourVoice"
        }
    }
  • リクエストパラメーター

    パラメーター

    デフォルト

    必須

    説明

    model

    string

    -

    対応

    音声クローンモデル。固定値:qwen-voice-enrollment

    action

    string

    -

    対応

    操作タイプ。固定値:delete

    voice

    string

    -

    対応

    削除する音声。

  • レスポンスパラメーター

    レスポンス例を表示

    {
        "usage": {
            "count": 0
        },
        "request_id": "yourRequestId"
    }

    主なパラメーター:

    パラメーター

    説明

    request_id

    string

    リクエスト ID。

    count

    integer

    このリクエストに対して課金される「音声の作成」操作の回数。料金は $ です。

    音声の削除は無料です。そのため、count は常に 0 です。

  • サンプルコード

    重要

    model:音声クローンモデル。固定値:qwen-voice-enrollment。変更しないでください。

    cURL

    API キーを環境変数として設定していない場合は、例中の $DASHSCOPE_API_KEY を実際の API キーに置き換えてください。

    # ======= 重要なお知らせ =======
    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # === 実行前にこのコメントを削除してください ===
    
    curl --location --request POST 'https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization' \
    --header 'Authorization: Bearer $DASHSCOPE_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "delete",
            "voice": "yourVoice"
        }
    }'

    Python

    import os
    import requests
    
    # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数が設定されていない場合は、次の行を置き換えてください:api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")
    # 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
    url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
    
    voice_to_delete = "yourVoice"  # 削除する音声(実際の値に置き換えてください)
    
    payload = {
        "model": "qwen-voice-enrollment", # この値を変更しないでください
        "input": {
            "action": "delete",
            "voice": voice_to_delete
        }
    }
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    response = requests.post(url, json=payload, headers=headers)
    
    print("HTTP ステータスコード:", response.status_code)
    
    if response.status_code == 200:
        data = response.json()
        request_id = data["request_id"]
    
        print(f"削除に成功しました")
        print(f"リクエスト ID:{request_id}")
    else:
        print("リクエストに失敗しました:", response.text)

    Java

    import com.google.gson.Gson;
    import com.google.gson.JsonObject;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class Main {
        public static void main(String[] args) {
            // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
            // 環境変数が設定されていない場合は、次の行を置き換えてください:String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
            // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization に置き換えてください。
            String apiUrl = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization";
            String voiceToDelete = "yourVoice"; // 削除する音声(実際の値に置き換えてください)
    
            // JSON リクエストボディを構築(Java 8 互換性のための文字列連結)
            String jsonPayload =
                    "{"
                            + "\"model\": \"qwen-voice-enrollment\"," // この値を変更しないでください
                            + "\"input\": {"
                            +     "\"action\": \"delete\","
                            +     "\"voice\": \"" + voiceToDelete + "\""
                            + "}"
                            + "}";
    
            try {
                // POST 接続を確立
                HttpURLConnection con = (HttpURLConnection) new URL(apiUrl).openConnection();
                con.setRequestMethod("POST");
                con.setRequestProperty("Authorization", "Bearer " + apiKey);
                con.setRequestProperty("Content-Type", "application/json");
                con.setDoOutput(true);
    
                // リクエストボディを送信
                try (OutputStream os = con.getOutputStream()) {
                    os.write(jsonPayload.getBytes("UTF-8"));
                }
    
                int status = con.getResponseCode();
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        status >= 200 && status < 300 ? con.getInputStream() : con.getErrorStream(), "UTF-8"));
    
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    response.append(line);
                }
                br.close();
    
                System.out.println("HTTP ステータスコード:" + status);
                System.out.println("応答 JSON:" + response.toString());
    
                if (status == 200) {
                    Gson gson = new Gson();
                    JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class);
                    String requestId = jsonObj.get("request_id").getAsString();
    
                    System.out.println("削除に成功しました");
                    System.out.println("リクエスト ID:" + requestId);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

音声合成

カスタムクローン音声を使用したパーソナライズ音声合成の詳細については、「クイックスタート:クローンから合成へ」をご参照ください。

音声クローン専用モデル(例:qwen3-tts-vc-realtime-2026-01-15)は、カスタムクローン音声のみをサポートする専用モデルです。Chelsie、Serena、Ethan、Cherry などのシステム音声はサポートしていません。

音声クォータとクリーンアップルール

  • 合計制限:アカウントあたり 1000 音声

    現在のインターフェイスでは音声数のクエリ機能は提供されていません。音声の一覧表示 インターフェイスを呼び出して、ご自身で音声数をカウントしてください。
  • 自動クリーンアップ:音声が 1 年以上音声合成リクエストで使用されていない場合、システムは自動的にその音声を削除します。

課金詳細

音声クローンと音声合成は別々に課金されます。

  • 音声クローン:「音声の作成」は、音声あたり $0.01 の費用がかかります。作成に失敗した場合は課金されません。

    説明

    無料クォータ詳細(Alibaba Cloud China Website (www.aliyun.com) の北京リージョンおよび Alibaba Cloud International Website (www.alibabacloud.com) のシンガポールリージョンでのみ利用可能):

    • Alibaba Cloud Model Studio を有効化してから 90 日以内に、1000 回の無料音声作成試行回数が提供されます。

    • 作成に失敗しても無料試行回数は消費されません。

    • 音声を削除しても無料試行回数は復元されません。

    • 無料クォータが期限切れになるか、90 日の有効期間が終了すると、音声作成は音声あたり $0.01 で課金されます。

  • カスタムクローン音声を使用した音声合成:ボリューム(文字数)に応じて課金されます。詳細については、「リアルタイム音声合成 - Qwen」または「音声合成 - Qwen」をご参照ください。

著作権と合法性

提供する音声の所有権および法的権利については、お客様が責任を負うものとします。利用規約 をお読みください。

録音ガイド

デバイス

ノイズリダクション機能付きのマイクを使用するか、静かな環境でスマートフォンを近距離で録音して、クリーンな音声を確保することを推奨します。

環境

場所

  • 10 平方メートル以下の閉鎖された空間で録音してください。

  • 吸音材(音響フォーム、カーペット、カーテンなど)のある部屋を優先してください。

  • ホール、会議室、教室などの広く反響の大きい空間は避けてください。

ノイズコントロール

  • 屋外の騒音:窓やドアを閉めて、交通、建設などの妨害を遮断してください。

  • 屋内の騒音:エアコン、扇風機、蛍光灯の安定器をオフにしてください。スマートフォンで周囲の騒音を録音し、大音量で再生して騒音源を特定してください。

反響コントロール

  • 反響は、こもった不明瞭な音声の原因となります。

  • 反射を減らす:カーテンを引き、クローゼットのドアを開け、テーブルやキャビネットを衣類やシーツで覆ってください。

  • 不規則な形状の物体(本棚や布張りの家具など)を使用して音を拡散させてください。

スクリプト

  • スクリプトの内容は柔軟に設定できます。ターゲットシナリオに合わせてください(例:カスタマーサービスシナリオでは、カスタマーサービスの対話スタイルを使用)。政治的、ポルノ的、暴力的などの機密または違法な内容が含まれていないことを確認してください。これらが含まれていると、クローンに失敗します。

  • 「こんにちは」や「はい」などの短いフレーズは避け、完全な文章を使用してください。

  • 意味的な一貫性を保ってください。頻繁な一時停止は避け(少なくとも 3 秒間の連続した発話を目指してください)、

  • ターゲットの感情(フレンドリー、真面目など)を取り入れることはできますが、過度に劇的な読み方は避けてください。自然な話し方を心がけてください。

操作のヒント

一般的な寝室を例として使用します。

  1. 窓やドアを閉めて、外部の騒音を遮断します。

  2. エアコン、扇風機、その他の電化製品の電源を切ります。

  3. カーテンを引いて反射を減らします。

  4. 机の上に衣類や毛布を置いて反射を減らします。

  5. スクリプトに慣れ親しんでください。キャラクターのトーンを設定し、自然に話します。

  6. 破裂音や信号の弱さを避けるため、録音デバイスから約 10 cm の距離を保ちます。

エラーメッセージ

エラーが発生した場合は、「エラーメッセージ」を参照してトラブルシューティングを行ってください。