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

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

最終更新日:Jan 28, 2026

このトピックでは、CosyVoice 音声合成 Java SDK のパラメーターとインターフェイスの詳細について説明します。

重要

中国 (北京) リージョンのモデルを使用するには、中国 (北京) リージョンの API キーページに移動してください

ユーザーガイド:モデルの詳細とモデル選択のガイダンスについては、「リアルタイム音声合成 - CosyVoice」をご参照ください。

前提条件

  • Model Studio を有効化し、API キーを作成済みであること。セキュリティリスクを防ぐため、API キーをコードにハードコーディングするのではなく、環境変数としてエクスポートしてください。

    説明

    サードパーティのアプリケーションやユーザーに一時的なアクセス権限を付与する場合、または機密データへのアクセスや削除などのリスクの高い操作を厳密に制御したい場合は、一時的な認証トークンの使用を推奨します。

    長期的な API キーと比較して、一時的な認証トークンは有効期間が短い (60 秒) ため、より安全です。これらは一時的な呼び出しシナリオに適しており、API キー漏洩のリスクを効果的に低減できます。

    一時的なトークンを使用するには、コード内の認証に使用される API キーを一時的な認証トークンに置き換えます。

  • DashScope SDK の最新バージョンをインストールする

モデルと料金

モデル

料金

無料クォータ (注)

cosyvoice-v3-plus

$0.286706/10,000 文字

無料クォータなし

cosyvoice-v3-flash

$0.14335/10,000 文字

cosyvoice-v2

$0.286706/10,000 文字

テキストとフォーマットの制限

テキスト長の制限

文字数カウントルール

  • 簡体字または繁体字中国語、日本の漢字、韓国の漢字を含む漢字は、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 エンコーディングを使用してください。

数式のサポート

数式解析機能は現在、cosyvoice-v2cosyvoice-v3-flash、および cosyvoice-v3-plus モデルでのみ利用可能です。この機能は、基本的な算術、代数、幾何学など、小中学校で習う一般的な数式をサポートしています。

LaTeX 数式から音声へ」をご参照ください。

SSML のサポート

音声合成マークアップ言語 (SSML) 機能は現在、cosyvoice-v3-flash、cosyvoice-v3-plus、および cosyvoice-v2 モデルのクローン音声、および「音声リスト」でサポートされていると示されているシステム音声でのみ利用可能です。以下の条件を満たす必要があります:

はじめに

SpeechSynthesizer クラスは、音声合成のためのインターフェイスを提供し、以下の呼び出しメソッドをサポートしています:

  • 非ストリーミング呼び出し:完全なテキストを一度に送信し、完全な音声を直接返すブロッキング呼び出しです。このメソッドは、短いテキストの合成シナリオに適しています。

  • 単方向ストリーミング呼び出し:完全なテキストを一度に送信し、コールバック関数を使用して音声データを受信する非ブロッキング呼び出しです。音声データはチャンクで配信される場合があります。このメソッドは、低遅延が要求される短いテキストの合成シナリオに適しています。

  • 双方向ストリーミング呼び出し:テキストをフラグメントで送信し、コールバック関数を使用して合成された音声ストリームをリアルタイムでインクリメンタルに受信する非ブロッキング呼び出しです。このメソッドは、低遅延が要求される長いテキストの合成シナリオに適しています。

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

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

image

SpeechSynthesizer クラスをインスタンス化し、リクエストパラメーターを設定し、call メソッドを呼び出してバイナリ音声データを合成および取得します。

テキスト長は 2,000 文字を超えることはできません。「SpeechSynthesizer クラス」の call メソッドをご参照ください。

重要

call メソッドを呼び出すたびに、新しい SpeechSynthesizer インスタンスを作成する必要があります。

クリックして完全な例を表示

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

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 キーが環境変数として設定されていない場合は、次の行のコメントを解除し、your-api-key をご自身の API キーに置き換えてください。
                        // .apiKey("your-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] Request ID: "
                            + synthesizer.getLastRequestId()
                            + ", First-packet latency (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) {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

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

ResultCallback コールバックを登録することで、音声合成タスクを非同期に送信し、リアルタイムで音声セグメントをフレームごとに受信します。

image

SpeechSynthesizer クラスをインスタンス化し、リクエストパラメーターResultCallback インターフェイスを設定し、その後 call メソッドを呼び出して音声を合成します。ResultCallback インターフェイスonEvent メソッドは、合成結果をリアルタイムで提供します。

