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

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

最終更新日:May 13, 2026

音声クローニングでは、トレーニングなしで音声をクローニングできます。10~20 秒の音声から、自然な音質で元の音声に近いカスタムボイスを生成できます。音声クローニングとモデルの呼び出しは、連続する 2 つのステップです。このドキュメントでは、音声クローニングのパラメーターと API の詳細について説明します。モデルの呼び出しについては、リアルタイム (Qwen-Omni-Realtime) または 非リアルタイム (Qwen-Omni) をご参照ください。

重要

このドキュメントは、Qwen-Omni および Qwen-Omni-Realtime の音声クローニング API のみを対象としています。テキスト読み上げモデルを使用する場合は、「音声合成」をご参照ください。

音声要件

高品質な入力音声は、良好なクローニング結果の基盤です。

項目

要件

対応フォーマット

WAV (16 ビット)、MP3、M4A

長さ

10~20秒を推奨します。最大:60秒。

ファイルサイズ

< 10 MB

サンプルレート

>= 24 kHz

チャンネル

モノラル

内容

音声には、背景音のない連続したクリアな音声を少なくとも3秒含める必要があります。残りの部分には、短い無音区間(2秒以下)を含めることができます。音声全体を通して、背景音楽、ノイズ、または他の人の声は避けてください。入力には通常の話し声を使用してください。歌や歌声はアップロードしないでください。

言語

中国語 (zh)、英語 (en)、ドイツ語 (de)、イタリア語 (it)、ポルトガル語 (pt)、スペイン語 (es)、日本語 (ja)、韓国語 (ko)、フランス語 (fr)、ロシア語 (ru)、タイ語 (th)、インドネシア語 (id)、アラビア語 (ar)、チェコ語 (cs)、デンマーク語 (da)、オランダ語 (nl)、フィンランド語 (fi)、ヘブライ語 (he)、ヒンディー語 (hi)、アイスランド語 (is)、マレー語 (ms)、ノルウェー語 (no)、ペルシャ語 (fa)、ポーランド語 (pl)、スウェーデン語 (sv)、タガログ語 (tl)、トルコ語 (tr)、ウルドゥー語 (ur)、ベトナム語 (vi)

中国語の方言:東北、陝西、四川、河南、長沙、天津、杭州、遼寧、瀋陽、鞍山

クイックスタート:ボイスのクローンと使用

image

1. ワークフロー

音声クローニングとモデルの呼び出しは、密接に関連しながらも独立した 2 つのステップで、「最初に作成してから使用する」というワークフローに従います:

  1. 音声の作成

    音声の作成 API を呼び出し、オーディオクリップをアップロードします。システムは音声を分析し、カスタムクローン音声を作成します。このステップでは、音声を駆動する omni model を宣言するため、target_model を指定する必要があります。

    すでに作成済みの音声がある場合 (音声の一覧表示 API を呼び出して確認)、このステップをスキップして次のステップに進んでください。

  2. 会話での音声の使用

    Omni API (リアルタイムまたは非リアルタイム) を呼び出し、前のステップで取得した音声を渡します。このステップで指定する omni model は、前のステップの target_model と一致している必要があります。

2. モデル構成と前提条件

適切なモデルを選択し、前提条件を満たしてください。

モデル構成

音声クローニングには 2 つのモデルが必要です:

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

  • 音声駆動用のオムニモデル:

    • qwen3.5-omni-plus-realtime

    • qwen3.5-omni-flash-realtime

    • qwen3.5-omni-plus

    • qwen3.5-omni-flash

前提条件

  1. API キーの取得API キーを作成してください。セキュリティのため、API キーを環境変数として設定してください。

  2. SDK のインストール最新の DashScope SDK がインストールされていることを確認してください。

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

3. エンドツーエンド例

次の例では、会話でクローン音声を使用して、オリジナル音声によく似た出力を生成する方法を示します。

重要な原則:音声クローニングの際、target_model (音声を生成する omni モデル) は、後続の Omni API 呼び出しで指定するモデルと一致させる必要があります。一致しない場合、合成に失敗します。この例では、音声クローニング用にローカルオーディオファイル voice.mp3 を使用しています。コードを実行する際は、ご自身のファイルに置き換えてください。

