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

Alibaba Cloud Model Studio:CosyVoice 音声合成 Java SDK

最終更新日:Mar 19, 2026

CosyVoice 音声合成 Java SDK のパラメーターおよび主要インターフェイスについて説明します。

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

前提条件

  • Model Studio を有効化し、API キーを作成済みである必要があります。環境変数としてエクスポートする(ハードコーディングしない)ことで、セキュリティリスクを防止してください。

    説明

    一時的なアクセスや、機密データへのアクセス/削除といった高リスク操作を厳密に制御する場合は、一時認証トークンをご利用ください。

    長期使用の API キーと比較して、一時トークンはより安全(有効期限:60 秒)であり、API キーの漏洩リスクを低減します。

    一時トークンを利用するには、コード内の認証に使用する API キーを、一時認証トークンに置き換えてください。

  • DashScope SDK の最新版をインストールしてください。

モデルおよび料金

リアルタイム音声合成 — CosyVoice」をご参照ください。

テキストおよびフォーマットの制限事項

テキスト長の制限

文字数カウント規則

  • 中国語文字(簡体字/繁体字)、日本語漢字、韓国語漢字は 1 文字につき 2 文字としてカウントされます。その他のすべての文字(句読点、英数字、ひらがな・カタカナ、ハングルなど)は 1 文字としてカウントされます。

  • SSML タグはテキスト長の計算対象外です。

  • 例:

    • "你好" → 2(中国語文字)+ 2(中国語文字)= 4 文字

    • "中A文123" → 2(中国語文字)+ 1(A)+ 2(中国語文字)+ 1(1)+ 1(2)+ 1(3)= 8 文字

    • "中文。" → 2(中国語文字)+ 2(中国語文字)+ 1(。)= 5 文字

    • "中 文。" → 2(中国語文字)+ 1(半角スペース)+ 2(中国語文字)+ 1(。)= 6 文字

    • "<speak>你好</speak>" → 2(中国語文字)+ 2(中国語文字)= 4 文字

エンコード形式

UTF-8 エンコードを使用してください。

数式のサポート

数式解析(v3.5-flash、v3.5-plus、v3-flash、v3-plus、v2 のみ対応):小学校・中学校レベルの数学(基本操作、代数、幾何学)をサポートします。

説明

この機能は中国語のみ対応しています。

LaTeX 数式を音声に変換(中国語のみ)」をご参照ください。

SSML のサポート

SSML は、v3.5-flash、v3.5-plus、v3-flash、v3-plus、v2 でカスタムボイス(音声デザインまたは音声クローニング)に使用可能であり、また音声一覧で「対応」と明記されたシステムボイスでも使用可能です。要件は以下のとおりです:

クイックスタート

SpeechSynthesizer クラスは、音声合成の主要インターフェイスを提供し、以下の呼び出し方法をサポートしています:

  • 非ストリーミング:テキスト全体を一度に送信し、完全な音声を返すブロッキング呼び出しです。短いテキストに適しています。

  • 単方向ストリーミング:テキスト全体を一度に送信し、コールバック経由で音声を受信するノンブロッキング呼び出しです。低レイテンシーを要求する短いテキストに適しています。

  • 双方向ストリーミング:テキストを断片的に段階的に送信し、リアルタイムでコールバック経由で音声を受信するノンブロッキング呼び出しです。低レイテンシーを要求する長いテキストに適しています。

非ストリーミング呼び出し

音声合成タスクを同期的に送信し、完全な結果を返します。

image

SpeechSynthesizer クラスのインスタンスを作成し、リクエストパラメーターをバインドしたうえで、call メソッドを呼び出して音声合成を行い、バイナリ音声データを取得します。

送信するテキストの長さは 20,000 文字を超えてはなりません。詳細については、SpeechSynthesizer クラスcall メソッドをご参照ください。

重要

call メソッドを呼び出すたびに、SpeechSynthesizer インスタンスを再初期化する必要があります。

完全なサンプルを表示する

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.utils.Constants;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

public class Main {
    // モデル
    private static String model = "cosyvoice-v3-flash";
    // ボイス
    private static String voice = "longanyang";

