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

Alibaba Cloud Model Studio:Qwen-TTS 音声デザイン API リファレンス

最終更新日:Jan 31, 2026

音声デザインは、テキスト記述からカスタム音声を生成する機能です。多言語および多次元の音声特徴をサポートしており、広告のナレーション、キャラクター作成、オーディオブック制作などのアプリケーションに適しています。音声デザインと音声合成は、連続した 2 つのステップです。このドキュメントでは、音声デザインのパラメーターとインターフェイスの詳細に焦点を当てています。音声合成の詳細については、「リアルタイム音声合成 - Qwen」をご参照ください。

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

サポート言語

音声デザインは、以下の言語を含む複数の言語での音声作成と音声合成をサポートしています:中国語 (zh)、英語 (en)、ドイツ語 (de)、イタリア語 (it)、ポルトガル語 (pt)、スペイン語 (es)、日本語 (ja)、韓国語 (ko)、フランス語 (fr)、ロシア語 (ru)

高品質な音声記述の書き方

制限事項

音声記述 (voice_prompt) を作成する際は、以下の制約に従ってください:

  • 長さ制限:voice_prompt は 2048 文字を超えてはなりません。

  • サポート言語:記述テキストは中国語または英語のみ使用できます。

基本原則

高品質な音声記述 (voice_prompt) は、理想的な音声を作成するための鍵となります。これは、特定の音声特徴を持つ音声を生成するようモデルを直接ガイドする設計図として機能します。

音声を記述する際は、以下の基本原則に従ってください:

  1. 具体的であること、曖昧でないこと:「深みのある」「はっきりした」「速いペースの」など、声の特徴を明確に記述する言葉を使用します。「良い響きの」や「普通の」といった主観的で情報量の少ない言葉は避けてください。

  2. 多次元的であること、単一次元的でないこと:効果的な記述は、以下で説明するように、性別、年齢、感情など複数の次元を組み合わせます。「女性の声」のような単一次元的な記述は、特徴的な音声を生成するには広すぎます。

  3. 客観的であること、主観的でないこと:個人的な好みではなく、音声自体の物理的および知覚的な特徴に焦点を当てます。例えば、「私のお気に入りの声」ではなく、「高音でエネルギッシュな」を使用します。

  4. 独創的であること、模倣でないこと:有名人など特定の人々の模倣を要求するのではなく、声の特徴を記述してください。そのようなリクエストは著作権リスクを伴い、モデルは直接的な模倣をサポートしていません。

  5. 簡潔であること、冗長でないこと:すべての単語が意味を持つようにします。同義語を繰り返したり、「とてもとても良い声」のような無意味な強調表現を使用したりすることは避けてください。

記述ディメンションのリファレンス

ディメンション

記述例

性別

男性、女性、中性

年齢

子供 (5~12 歳)、ティーン (13~18 歳)、若年成人 (19~35 歳)、中年 (36~55 歳)、シニア (55 歳以上)

ピッチ

高い、中間、低い、やや高い、やや低い

話速

速い、普通、遅い、やや速い、やや遅い

感情

明るい、落ち着いた、優しい、真面目な、生き生きとした、冷静な、心地よい

特徴

魅力的な、はっきりした、しゃがれた、滑らかな、甘い、豊かな、力強い

利用シーン

ニュース放送、広告ナレーション、オーディオブック、アニメキャラクター、音声アシスタント、ドキュメンタリーナレーション

用例比較

✅ 推奨される例

  • 「若々しく生き生きとした女性の声。話速は速く、イントネーションが顕著に上昇する。ファッション製品の紹介に適している。」

    分析:この記述は年齢、個性、話速、イントネーションを組み合わせ、利用シーンを指定することで、鮮やかで明確なイメージを作り出しています。

  • 「落ち着いた中年の男性の声。話速は遅く、深みと魅力のあるトーンで、ニュースの読み上げやドキュメンタリーのナレーションに最適。」

    分析:この記述は性別、年齢層、話速、音質、適用ドメインを明確に定義しています。

  • 「かわいい子供の声。およそ 8 歳の女の子で、少し子供っぽいトーン。アニメキャラクターの吹き替えに最適。」

    分析:この記述は正確な年齢と声の特徴 (「子供っぽい」) を、明確な目的とともに指定しています。

  • 「優しく知的な女性の声。30 歳前後で、落ち着いたトーン。オーディオブックのナレーションに適している。」

    分析:この記述は「知的」「落ち着いた」といった言葉を通じて、感情的および文体的な質を効果的に伝えています。

❌ 推奨されない例と提案

主な問題点

提案

良い響きの声

曖昧で主観的すぎる。実行可能な特徴に欠ける。

具体的なディメンションを追加する。例:「澄んだトーンで優しいイントネーションの若い女性の声」。

特定の有名人のような声

著作権リスクを伴う。モデルは特定の人を直接模倣できない。

声の特徴を記述する。例:「落ち着いたペースで、成熟した魅力的な男性の声」。

とてもとてもとても良い女性の声

冗長。単語を繰り返しても声の定義には役立たない。