リアルタイム

Qwen3.5-Omni-Realtime シリーズモデルに適用されます。詳細については、「リアルタイム (Qwen-Omni-Realtime)」をご参照ください。

Python

# 必要なライブラリ: dashscope >= 1.23.9, pyaudio
import os
import requests
import base64
import pathlib
import time
import pyaudio
from dashscope.audio.qwen_omni import MultiModality, OmniRealtimeCallback, OmniRealtimeConversation
import dashscope

# ======= 設定 =======
DEFAULT_TARGET_MODEL = "qwen3.5-omni-plus-realtime"  # クローニングと会話で同じモデルを使用する必要があります
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 キーは Singapore リージョンと Beijing リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/en/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"Audio file not found: {file_path}")

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

    # Singapore リージョンの URL。Beijing リージョンの場合は次を使用: 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"Failed to create voice: {resp.status_code}, {resp.text}")

    try:
        return resp.json()["output"]["voice"]
    except (KeyError, ValueError) as e:
        raise RuntimeError(f"Failed to parse voice response: {e}")


class SimpleCallback(OmniRealtimeCallback):
    def __init__(self, pya):
        self.pya = pya
        self.out = None
    def on_open(self):
        self.out = self.pya.open(
            format=pyaudio.paInt16,
            channels=1,
            rate=24000,
            output=True
        )
    def on_event(self, response):
        if response['type'] == 'response.audio.delta':
            self.out.write(base64.b64decode(response['delta']))
        elif response['type'] == 'conversation.item.input_audio_transcription.completed':
            print(f"[User] {response['transcript']}")
        elif response['type'] == 'response.audio_transcript.done':
            print(f"[LLM] {response['transcript']}")


if __name__ == '__main__':
    # 環境変数を設定していない場合は、次の行を置き換えてください: dashscope.api_key = "sk-xxx"
    dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
    # Singapore リージョンの URL。Beijing リージョンの場合は次を使用: wss://dashscope.aliyuncs.com/api-ws/v1/realtime
    url = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime"

    # ステップ 1: 音声クローニング
    voice = create_voice(VOICE_FILE_PATH)
    print(f"音声クローニングが完了しました。ボイス: {voice}")

    # ステップ 2: クローンされた音声でリアルタイム会話を開始
    pya = pyaudio.PyAudio()
    callback = SimpleCallback(pya)
    conv = OmniRealtimeConversation(model=DEFAULT_TARGET_MODEL, callback=callback, url=url)
    conv.connect()
    conv.update_session(
        output_modalities=[MultiModality.AUDIO, MultiModality.TEXT],
        voice=voice  # クローンされた音声を使用
    )
    mic = pya.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True)
    print("会話を開始しました。マイクに向かって話してください (終了するには Ctrl+C) ...")
    try:
        while True:
            audio_data = mic.read(3200, exception_on_overflow=False)
            conv.append_audio(base64.b64encode(audio_data).decode())
            time.sleep(0.01)
    except KeyboardInterrupt:
        conv.close()
        mic.close()
        callback.out.close()
        pya.terminate()
        print("\n会話を終了しました")

Java

import com.alibaba.dashscope.audio.omni.*;
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.ByteBuffer;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;