    public static void streamAudioDataToSpeaker() {
        // リクエストパラメーター
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // シンガポールおよび北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
                        // 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model(model) // モデル
                        .voice(voice) // ボイス
                        .build();

        // 同期モード:コールバックを無効化(第 2 引数を null に設定)。
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        ByteBuffer audio = null;
        try {
            // 音声が返されるまでブロックします。
            audio = synthesizer.call("今日の天気はどうですか?");
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // タスク完了後に WebSocket 接続を閉じます。
            synthesizer.getDuplexApi().close(1000, "bye");
        }
        if (audio != null) {
            // 音声データを「output.mp3」という名前のローカルファイルに保存します。
            File file = new File("output.mp3");
            // 最初のテキスト送信時に WebSocket 接続を確立する必要があります。そのため、最初のパケット遅延には接続確立時間も含まれます。
            System.out.println(
                    "[Metric] リクエスト ID: "
                            + synthesizer.getLastRequestId()
                            + ", 最初のパケット遅延 (ms): "
                            + synthesizer.getFirstPackageDelay());
            try (FileOutputStream fos = new FileOutputStream(file)) {
                fos.write(audio.array());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
        Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

単方向ストリーミング呼び出し

音声合成タスクを非同期で送信し、ResultCallback を介して音声を段階的に受信します。

image

SpeechSynthesizer クラスのインスタンスを作成し、リクエストパラメーターおよびResultCallback インターフェイスをバインドしたうえで、call メソッドを呼び出して音声合成を行います。ResultCallback インターフェイスonEvent メソッドを介して、リアルタイムで合成結果を取得します。

送信するテキストの長さは 20,000 文字を超えてはなりません。詳細については、SpeechSynthesizer クラスcall メソッドをご参照ください。

重要

call メソッドを呼び出すたびに、SpeechSynthesizer インスタンスを再初期化する必要があります。

完全なサンプルを表示する

import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.utils.Constants;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CountDownLatch;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}

public class Main {
    // モデル
    private static String model = "cosyvoice-v3-flash";
    // ボイス
    private static String voice = "longanyang";

    public static void streamAudioDataToSpeaker() {
        CountDownLatch latch = new CountDownLatch(1);

        // ResultCallback インターフェイスを実装します。
        ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
            @Override
            public void onEvent(SpeechSynthesisResult result) {
                // System.out.println("Message received: " + result);
                if (result.getAudioFrame() != null) {
                    // 音声データをローカルファイルに保存する処理をここに実装します。
                    System.out.println(TimeUtils.getTimestamp() + " 音声を受信しました");
                }
            }

            @Override
            public void onComplete() {
                System.out.println(TimeUtils.getTimestamp() + " 完了を受信しました。音声合成が終了しました。");
                latch.countDown();
            }

            @Override
            public void onError(Exception e) {
                System.out.println("例外が発生しました:" + e.toString());
                latch.countDown();
            }
        };

        // リクエストパラメーター
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // シンガポールおよび北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
                        // 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model(model) // モデル
                        .voice(voice) // ボイス
                        .build();
        // コールバックを第 2 引数として渡すことで、非同期モードを有効化します。
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, callback);
        // これはノンブロッキング呼び出しであり、即座に null を返します。実際の結果はコールバックインターフェイスを介して非同期的に渡されます。バイナリ音声はコールバックインターフェイスの onEvent メソッドでリアルタイムで返されます。
        try {
            synthesizer.call("今日の天気はどうですか?");
            // 合成が完了するまで待機します。
            latch.await();
            // すべての再生スレッドが終了するまで待機します。
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // タスク完了後に WebSocket 接続を閉じます。
            synthesizer.getDuplexApi().close(1000, "bye");
        }
        // 最初のテキスト送信時に WebSocket 接続を確立する必要があります。そのため、最初のパケット遅延には接続確立時間も含まれます。
        System.out.println(
                "[Metric] リクエスト ID: "
                        + synthesizer.getLastRequestId()
                        + ", 最初のパケット遅延 (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) {
        // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
        Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

双方向ストリーミング呼び出し

複数のチャンクに分割したテキストを送信し、登録済みの ResultCallback コールバックを介して音声データを段階的に受信します。

説明
  • ストリーミング入力の場合、streamingCall を複数回呼び出して、順次テキスト断片を送信します。サーバーがテキスト断片を受信すると、自動的に文に分割します:

    • 完全な文は即座に合成されます。

    • 不完全な文はバッファーに保持され、完成後に合成されます。

    streamingComplete を呼び出すと、サーバーは受信済みだが未処理のすべてのテキスト断片(不完全な文を含む)を強制的に合成します。

  • テキスト断片の送信間隔は 23 秒を超えてはならず、それ以上になるとタイムアウト例外が発生します。

    テキストの送信が完了した場合は、速やかに streamingComplete メソッドを呼び出してください。

    サーバーは 23 秒のタイムアウト機構を強制的に適用します。この設定はクライアント側では変更できません。
image
  1. SpeechSynthesizer クラスのインスタンス化

    SpeechSynthesizer クラスのインスタンスを作成し、リクエストパラメーターおよびResultCallback インターフェイスをバインドします。

  2. ストリーミング

    SpeechSynthesizer クラスstreamingCall メソッドを複数回呼び出して、合成用のテキストをチャンク単位で送信します。これにより、テキストがセグメント単位でサーバーに送信されます。

    テキストを送信している間、サーバーはResultCallback インターフェイスonEvent メソッドを介して、リアルタイムで合成結果をクライアントに返します。

    streamingCall メソッド(text パラメーター)で送信する各テキスト断片の長さは 20,000 文字を超えてはならず、送信するテキストの合計長は 200,000 文字を超えてはなりません。

  3. 処理の終了

    SpeechSynthesizer クラスstreamingComplete メソッドを呼び出して音声合成を終了します。

    このメソッドは、ResultCallback インターフェイスonComplete または onError コールバックがトリガーされるまで、現在のスレッドをブロックします。その後、スレッドのブロックが解除されます。

    必ずこのメソッドを呼び出してください。呼び出さないと、末尾のテキストが音声に変換されない可能性があります。

完全なサンプルを表示する

import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisAudioFormat;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.utils.Constants;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}


public class Main {
    private static String[] textArray = {"ストリーミング音声合成 SDK ",
            "は入力テキストを", "バイナリ音声データに変換できます。", "非ストリーミング合成と比較して、",
            "ストリーミングはより優れたリアルタイム性能を提供します。", "タイプするのとほぼ同時に音声出力を聞くことができ、",
            "ユーザー体験が大幅に向上し、待ち時間が短縮されます。", "これは、大規模言語モデル(LLM)を活用して、",
            "テキストのストリームから音声を合成するアプリケーションに最適です。"};
    private static String model = "cosyvoice-v3-flash"; // モデル
    private static String voice = "longanyang"; // ボイス

    public static void streamAudioDataToSpeaker() {
        // コールバック関数を構成します。
        ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
            @Override
            public void onEvent(SpeechSynthesisResult result) {
                // System.out.println("Message received: " + result);
                if (result.getAudioFrame() != null) {
                    // 音声データを処理するロジックをここに実装します。
                    System.out.println(TimeUtils.getTimestamp() + " 音声を受信しました");
                }
            }

            @Override
            public void onComplete() {
                System.out.println(TimeUtils.getTimestamp() + " 完了を受信しました。音声合成が終了しました。");
            }

            @Override
            public void onError(Exception e) {
                System.out.println("例外が発生しました:" + e.toString());
            }
        };

        // リクエストパラメーター
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // シンガポールおよび北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
                        // 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model(model)
                        .voice(voice)
                        .format(SpeechSynthesisAudioFormat
                                .PCM_22050HZ_MONO_16BIT) // ストリーミング合成には PCM または MP3 を使用します。
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, callback);
        // コールバック付きの call メソッドは、現在のスレッドをブロックしません。
        try {
            for (String text : textArray) {
                // テキスト断片を送信し、コールバックインターフェイスの onEvent メソッドでリアルタイムにバイナリ音声を取得します。
                synthesizer.streamingCall(text);
            }
            // ストリーミング音声合成の完了を待機します。
            synthesizer.streamingComplete();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // タスク完了後に WebSocket 接続を閉じます。
            synthesizer.getDuplexApi().close(1000, "bye");
        }

        // 最初のテキスト送信時に WebSocket 接続を確立する必要があります。そのため、最初のパケット遅延には接続確立時間も含まれます。
        System.out.println(
                "[Metric] リクエスト ID: "
                        + synthesizer.getLastRequestId()
                        + ", 最初のパケット遅延 (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) {
        // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
        Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

Flowable を使用した呼び出し

Flowable はオープンソースのワークフロー・フレームワーク(Apache 2.0 ライセンス)です。「Flowable API の詳細」をご参照ください。

Flowable を使用する前に、RxJava ライブラリを統合し、リアクティブプログラミングの基本概念を理解していることを確認してください。

単方向ストリーミング呼び出し

次の例では、Flowable オブジェクトの blockingForEach インターフェイスを使用して、各ストリームから返される SpeechSynthesisResult データをブロッキングして取得する方法を示します。

すべての Flowable ストリームデータが返された後、SpeechSynthesizer クラスgetAudioData メソッドを介して、完全な合成結果も取得できます。

完全なサンプルを表示する

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}

public class Main {
    private static String model = "cosyvoice-v3-flash"; // モデル
    private static String voice = "longanyang"; // ボイス

    public static void streamAudioDataToSpeaker() throws NoApiKeyException {
        // リクエストパラメーター
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // シンガポールおよび北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
                        // 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model(model) // モデル
                        .voice(voice) // ボイス
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        synthesizer.callAsFlowable("今日の天気はどうですか?").blockingForEach(result -> {
            // System.out.println("Message received: " + result);
            if (result.getAudioFrame() != null) {
                // 音声データを処理するロジックをここに実装します。
                System.out.println(TimeUtils.getTimestamp() + " 音声を受信しました");
            }
        });
        // タスク完了後に WebSocket 接続を閉じます。
        synthesizer.getDuplexApi().close(1000, "bye");
        // 最初のテキスト送信時に WebSocket 接続を確立する必要があります。そのため、最初のパケット遅延には接続確立時間も含まれます。
        System.out.println(
                "[Metric] リクエスト ID: "
                        + synthesizer.getLastRequestId()
                        + ", 最初のパケット遅延 (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
        // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
        Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

双方向ストリーミング呼び出し

次の例では、Flowable オブジェクトを入力パラメーターとしてテキストストリームを入力する方法、および Flowable オブジェクトを戻り値として使用し、blockingForEach インターフェイスを介して各ストリームから返される SpeechSynthesisResult データをブロッキングして取得する方法を示します。

すべての Flowable ストリームデータが返された後、SpeechSynthesizer クラスgetAudioData メソッドを介して、完全な合成結果も取得できます。

完全なサンプルを表示する

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}

public class Main {
    private static String[] textArray = {"ストリーミング音声合成 SDK ",
            "は入力テキストを", "バイナリ音声データに変換できます。", "非ストリーミング合成と比較して、",
            "ストリーミングはより優れたリアルタイム性能を提供します。", "タイプするのとほぼ同時に音声出力を聞くことができ、",
            "ユーザー体験が大幅に向上し、待ち時間が短縮されます。", "これは、大規模言語モデル(LLM)を活用して、",
            "テキストのストリームから音声を合成するアプリケーションに最適です。"};
    private static String model = "cosyvoice-v3-flash";
    private static String voice = "longanyang";

    public static void streamAudioDataToSpeaker() throws NoApiKeyException {
        // ストリーミング入力をシミュレートします。
        Flowable<String> textSource = Flowable.create(emitter -> {
            new Thread(() -> {
                for (int i = 0; i < textArray.length; i++) {
                    emitter.onNext(textArray[i]);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                emitter.onComplete();
            }).start();
        }, BackpressureStrategy.BUFFER);

        // リクエストパラメーター
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // シンガポールおよび北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
                        // 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model(model) // モデル
                        .voice(voice) // ボイス
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        synthesizer.streamingCallAsFlowable(textSource).blockingForEach(result -> {
            if (result.getAudioFrame() != null) {
                // 音声を再生するロジックをここに実装します。
                System.out.println(
                        TimeUtils.getTimestamp() +
                                " バイナリ音声サイズ:" + result.getAudioFrame().capacity());
            }
        });
        synthesizer.getDuplexApi().close(1000, "bye");
        // 最初のテキスト送信時に WebSocket 接続を確立する必要があります。そのため、最初のパケット遅延には接続確立時間も含まれます。
        System.out.println(
                "[Metric] リクエスト ID: "
                        + synthesizer.getLastRequestId()
                        + ", 最初のパケット遅延 (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
        // 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
        Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

高同時実行数呼び出し

DashScope Java SDK は OkHttp3 の接続プール技術を使用して、接続を繰り返し確立するオーバーヘッドを削減します。詳細については、「高同時実行数のシナリオ」をご参照ください。

リクエストパラメーター

SpeechSynthesisParam のチェーンメソッドを使用して、モデルやボイスなどのパラメーターを構成します。構成済みのパラメーター・オブジェクトを、SpeechSynthesizer クラスのコンストラクターに渡します。

サンプルを表示する

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .format(SpeechSynthesisAudioFormat.WAV_8000HZ_MONO_16BIT) // 音声エンコーディング形式およびサンプルレート
    .volume(50) // ボリューム。有効範囲:[0, 100]。
    .speechRate(1.0f) // 話速。有効範囲:[0.5, 2]。
    .pitchRate(1.0f) // ピッチ。有効範囲:[0.5, 2]。
    .build();

パラメーター

必須

説明

model

String

はい

音声合成モデルです。各モデルバージョンには互換性のあるボイスが必要です:

  • cosyvoice-v3.5-flash/cosyvoice-v3.5-plus:システムボイスは利用できません。音声デザインまたは音声クローニングによるカスタムボイスのみ対応しています。

  • cosyvoice-v3-flash/cosyvoice-v3-plus:longanyang などのボイスを使用します。

  • cosyvoice-v2:longxiaochun_v2 などのボイスを使用します。

  • ボイスの完全な一覧については、「音声一覧」をご参照ください。

voice

String

はい

音声合成に使用するボイスです。

対応するボイスの種類:

  • システムボイス:詳細については、「音声一覧」をご参照ください。

  • クローニングボイス:「音声クローニング」機能でカスタマイズしたボイスです。クローニングボイスを使用する場合は、音声クローニングと音声合成で同一のアカウントを使用してください。

    クローニングボイスの場合、model はボイス作成モデル(target_model)と一致させる必要があります。

  • デザインボイス:「音声デザイン」機能でカスタマイズしたボイスです。デザインボイスを使用する場合は、音声デザインと音声合成で同一のアカウントを使用してください。

    デザインボイスの場合、model はボイス作成モデル(target_model)と一致させる必要があります。

format

enum

いいえ

音声エンコーディング形式およびサンプルレートです。

デフォルトは、22.05 kHz サンプルレートの MP3 形式です。

説明

デフォルトのサンプルレートは、選択したボイスに対して最適なレートを表します。出力はこのレートでデフォルトで行われますが、ダウンサンプリングおよびアップサンプリングもサポートされています。

対応する音声エンコーディング形式およびサンプルレートは以下のとおりです:

  • すべてのモデルで対応する音声エンコーディング形式およびサンプルレート:

    • SpeechSynthesisAudioFormat.WAV_8000HZ_MONO_16BIT:WAV 形式、8 kHz サンプルレート

    • SpeechSynthesisAudioFormat.WAV_16000HZ_MONO_16BIT:WAV 形式、16 kHz サンプルレート

    • SpeechSynthesisAudioFormat.WAV_22050HZ_MONO_16BIT:WAV 形式、22.05 kHz サンプルレート

    • SpeechSynthesisAudioFormat.WAV_24000HZ_MONO_16BIT:WAV 形式、24 kHz サンプルレート

    • SpeechSynthesisAudioFormat.WAV_44100HZ_MONO_16BIT:WAV 形式、44.1 kHz サンプルレート

    • SpeechSynthesisAudioFormat.WAV_48000HZ_MONO_16BIT:WAV 形式、48 kHz サンプルレート

    • SpeechSynthesisAudioFormat.MP3_8000HZ_MONO_128KBPS:MP3 形式、8 kHz サンプルレート

    • SpeechSynthesisAudioFormat.MP3_16000HZ_MONO_128KBPS:MP3 形式、16 kHz サンプルレート

    • SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS:MP3 形式、22.05 kHz サンプルレート

    • SpeechSynthesisAudioFormat.MP3_24000HZ_MONO_256KBPS:MP3 形式、24 kHz サンプルレート

    • SpeechSynthesisAudioFormat.MP3_44100HZ_MONO_256KBPS:MP3 形式、44.1 kHz サンプルレート

    • SpeechSynthesisAudioFormat.MP3_48000HZ_MONO_256KBPS:MP3 形式、48 kHz サンプルレート

    • SpeechSynthesisAudioFormat.PCM_8000HZ_MONO_16BIT:PCM 形式、8 kHz サンプルレート

    • SpeechSynthesisAudioFormat.PCM_16000HZ_MONO_16BIT:PCM 形式、16 kHz サンプルレート

    • SpeechSynthesisAudioFormat.PCM_22050HZ_MONO_16BIT:PCM 形式、22.05 kHz サンプルレート

    • SpeechSynthesisAudioFormat.PCM_24000HZ_MONO_16BIT:PCM 形式、24 kHz サンプルレート

    • SpeechSynthesisAudioFormat.PCM_44100HZ_MONO_16BIT:PCM 形式、44.1 kHz サンプルレート

    • SpeechSynthesisAudioFormat.PCM_48000HZ_MONO_16BIT:PCM 形式、48 kHz サンプルレート

  • 音声形式が Opus の場合、bit_rate パラメーターを使用してビットレートを調整します。これは DashScope 2.21.0 以降でのみ適用されます。

    • SpeechSynthesisAudioFormat.OGG_OPUS_8KHZ_MONO_32KBPS:Opus 形式、8 kHz サンプルレート、32 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS:Opus 形式、16 kHz サンプルレート、16 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_16KHZ_MONO_32KBPS:Opus 形式、16 kHz サンプルレート、32 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_16KHZ_MONO_64KBPS:Opus 形式、16 kHz サンプルレート、64 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_24KHZ_MONO_16KBPS:Opus 形式、24 kHz サンプルレート、16 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_24KHZ_MONO_32KBPS:Opus 形式、24 kHz サンプルレート、32 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_24KHZ_MONO_64KBPS:Opus 形式、24 kHz サンプルレート、64 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_48KHZ_MONO_16KBPS:Opus 形式、48 kHz サンプルレート、16 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_48KHZ_MONO_32KBPS:Opus 形式、48 kHz サンプルレート、32 kbps ビットレート

    • SpeechSynthesisAudioFormat.OGG_OPUS_48KHZ_MONO_64KBPS:Opus 形式、48 kHz サンプルレート、64 kbps ビットレート

volume

int

いいえ

ボリュームです。

デフォルト値:50。

有効範囲:[0, 100]。値は線形にスケーリングされます。0 は無音、50 はデフォルト、100 は最大です。

speechRate

float

いいえ

話速です。

デフォルト値:1.0。

有効範囲:[0.5, 2.0]。1.0 は標準の話速です。1.0 より小さい値は話速を遅くし、1.0 より大きい値は話速を速くします。

pitchRate

float

いいえ

ピッチ倍率です。知覚されるピッチとの関係は線形でも対数でもありません。適切な値を見つけるためにはテストが必要です。

デフォルト値:1.0。

有効範囲:[0.5, 2.0]。1.0 はボイスの自然なピッチです。1.0 より大きい値はピッチを上げ、1.0 より小さい値はピッチを下げます。

bit_rate

int

いいえ

音声ビットレート(kbps)。音声形式が Opus の場合、bit_rate パラメーターを使用してビットレートを調整します。

デフォルト値:32。

有効範囲:[6, 510]。

説明

bit_rate パラメーターは、parameter メソッドまたは parameters メソッドを SpeechSynthesisParam インスタンスに使用して設定します:

parameter メソッドを使用した設定

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameter("bit_rate", 32)
    .build();

parameters メソッドを使用した設定

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameters(Collections.singletonMap("bit_rate", 32))
    .build();

enableWordTimestamp

boolean

いいえ

単語レベルのタイムスタンプを有効にするかどうかを指定します。

デフォルト値:false。

  • true

  • false

この機能は、cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2 モデルのクローニングボイスおよび、音声一覧で「対応」と明記されたシステムボイスでのみ利用可能です。

タイムスタンプの結果は、コールバックインターフェイスでのみ利用可能です。

seed

int

いいえ

生成中に使用される乱数シードです。異なるシードは異なる合成結果を生成します。モデル、テキスト、ボイス、その他のパラメーターが同一の場合、同じシードを使用すると同一の出力を再現できます。

デフォルト値:0。

有効範囲:[0, 65535]。

languageHints

List

いいえ

音声合成の対象言語を指定することで、合成効果を向上させます。

数字、略語、記号、またはあまり使われない言語の発音や合成品質が低い場合に使用します:

  • 数字が期待通りに読み上げられません。たとえば、「hello, this is 110」が「hello, this is one one zero」と読み上げられる場合、代わりに「hello, this is yāo yāo líng」と読み上げるようにします。

  • @ 記号が「ai te」と誤って読み上げられ、本来の「at」とは異なります。

  • あまり使われない言語の合成品質が低く、不自然に聞こえます。

有効な値:

  • zh:中国語

  • en:英語

  • fr:フランス語

  • de:ドイツ語

  • ja:日本語

  • ko:韓国語

  • ru:ロシア語

  • pt:ポルトガル語

  • th:タイ語

  • id:インドネシア語

  • vi:ベトナム語

注: このパラメーターは配列ですが、現在のバージョンでは先頭の要素のみが処理されます。そのため、1 つの値のみを渡すことを推奨します。

重要

このパラメーターは音声合成の対象言語を指定します。この設定は、音声クローニングで使用するサンプル音声の言語とは独立しています。クローニングタスクのソース言語を設定するには、「CosyVoice 音声クローニング/デザイン API」をご参照ください。

instruction

String

いいえ

方言、感情、話し方のスタイルなどの合成効果を制御する命令を設定します。この機能は、cosyvoice-v3.5-flash、cosyvoice-v3.5-plus、cosyvoice-v3-flash モデルのクローニングボイスおよび、音声一覧で「Instruct 対応」と明記されたシステムボイスでのみ利用可能です。

長さ制限: 100 文字。

中国語文字(簡体字/繁体字、日本語漢字、韓国語漢字)は 1 文字につき 2 文字としてカウントされます。句読点、英数字、ひらがな・カタカナ、ハングルなどのその他の文字は 1 文字としてカウントされます。

使用要件(モデルによって異なります):

  • v3.5-flash および v3.5-plus:感情、話速などを制御する自然言語の命令を任意に使用できます。

    重要

    cosyvoice-v3.5-flash および cosyvoice-v3.5-plus にはシステムボイスはありません。音声デザインまたは音声クローニングによるカスタムボイスのみがサポートされています。

    命令の例:

    非常に興奮し、高いピッチで話すように指示します。偉大な成功に対する ecstasy と excitement を表現してください。
    中程度のゆっくりとした話速を維持し、洗練されて知的で落ち着いたトーンで話してください。冷静さと安心感を与えるようにしてください。
    悲しみと郷愁に満ちたトーンで話してください。わずかな鼻声を伴い、心を打つ物語を語っているかのようにしてください。
    息を詰めたような声で、非常に小さな音量で話してください。親密で神秘的なささやきのような印象を与えるようにしてください。
    非常に不機嫌で苛立ったトーンで話してください。話速を速め、文と文の間の休止を最小限にしてください。
    親切で優しい年配者を模倣してください。一定の話速で、思いやりと愛情に満ちた声で話してください。
    皮肉で軽蔑的なトーンで話してください。キーワードを強調し、文末でわずかに上昇するイントネーションを用いてください。
    極めて恐れおののき、震える声で話してください。
    プロのニュースアナウンサーのように話してください。冷静で客観的、明瞭な発音で、中立的な感情を込めてください。
    生き生きと遊び心のあるトーンで話してください。明るい笑顔をイメージし、エネルギッシュで陽気な声で話してください。
  • cosyvoice-v3-flash:以下の要件を満たす必要があります:

    • クローニングボイス:音声合成効果を制御するために、任意の自然言語を使用できます。

      命令の例:

      広東語で話してください。(対応する方言:広東語、東北地方、甘粛省、貴州省、河南省、湖北省、江西省、閩南語、寧夏回族自治区、山西省、陝西省、山東省、上海語、四川省、天津市、雲南省)
      できるだけ大きな声で一文を言ってください。
      できるだけゆっくりと一文を言ってください。
      できるだけ速く一文を言ってください。
      非常に小さく一文を言ってください。
      もう少しゆっくり話していただけますか?
      とても速く話していただけますか?
      とてもゆっくり話していただけますか?
      もう少し速く話していただけますか?
      非常に怒ったトーンで一文を言ってください。
      非常に幸せなトーンで一文を言ってください。
      非常に恐れたトーンで一文を言ってください。
      非常に悲しいトーンで一文を言ってください。
      非常に驚いたトーンで一文を言ってください。
      できるだけ力強いトーンで話してください。
      できるだけ怒ったトーンで話してください。
      親しみやすいトーンで話してください。
      冷たいトーンで話してください。
      威厳あるトーンで話してください。
      自然なトーンを体験したいと思います。
      脅しの表現を教えてください。
      知恵の表現を教えてください。
      誘惑の表現を教えてください。
      生き生きとしたトーンで話してみてください。
      情熱を持って話してみてください。
      落ち着いたトーンで話してみてください。
      自信を持って話してみてください。
      興奮して話してみてください。
      傲慢な感情を示してみてください。
      洗練された感情を示してみてください。
      幸せな感情で質問に答えてみてください。
      優しい感情でデモンストレーションをしてみてください。
      落ち着いたトーンで話してみてください。
      深みのあるトーンで答えてみてください。
      荒々しい態度で話してみてください。
      邪悪な声で答えを教えてください。
      しなやかな声で答えを教えてください。
      自然で友好的なチャットスタイルで語ってください。
      ラジオドラマのポッドキャスターのトーンで話してください。
    • システムボイス:命令は固定の形式および内容でなければなりません。詳細については、「音声一覧」をご参照ください。

enable_aigc_tag

boolean

いいえ

生成された音声に不可視の AIGC 不可視識別子を追加するかどうかを指定します。true に設定すると、対応するフォーマット(WAV、MP3、Opus)の音声に不可視の識別子が埋め込まれます。

デフォルト値:false。

この機能は cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2 のみがサポートしています。

説明

enable_aigc_tag パラメーターは、parameter メソッドまたは parameters メソッドを SpeechSynthesisParam インスタンスに使用して設定します:

parameter メソッドを使用した設定

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameter("enable_aigc_tag", true)
    .build();

parameters メソッドを使用した設定

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameters(Collections.singletonMap("enable_aigc_tag", true))
    .build();

aigc_propagator

String

いいえ

不可視の AIGC 不可視識別子の ContentPropagator フィールドを設定し、コンテンツ伝播元を識別します。このパラメーターは、enable_aigc_tagtrue の場合にのみ有効です。

デフォルト値:Alibaba Cloud UID。

この機能は cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2 のみがサポートしています。

説明

aigc_propagator パラメーターは、parameter メソッドまたは parameters メソッドを SpeechSynthesisParam インスタンスに使用して設定します:

parameter メソッドを使用した設定

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameter("enable_aigc_tag", true)
    .parameter("aigc_propagator", "xxxx")
    .build();

parameters メソッドを使用した設定

Map<String, Object> map = new HashMap();
map.put("enable_aigc_tag", true);
map.put("aigc_propagator", "xxxx");

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameters(map)
    .build();

aigc_propagate_id

String

いいえ

不可視の AIGC 不可視識別子の PropagateID フィールドを設定し、特定の伝播動作を一意に識別します。このパラメーターは、enable_aigc_tagtrue の場合にのみ有効です。

デフォルト値:現在の音声合成リクエストのリクエスト ID。

この機能は cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2 のみがサポートしています。

説明

aigc_propagate_id パラメーターは、parameter メソッドまたは parameters メソッドを SpeechSynthesisParam インスタンスに使用して設定します:

parameter メソッドを使用した設定

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameter("enable_aigc_tag", true)
    .parameter("aigc_propagate_id", "xxxx")
    .build();

parameters メソッドを使用した設定

Map<String, Object> map = new HashMap();
map.put("enable_aigc_tag", true);
map.put("aigc_propagate_id", "xxxx");

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("longanyang") // ボイス
    .parameters(map)
    .build();

hotFix

ParamHotFix

いいえ

テキストホットパッチの構成です。特定の単語の発音をカスタマイズしたり、合成前にテキストを置き換えたりできます。この機能は cosyvoice-v3-flash のクローニングボイスでのみ利用可能です。

パラメーターの説明:

  • ParamHotFix.PronunciationItem:発音をカスタマイズします。不正確なデフォルト発音を修正するために、単語のピンイン注釈を指定します。

  • ParamHotFix.ReplaceItem:テキストを置き換えます。合成前に指定された単語をターゲットテキストに置き換えます。置き換えられたテキストが実際の合成に使用されます。

例:

List<ParamHotFix.PronunciationItem> pronunciationItems = new ArrayList<>();
pronunciationItems.add(new ParamHotFix.PronunciationItem("weather", "tian1 qi4"));

List<ParamHotFix.ReplaceItem> replaceItems = new ArrayList<>();
replaceItems.add(new ParamHotFix.ReplaceItem("today", "gold day"));

ParamHotFix paramHotFix = new ParamHotFix();
paramHotFix.setPronunciation(pronunciationItems);
paramHotFix.setReplace(replaceItems);

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                        .model("cosyvoice-v3-flash") // モデル
                        .voice("your_voice") // cosyvoice-v3-flash のクローニングボイスに置き換えてください
                        .hotFix(paramHotFix)
                        .build();

enable_markdown_filter

boolean

false

Markdown フィルターを有効にするかどうかを指定します。有効にすると、システムは合成前に入力テキストから Markdown シンボルを自動的に削除し、それらが読み上げられないようにします。この機能は cosyvoice-v3-flash のクローニングボイスでのみ利用可能です。

デフォルト値:false。

有効な値:

  • true

  • false

説明

enable_markdown_filter パラメーターは、parameter メソッドまたは parameters メソッドを SpeechSynthesisParam インスタンスに使用して設定します:

parameter メソッドを使用した設定

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("your_voice") // cosyvoice-v3-flash のクローニングボイスに置き換えてください
    .parameter("enable_markdown_filter", true)
    .build();

parameters メソッドを使用した設定

Map<String, Object> map = new HashMap();
map.put("enable_markdown_filter", true);

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v3-flash") // モデル
    .voice("your_voice") // cosyvoice-v3-flash のクローニングボイスに置き換えてください
    .parameters(map)
    .build();

主要インターフェイス

SpeechSynthesizer クラス

SpeechSynthesizer クラスは import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer; を使用してインポートします。音声合成の主要インターフェイスを提供します。

インターフェイス/メソッド

パラメーター

戻り値

説明

public SpeechSynthesizer(SpeechSynthesisParam param, ResultCallback<SpeechSynthesisResult> callback)

SpeechSynthesizer インスタンス

コンストラクターです。

  • ストリーミング呼び出し(単方向または双方向):callback を ResultCallback インターフェイスに設定します。

  • 非ストリーミングまたは Flowable 呼び出し:callback を null に設定します。

public ByteBuffer call(String text)

text:合成対象のテキスト(UTF-8)。

ByteBuffer または null

テキスト(プレーンテキストまたはSSML を含む)を音声に変換します。

SpeechSynthesizer インスタンスを作成するときのケースは以下のとおりです:

重要

call メソッドを呼び出すたびに、SpeechSynthesizer インスタンスを再初期化する必要があります。

public void streamingCall(String text)

text:合成対象のテキスト(UTF-8)。

なし

テキストをストリームとして送信します。SSML はサポートされていません。

このインターフェイスを複数回呼び出して、テキストを複数の部分に分けてサーバーに送信します。合成結果は ResultCallback インターフェイスonEvent メソッドを介して返されます。

詳細な呼び出しフローおよび参考例については、「双方向ストリーミング呼び出し」をご参照ください。

public void streamingComplete() throws RuntimeException

なし

なし

ストリーミング音声合成を終了します。

このメソッドは、以下のいずれかの条件が発生するまでブロックします:

  • サーバーが合成を完了した場合(成功)。

  • 会話が中断された場合(失敗)。

  • 10 分のタイムアウトに達した場合(自動ブロック解除)。

詳細な呼び出しフローおよび参考例については、「双方向ストリーミング呼び出し」をご参照ください。

重要

双方向ストリーミング呼び出しを行う際は、合成音声の一部が欠落しないように、必ずこのメソッドを呼び出してください。

public Flowable<SpeechSynthesisResult> callAsFlowable(String text)

text:合成対象のテキスト(UTF-8 形式)。

合成結果( Flowable<SpeechSynthesisResult> にカプセル化)。

非ストリーミングのテキスト入力(SSML を含むテキストはサポートされていません)を、リアルタイムでストリーミング音声出力に変換します。合成結果は Flowable オブジェクト内のストリームで返されます。

詳細な呼び出しフローおよび参考例については、「Flowable を使用した呼び出し」をご参照ください。

boolean getDuplexApi().close(int code, String reason)

code:WebSocket クローズコード

reason:クローズ理由

これらのパラメーターの構成方法については、「The WebSocket Protocol」ドキュメントをご参照ください。

true

タスク完了後、例外が発生したかどうかにかかわらず、WebSocket 接続を閉じる必要があります。これにより、接続リークを防ぎます。接続を再利用して効率を向上させる方法については、「高同時実行数のシナリオ」をご参照ください。

public Flowable<SpeechSynthesisResult> streamingCallAsFlowable(Flowable<String> textStream)

textStream:合成対象のテキストをカプセル化した Flowable インスタンス。

合成結果( Flowable<SpeechSynthesisResult> にカプセル化)。

ストリーミングのテキスト入力(SSML を含むテキストはサポートされていません)を、リアルタイムでストリーミング音声出力に変換します。合成結果は Flowable オブジェクト内のストリームで返されます。

詳細な呼び出しフローおよび参考例については、「Flowable を使用した呼び出し」をご参照ください。

public String getLastRequestId()

なし

前回のタスクのリクエスト ID。

前回のタスクのリクエスト ID を取得します。callstreamingCallcallAsFlowable、または streamingCallAsFlowable を呼び出して新しいタスクを開始した後に使用します。

public long getFirstPackageDelay()

なし

現在のタスクの最初のパケット遅延。

最初のパケット遅延をミリ秒単位で返します(テキスト送信から最初の音声受信までの時間)。タスク完了後に呼び出してください。

最初のパケット遅延に影響する要因:

  • WebSocket 接続の確立時間(初回呼び出し時)

  • ボイスのロード時間(ボイスによって異なります)

  • サービス負荷(ピーク時にはキューイングが発生する可能性があります)

  • ネットワーク遅延

一般的な遅延:

  • ボイスが既にロードされている接続を再利用する場合:約 500 ms

  • 初回接続またはボイス切り替え時:1,500~2,000 ms に達する場合があります

遅延が常に 2,000 ms を超える場合:

  1. 高同時実行数のシナリオ向けに接続プール機能を使用して、事前に接続を確立します。

  2. ご利用のネットワーク接続の品質を確認してください。

  3. ピーク時間帯の呼び出しを避けてください。

ResultCallback インターフェイス

ストリーミング呼び出し(単方向または双方向)の場合、ResultCallback を介して結果を取得します。インポート:import com.alibaba.dashscope.common.ResultCallback;

サンプルを表示する

ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
    @Override
    public void onEvent(SpeechSynthesisResult result) {
        System.out.println("リクエスト ID: " + result.getRequestId());
        // 音声チャンクをリアルタイムで処理します(例:再生またはバッファーへの書き込み)。
    }

    @Override
    public void onComplete() {
        System.out.println("タスク完了");
        // 合成完了ロジックを処理します(例:プレーヤーの解放)。
    }

    @Override
    public void onError(Exception e) {
        System.out.println("タスク失敗:" + e.getMessage());
        // 例外を処理します(ネットワークエラーまたはサーバー側のエラーコード)。
    }
};

インターフェイス/メソッド

パラメーター

戻り値

説明

public void onEvent(SpeechSynthesisResult result)

result:SpeechSynthesisResult インスタンス。

なし

サーバーが音声データをプッシュしたときに呼び出されます。

getAudioFrame を使用してバイナリ音声を取得します。

SpeechSynthesisResultgetUsage メソッドを呼び出して、現在までのリクエストにおける課金対象文字数を取得します。

public void onComplete()

なし

なし

すべての合成データが返され、音声合成が完了した後に非同期で呼び出されます。

public void onError(Exception e)

e:例外情報。

なし

例外が発生したときに非同期で呼び出されます。

onError メソッドに、完全な例外ログ記録とリソースクリーンアップのロジックを実装することを推奨します。

応答

サーバーはバイナリ音声データを返します:

  • 非ストリーミング呼び出しSpeechSynthesizer クラスcall メソッドが返すバイナリ音声データを処理します。

  • 単方向ストリーミング呼び出しまたは双方向ストリーミング呼び出しResultCallback インターフェイスonEvent メソッドのパラメーター(型:SpeechSynthesisResult)を処理します。

    SpeechSynthesisResult の主要インターフェイスは以下のとおりです:

    インターフェイス/メソッド

    パラメーター

    戻り値

    説明

    public ByteBuffer getAudioFrame()

    なし

    バイナリ音声データ

    現在のセグメントのバイナリ音声を返します(新しいデータがない場合は空の場合があります)。

    セグメントを結合して完全なファイルにするか、互換性のあるプレーヤーにストリーミングします。

    重要
    • ストリーミング音声合成では、MP3 や Opus などの圧縮形式の場合、セグメント化された音声データはストリーミングプレーヤーを使用して再生する必要があります。フレームごとに再生するとデコードに失敗するため、行わないでください。

      ストリーミングプレーヤーには、FFmpeg、PyAudio (Python)、AudioFormat (Java)、MediaSource (JavaScript) などがあります。
    • 音声データを結合して完全な音声ファイルを作成する場合は、追記モードで同一ファイルに書き込みます。

    • ストリーミング音声合成による WAV および MP3 音声では、最初のフレームにのみヘッダー情報が含まれます。後続のフレームには音声データのみが含まれます。

    public String getRequestId()

    なし

    タスクのリクエスト ID。

    タスクのリクエスト ID を取得します。getAudioFrame を呼び出してバイナリ音声データを取得する場合、getRequestId メソッドの戻り値は null です。

    public SpeechSynthesisUsage getUsage()

    なし

    SpeechSynthesisUsage:現在までのリクエストにおける課金対象文字数。

    SpeechSynthesisUsage または null を返します。

    SpeechSynthesisUsagegetCharacters メソッドは、現在までのリクエストにおける課金対象文字数を返します。最後に受信した SpeechSynthesisUsage を最終値として使用します。

    public Sentence getTimestamp()

    なし

    Sentence:現在までのリクエストで課金対象となっている文。

    enableWordTimestamp 単語レベルのタイムスタンプ機能を有効にする必要があります。

    Sentence または null を返します。

    Sentence のメソッド:

    • getIndex:文番号を取得します(0 から始まります)。

    • getWords:文を構成する文字配列 List<Word> を取得します。最後に受信した Sentence を最終値として使用します。

    Word のメソッド:

    • getText:文字のテキストを取得します。

    • getBeginIndex:文中の文字の開始位置インデックスを取得します(0 から始まります)。

    • getEndIndex:文中の文字の終了位置インデックスを取得します(1 から始まります)。

    • getBeginTime:文字に対応する音声の開始タイムスタンプをミリ秒単位で取得します。

    • getEndTime:文字に対応する音声の終了タイムスタンプをミリ秒単位で取得します。

エラーコード

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

その他の例

その他の例については、GitHub をご参照ください。

よくある質問

機能、課金、レート制限

Q:発音が不正確な場合はどうすればよいですか?

A:「SSML」を使用して発音を修正してください。

Q:音声合成は文字数で課金されます。各合成リクエストのテキスト長を確認するにはどうすればよいですか?

トラブルシューティング

コードエラーが発生した場合は、「エラーコード」をご参照のうえ、トラブルシューティングを行ってください。

Q:リクエスト ID を取得するにはどうすればよいですか?

以下のいずれかの方法で取得します:

Q:SSML 機能が失敗するのはなぜですか?

トラブルシューティング:

  1. 制限事項と制約を確認します。

  2. DashScope SDK の最新版をインストールします。

  3. 正しいインターフェイスを使用していることを確認します:SpeechSynthesizer クラスcall メソッドのみが SSML をサポートしています。

  4. 合成対象のテキストがプレーンテキスト形式であり、フォーマット要件を満たしていることを確認します。詳細については、「SSML マークアップ言語の概要」をご参照ください。

Q:TTS 音声合成の音声持続時間が、WAV ファイルの表示持続時間と異なるのはなぜですか?たとえば、WAV ファイルの表示が 7 秒でも、実際の音声は 5 秒未満の場合などです。

TTS はストリーミング合成メカニズムを使用しており、データを段階的に合成して返します。そのため、WAV ファイルヘッダーには推定値が含まれており、多少の誤差が生じる可能性があります。正確な持続時間が必要な場合は、フォーマットを PCM に設定し、完全な合成結果を取得した後に手動で WAV ヘッダー情報を追加することで、より正確な持続時間を得ることができます。

Q:音声が再生できないのはなぜですか?

以下のシナリオを順に確認してください:

  1. 音声が完全なファイル(xx.mp3 など)として保存されている場合。

    1. フォーマットの一貫性:リクエストフォーマットがファイル拡張子と一致していることを確認します(例:WAV は .wav であり、.mp3 ではない)。

    2. プレーヤーの互換性:ご利用のプレーヤーが音声ファイルのフォーマットとサンプルレートをサポートしていることを確認します。一部のプレーヤーは、高いサンプルレートや特定の音声エンコーディングをサポートしていない場合があります。

  2. オーディオはストリームで再生されます。

    1. 音声ストリームを完全なファイルとして保存し、プレーヤーで再生してみてください。ファイルが再生できない場合は、シナリオ 1 のトラブルシューティング方法をご参照ください。

    2. ファイルが正常に再生される場合は、ストリーミング再生の実装に問題がある可能性があります。ご利用のプレーヤーがストリーミング再生をサポートしていることを確認してください。

      ストリーミング再生をサポートする一般的なツールやライブラリには、FFmpeg、PyAudio (Python)、AudioFormat (Java)、MediaSource (JavaScript) などがあります。

Q:音声再生が途切れるのはなぜですか?

以下のシナリオを順に確認してください:

  1. テキスト送信速度の確認:テキストセグメント間の間隔が適切であることを確認します。前の音声セグメントの再生が終了した後に、次のセグメントが速やかに送信されない状況を避けてください。

  2. コールバック関数のパフォーマンスの確認:

    • コールバック関数内で重いビジネスロジックを実行すると、ブロッキングの原因となるため避けてください。

    • コールバックは WebSocket スレッドで実行されます。ブロッキングが発生すると、パケットのタイムリーな受信が妨げられ、音声再生が途切れる原因となります。

    • WebSocket スレッドのブロッキングを避けるため、音声データを別のバッファーに書き込み、別のスレッドで処理することを推奨します。

  3. ネットワークの安定性の確認:ネットワークの変動による音声伝送の中断や遅延を避けるため、ネットワーク接続が安定していることを確認してください。

Q:音声合成に時間がかかるのはなぜですか?

以下の手順でトラブルシューティングを行ってください:

  1. 入力間隔の確認

    入力間隔を確認します。ストリーミング音声合成を使用している場合、テキストセグメントの送信間隔が長すぎないか(たとえば、数秒の遅延)を確認します。間隔が長いと、合計合成時間が増加します。

  2. パフォーマンスメトリクスの分析

    • 最初のパケット遅延:通常は約 500 ms です。

    • RTF(RTF = 合計合成時間 / 音声持続時間):通常は 1.0 未満です。

Q:合成音声の発音が不正確な場合はどうすればよいですか?

A:SSML の <phoneme> タグを使用して、正しい発音を指定してください。

Q:末尾の一部のテキストが音声に変換されない、または音声が返されないのはなぜですか?

A:SpeechSynthesizer クラスstreamingComplete メソッドを呼び出しているか確認してください。音声合成中、サーバーは十分なテキストをキャッシュした後にのみ合成を開始します。streamingComplete を呼び出さないと、バッファーに残っているテキストが合成されない可能性があります。

権限と認証

Q:API キーを CosyVoice 音声合成サービスのみに制限する(権限隔離)にはどうすればよいですか?

A:ワークスペースを作成し、特定のモデルにのみ権限を付与することで、API キーの範囲を制限できます。詳細については、「ワークスペースの管理」をご参照ください。

その他の質問

GitHub の QA をご参照ください。