繰り返しを削除し、意味のある記述子を追加する。例:「20~24 歳の女性の声で、軽快で明るいトーンと甘い音色」。

123456

無効な入力。声の特徴として解析できない。

意味のあるテキスト記述を提供する。詳細については、上記の推奨例をご参照ください。

クイックスタート:音声デザインから音声合成まで

image

1. ワークフロー

音声デザインと音声合成は、密接に関連しながらも独立した 2 つのステップであり、「作成してから使用する」というワークフローに従います:

  1. 音声デザインのための音声記述とプレビューテキストを準備します。

    • 音声記述 (voice_prompt):ターゲットとなる音声の特徴を定義します。ガイダンスについては、「高品質な音声記述の書き方」をご参照ください。

    • プレビューテキスト (preview_text):プレビュー音声が読み上げるテキストです。例:「皆さん、こんにちは。番組へようこそ。」

  2. 音声の作成 API を呼び出してカスタム音声を生成し、その名前とプレビュー音声を取得します。

    このステップでは、作成された音声を駆動する音声合成モデルを宣言するために、target_model を指定する必要があります。

    プレビュー音声を聞いて、期待どおりかどうかを評価します。期待どおりであれば次に進みます。そうでなければ、音声を再設計します。

    音声のリスト表示 API を使用して確認できる作成済みの音声が既にある場合は、このステップをスキップして次のステップに進むことができます。

  3. 音声合成にその音声を使用します。

    音声合成 API を呼び出し、前のステップで取得した音声を渡します。ここで使用する音声合成モデルは、前のステップで指定した target_model と一致する必要があります。

2. モデル構成と事前準備

適切なモデルを選択し、セットアップタスクを完了します。

モデル構成

音声デザイン中に以下の 2 つのモデルを指定します:

  • 音声デザインモデル:qwen-voice-design

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

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

事前準備

  1. API キーの取得:「API キーの取得と設定」をご参照ください。セキュリティのため、API キーは環境変数に保存してください。

  2. SDK のインストール:「最新の DashScope SDK のインストール」をご参照ください。