public class Main {
    // ===== 定数 =====
    // 音声クローニングとリアルタイム会話で同じモデルを使用
    private static final String TARGET_MODEL = "qwen3.5-omni-plus-realtime";
    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 キーは Singapore リージョンと Beijing リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/en/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 は Singapore リージョン用です。Beijing リージョンのモデルを使用する場合は、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();
        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);
            }
            if (status == 200) {
                JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
                return jsonObj.getAsJsonObject("output").get("voice").getAsString();
            }
            throw new IOException("Failed to create voice: " + status + " - " + response);
        }
    }

    // シンプルなオーディオプレーヤー
    static class SimpleAudioPlayer {
        private final SourceDataLine line;
        private final Queue<byte[]> audioQueue = new ConcurrentLinkedQueue<>();
        private final Thread playerThread;
        private final AtomicBoolean shouldStop = new AtomicBoolean(false);

        public SimpleAudioPlayer() throws LineUnavailableException {
            AudioFormat format = new AudioFormat(24000, 16, 1, true, false);
            line = AudioSystem.getSourceDataLine(format);
            line.open(format);
            line.start();
            playerThread = new Thread(() -> {
                while (!shouldStop.get()) {
                    byte[] audio = audioQueue.poll();
                    if (audio != null) {
                        line.write(audio, 0, audio.length);
                    } else {
                        try { Thread.sleep(10); } catch (InterruptedException ignored) {}
                    }
                }
            }, "AudioPlayer");
            playerThread.start();
        }

        public void play(String base64Audio) {
            audioQueue.add(Base64.getDecoder().decode(base64Audio));
        }

        public void close() {
            shouldStop.set(true);
            try { playerThread.join(1000); } catch (InterruptedException ignored) {}
            line.drain();
            line.close();
        }
    }

    public static void main(String[] args) {
        try {
            // 1. 音声クローニング: カスタムボイスを作成
            String voice = createVoice();
            System.out.println("音声クローニングが完了しました。ボイス: " + voice);

            // 2. クローンされた音声をリアルタイム会話で使用
            SimpleAudioPlayer player = new SimpleAudioPlayer();
            AtomicBoolean shouldStop = new AtomicBoolean(false);

            OmniRealtimeParam param = OmniRealtimeParam.builder()
                    .model(TARGET_MODEL)
                    // API キーは Singapore リージョンと Beijing リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/en/model-studio/get-api-key
                    // 環境変数を設定していない場合は、次の行を置き換えてください: .apikey("sk-xxx")
                    .apikey(System.getenv("DASHSCOPE_API_KEY"))
                    // 以下の URL は Singapore リージョン用です。Beijing リージョンのモデルを使用する場合は、URL を次に置き換えてください: wss://dashscope.aliyuncs.com/api-ws/v1/realtime
                    .url("wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime")
                    .build();

            OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, new OmniRealtimeCallback() {
                @Override public void onOpen() { System.out.println("接続が確立されました"); }
                @Override public void onClose(int code, String reason) {
                    System.out.println("接続が閉じられました (" + code + "): " + reason);
                    shouldStop.set(true);
                }
                @Override public void onEvent(JsonObject event) {
                    String type = event.get("type").getAsString();
                    if ("response.audio.delta".equals(type)) {
                        player.play(event.get("delta").getAsString());
                    } else if ("conversation.item.input_audio_transcription.completed".equals(type)) {
                        System.out.println("[User] " + event.get("transcript").getAsString());
                    } else if ("response.audio_transcript.done".equals(type)) {
                        System.out.println("[LLM] " + event.get("transcript").getAsString());
                    }
                }
            });

            conversation.connect();
            conversation.updateSession(OmniRealtimeConfig.builder()
                    .modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
                    .voice(voice)  // クローンされたカスタムボイスを使用
                    .enableTurnDetection(true)
                    .enableInputAudioTranscription(true)
                    .build()
            );

            System.out.println("会話を開始しました。マイクに向かって話してください (終了するには Ctrl+C) ...");
            AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
            TargetDataLine mic = AudioSystem.getTargetDataLine(format);
            mic.open(format);
            mic.start();

            ByteBuffer buffer = ByteBuffer.allocate(3200);
            while (!shouldStop.get()) {
                int bytesRead = mic.read(buffer.array(), 0, buffer.capacity());
                if (bytesRead > 0) {
                    conversation.appendAudio(Base64.getEncoder().encodeToString(buffer.array()));
                }
                Thread.sleep(20);
            }

            conversation.close(1000, "正常終了");
            player.close();
            mic.close();
            System.out.println("\n会話を終了しました");
        } catch (NoApiKeyException e) {
            System.err.println("API キーが見つかりません。DASHSCOPE_API_KEY 環境変数を設定してください。");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
}

非リアルタイム

Qwen3.5-Omni シリーズのモデルに適用されます。 詳細については、「非リアルタイム (Qwen-Omni)」をご参照ください。

Python

# 要件:dashscope >= 1.23.9、soundfile、numpy
import os
import requests
import base64
import pathlib
import numpy as np
import soundfile as sf
import dashscope