テキスト長は 2,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 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() + " Audio received");
                }
            }

            @Override
            public void onComplete() {
                System.out.println(TimeUtils.getTimestamp() + " 'Complete' received. Speech synthesis is finished.");
                latch.countDown();
            }

            @Override
            public void onError(Exception e) {
                System.out.println("An exception occurred: " + e.toString());
                latch.countDown();
            }
        };

        // リクエストパラメーター
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // API キーを環境変数として設定していない場合は、次の行のコメントを解除し、"your-api-key" をご自身の API キーに置き換えてください。
                        // .apiKey("your-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] Request ID: "
                        + synthesizer.getLastRequestId()
                        + ", First-packet latency (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

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

ResultCallback コールバックを登録することで、テキストを複数回に分けて送信し、リアルタイムで音声セグメントデータをフレームごとに受信します。

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

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

    • 不完全な文は、完全になるまでキャッシュされてから合成されます。

    streamingComplete を呼び出すと、サーバーは不完全な文を含む、受信したが未処理のすべてのテキストフラグメントを合成します。

  • テキストフラグメントの送信間隔は 23 秒を超えることはできません。超えた場合、「request timeout after 23 seconds」例外が発生します。

    送信するテキストがこれ以上ない場合は、streamingComplete を呼び出してタスクを速やかに終了してください。

    サーバーは 23 秒のタイムアウトを強制します。クライアント側で変更することはできません。
image
  1. SpeechSynthesizer クラスをインスタンス化する

    SpeechSynthesizer クラスをインスタンス化し、リクエストパラメーターResultCallback インターフェイスを設定します。

  2. データのストリーミング

    SpeechSynthesizer クラスstreamingCall メソッドを複数回呼び出して、合成するテキストをセグメントに分けてサーバーに送信します。

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

    streamingCall メソッドを呼び出すたびに、テキストセグメント (つまり text) の長さは 2,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 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[] 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() + " Audio received");
                }
            }

            @Override
            public void onComplete() {
                System.out.println(TimeUtils.getTimestamp() + " 'Complete' received. Speech synthesis is finished.");
            }

            @Override
            public void onError(Exception e) {
                System.out.println("An exception occurred: " + e.toString());
            }
        };

        // リクエストパラメーター
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // API キーが環境変数として設定されていない場合は、次の行のコメントを解除し、your-api-key をご自身のキーに置き換えてください。
                        // .apiKey("your-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] Request ID: "
                        + synthesizer.getLastRequestId()
                        + ", First-packet latency (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

Flowable を介した呼び出し