3. サンプルコード

  1. カスタム音声を生成し、プレビューを聞きます。満足できれば次に進みます。そうでなければ、音声を再生成します。

    Python

    import requests
    import base64
    import os
    
    def create_voice_and_play():
        # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
        # 環境変数を設定していない場合は、以下の行を api_key = "sk-xxx" に置き換えてください。
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        if not api_key:
            print("エラー:DASHSCOPE_API_KEY 環境変数が見つかりません。API キーを設定してください。")
            return None, None, None
        
        # リクエストデータを準備
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "create",
                "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                "voice_prompt": "冷静な中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーの解説に適しています。",
                "preview_text": "リスナーの皆様、こんにちは。夜のニュースへようこそ。",
                "preferred_name": "announcer",
                "language": "en"
            },
            "parameters": {
                "sample_rate": 24000,
                "response_format": "wav"
            }
        }
        
        # シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        
        try:
            # リクエストを送信
            response = requests.post(
                url,
                headers=headers,
                json=data,
                timeout=60  # タイムアウト設定を追加
            )
            
            if response.status_code == 200:
                result = response.json()
                
                # 音声名を取得
                voice_name = result["output"]["voice"]
                print(f"音声名:{voice_name}")
                
                # プレビュー音声データを取得
                base64_audio = result["output"]["preview_audio"]["data"]
                
                # Base64 音声データをデコード
                audio_bytes = base64.b64decode(base64_audio)
                
                # 音声ファイルをローカルに保存
                filename = f"{voice_name}_preview.wav"
                
                # 音声データをローカルファイルに書き込み
                with open(filename, 'wb') as f:
                    f.write(audio_bytes)
                
                print(f"音声がローカルファイルに保存されました:{filename}")
                print(f"ファイルパス:{os.path.abspath(filename)}")
                
                return voice_name, audio_bytes, filename
            else:
                print(f"リクエストが失敗しました。状態コード:{response.status_code}")
                print(f"応答:{response.text}")
                return None, None, None
                
        except requests.exceptions.RequestException as e:
            print(f"ネットワークリクエストエラー:{e}")
            return None, None, None
        except KeyError as e:
            print(f"応答フォーマットエラー:必須フィールドがありません:{e}")
            print(f"応答:{response.text if 'response' in locals() else '応答なし'}")
            return None, None, None
        except Exception as e:
            print(f"予期せぬエラー:{e}")
            return None, None, None
    
    if __name__ == "__main__":
        print("音声を作成中...")
        voice_name, audio_data, saved_filename = create_voice_and_play()
        
        if voice_name:
            print(f"\n音声 '{voice_name}' の作成に成功しました")
            print(f"音声ファイルが保存されました:'{saved_filename}'")
            print(f"ファイルサイズ:{os.path.getsize(saved_filename)} バイト")
        else:
            print("\n音声の作成に失敗しました")

    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.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Base64;
    
    public class Main {
        public static void main(String[] args) {
            Main example = new Main();
            example.createVoice();
        }
    
        public void createVoice() {
            // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
            // 環境変数を設定していない場合は、以下の行を String apiKey = "sk-xxx" に置き換えてください。
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // JSON リクエストボディ文字列を作成
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"create\",\n" +
                    "        \"target_model\": \"qwen3-tts-vd-realtime-2026-01-15\",\n" +
                    "        \"voice_prompt\": \"冷静な中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーの解説に適しています。\",\n" +
                    "        \"preview_text\": \"リスナーの皆様、こんにちは。夜のニュースへようこそ。\",\n" +
                    "        \"preferred_name\": \"announcer\",\n" +
                    "        \"language\": \"en\"\n" +
                    "    },\n" +
                    "    \"parameters\": {\n" +
                    "        \"sample_rate\": 24000,\n" +
                    "        \"response_format\": \"wav\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // リクエストメソッドとヘッダーを設定
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // リクエストボディを送信
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // 応答を取得
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // 応答内容を読み取り
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // JSON 応答を解析
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
                    JsonObject outputObj = jsonResponse.getAsJsonObject("output");
                    JsonObject previewAudioObj = outputObj.getAsJsonObject("preview_audio");
    
                    // 音声名を取得
                    String voiceName = outputObj.get("voice").getAsString();
                    System.out.println("音声名:" + voiceName);
    
                    // Base64 エンコードされた音声データを取得
                    String base64Audio = previewAudioObj.get("data").getAsString();
    
                    // Base64 音声データをデコード
                    byte[] audioBytes = Base64.getDecoder().decode(base64Audio);
    
                    // 音声をローカルファイルに保存
                    String filename = voiceName + "_preview.wav";
                    saveAudioToFile(audioBytes, filename);
    
                    System.out.println("音声がローカルファイルに保存されました:" + filename);
    
                } else {
                    // エラー応答を読み取り
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("リクエストが失敗しました。状態コード:" + responseCode);
                    System.out.println("エラー応答:" + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("リクエストエラー:" + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    
        private void saveAudioToFile(byte[] audioBytes, String filename) {
            try {
                File file = new File(filename);
                try (FileOutputStream fos = new FileOutputStream(file)) {
                    fos.write(audioBytes);
                }
                System.out.println("音声が保存されました:" + file.getAbsolutePath());
            } catch (IOException e) {
                System.err.println("音声ファイルの保存中にエラーが発生しました:" + e.getMessage());
                e.printStackTrace();
            }
        }
    }
  2. 前のステップで生成されたカスタム音声を音声合成に使用します。

    この例は、DashScope SDK の「サーバーコミットモード」に基づいており、システム音声を使用して音声合成を行います。voice パラメーターを、音声デザインによって生成されたカスタム音声に置き換えます。

    重要な原則:音声デザイン時に使用したモデル (target_model) は、後続の音声合成で使用するモデル (model) と同じでなければなりません。そうでない場合、合成は失敗します。

    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 base64
    import threading
    import time
    import dashscope  # DashScope Python SDK バージョン 1.23.9 以降が必要です
    from dashscope.audio.qwen_tts_realtime import QwenTtsRealtime, QwenTtsRealtimeCallback, AudioFormat
    
    # ======= 定数設定 =======
    TEXT_TO_SYNTHESIZE = [
        'Right? I just love this kind of supermarket,',
        'especially during the New Year.',
        'Going to the supermarket',
        'just makes me feel',
        'super, super happy!',
        'I want to buy so many things!'
    ]
    
    def init_dashscope_api_key():
        """
        DashScope SDK の API キーを初期化します
        """
        # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/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] 接続が閉じられました, code={close_status_code}, msg={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="qwen3-tts-vd-realtime-2026-01-15",
            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="myvoice", # voice パラメーターを音声デザインで生成したカスタム音声に置き換えます
            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()}s')

    Java

    import com.alibaba.dashscope.audio.qwen_tts_realtime.*;
    import com.alibaba.dashscope.exception.NoApiKeyException;
    import com.google.gson.JsonObject;
    
    import javax.sound.sampled.*;
    import java.io.*;
    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 String[] textToSynthesize = {
                "Right? I just love this kind of supermarket,",
                "especially during the New Year.",
                "Going to the supermarket",
                "just makes me feel",
                "super, super happy!",
                "I want to buy so many things!"
        };
    
        // リアルタイム音声再生クラス
        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("qwen3-tts-vd-realtime-2026-01-15")
                    // シンガポールリージョンの 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/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("myvoice") // voice パラメーターを音声デザインで生成したカスタム音声に置き換えます
                    .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);
        }
    }

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-design に固定されています。

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

    {
        "model": "qwen-voice-design",
        "input": {
            "action": "create",
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice_prompt": "落ち着いた中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーのナレーションに適しています。",
            "preview_text": "リスナーの皆様、こんにちは。夜のニュースへようこそ。",
            "preferred_name": "announcer",
            "language": "en"
        },
        "parameters": {
            "sample_rate": 24000,
            "response_format": "wav"
        }
    }
  • リクエストパラメーター

    パラメーター

    タイプ

    デフォルト

    必須

    説明

    model

    string

    -

    対応

    音声デザインモデル。固定値:qwen-voice-design

    action

    string

    -

    はい

    操作タイプ。固定値:create

    target_model

    string

    -

    はい

    音声を駆動する音声合成モデル。サポートされているモデル:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

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

    voice_prompt

    string

    -

    はい

    音声記述。最大長:2048 文字。

    中国語と英語のみサポートされています。

    音声記述の書き方については、「高品質な音声記述の書き方」をご参照ください。

    preview_text

    string

    -

    はい

    プレビュー音声用のテキスト。最大長:1024 文字。

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

    preferred_name

    string

    -

    対応

    音声に識別しやすい名前を割り当てます (数字、文字、アンダースコアのみ許可、最大 16 文字)。キャラクターやシナリオに関連する識別子を使用することを推奨します。

    キーワードは設計された音声名に表示されます。例えば、キーワードが "announcer" の場合、最終的な音声名は "qwen-tts-vd-announcer-voice-20251201102800-a1b2" となります。

    language

    string

    zh

    いいえ

    言語コード。生成される音声の言語プリファレンスを指定します。このパラメーターは、音声の言語的特徴と発音傾向に影響します。ご利用のユースケースに一致するコードを選択してください。

    このパラメーターを使用する場合、言語は preview_text の言語と一致する必要があります。

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

    sample_rate

    int

    24000

    いいえ

    音声デザインによって生成されるプレビュー音声のサンプルレート (Hz)。

    有効な値:

    • 8000

    • 16000

    • 24000

    • 48000

    response_format

    string

    wav

    いいえ

    音声デザインによって生成されるプレビュー音声のフォーマット。

    有効な値:

    • pcm

    • wav

    • mp3

    • opus

  • 応答パラメーター

    クリックして応答例を表示

    {
        "output": {
            "preview_audio": {
                "data": "{base64_encoded_audio}",
                "sample_rate": 24000,
                "response_format": "wav"
            },
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice": "yourVoice"
        },
        "usage": {
            "count": 1
        },
        "request_id": "yourRequestId"
    }

    主要なパラメーターは以下の通りです:

    パラメーター

    タイプ

    説明

    voice

    string

    音声名。音声合成 API の voice パラメーターとして直接使用できます。

    data

    string

    音声デザインによって生成されたプレビュー音声データ。Base64 エンコードされた文字列として返されます。

    sample_rate

    int

    音声デザインによって生成されたプレビュー音声のサンプルレート (Hz)。音声作成時に設定されたサンプルレートと一致します。デフォルトは 24000 Hz です。

    response_format

    string

    音声デザインによって生成されたプレビュー音声のフォーマット。音声作成時に設定されたオーディオフォーマットと一致します。デフォルトは wav です。

    target_model

    string

    音声を駆動する音声合成モデル。サポートされているモデル:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

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

    request_id

    string

    リクエスト ID。

    count

    integer

    このリクエストで課金される「音声の作成」操作の数。このリクエストのコストは $ です。

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

  • サンプルコード

    重要

    以下のパラメーターの違いにご注意ください:

    • model:音声デザインモデル。値は qwen-voice-design に固定されています。

    • target_model:音声を駆動する音声合成モデル。後続の 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 -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "input": {
            "action": "create",
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice_prompt": "落ち着いた中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーのナレーションに適しています。",
            "preview_text": "リスナーの皆様、こんにちは。夜のニュースへようこそ。",
            "preferred_name": "announcer",
            "language": "en"
        },
        "parameters": {
            "sample_rate": 24000,
            "response_format": "wav"
        }
    }'

    Python

    import requests
    import base64
    import os
    
    def create_voice_and_play():
        # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
        # 環境変数を設定していない場合は、以下の行を api_key = "sk-xxx" に置き換えてください。
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        if not api_key:
            print("エラー:DASHSCOPE_API_KEY 環境変数が見つかりません。API キーを設定してください。")
            return None, None, None
        
        # リクエストデータを準備
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "create",
                "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                "voice_prompt": "冷静な中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーの解説に適しています。",
                "preview_text": "リスナーの皆様、こんにちは。夜のニュースへようこそ。",
                "preferred_name": "announcer",
                "language": "en"
            },
            "parameters": {
                "sample_rate": 24000,
                "response_format": "wav"
            }
        }
        
        # シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        
        try:
            # リクエストを送信
            response = requests.post(
                url,
                headers=headers,
                json=data,
                timeout=60  # タイムアウト設定を追加
            )
            
            if response.status_code == 200:
                result = response.json()
                
                # 音声名を取得
                voice_name = result["output"]["voice"]
                print(f"音声名:{voice_name}")
                
                # プレビュー音声データを取得
                base64_audio = result["output"]["preview_audio"]["data"]
                
                # Base64 音声データをデコード
                audio_bytes = base64.b64decode(base64_audio)
                
                # 音声ファイルをローカルに保存
                filename = f"{voice_name}_preview.wav"
                
                # 音声データをローカルファイルに書き込み
                with open(filename, 'wb') as f:
                    f.write(audio_bytes)
                
                print(f"音声がローカルファイルに保存されました:{filename}")
                print(f"ファイルパス:{os.path.abspath(filename)}")
                
                return voice_name, audio_bytes, filename
            else:
                print(f"リクエストが失敗しました。状態コード:{response.status_code}")
                print(f"応答:{response.text}")
                return None, None, None
                
        except requests.exceptions.RequestException as e:
            print(f"ネットワークリクエストエラー:{e}")
            return None, None, None
        except KeyError as e:
            print(f"応答フォーマットエラー:必須フィールドがありません:{e}")
            print(f"応答:{response.text if 'response' in locals() else '応答なし'}")
            return None, None, None
        except Exception as e:
            print(f"予期せぬエラー:{e}")
            return None, None, None
    
    if __name__ == "__main__":
        print("音声を作成中...")
        voice_name, audio_data, saved_filename = create_voice_and_play()
        
        if voice_name:
            print(f"\n音声 '{voice_name}' の作成に成功しました")
            print(f"音声ファイルが保存されました:'{saved_filename}'")
            print(f"ファイルサイズ:{os.path.getsize(saved_filename)} バイト")
        else:
            print("\n音声の作成に失敗しました")

    Java

    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Base64;
    
    public class Main {
        public static void main(String[] args) {
            Main example = new Main();
            example.createVoice();
        }
    
        public void createVoice() {
            // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
            // 環境変数を設定していない場合は、以下の行を String apiKey = "sk-xxx" に置き換えてください。
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // JSON リクエストボディ文字列を作成
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"create\",\n" +
                    "        \"target_model\": \"qwen3-tts-vd-realtime-2026-01-15\",\n" +
                    "        \"voice_prompt\": \"冷静な中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーの解説に適しています。\",\n" +
                    "        \"preview_text\": \"リスナーの皆様、こんにちは。夜のニュースへようこそ。\",\n" +
                    "        \"preferred_name\": \"announcer\",\n" +
                    "        \"language\": \"en\"\n" +
                    "    },\n" +
                    "    \"parameters\": {\n" +
                    "        \"sample_rate\": 24000,\n" +
                    "        \"response_format\": \"wav\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // リクエストメソッドとヘッダーを設定
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // リクエストボディを送信
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // 応答を取得
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // 応答内容を読み取り
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // JSON 応答を解析
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
                    JsonObject outputObj = jsonResponse.getAsJsonObject("output");
                    JsonObject previewAudioObj = outputObj.getAsJsonObject("preview_audio");
    
                    // 音声名を取得
                    String voiceName = outputObj.get("voice").getAsString();
                    System.out.println("音声名:" + voiceName);
    
                    // Base64 エンコードされた音声データを取得
                    String base64Audio = previewAudioObj.get("data").getAsString();
    
                    // Base64 音声データをデコード
                    byte[] audioBytes = Base64.getDecoder().decode(base64Audio);
    
                    // 音声をローカルファイルに保存
                    String filename = voiceName + "_preview.wav";
                    saveAudioToFile(audioBytes, filename);
    
                    System.out.println("音声がローカルファイルに保存されました:" + filename);
    
                } else {
                    // エラー応答を読み取り
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("リクエストが失敗しました。状態コード:" + responseCode);
                    System.out.println("エラー応答:" + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("リクエストエラー:" + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    
        private void saveAudioToFile(byte[] audioBytes, String filename) {
            try {
                File file = new File(filename);
                try (FileOutputStream fos = new FileOutputStream(file)) {
                    fos.write(audioBytes);
                }
                System.out.println("音声が保存されました:" + file.getAbsolutePath());
            } catch (IOException e) {
                System.err.println("音声ファイルの保存中にエラーが発生しました:" + e.getMessage());
                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-design に固定されています。この値を変更しないでください。

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

    パラメーター

    タイプ

    デフォルト

    必須

    説明

    model

    string

    -

    対応

    音声デザインモデル。固定値:qwen-voice-design

    action

    string

    -

    対応

    操作タイプ。固定値:list

    page_index

    integer

    0

    いいえ

    ページインデックス。有効値:[0, 200]。

    page_size

    integer

    10

    いいえ

    1 ページあたりのデータエントリ数。値は 0 より大きくなければなりません。

  • 応答パラメーター

    クリックして応答例を表示

    {
        "output": {
            "page_index": 0,
            "page_size": 2,
            "total_count": 26,
            "voice_list": [
                {
                    "gmt_create": "2025-12-10 17:04:54",
                    "gmt_modified": "2025-12-10 17:04:54",
                    "language": "en",
                    "preview_text": "リスナーの皆様、こんにちは。本日の番組へようこそ。",
                    "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                    "voice": "yourVoice1",
                    "voice_prompt": "落ち着いた中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーのナレーションに適しています。深みと魅力があり、安定した話速"
                },
                {
                    "gmt_create": "2025-12-10 15:31:35",
                    "gmt_modified": "2025-12-10 15:31:35",
                    "language": "en",
                    "preview_text": "リスナーの皆様、こんにちは",
                    "target_model": "qwen3-tts-vd-realtime-2026-01-15",
                    "voice": "yourVoice2",
                    "voice_prompt": "落ち着いた中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーのナレーションに適しています。"
                }
            ]
        },
        "usage": {},
        "request_id": "yourRequestId"
    }

    主要なパラメーターは以下の通りです:

    パラメーター

    タイプ

    説明

    voice

    string

    音声名。音声合成 API の voice パラメーターとして直接使用できます。

    target_model

    string

    音声を駆動する音声合成モデル。サポートされているモデル:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

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

    language

    string

    言語コード。

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

    voice_prompt

    string

    音声記述。

    preview_text

    string

    プレビューテキスト。

    gmt_create

    string

    音声が作成された時刻。

    gmt_modified

    string

    音声が変更された時刻。

    page_index

    integer

    ページインデックス。

    page_size

    integer

    1 ページあたりのデータエントリ数。

    total_count

    integer

    見つかったデータエントリの総数。

    request_id

    string

    リクエスト ID。

  • サンプルコード

    重要

    model:音声デザインモデル。値は qwen-voice-design に固定されています。この値を変更しないでください。

    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 -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "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-design", # この値は変更しないでください
        "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/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-design\"," // この値は変更しないでください
                            + "\"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-design に固定されています。この値を変更しないでください。

    {
        "model": "qwen-voice-design",
        "input": {
            "action": "query",
            "voice": "voiceName"
        }
    }
  • リクエストパラメーター

    パラメーター

    タイプ

    デフォルト

    必須

    説明

    model

    string

    -

    対応

    音声デザインモデル。固定値:qwen-voice-design

    action

    string

    -

    はい

    操作タイプ。固定値:query

    voice

    string

    -

    対応

    クエリする音声の名前。

  • 応答パラメーター

    クリックして応答例を表示

    データが見つかった場合

    {
        "output": {
            "gmt_create": "2025-12-10 14:54:09",
            "gmt_modified": "2025-12-10 17:47:48",
            "language": "en",
            "preview_text": "リスナーの皆様、こんにちは",
            "target_model": "qwen3-tts-vd-realtime-2026-01-15",
            "voice": "yourVoice",
            "voice_prompt": "落ち着いた中年の男性アナウンサーの声。深みと豊かさ、そして魅力があり、安定した話速と明瞭な発音で、ニュース放送やドキュメンタリーのナレーションに適しています。"
        },
        "usage": {},
        "request_id": "yourRequestId"
    }

    データが見つからない場合

    クエリされた音声が存在しない場合、API は HTTP 400 状態コードを返し、応答ボディには VoiceNotFound エラーコードが含まれます。

    {
        "request_id":"yourRequestId",
        "code":"VoiceNotFound",
        "message":"Voice not found: qwen-tts-vd-announcer-voice-xxxx"
    }

    主要なパラメーターは以下の通りです:

    パラメーター

    タイプ

    説明

    voice

    string

    音声名。音声合成 API の voice パラメーターとして直接使用できます。

    target_model

    string

    音声を駆動する音声合成モデル。サポートされているモデル:

    • qwen3-tts-vd-realtime-2026-01-15

    • qwen3-tts-vd-realtime-2025-12-16

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

    language

    string

    言語コード。

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

    voice_prompt

    string

    音声記述。

    preview_text

    string

    プレビューテキスト。

    gmt_create

    string

    音声が作成された時刻。

    gmt_modified

    string

    音声が変更された時刻。

    request_id

    string

    リクエスト ID。

  • サンプルコード

    重要

    model:音声デザインモデル。値は qwen-voice-design に固定されています。この値を変更しないでください。

    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 -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "input": {
            "action": "query",
            "voice": "voiceName"
        }
    }'

    Python

    import requests
    import os
    
    def query_voice(voice_name):
        """
        特定の音声の情報をクエリします
        :param voice_name: 音声の名前
        :return: 音声情報を含む辞書、見つからない場合は None
        """
        # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
        # 環境変数を設定していない場合は、以下の行を api_key = "sk-xxx" に置き換えてください。
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        # リクエストデータを準備
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "query",
                "voice": voice_name
            }
        }
        
        # シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        # リクエストを送信
        response = requests.post(
            url,
            headers=headers,
            json=data
        )
        
        if response.status_code == 200:
            result = response.json()
            
            # エラーメッセージを確認
            if "code" in result and result["code"] == "VoiceNotFound":
                print(f"音声が見つかりません:{voice_name}")
                print(f"エラーメッセージ:{result.get('message', '音声が見つかりません')}")
                return None
            
            # 音声情報を取得
            voice_info = result["output"]
            print(f"音声情報のクエリに成功しました:")
            print(f"  音声名:{voice_info.get('voice')}")
            print(f"  作成日時:{voice_info.get('gmt_create')}")
            print(f"  変更日時:{voice_info.get('gmt_modified')}")
            print(f"  言語:{voice_info.get('language')}")
            print(f"  プレビューテキスト:{voice_info.get('preview_text')}")
            print(f"  モデル:{voice_info.get('target_model')}")
            print(f"  音声プロンプト:{voice_info.get('voice_prompt')}")
            
            return voice_info
        else:
            print(f"リクエストが失敗しました。状態コード:{response.status_code}")
            print(f"応答:{response.text}")
            return None
    
    def main():
        # 例:音声をクエリ
        voice_name = "myvoice"  # クエリしたい実際の音声名に置き換えてください
        
        print(f"音声をクエリ中:{voice_name}")
        voice_info = query_voice(voice_name)
        
        if voice_info:
            print("\n音声のクエリに成功しました!")
        else:
            print("\n音声のクエリに失敗したか、音声が存在しません。")
    
    if __name__ == "__main__":
        main()

    Java

    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    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) {
            Main example = new Main();
            // 例:音声をクエリ
            String voiceName = "myvoice"; // クエリしたい実際の音声名に置き換えてください
            System.out.println("音声をクエリ中:" + voiceName);
            example.queryVoice(voiceName);
        }
    
        public void queryVoice(String voiceName) {
            // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
            // 環境変数を設定していない場合は、以下の行を String apiKey = "sk-xxx" に置き換えてください。
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // JSON リクエストボディ文字列を作成
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"query\",\n" +
                    "        \"voice\": \"" + voiceName + "\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // リクエストメソッドとヘッダーを設定
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // リクエストボディを送信
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // 応答を取得
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // 応答内容を読み取り
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // JSON 応答を解析
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
    
                    // エラーメッセージを確認
                    if (jsonResponse.has("code") && "VoiceNotFound".equals(jsonResponse.get("code").getAsString())) {
                        String errorMessage = jsonResponse.has("message") ?
                                jsonResponse.get("message").getAsString() : "音声が見つかりません";
                        System.out.println("音声が見つかりません:" + voiceName);
                        System.out.println("エラーメッセージ:" + errorMessage);
                        return;
                    }
    
                    // 音声情報を取得
                    JsonObject outputObj = jsonResponse.getAsJsonObject("output");
    
                    System.out.println("音声情報のクエリに成功しました:");
                    System.out.println("  音声名:" + outputObj.get("voice").getAsString());
                    System.out.println("  作成日時:" + outputObj.get("gmt_create").getAsString());
                    System.out.println("  変更日時:" + outputObj.get("gmt_modified").getAsString());
                    System.out.println("  言語:" + outputObj.get("language").getAsString());
                    System.out.println("  プレビューテキスト:" + outputObj.get("preview_text").getAsString());
                    System.out.println("  モデル:" + outputObj.get("target_model").getAsString());
                    System.out.println("  音声プロンプト:" + outputObj.get("voice_prompt").getAsString());
    
                } else {
                    // エラー応答を読み取り
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("リクエストが失敗しました。状態コード:" + responseCode);
                    System.out.println("エラー応答:" + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("リクエストエラー:" + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }

音声の削除

指定された音声を削除し、対応するクォータを解放します。

  • 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-design に固定されています。この値を変更しないでください。

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

    パラメーター

    タイプ

    デフォルト

    必須

    説明

    model

    string

    -

    対応

    音声デザインモデル。固定値:qwen-voice-design

    action

    string

    -

    対応

    操作タイプ。固定値:delete

    voice

    string

    -

    対応

    削除する音声。

  • 応答パラメーター

    クリックして応答例を表示

    {
        "output": {
            "voice": "yourVoice"
        },
        "usage": {},
        "request_id": "yourRequestId"
    }

    主要なパラメーターは以下の通りです:

    パラメーター

    タイプ

    説明

    request_id

    string

    リクエスト ID。

    voice

    string

    削除された音声。

  • サンプルコード

    重要

    model:音声デザインモデル。値は qwen-voice-design に固定されています。この値を変更しないでください。

    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 -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen-voice-design",
        "input": {
            "action": "delete",
            "voice": "yourVoice"
        }
    }'

    Python

    import requests
    import os
    
    def delete_voice(voice_name):
        """
        指定された音声を削除します
        :param voice_name: 音声の名前
        :return: 削除が成功した場合、または音声が存在しないがリクエストが成功した場合は True、操作が失敗した場合は False
        """
        # API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
        # 環境変数を設定していない場合は、以下の行を api_key = "sk-xxx" に置き換えてください。
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        # リクエストデータを準備
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "qwen-voice-design",
            "input": {
                "action": "delete",
                "voice": voice_name
            }
        }
        
        # シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
        url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"
        # リクエストを送信
        response = requests.post(
            url,
            headers=headers,
            json=data
        )
        
        if response.status_code == 200:
            result = response.json()
            
            # エラーメッセージを確認
            if "code" in result and "VoiceNotFound" in result["code"]:
                print(f"音声が存在しません:{voice_name}")
                print(f"エラーメッセージ:{result.get('message', '音声が見つかりません')}")
                return True  # 音声が存在しないことも成功した操作と見なします (ターゲットは既に存在しないため)
            
            # 削除が成功したか確認
            if "usage" in result:
                print(f"音声が正常に削除されました:{voice_name}")
                print(f"リクエスト ID:{result.get('request_id', 'N/A')}")
                return True
            else:
                print(f"削除操作が予期しないフォーマットを返しました:{result}")
                return False
        else:
            print(f"音声の削除リクエストが失敗しました。状態コード:{response.status_code}")
            print(f"応答:{response.text}")
            return False
    
    def main():
        # 例:音声を削除
        voice_name = "myvoice"  # 削除したい実際の音声名に置き換えてください
        
        print(f"音声を削除中:{voice_name}")
        success = delete_voice(voice_name)
        
        if success:
            print(f"\n音声 '{voice_name}' の削除操作が完了しました!")
        else:
            print(f"\n音声 '{voice_name}' の削除操作が失敗しました!")
    
    if __name__ == "__main__":
        main()

    Java

    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    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) {
            Main example = new Main();
            // 例:音声を削除
            String voiceName = "myvoice"; // 削除したい実際の音声名に置き換えてください
            System.out.println("音声を削除中:" + voiceName);
            example.deleteVoice(voiceName);
        }
    
        public void deleteVoice(String voiceName) {
            // API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
            // 環境変数を設定していない場合は、以下の行を String apiKey = "sk-xxx" に置き換えてください。
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // JSON リクエストボディ文字列を作成
            String jsonBody = "{\n" +
                    "    \"model\": \"qwen-voice-design\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"delete\",\n" +
                    "        \"voice\": \"" + voiceName + "\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // シンガポールリージョンの URL。北京リージョンの場合は、https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization を使用します。
                URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization");
                connection = (HttpURLConnection) url.openConnection();
    
                // リクエストメソッドとヘッダーを設定
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Authorization", "Bearer " + apiKey);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setDoOutput(true);
                connection.setDoInput(true);
    
                // リクエストボディを送信
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = jsonBody.getBytes("UTF-8");
                    os.write(input, 0, input.length);
                    os.flush();
                }
    
                // 応答を取得
                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // 応答内容を読み取り
                    StringBuilder response = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            response.append(responseLine.trim());
                        }
                    }
    
                    // JSON 応答を解析
                    JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject();
    
                    // エラーメッセージを確認
                    if (jsonResponse.has("code") && jsonResponse.get("code").getAsString().contains("VoiceNotFound")) {
                        String errorMessage = jsonResponse.has("message") ?
                                jsonResponse.get("message").getAsString() : "音声が見つかりません";
                        System.out.println("音声が存在しません:" + voiceName);
                        System.out.println("エラーメッセージ:" + errorMessage);
                        // 音声が存在しないことも成功した操作と見なします (ターゲットは既に存在しないため)
                    } else if (jsonResponse.has("usage")) {
                        // 削除が成功したか確認
                        System.out.println("音声が正常に削除されました:" + voiceName);
                        String requestId = jsonResponse.has("request_id") ?
                                jsonResponse.get("request_id").getAsString() : "N/A";
                        System.out.println("リクエスト ID:" + requestId);
                    } else {
                        System.out.println("削除操作が予期しないフォーマットを返しました:" + response.toString());
                    }
    
                } else {
                    // エラー応答を読み取り
                    StringBuilder errorResponse = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(
                            new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
                        String responseLine;
                        while ((responseLine = br.readLine()) != null) {
                            errorResponse.append(responseLine.trim());
                        }
                    }
    
                    System.out.println("音声の削除リクエストが失敗しました。状態コード:" + responseCode);
                    System.out.println("エラー応答:" + errorResponse.toString());
                }
    
            } catch (Exception e) {
                System.err.println("リクエストエラー:" + e.getMessage());
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }

音声合成

音声デザインからのカスタム音声を使用してパーソナライズされた音声合成を行う方法については、「クイックスタート:音声デザインから音声合成まで」をご参照ください。

qwen3-tts-vd-realtime-2026-01-15 などの音声デザイン用の音声合成モデルは特殊です。これらは音声デザインによって生成された音声のみをサポートし、Chelsie、Serena、Ethan、Cherry などの公開プリセット音声はサポートしていません。

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

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

    音声のリスト表示total_count
  • 自動クリーンアップ:過去 1 年間に音声合成リクエストで使用されなかった音声は、システムによって自動的に削除されます。

課金

音声デザインと音声合成は別々に課金されます:

  • 音声デザイン:音声の作成は、1 音声あたり 0.2 米ドルで課金されます。作成に失敗した場合は課金されません。

    説明

    無料クォータの詳細 (シンガポールリージョンのみ):

    • Alibaba Cloud Model Studio をアクティベートしてから 90 日以内に、10 回の無料音声作成機会が付与されます。

    • 作成に失敗しても無料クォータは消費されません。

    • 音声を削除しても無料クォータは復元されません。

    • 無料クォータを使い切った後、または 90 日の有効期間が終了した後は、音声作成は1 音声あたり 0.2 米ドルで課金されます。

  • 音声デザインのカスタム音声を使用した音声合成:テキスト文字数に基づいて課金されます。詳細については、「リアルタイム音声合成 - Qwen」をご参照ください。

エラーメッセージ

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