# ======= 設定 =======
DEFAULT_TARGET_MODEL = "qwen3.5-omni-plus"  # 音声クローニングと非リアルタイムの呼び出しでは、同じモデルを使用する必要があります
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/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"Audio file not found: {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"Failed to create voice: {resp.status_code}, {resp.text}")

    try:
        return resp.json()["output"]["voice"]
    except (KeyError, ValueError) as e:
        raise RuntimeError(f"Failed to parse voice response: {e}")


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

    # 1. 音声クローニング:カスタム音声を作成
    voice = create_voice(VOICE_FILE_PATH)
    print(f"Voice cloning complete. Voice: {voice}")

    # 2. クローンした音声との非リアルタイム会話
    messages = [{"role": "user", "content": [{"text": "Hello, please introduce yourself"}]}]

    response = dashscope.MultiModalConversation.call(
        # 環境変数が設定されていない場合は、api_key="sk-xxx" に置き換えてください
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        model=DEFAULT_TARGET_MODEL,
        messages=messages,
        modalities=["text", "audio"],
        audio={"voice": voice, "format": "wav"},  # クローンした音声を使用
        stream=True
    )

    print("Model response:")
    audio_base64_string = ""
    for r in response:
        try:
            content = r.output.choices[0].message.content
            for item in content:
                if isinstance(item, dict):
                    if "audio" in item:
                        audio_base64_string += item["audio"].get("data", "")
                    elif "text" in item:
                        print(item["text"], end="")
        except Exception:
            pass

    if audio_base64_string:
        wav_bytes = base64.b64decode(audio_base64_string)
        audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
        sf.write("audio_cloned.wav", audio_np, samplerate=24000)
        print("\nAudio saved to: audio_cloned.wav")

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.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Main {
    // ===== 定数 =====
    // 音声クローニングと非リアルタイムの呼び出しでは、同じモデルを使用する必要があります
    private static final String TARGET_MODEL = "qwen3.5-omni-plus";
    private static final String PREFERRED_NAME = "guanyu";
    // 音声クローニング用のローカル音声ファイルへのパス
    private static final String AUDIO_FILE = "voice.mp3";
    private static final String AUDIO_MIME_TYPE = "audio/mpeg";

    // PCM データを標準の WAV ファイルとして書き込む
    public static void writeWav(String path, byte[] pcmData, int sampleRate) throws IOException {
        int channels = 1, bitsPerSample = 16;
        int byteRate = sampleRate * channels * bitsPerSample / 8;
        int blockAlign = channels * bitsPerSample / 8;
        ByteBuffer header = ByteBuffer.allocate(44).order(ByteOrder.LITTLE_ENDIAN);
        header.put("RIFF".getBytes()); header.putInt(36 + pcmData.length);
        header.put("WAVE".getBytes()); header.put("fmt ".getBytes());
        header.putInt(16); header.putShort((short) 1); header.putShort((short) channels);
        header.putInt(sampleRate); header.putInt(byteRate);
        header.putShort((short) blockAlign); header.putShort((short) bitsPerSample);
        header.put("data".getBytes()); header.putInt(pcmData.length);
        try (FileOutputStream fos = new FileOutputStream(path)) {
            fos.write(header.array());
            fos.write(pcmData);
        }
    }

    // ファイルからデータ 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/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();
        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);
            }
            if (status == 200) {
                JsonObject jsonObj = new Gson().fromJson(response.toString(), JsonObject.class);
                return jsonObj.getAsJsonObject("output").get("voice").getAsString();
            }
            throw new IOException("Failed to create voice: " + status + " - " + response);
        }
    }

    public static void main(String[] args) {
        try {
            // API キーはシンガポールリージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
            // 環境変数が設定されていない場合は、次の行を String apiKey = "sk-xxx" に置き換えてください
            String apiKey = System.getenv("DASHSCOPE_API_KEY");

            // 1. 音声クローニング:カスタム音声を作成
            String voice = createVoice();
            System.out.println("Voice cloning complete. Voice: " + voice);

            // 2. クローンした音声との非リアルタイム会話 (OpenAI 互換 API)
            String requestBody = "{"
                    + "\"model\": \"" + TARGET_MODEL + "\","
                    + "\"messages\": [{\"role\": \"user\", \"content\": \"Hello, please introduce yourself\"}],"
                    + "\"modalities\": [\"text\", \"audio\"],"
                    + "\"audio\": {\"voice\": \"" + voice + "\", \"format\": \"wav\"},"
                    + "\"stream\": true,"
                    + "\"stream_options\": {\"include_usage\": true}"
                    + "}";

            // シンガポールリージョンの URL。 北京リージョンの場合は、https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください
            String url = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions";
            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(requestBody.getBytes(StandardCharsets.UTF_8));
            }

            // 3. ストリーミング SSE レスポンスを解析
            StringBuilder audioBase64 = new StringBuilder();
            System.out.println("Model response:");

            try (BufferedReader br = new BufferedReader(
                    new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8))) {
                String line;
                while ((line = br.readLine()) != null) {
                    if (!line.startsWith("data: ") || line.equals("data: [DONE]")) continue;
                    String json = line.substring(6);
                    JsonObject chunk = new Gson().fromJson(json, JsonObject.class);
                    if (!chunk.has("choices") || chunk.getAsJsonArray("choices").size() == 0) continue;

                    JsonObject delta = chunk.getAsJsonArray("choices").get(0)
                            .getAsJsonObject().getAsJsonObject("delta");
                    if (delta.has("content") && !delta.get("content").isJsonNull()) {
                        System.out.print(delta.get("content").getAsString());
                    }
                    if (delta.has("audio") && !delta.get("audio").isJsonNull()) {
                        JsonObject audio = delta.getAsJsonObject("audio");
                        if (audio.has("data")) {
                            audioBase64.append(audio.get("data").getAsString());
                        }
                    }
                }
            }

            // 4. 音声ファイルを保存 (API は未加工の PCM データを返すため、WAV ヘッダーが必要です)
            if (audioBase64.length() > 0) {
                byte[] pcmBytes = Base64.getDecoder().decode(audioBase64.toString());
                writeWav("audio_cloned.wav", pcmBytes, 24000);
                System.out.println("\nAudio saved to: audio_cloned.wav");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

API リファレンス

複数の API で同じアカウントを使用してください。

音声の作成

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

  • URL

    China (Beijing):

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

    International (Singapore):

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

    [パラメーター]

    タイプ

    必須

    説明

    Authorization

    文字列

    はい

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

    Content-Type

    文字列

    はい

    リクエストボディのメディアタイプです。application/json に設定してください。

  • リクエストボディ 次のリクエストボディには、すべてのパラメーターが含まれています。必要に応じて任意フィールドを省略できます。次のパラメーターの違いにご注意ください:

    重要

    model :音声クローニングモデルです。qwen-voice-enrollment に設定してください。

    target_model :音声を駆動する omni モデルです。後続のリアルタイムマルチモーダル API 呼び出しで使用するモデルと一致する必要があります。一致しない場合、合成に失敗します。

    {
        "model": "qwen-voice-enrollment",
        "input": {
            "action": "create",
            "target_model": "qwen3.5-omni-plus-realtime",
            "preferred_name": "guanyu",
            "audio": {
                "data": "https://xxx.wav"
            },
            "text": "Optional. The transcript of the audio in audio.data.",
            "language": "Optional. The language of the audio in audio.data, such as zh."
        }
    }
  • リクエストパラメーター

    パラメーター

    タイプ

    デフォルト

    必須

    説明

    model

    文字列

    -

    はい

    音声クローニングモデルです。qwen-voice-enrollment に設定してください。

    action

    文字列

    -

    はい

    アクションタイプです。create に設定してください。

    target_model

    文字列

    -

    はい

    音声を駆動する omni モデル:

    • qwen3.5-omni-plus-realtime

    • qwen3.5-omni-flash-realtime

    • qwen3.5-omni-plus

    • qwen3.5-omni-flash

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

    preferred_name

    文字列

    -

    はい

    音声の判読可能な名前です。使用できるのは数字、英字、アンダースコアのみです。最大:16 文字。ロールやシナリオに関連する名前を使用してください。

    このキーワードは最終的な音声名に含まれます。たとえば、キーワードが "guanyu" の場合、生成される音声名は "qwen-omni-vc-guanyu-voice-20250812105009984-838b" になります。

    audio.data

    文字列

    -

    はい

    クローニング用の音声です (録音時は Recording guide に従い、音声が Audio requirements を満たしていることを確認してください)。

    音声データは、次のいずれかの方法で送信します:

    1. データ 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. Audio URL ( uploading your audio to OSS を推奨します)

      • ファイルサイズは 10 MB を超えないようにしてください。

      • URL は、認証なしでパブリックにアクセス可能である必要があります。

    text

    文字列

    -

    いいえ

    audio.data の音声に対応するトランスクリプトです。

    このパラメーターを指定すると、サーバーは音声とテキストを比較します。差分が大きすぎる場合、Audio.PreprocessError が返されます。

    language

    文字列

    -

    いいえ

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

    サポートされている値:zh (中国語)、en (英語)、de (ドイツ語)、it (イタリア語)、pt (ポルトガル語)、es (スペイン語)、ja (日本語)、ko (韓国語)、fr (フランス語)、ru (ロシア語)、th (タイ語)、id (インドネシア語)、ar (アラビア語)、cs (チェコ語)、da (デンマーク語)、nl (オランダ語)、fi (フィンランド語)、he (ヘブライ語)、hi (ヒンディー語)、is (アイスランド語)、ms (マレー語)、no (ノルウェー語)、fa (ペルシャ語)、pl (ポーランド語)、sv (スウェーデン語)、tl (タガログ語)、tr (トルコ語)、ur (ウルドゥー語)、vi (ベトナム語)。

    中国語の方言:DongbeiShannxiSichuanHenanChangshaTianjinHangzhouLiaoningShenyangAnshan

    このパラメーターを使用する場合は、クローニングに使用する音声の実際の言語に設定してください。

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

    レスポンス例を表示

    {
        "output": {
            "voice": "yourVoice",
            "target_model": "qwen3.5-omni-plus-realtime"
        },
        "usage": {
            "count": 1
        },
        "request_id": "yourRequestId"
    }

    主要なレスポンスパラメーター:

    パラメーター

    タイプ

    説明

    voice

    文字列

    音声名です。リアルタイムマルチモーダルAPIのvoiceパラメーターには、この値をそのまま使用してください。

    target_model

    文字列

    音声を駆動する omni モデル:

    • qwen3.5-omni-plus-realtime

    • qwen3.5-omni-flash-realtime

    後続のリアルタイムマルチモーダル API 呼び出しで使用するモデルと一致する必要があります。一致しない場合、合成に失敗します。

    request_id

    文字列

    リクエスト ID です。

    count

    整数

    このリクエストで課金される「create voice」操作の回数です。コストは $ です。

    音声を作成する場合、count は常に 1 です。

  • サンプルコード

    重要

    model :音声クローニングモデルです。qwen-voice-enrollment に設定してください。

    target_model :音声を駆動する omni モデルです。後続のリアルタイムマルチモーダル API 呼び出しで使用するモデルと一致する必要があります。一致しない場合、合成に失敗します。

    curl

    API キーを環境変数として設定していない場合は、例内の $DASHSCOPE_API_KEY を実際の API キーに置き換える必要があります。

    # ======= 重要 =======
    # シンガポールリージョンのURL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用してください。
    # APIキーはリージョンによって異なります。APIキーの取得: https://www.alibabacloud.com/help/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": "create",
            "target_model": "qwen3.5-omni-plus-realtime",
            "preferred_name": "your_voice_name",
            "audio": {
                "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/speaker_audio.wav"
            }
        }
    }'

    python

    import os
    import requests
    
    # APIキーはリージョンによって異なります。APIキーの取得: https://www.alibabacloud.com/help/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": "qwen3.5-omni-plus-realtime",
            "preferred_name": "your_voice_name",
            "audio": {
                # サンプル音声のURL。独自の音声ファイルを使用するには、ローカルファイルをアップロードするか、Data URLを使用してください。
                "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/speaker_audio.wav"
            }
        }
    }
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    response = requests.post(url, json=payload, headers=headers)
    
    print("HTTP status:", response.status_code)
    
    if response.status_code == 200:
        data = response.json()
        voice_name = data["output"]["voice"]
        request_id = data["request_id"]
        print(f"Voice created successfully. Voice name: {voice_name}")
        print(f"Request ID: {request_id}")
    else:
        print("Request failed:", 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/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リクエストボディ
            String jsonPayload =
                    "{"
                            + "\"model\": \"qwen-voice-enrollment\"," // 変更しないでください
                            + "\"input\": {"
                            +     "\"action\": \"create\","
                            +     "\"target_model\": \"qwen3.5-omni-plus-realtime\","
                            +     "\"preferred_name\": \"your_voice_name\","
                            +     "\"audio\": {"
                            // サンプル音声のURL。独自の音声ファイルを使用するには、ローカルファイルをアップロードするか、Data URLを使用してください。
                            +         "\"data\": \"https://dashscope.oss-cn-beijing.aliyuncs.com/audios/speaker_audio.wav\""
                            +     "}"
                            + "}"
                            + "}";
    
            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: " + status);
                System.out.println("Response JSON: " + response.toString());
    
                if (status == 200) {
                    Gson gson = new Gson();
                    JsonObject jsonObj = gson.fromJson(response.toString(), JsonObject.class);
                    JsonObject output = jsonObj.getAsJsonObject("output");
                    String voiceName = output.get("voice").getAsString();
                    String requestId = jsonObj.get("request_id").getAsString();
    
                    System.out.println("\nVoice created successfully.");
                    System.out.printf("- Voice Name: %s\n", voiceName);
                    System.out.printf("- Request ID: %s\n", requestId);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

ボイスの一覧表示

ページネーションを使用して、作成済みのボイスを照会します。

  • URL

    China (Beijing):

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

    International (Singapore):

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

    [パラメーター]

    タイプ

    必須

    説明

    Authorization

    文字列

    はい

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

    Content-Type

    文字列

    はい

    リクエストボディのメディアタイプです。application/json に設定してください。

  • リクエストパラメーター

    パラメーター

    タイプ

    デフォルト

    必須

    説明

    model

    文字列

    -

    対応

    音声クローニングモデルです。qwen-voice-enrollment に設定してください。

    action

    文字列

    -

    対応

    アクションタイプです。list に設定してください。

    page_index

    整数

    0

    非対応

    ページ番号のインデックスです。有効な値:0~1,000,000。

    page_size

    整数

    10

    非対応

    ページあたりの項目数です。有効な値:0~1,000,000。

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

    レスポンス例を表示

    {
        "output": {
            "voice_list": [
                {
                    "voice": "yourVoice1",
                    "gmt_create": "2025-08-11 17:59:32",
                    "target_model": "qwen3.5-omni-plus-realtime"
                },
                {
                    "voice": "yourVoice2",
                    "gmt_create": "2025-08-11 17:38:10",
                    "target_model": "qwen3.5-omni-plus-realtime"
                }
            ]
        },
        "usage": {
            "count": 0
        },
        "request_id": "yourRequestId"
    }

    主要なレスポンスパラメーター:

    パラメーター

    タイプ

    説明

    voice

    文字列

    ボイス名です。この値は、リアルタイムマルチモーダル API の voice パラメーターにそのまま設定してください。

    gmt_create

    文字列

    ボイスが作成された時刻です。

    target_model

    文字列

    音声を駆動する omni モデル:

    • qwen3.5-omni-plus-realtime

    • qwen3.5-omni-flash-realtime

    • qwen3.5-omni-plus

    • qwen3.5-omni-flash

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

    request_id

    文字列

    リクエスト ID です。

    count

    整数

    本リクエストは、「音声の作成」操作の実際の実行回数に基づいて課金されます。本リクエストの料金は $ です。

    ボイスの一覧表示は無料です。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/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/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 status:", response.status_code)
    
    if response.status_code == 200:
        data = response.json()
        voice_list = data["output"]["voice_list"]
    
        print("Voice list:")
        for item in voice_list:
            print(f"- Voice: {item['voice']}  Created: {item['gmt_create']}  Model: {item['target_model']}")
    else:
        print("Request failed:", 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/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 リクエストボディ
            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: " + status);
                System.out.println("Response 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 Voice list:");
                    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("- Voice: %s  Created: %s  Model: %s\n",
                                voice, gmtCreate, targetModel);
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

音声の削除

特定の音声を削除し、対応するクォータを解放します。

  • URL

    China (Beijing):

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

    International (Singapore):

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

    [パラメーター]

    タイプ

    必須

    説明

    Authorization

    文字列

    はい

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

    Content-Type

    文字列

    はい

    リクエストボディのメディアタイプです。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

    本リクエストは、「音声の作成」操作の実際の実行回数に基づいて課金されます。本リクエストの料金は $ です。

    Deleting a voice is free. count is always 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/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/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 status:", response.status_code)
    
    if response.status_code == 200:
        data = response.json()
        request_id = data["request_id"]
    
        print(f"削除に成功しました")
        print(f"Request 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/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 リクエストボディを作成します
            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: " + status);
                System.out.println("Response 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("Request ID: " + requestId);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

会話での使用

会話でクローン音声を使用するには、「クイックスタート:音声のクローンと使用」をご参照ください。

ボイスのクォータと自動クリーンアップ

合計上限:1 アカウントあたり 1,000 ボイス

現在、API でボイス数を確認する機能は提供されていません。API を呼び出してボイス数をカウントしてください。

自動クリーンアップ:ボイスが 1 年間、いずれのモデル呼び出しリクエストでも使用されていない場合、システムによって自動的に削除されます。

課金

音声クローニングとモデルの呼び出しは、個別に課金されます:

  • 音声クローニング:$0.01/ボイス で課金されます。作成に失敗した場合は課金されません。

    説明

    無料クォータ (中国サイトの北京リージョンおよび国際サイトのシンガポールリージョンでのみ利用可能):

    • Alibaba Cloud Model Studio の有効化から 90 日以内は、1,000 回のボイス作成が無料になります。

    • 作成に失敗しても、無料クォータは減りません。

    • ボイスを削除しても、無料クォータは復元されません。

    • 無料クォータを使い切るか、90 日の期間が終了すると、ボイスの作成は$0.01/ボイス で課金されます。

  • クローン音声との会話:モデル呼び出し時のトークン使用量に基づいて課金されます。詳細については、「モデル推論の料金」をご参照ください。

著作権と法的コンプライアンス

お客様は、提供する音声の所有権および合法的な使用について責任を負います。サービス規約をお読みください。

録音ガイド

録音機材

ノイズキャンセリング機能付きのマイクを使用するか、静かな環境でスマートフォンを近距離で使用して録音し、クリアな音質を確保します。

録音環境

場所

  • 10 平方メートル以下の小さな密閉空間で録音します。

  • 吸音フォーム、カーペット、カーテンなどの吸音材がある部屋を選びます。

  • 残響が大きい広いホール、会議室、教室は避けてください。

ノイズコントロール

  • 屋外の騒音:ドアや窓を閉めて、交通、工事、その他の外部の音を遮断します。

  • 屋内の騒音:エアコン、扇風機、蛍光灯の安定器の電源を切ります。

  • スマートフォンで環境音を録音し、大音量で再生して、隠れたノイズ源を特定します。

残響コントロール

  • 残響は音声がこもって聞こえる原因となり、明瞭度を低下させます。

  • 滑らかな表面からの反射を減らすには:カーテンを閉めて、クローゼットのドアを開けて、机や棚を衣類や毛布で覆います。

  • 本棚や布張りの家具などの不規則な物体を使用して、拡散反射を作り出します。

台本の準備

  • 台本をターゲットのユースケースに合わせます。例えば、カスタマーサービスのシナリオでは、カスタマーサービスの対話スタイルを使用します。

  • 台本に機密情報や違法なコンテンツ (政治的、ポルノ、暴力的な内容など) が含まれていないことを確認してください。これらはクローニングの失敗の原因となります。

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

  • 読み上げ中は、意味的な一貫性を保ち、頻繁に間を置くことは避けてください。中断なく 3 秒以上連続することを推奨します。

  • ターゲットの感情 (友好的、真面目など) を伝えることはできますが、過度に劇的または芝居がかった話し方は避けてください。自然な口調を保ってください。

推奨手順

一般的な寝室を例に説明します:

エラーメッセージ

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