Flowable は、Apache 2.0 ライセンスでリリースされている、ワークフローおよびビジネスプロセス管理のためのオープンソースフレームワークです。Flowable の使用方法の詳細については、「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 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 キーが環境変数として設定されていない場合は、次の行のコメントを解除し、your-api-key をご自身の API キーに置き換えてください。
                        // .apiKey("your-api-key")
                        .model(model) // モデル
                        .voice(voice) // 音声
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        synthesizer.callAsFlowable("今日の天気はどうですか?").blockingForEach(result -> {
            // System.out.println("Received message: " + result);
            if (result.getAudioFrame() != null) {
                // ここに音声データを処理するロジックを実装します。
                System.out.println(TimeUtils.getTimestamp() + " Audio received");
            }
        });
        // タスク完了後、WebSocket 接続を閉じます。
        synthesizer.getDuplexApi().close(1000, "bye");
        // 最初にテキストを送信する際に WebSocket 接続を確立する必要があるため、初回パケット遅延には接続確立にかかる時間が含まれます。
        System.out.println(
                "[Metric] Request ID: "
                        + synthesizer.getLastRequestId()
                        + ", First-packet latency (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
        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 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 キーが環境変数として設定されていない場合は、次の行のコメントを解除し、yourApikey をご自身の API キーに置き換えてください。
                        // .apiKey("yourApikey")
                        .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() +
                                " Binary audio size: " + result.getAudioFrame().capacity());
            }
        });
        synthesizer.getDuplexApi().close(1000, "bye");
        // 最初にテキストを送信する際に WebSocket 接続を確立する必要があるため、初回パケット遅延には接続確立にかかる時間が含まれます。
        System.out.println(
                "[Metric] Request ID: "
                        + synthesizer.getLastRequestId()
                        + ", First-packet latency (ms): "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
        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-flash/cosyvoice-v3-plus:longanyang などの音声を使用します。

  • cosyvoice-v2:longxiaochun_v2 などの音声を使用します。

  • 完全なリストについては、「音声リスト」をご参照ください。

voice

String

はい

音声合成に使用する音声。

システム音声とクローン音声がサポートされています:

  • システム音声:「音声リスト」をご参照ください。

  • クローン音声音声クローン機能を使用して音声をカスタマイズします。クローン音声を使用する場合、音声クローンと音声合成の両方で同じアカウントが使用されていることを確認してください。詳細な手順については、「CosyVoice 音声クローン API」をご参照ください。

    クローン音声を使用する場合、リクエストの model パラメーターの値は、音声を作成するために使用されたモデルバージョン (target_model パラメーター) と完全に同じでなければなりません。

format

enum

いいえ

音声コーディング形式とサンプルレート。

format を指定しない場合、合成された音声はサンプルレート 22.05 kHz の MP3 形式になります。

説明

デフォルトのサンプルレートは、現在の音声に最適なレートです。デフォルトでは、出力はこのサンプルレートを使用します。ダウンサンプリングとアップサンプリングもサポートされています。

以下の音声コーディング形式とサンプルレートが利用可能です:

  • すべてのモデルでサポートされている音声コーディング形式とサンプルレート:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

volume

int

いいえ

音量。

デフォルト値:50。

有効値:[0, 100]。値 50 が標準の音量です。音量はこの値と線形の関係にあります。0 はミュート、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 パラメーターは、SpeechSynthesisParam インスタンスの parameter または parameters メソッドを使用して設定します:

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

いいえ

音声合成のターゲット言語を指定して、合成効果を向上させます。

数字、略語、記号の発音、または中国語以外の言語の合成効果が期待どおりでない場合にこのパラメーターを使用します。

有効な値:

  • zh:中国語

  • en:英語

  • fr:フランス語

  • de:ドイツ語

  • ja:日本語

  • ko:韓国語

  • ru:ロシア語

:このパラメーターは配列ですが、現在のバージョンでは最初の要素のみが処理されます。したがって、1 つの値のみを渡す必要があります。

重要

このパラメーターは、音声合成のターゲット言語を指定します。この設定は、音声クローンに使用されるサンプル音声の言語とは無関係です。音声クローンタスクのソース言語を設定するには、「CosyVoice 音声クローン API」をご参照ください。

instruction

String

いいえ

方言、感情、キャラクターなどの効果を制御するための命令を設定します。cosyvoice-v3-flash および cosyvoice-v3-plus のクローン音声、および「音声リスト」で instruct をサポートしているとマークされたシステム音声でのみ利用可能です。

制限事項

  • 命令は中国語の固定フォーマットに従う必要があります (以下の説明を参照)

  • 設定しない場合は効果がありません。デフォルト値はありません。

機能:

  • 方言を指定する

    • 音声の制限:クローン音声のみ。

    • 形式: 「请用<方言>表达。」(注: 末尾の句点 (。) を省略せず、必ず中国語を使用してください。また、「<方言>」を、广东话などの特定のdialectに置き換えてください)。

    • 例:「请用广东话表达。

    • 方言:广东话 (広東語)、东北话 (東北語)、甘肃话 (甘粛語)、贵州话 (貴州語)、河南话 (河南語)、湖北话 (湖北語)、江西话 (江西語)、闽南话 (閩南語)、宁夏话 (寧夏語)、山西话 (山西語)、陕西话 (陝西語)、山东话 (山東語)、上海话 (上海語)、四川话 (四川語)、天津话 (天津語)、云南话 (雲南語)。

  • 感情を指定する

    • 音声の制限:

      • クローン音声。

      • 音声リスト」で instruct をサポートしているとマークされたシステム音声。

    • フォーマット:

      • クローン音声:

        フォーマットを表示するにはクリック (中国語を使用する必要があります)

        • 请尽可能非常大声地说一句话。 (できるだけ大きな声で一文を言ってください)

        • 请用尽可能慢地语速说一句话。 (できるだけゆっくりとした速さで一文を言ってください)

        • 请用尽可能快地语速说一句话。 (できるだけ速い速さで一文を言ってください)

        • 请非常轻声地说一句话。 (とても小さな声で一文を言ってください)

        • 你可以慢一点说吗 (もう少しゆっくり話せますか)

        • 你可以非常快一点说吗 (とても速く話せますか)

        • 你可以非常慢一点说吗 (とてもゆっくり話せますか)

        • 你可以快一点说吗 (もう少し速く話せますか)

        • 请非常生气地说一句话。 (とても怒って一文を言ってください)

        • 请非常开心地说一句话。 (とても嬉しそうに一文を言ってください)

        • 请非常恐惧地说一句话。 (とても怖がって一文を言ってください)

        • 请非常伤心地说一句话。 (とても悲しそうに一文を言ってください)

        • 请非常惊讶地说一句话。 (とても驚いて一文を言ってください)

        • 请尽可能表现出坚定的感觉。 (できるだけ断固とした感じを出してください)

        • 请尽可能表现出愤怒的感觉。 (できるだけ怒りの感情を表現してください)

        • 请尝试一下亲和的语调。 (親しみやすいトーンを試してください)

        • 请用冷酷的语调讲话。 (冷たいトーンで話してください)

        • 请用威严的语调讲话。 (威厳のあるトーンで話してください)

        • 我想体验一下自然的语气。 (自然なトーンを体験したいです)

        • 我想看看你如何表达威胁。(あなたが脅威をどのように表現するか見てみたいです)

        • 我想看看你怎么表现智慧。 (あなたが知恵をどのように表現するか見たいです)

        • 我想看看你怎么表现诱惑。 (あなたが誘惑をどのように表現するか見たいです)

        • 我想听听用活泼的方式说话。 (活発な話し方を聞きたいです)

        • 我想听听你用激昂的感觉说话。 (情熱的な感じで話すのを聞きたいです)

        • 我想听听用沉稳的方式说话的样子。 (落ち着いた話し方を聞きたいです)

        • 我想听听你用自信的感觉说话。 (自信を持って話すのを聞きたいです)

        • 你能用兴奋的感觉和我交流吗? (興奮した感じで私とコミュニケーションできますか?)

        • 你能否展示狂傲的情绪表达? (傲慢な感情表現を見せてもらえますか?)

        • 你能展现一下优雅的情绪吗? (優雅な感情を見せてもらえますか?)

        • 你可以用幸福的方式回答问题吗?(幸せそうに質問に答えることはできますか?)

        • 你可以做一个温柔的情感演示吗? (優しい感情を実演できますか?)

        • 能用冷静的语调和我谈谈吗? (冷静なトーンで私と話せますか?)

        • 能用深沉的方法回答我吗? (深遠な回答をいただけますか)

        • 能用粗犷的情绪态度和我对话吗? (荒々しい感情的な態度で私と対話できますか?)

        • 用阴森的声音告诉我这个答案。 (不気味な声でこの答えを教えてください)

        • 用坚韧的声音告诉我这个答案。 (粘り強い声でこの答えを教えてください)

        • 用自然亲切的闲聊风格叙述。 (自然で親しみやすい雑談スタイルで語ってください)

        • 用广播剧博客主的语气讲话。 (ラジオドラマのポッドキャスターの口調で話してください)

      • システム音声:感情命令のフォーマットは上記とは異なります。代わりに「音声リスト」をご参照ください。

  • シナリオ、役割、または ID を指定する

    • 音声の制限:「音声リスト」で instruct をサポートしているとマークされたシステム音声。

    • フォーマット:「音声リスト」をご参照ください。

enable_aigc_tag

boolean

いいえ

生成された音声に非表示の AIGC 識別子を追加するかどうかを指定します。true に設定すると、サポートされている形式 (WAV、MP3、Opus) の音声に非表示の識別子が埋め込まれます。

デフォルト値:false。

この機能は、cosyvoice-v3-flash、cosyvoice-v3-plus、および cosyvoice-v2 モデルでのみ利用可能です。

説明

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

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 は、SpeechSynthesisParam インスタンスの parameter または parameters メソッドを使用して設定します:

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 は、SpeechSynthesisParam インスタンスの parameter または parameters メソッドを使用して設定します:

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();

主要なインターフェイス

SpeechSynthesizer クラス

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

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

パラメーター

戻り値

説明

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

SpeechSynthesizer インスタンス

コンストラクター。

public ByteBuffer call(String text)

text:合成するテキスト (UTF-8)

ByteBuffer または null

テキストのセグメントを音声に変換します。テキストはプレーンテキストまたは SSML を含むテキストにすることができます。

SpeechSynthesizer インスタンスを作成する際、2 つのケースが考えられます:

重要

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()

なし

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

現在のタスクの初回パケット遅延を取得します。通常は約 500 ms です。このメソッドはタスク完了後に使用します。

初回パケット遅延は、テキストの送信が開始されてから最初の音声パケットが受信されるまでの時間で、ミリ秒単位で測定されます。

最初にテキストを送信する際に WebSocket 接続を確立する必要があるため、初回パケット遅延には接続確立にかかる時間が含まれます。高同時実行シナリオで接続が再利用される場合、接続時間は含まれません。

コールバックインターフェイス (ResultCallback)

単方向ストリーミング呼び出しまたは双方向ストリーミング呼び出しを行う場合、ResultCallback インターフェイスから合成結果を取得できます。このインターフェイスは import com.alibaba.dashscope.common.ResultCallback; を使用してインポートされます。

クリックして例を表示

ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
    @Override
    public void onEvent(SpeechSynthesisResult result) {
        System.out.println("RequestId: " + result.getRequestId());
        // 再生やバッファへの書き込みなど、音声シャードをリアルタイムで処理します。
    }

    @Override
    public void onComplete() {
        System.out.println("Task completed");
        // プレーヤーの解放など、合成後のロジックを処理します。
    }

    @Override
    public void onError(Exception e) {
        System.out.println("Task failed: " + e.getMessage());
        // ネットワークエラーやサーバー側のエラーコードなど、例外を処理します。
    }
};

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

パラメーター

戻り値

説明

public void onEvent(SpeechSynthesisResult result)

result:SpeechSynthesisResult インスタンス

なし

サーバーが音声合成データをプッシュすると、このコールバックが非同期で呼び出されます。

SpeechSynthesisResultgetAudioFrame メソッドを呼び出して、バイナリ音声データを取得できます。

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:発音が不正確な場合、どうすれば修正できますか?

SSML を使用して音声合成の出力をカスタマイズできます。

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

トラブルシューティング

コードエラーが発生した場合は、「エラーコード」でトラブルシューティング情報をご参照ください。

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

以下の 2 つの方法のいずれかで取得できます:

  • ResultCallbackonEvent メソッドで、SpeechSynthesisResultgetRequestId メソッドを呼び出すことができます。

    getRequestId メソッドの戻り値は null になる場合があります。「SpeechSynthesisResult」の getRequestId メソッドの説明をご参照ください。

  • SpeechSynthesizergetLastRequestId メソッドを呼び出します。

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

この問題をトラブルシューティングするには、以下の手順を実行してください:

  1. 制限と制約が正しいことを確認します。

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

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

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

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

以下のシナリオに基づいてこの問題をトラブルシューティングしてください:

  1. オーディオは、.mp3 ファイルなどの完全なファイルとして保存されます。

    1. 音声フォーマットの一貫性:リクエストパラメーターで指定された音声フォーマットがファイル拡張子と一致していることを確認します。例えば、リクエストパラメーターで音声フォーマットが WAV に設定されているのに、ファイルの拡張子が .mp3 の場合、再生が失敗する可能性があります。

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

  2. 音声がストリーミングモードで再生される場合。

    1. 音声ストリームを完全なファイルとして保存し、再生を試みます。ファイルの再生に失敗した場合は、最初のシナリオのトラブルシューティング手順をご参照ください。

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

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

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

以下のシナリオに基づいてこの問題をトラブルシューティングしてください:

  1. テキスト送信速度の確認: テキストの送信間隔が合理的であることを確認します。前のセグメントの音声再生が終了した後に、次のテキストセグメントの送信が遅れないようにします。

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

    • コールバック関数に、ブロックを引き起こす可能性のある過剰なビジネスロジックが含まれていないか確認します。

    • コールバック関数は WebSocket スレッドで実行されます。このスレッドがブロックされると、WebSocket がネットワークパケットを受信する能力が妨げられ、音声の途切れが発生する可能性があります。

    • WebSocket スレッドのブロックを避けるために、音声データを別の音声バッファーに書き込み、別のスレッドで読み取って処理します。

  3. ネットワークの安定性の確認: ネットワーク接続が安定していることを確認し、ネットワークの変動による音声伝送の中断や遅延を防ぎます。

Q:音声合成が遅い (合成時間が長い) のはなぜですか?

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

  1. 入力間隔の確認

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

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

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

    • リアルタイム係数 (RTF):合計合成時間 / 音声の長さで計算されます。RTF は通常 1.0 未満です。

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

SSML の <phoneme> タグを使用して、正しい発音を指定します。

Q:音声が返されないのはなぜですか?テキストの末尾が音声に正常に変換されないのはなぜですか?(合成音声の欠落)

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

権限と認証

Q:API キーを CosyVoice 音声合成サービス専用にし、他の Model Studio モデルには使用しないようにしたいのですが (権限の分離)、どうすればよいですか

ワークスペースを作成し、特定のモデルのみを承認することで、API キーの範囲を制限できます。「ワークスペースの管理」をご参照ください。

その他の質問

GitHub の Q&A をご参照ください。