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

Alibaba Cloud Model Studio:リアルタイム音声合成 — CosyVoice

最終更新日:Mar 22, 2026

音声合成(Text-to-Speech:TTS)は、テキストを自然な音声に変換する技術です。この技術では、機械学習アルゴリズムを用いて大量の音声データを分析し、言語のリズム、イントネーション、発音パターンを学習します。これにより、入力されたテキストから人間らしい音声を生成できます。

主な機能

  • 中国語および英語など複数の言語に対応した、高品質で自然なリアルタイム音声を生成します。

  • 音声クローニングと音声デザインという 2 種類の音声カスタマイズ方法を提供します。

  • 低遅延のストリーミング入出力をサポートし、リアルタイムでの対話が可能です。

  • 音声出力の詳細制御として、話速、ピッチ、音量、ビットレートを調整できます。

  • 主要なオーディオフォーマットをサポートし、最大 48 kHz の出力サンプルレートに対応します。

可用性

対応モデル:

国際

国際デプロイモード」では、アクセスポイントおよびデータストレージは シンガポール リージョンに配置され、モデル推論の計算リソースは中国本土を除く世界中で動的にスケジュールされます。

以下のモデルを呼び出す際は、API キー をシンガポールリージョン向けに選択してください:

  • CosyVoice: cosyvoice-v3-plus、cosyvoice-v3-flash

中国本土

中国本土デプロイモード」では、アクセスポイントおよびデータストレージは 中国 (北京) リージョンに配置され、モデル推論の計算リソースは中国本土内に限定されます。

以下のモデルを呼び出す際は、API キー を中国 (北京) リージョン向けに選択してください:

  • CosyVoice: cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-plus、cosyvoice-v3-flash、cosyvoice-v2、cosyvoice-v1

詳細については、「モデル一覧」をご参照ください。

モデル選択

シナリオ

推奨モデル

選択理由

備考

テキストから独自のブランドボイスを作成する

cosyvoice-v3.5-plus

音声デザイン機能をサポートしており、音声サンプルを一切使用せずにテキストのみからカスタム音声を生成できます。ブランド専用の音声をゼロから構築するのに最適です。

cosyvoice-v3.5-plus は中国 (北京) リージョンでのみ利用可能であり、システム音声には対応していません。

音声サンプルから特定の音声を再現する

cosyvoice-v3.5-plus

音声クローニング機能をサポートしており、音声サンプルから迅速に音声を再現し、高品質・一貫性・人間らしいブランドボイスプリントを実現します。

cosyvoice-v3.5-plus は中国 (北京) リージョンでのみ利用可能であり、システム音声には対応していません。

インテリジェントカスタマーサポート/音声アシスタント

cosyvoice-v3-flash、cosyvoice-v3.5-flash

plus モデルよりもコスト効率が高く、ストリーミング対話および感情表現をサポートし、高速かつ低遅延の応答を実現します。

cosyvoice-v3.5-flash は中国 (北京) リージョンでのみ利用可能であり、システム音声には対応していません。

地域方言による放送

cosyvoice-v3.5-plus

東北官話や閩南語など、複数の中国語方言をサポートしています。地域コンテンツの放送に最適です。

cosyvoice-v3.5-plus は中国 (北京) リージョンでのみ利用可能であり、システム音声には対応していません。

教育用途(数式読み上げを含む)

cosyvoice-v2、cosyvoice-v3-flash、cosyvoice-v3-plus

数学、物理、化学の指導に最適であり、LaTeX 数式を音声に変換できます。

cosyvoice-v2 と cosyvoice-v3-plus は料金が高くなります (1 万文字あたり 0.286706 米ドル)。

構造化された音声放送(ニュースやアナウンスなど)

cosyvoice-v3-plus、cosyvoice-v3-flash、cosyvoice-v2

SSML をサポートしており、話速、一時停止、発音などの要素を制御することで、放送品質を向上させます。

SSML の生成にはカスタムロジックが必要です。感情表現はサポートされていません。

音声とテキストの正確な同期(字幕生成や授業再生など)

cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2

タイムスタンプ出力をサポートしており、合成音声と原文の同期を実現します。

タイムスタンプ機能はデフォルトで無効になっているため、明示的に有効化する必要があります。

グローバル市場向けの多言語アプリケーション

cosyvoice-v3-flash、cosyvoice-v3-plus

複数言語の音声合成をサポートしています。

機能および可用性はモデルおよびリージョンによって異なります。モデルを選択する前に、「モデル比較」セクションをご確認ください。

クイックスタート

以下のコード例は API の呼び出し方法を示しています。一般的なシナリオをカバーしたその他のサンプルコードについては、「GitHub」をご参照ください。

API キーの取得およびAPI キーの環境変数へのエクスポートを行ってください。SDK を使用して呼び出しを行う場合は、DashScope SDK のインストールを行ってください。

CosyVoice

重要

cosyvoice-v3.5-plus および cosyvoice-v3.5-flash モデルは中国 (北京) リージョンでのみ利用可能であり、音声デザインおよび音声クローニング専用です。これらのモデルはシステム音声をサポートしていません。音声合成に使用する前に、まずCosyVoice 音声クローニング/デザイン APIを使用してターゲット音声を作成する必要があります。音声が作成された後は、コード内の voice パラメーターを新しい音声 ID に更新し、model パラメーターを対応するモデルに設定してください。

システム音声

以下の例は、システム音声を使用した音声合成の方法を示しています。詳細については、「音声一覧」をご参照ください。

ファイルへの保存

Python

# coding=utf-8

import os
import dashscope
from dashscope.audio.tts_v2 import *

# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

# 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'

# モデルを指定します。
# モデルのバージョンによって、対応する音声が異なります:
# cosyvoice-v3-flash/cosyvoice-v3-plus:longanyang などの音声を使用します。
# cosyvoice-v2:longxiaochun_v2 などの音声を使用します。
# 各音声は異なる言語をサポートしています。中国語以外の言語(日本語や韓国語など)を合成する場合は、対象言語をサポートする音声を選択してください。詳細については、CosyVoice 音声一覧をご参照ください。
model = "cosyvoice-v3-flash"
# 音声を指定します。
voice = "longanyang"

# SpeechSynthesizer をインスタンス化し、コンストラクター内で model および voice パラメーターを渡します。
synthesizer = SpeechSynthesizer(model=model, voice=voice)
# 合成するテキストを送信し、バイナリ形式のオーディオデータを受信します。
audio = synthesizer.call("今日の天気はどうですか?")
# 最初にテキストを送信すると、WebSocket 接続が確立される必要があります。したがって、最初のパケット遅延には接続確立にかかる時間が含まれます。
print('[Metric] Request ID: {}, first-packet latency: {} ms'.format(
    synthesizer.get_last_request_id(),
    synthesizer.get_first_package_delay()))

# オーディオをローカルファイルに保存します。
with open('output.mp3', 'wb') as f:
    f.write(audio)

Java

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 {
    // モデルを指定します。
    // モデルのバージョンによって、対応する音声が異なります:
    // cosyvoice-v3-flash/cosyvoice-v3-plus:longanyang などの音声を使用します。
    // cosyvoice-v2:longxiaochun_v2 などの音声を使用します。
    // 各音声は異なる言語をサポートしています。中国語以外の言語(日本語や韓国語など)を合成する場合は、対象言語をサポートする音声を選択してください。詳細については、CosyVoice 音声一覧をご参照ください。
    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] 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) {
        // 次の 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);
    }
}

リアルタイム音声の再生

以下の例は、Qwen 大規模言語モデル(LLM)からストリーミングされるテキストを音声に変換し、リアルタイムで再生する方法を示しています。

Python

Python の例を実行する前に、pip を使用してサードパーティ製のオーディオ再生ライブラリをインストールする必要があります。

# 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 os
import pyaudio
import dashscope
from dashscope.audio.tts_v2 import *


from http import HTTPStatus
from dashscope import Generation

# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

# 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'

# モデルのバージョンによって、対応する音声が異なります:
# cosyvoice-v3-flash/cosyvoice-v3-plus:longanyang などの音声を使用します。
# cosyvoice-v2:longxiaochun_v2 などの音声を使用します。
# 各音声は異なる言語をサポートしています。中国語以外の言語(日本語や韓国語など)を合成する場合は、対象言語をサポートする音声を選択してください。詳細については、CosyVoice 音声一覧をご参照ください。
model = "cosyvoice-v3-flash"
voice = "longanyang"


class Callback(ResultCallback):
    _player = None
    _stream = None

    def on_open(self):
        print("websocket がオープンしました。")
        self._player = pyaudio.PyAudio()
        self._stream = self._player.open(
            format=pyaudio.paInt16, channels=1, rate=22050, output=True
        )

    def on_complete(self):
        print("音声合成タスクが正常に完了しました。")

    def on_error(self, message: str):
        print(f"音声合成タスクが失敗しました。{message}")

    def on_close(self):
        print("websocket がクローズされました。")
        # プレーヤーを停止します。
        self._stream.stop_stream()
        self._stream.close()
        self._player.terminate()

    def on_event(self, message):
        print(f"音声合成メッセージを受信しました:{message}")

    def on_data(self, data: bytes) -> None:
        print("オーディオ結果の長さ:", len(data))
        self._stream.write(data)


def synthesizer_with_llm():
    callback = Callback()
    synthesizer = SpeechSynthesizer(
        model=model,
        voice=voice,
        format=AudioFormat.PCM_22050HZ_MONO_16BIT,
        callback=callback,
    )

    messages = [{"role": "user", "content": "自己紹介をお願いします"}]
    responses = Generation.call(
        model="qwen-turbo",
        messages=messages,
        result_format="message",  # 結果フォーマットを 'message' に設定します。
        stream=True,  # ストリーム出力を有効化します。
        incremental_output=True,  # 増分出力を有効化します。
    )
    for response in responses:
        if response.status_code == HTTPStatus.OK:
            print(response.output.choices[0]["message"]["content"], end="")
            synthesizer.streaming_call(response.output.choices[0]["message"]["content"])
        else:
            print(
                "Request id: %s, Status code: %s, error code: %s, error message: %s"
                % (
                    response.request_id,
                    response.status_code,
                    response.code,
                    response.message,
                )
            )
    synthesizer.streaming_complete()
    print('requestId: ', synthesizer.get_last_request_id())


if __name__ == "__main__":
    synthesizer_with_llm()

Java

クローン音声

image

音声クローニングと音声合成は、それぞれ独立したが関連性のある 2 つのステップであり、「作成 → 使用」のワークフローに従います:

  1. 音声録音ファイルの準備

    音声クローニング:入力音声フォーマット の要件を満たす音声ファイルを、Object Storage Service (OSS) などの一般公開可能な場所にアップロードします。URL が一般公開可能であることを確認してください。

  2. 音声の作成

    音声の作成 API を呼び出します。このステップでは、作成した音声と連携して使用する音声合成モデルを指定するために、target_model/targetModel パラメーターを必ず指定する必要があります。

    すでに音声を作成済みの場合は、このステップをスキップできます。既存の音声を確認するには、音声一覧の照会 API を呼び出してください。

  3. 音声合成への音声の使用

    音声の作成 API を使用して音声を作成すると、システムから voice_id/voiceID が返されます。

    • この voice_id または voiceID を、その後の音声合成呼び出しにおける voice パラメーターの値として使用します。

    • 非ストリーミング、片方向ストリーミング、双方向ストリーミング合成など、複数の呼び出しモードがサポートされています。

    • 音声合成モデルは、音声作成時に target_model/targetModel パラメーターで指定したものと同じである必要があります。そうでない場合、合成は失敗します。

サンプルコード

import os
import time
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService, SpeechSynthesizer

# 1. 環境の準備。
# API キーは環境変数として設定することを推奨します。
# シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
if not dashscope.api_key:
    raise ValueError("DASHSCOPE_API_KEY 環境変数が設定されていません。")

# シンガポールリージョン向けの WebSocket URL。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# シンガポールリージョン向けの HTTP URL。中国 (北京) リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'


# 2. クローニングパラメーターの定義。
TARGET_MODEL = "cosyvoice-v3.5-plus" 
# 音声に意味のあるプレフィックスを指定します。
VOICE_PREFIX = "myvoice" # 数字および小文字のみ許可されます。プレフィックスは 10 文字未満である必要があります。
# 音声ファイルの一般公開可能な URL を指定します。
AUDIO_URL = "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/cosyvoice/cosyvoice-zeroshot-sample.wav" # これはサンプル URL です。ご自身の URL に置き換えてください。

# 3. 音声の作成(非同期タスク)。
print("--- ステップ 1:音声登録の作成 ---")
service = VoiceEnrollmentService()
try:
    voice_id = service.create_voice(
        target_model=TARGET_MODEL,
        prefix=VOICE_PREFIX,
        url=AUDIO_URL
    )
    print(f"音声登録の送信が正常に完了しました。リクエスト ID:{service.get_last_request_id()}")
    print(f"生成された音声 ID:{voice_id}")
except Exception as e:
    print(f"音声作成中にエラーが発生しました:{e}")
    raise e
# 4. 音声ステータスのポーリング。
print("\n--- ステップ 2:音声ステータスのポーリング ---")
max_attempts = 30
poll_interval = 10 # 秒
for attempt in range(max_attempts):
    try:
        voice_info = service.query_voice(voice_id=voice_id)
        status = voice_info.get("status")
        print(f"試行 {attempt + 1}/{max_attempts}:音声ステータスは '{status}' です")
        
        if status == "OK":
            print("音声は合成に使用可能です。")
            break
        elif status == "UNDEPLOYED":
            print(f"音声処理が失敗しました。ステータス:{status}。音声品質を確認するか、サポートへお問い合わせください。")
            raise RuntimeError(f"音声処理が失敗しました。ステータス:{status}")
        # "DEPLOYING" などの中間ステータスの場合は、ポーリングを継続します。
        time.sleep(poll_interval)
    except Exception as e:
        print(f"ステータスポーリング中にエラーが発生しました:{e}")
        time.sleep(poll_interval)
else:
    print("ポーリングがタイムアウトしました。複数回の試行後も音声が準備できませんでした。")
    raise RuntimeError("ポーリングがタイムアウトしました。複数回の試行後も音声が準備できませんでした。")

# 5. クローン音声を使用した音声合成。
print("\n--- ステップ 3:新規音声による音声合成 ---")
try:
    synthesizer = SpeechSynthesizer(model=TARGET_MODEL, voice=voice_id)
    text_to_synthesize = "おめでとうございます!ご自身の音声をクローンし、合成することに成功しました!"
    
    # call() メソッドはバイナリ形式のオーディオデータを返します。
    audio_data = synthesizer.call(text_to_synthesize)
    print(f"音声合成が正常に完了しました。リクエスト ID:{synthesizer.get_last_request_id()}")

    # 6. オーディオファイルの保存。
    output_file = "my_custom_voice_output.mp3"
    with open(output_file, "wb") as f:
        f.write(audio_data)
    print(f"オーディオが {output_file} に保存されました")

except Exception as e:
    print(f"音声合成中にエラーが発生しました:{e}")

デザイン音声

image

音声デザインと音声合成は、それぞれ独立したが関連性のある 2 つのステップであり、「作成 → 使用」のワークフローに従います:

  1. 音声デザインのための音声説明およびプレビュー用テキストの準備

    • 音声説明 (voice_prompt):ターゲット音声の特徴を記述します。詳細については、「音声デザイン:高品質な音声説明の書き方」をご参照ください。

    • プレビュー用テキスト (preview_text):ターゲット音声が読み上げるプレビュー用のテキストです。例:「みなさん、こんにちは。ようこそ。」

  2. 音声の作成 API を呼び出してカスタム音声を作成し、音声 ID およびプレビュー音声を取得します。

    このステップでは、作成した音声と連携して使用する音声合成モデルを指定するために、target_model パラメーターを必ず指定する必要があります。

    プレビュー音声を聴取します。期待通りであれば、次のステップに進んでください。そうでない場合は、音声を再設計してください。

    すでに音声を作成済みの場合は、このステップをスキップできます。既存の音声を確認するには、音声一覧の照会 API を呼び出してください。

  3. 音声合成への音声の使用。

    音声の作成 API を使用して音声を作成すると、システムから voice_id/voiceID が返されます。

    • この voice_id または voiceID を、その後の音声合成呼び出しにおける voice パラメーターの値として使用します。

    • 非ストリーミング、片方向ストリーミング、双方向ストリーミング合成など、複数の呼び出しモードがサポートされています。

    • 音声合成モデルは、音声作成時に target_model/targetModel パラメーターで指定したものと同じである必要があります。そうでない場合、合成は失敗します。

サンプルコード

  1. カスタム音声を生成し、プレビュー結果を確認します。結果に満足した場合は、次のステップに進んでください。そうでない場合は、音声を再生成してください。

    Python

    import requests
    import base64
    import os
    
    def create_voice_and_play():
        # シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
        # 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: api_key = "sk-xxx"
        api_key = os.getenv("DASHSCOPE_API_KEY")
        
        if not api_key:
            print("エラー:DASHSCOPE_API_KEY 環境変数が設定されていません。")
            return None, None, None
        
        # リクエストデータを準備します。
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": "voice-enrollment",
            "input": {
                "action": "create_voice",
                "target_model": "cosyvoice-v3.5-plus",
                "voice_prompt": "落ち着いた中年男性アナウンサーで、深みがあり豊かで磁石のような声、一定の話速、明瞭な発音が特徴で、ニュース放送やドキュメンタリー解説に適しています。",
                "preview_text": "リスナーの皆様、こんにちは。夜のニュースへようこそ。",
                "prefix": "announcer"
            },
            "parameters": {
                "sample_rate": 24000,
                "response_format": "wav"
            }
        }
        
        # 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、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()
                
                # 音声 ID を取得します。
                voice_id = result["output"]["voice_id"]
                print(f"音声 ID:{voice_id}")
                
                # プレビュー音声データを取得します。
                base64_audio = result["output"]["preview_audio"]["data"]
                
                # Base64 形式の音声データをデコードします。
                audio_bytes = base64.b64decode(base64_audio)
                
                # 音声ファイルをローカルデバイスに保存します。
                filename = f"{voice_id}_preview.wav"
                
                # 音声データをローカルファイルに書き込みます。
                with open(filename, 'wb') as f:
                    f.write(audio_bytes)
                
                print(f"音声はローカルファイルに保存されました:{filename}")
                print(f"ファイルパス:{os.path.abspath(filename)}")
                
                return voice_id, 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 'No response'}")
            return None, None, None
        except Exception as e:
            print(f"予期しないエラーが発生しました:{e}")
            return None, None, None
    
    if __name__ == "__main__":
        print("音声の作成を開始します...")
        voice_id, audio_data, saved_filename = create_voice_and_play()
        
        if voice_id:
            print(f"\n音声 '{voice_id}' が作成されました。")
            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/en/model-studio/get-api-key をご参照ください。
            // 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
    
            // JSON リクエストボディ文字列を作成します。
            String jsonBody = "{\n" +
                    "    \"model\": \"voice-enrollment\",\n" +
                    "    \"input\": {\n" +
                    "        \"action\": \"create_voice\",\n" +
                    "        \"target_model\": \"cosyvoice-v3.5-plus\",\n" +
                    "        \"voice_prompt\": \"落ち着いた中年男性アナウンサーで、深みがあり豊かで磁石のような声、一定の話速、明瞭な発音が特徴で、ニュース放送やドキュメンタリー解説に適しています。\",\n" +
                    "        \"preview_text\": \"リスナーの皆様、こんにちは。夜のニュースへようこそ。\",\n" +
                    "        \"prefix\": \"announcer\"\n" +
                    "    },\n" +
                    "    \"parameters\": {\n" +
                    "        \"sample_rate\": 24000,\n" +
                    "        \"response_format\": \"wav\"\n" +
                    "    }\n" +
                    "}";
    
            HttpURLConnection connection = null;
            try {
                // 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、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");
    
                    // 音声 ID を取得します。
                    String voiceId = outputObj.get("voice_id").getAsString();
                    System.out.println("音声 ID: " + voiceId);
    
                    // Base64 エンコードされた音声データを取得します。
                    String base64Audio = previewAudioObj.get("data").getAsString();
    
                    // Base64 形式の音声データをデコードします。
                    byte[] audioBytes = Base64.getDecoder().decode(base64Audio);
    
                    // 音声をローカルファイルに保存します。
                    String filename = voiceId + "_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. 前のステップで生成したカスタム音声を音声合成に使用します。

    この手順では、ノンストリーミング呼び出し の例を参照します。 voice パラメーターの値を、音声デザインによって生成されたカスタム音声 ID に置き換えます。

    基本原則:音声デザインで使用したモデル(target_model)と、その後の音声合成で使用するモデル(model)は同一である必要があります。そうでない場合、合成は失敗します。

    Python

    # coding=utf-8
    
    import dashscope
    from dashscope.audio.tts_v2 import *
    import os
    
    # シンガポールおよび中国 (北京) リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
    # 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください:dashscope.api_key = "sk-xxx"
    dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
    
    # 次の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
    dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
    
    # 音声デザインと音声合成で同じモデルを使用します。
    model = "cosyvoice-v3.5-plus"
    # 音声パラメーターの値を、音声デザインで生成したカスタム音声 ID に置き換えます。
    voice = "your_voice_id"
    
    # SpeechSynthesizer をインスタンス化し、コンストラクター内で model および voice パラメーターを渡します。
    synthesizer = SpeechSynthesizer(model=model, voice=voice)
    # 合成するテキストを送信し、バイナリ形式のオーディオデータを受信します。
    audio = synthesizer.call("今日の天気はどうですか?")
    # 最初にテキストを送信すると、WebSocket 接続が確立される必要があります。したがって、最初のパケット遅延には接続確立にかかる時間が含まれます。
    print('[Metric] Request ID: {}, first-packet latency: {} ms'.format(
        synthesizer.get_last_request_id(),
        synthesizer.get_first_package_delay()))
    
    # オーディオをローカルファイルに保存します。
    with open('output.mp3', 'wb') as f:
        f.write(audio)

    Java

    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.5-plus";
        // 音声パラメーターの値を、音声デザインで生成したカスタム音声 ID に置き換えます。
        private static String voice = "your_voice_id";
    
        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] 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) {
            // 次の 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);
        }
    }

音声クローニング:音声要件

重要

この機能はシンガポールリージョンではサポートされていません。

優れた音声クローニング結果を得るには、高品質な入力音声が不可欠です。

項目

要件

対応フォーマット

WAV(16 ビット)、MP3、M4A

音声持続時間

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

ファイルサイズ

≤ 10 MB

サンプルレート

≥ 16 kHz

音声チャンネル

モノラルまたはステレオ。ステレオ音声の場合は、最初のチャンネルのみが処理されます。最初のチャンネルに明瞭な人間の話し声が含まれていることを確認してください。

コンテンツ

最高の結果を得るために、音声ファイルは以下の要件を満たす必要があります:

音声デザイン:高品質な音声説明の書き方

重要

この機能はシンガポールリージョンではサポートされていません。

要件および制限事項

音声説明(voice_prompt)を作成する際は、以下の技術的制約に従う必要があります:

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

  • 対応言語:説明は中国語または英語でなければなりません。

基本原則

高品質な音声説明(voice_prompt)は、理想の音声を作成する鍵となります。これは音声デザインの設計図であり、モデルが特定の特徴を持つ音声を生成するように直接ガイドします。

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

  1. 曖昧ではなく具体的であること:「深い」「クリア」「速い」など、具体的な音声特性を表す言葉を使用します。「聞きやすい」や「普通」など、主観的で情報量の少ない用語は避けてください。

  2. 単一ではなく多次元であること:優れた説明は、通常、性別、年齢、感情(以下で説明)など、複数の次元を組み合わせます。「女性の声」という単一の次元の説明では、明確な音声品質を生成するには不十分です。

  3. 主観ではなく客観であること:音声自体の物理的・知覚的な特性に焦点を当て、個人的な好みには言及しないでください。例えば、「エネルギッシュなトーンでやや高いピッチ」という表現を、「私の好きな声」という表現の代わりに使用してください。

  4. 模倣ではなく独創であること:特定の人物(有名人や俳優など)の模倣を依頼するのではなく、音声の特性を説明してください。このような依頼は著作権上のリスクを伴い、モデルは直接の模倣をサポートしていません。

  5. 冗長ではなく簡潔であること:すべての単語が意味を持ち、重複する同義語や意味のない強調語(例:「とても、とても、とても良い声」)を避けてください。

説明の次元

次元

性別

男性、女性、中立

年齢

子供(5~12 歳)、ティーンエイジャー(13~18 歳)、若年成人(19~35 歳)、中高年(36~55 歳)、高齢者(55 歳以上)

ピッチ

高い、中程度、低い、やや高い、やや低い

話速

速い、中程度、遅い、やや速い、やや遅い

感情

明るい、落ち着いた、優しい、真剣な、活気のある、落ち着いた、安らぎを与える

特性

魅惑的な、鮮明な、かすれた、まろやかな、甘美な、豊かな、力強い

用途

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

例の比較

✅ 推奨される例

  • 「明るく活気のある若い女性の声で、話速が速く、はっきりと上がるイントネーションが特徴で、ファッション製品の紹介に適しています。」

    分析:この説明では、年齢、性格、話速、イントネーションを組み合わせており、さらに使用ケースを明示しているため、鮮明でバランスの取れた音声プロファイルを作成できます。

  • 「落ち着いた中高年の男性の声で、話速がゆっくりで、深みがあり磁石のようなトーンが特徴で、ニュース放送やドキュメンタリー解説に適しています。」

    分析:この説明では、性別、年齢層、話速、音声の特性、および目的が明確に定義されています。

  • 「かわいい子供の声で、約 8 歳の女の子を想定し、やや子供っぽいトーンが特徴で、アニメーションキャラクターの声に適しています。」

    分析:この説明では、特定の年齢と音声品質(子供っぽさ)を明確に指定し、明確な目的を定義しています。

  • 「優しく知的で、約 30 歳の女性の声で、落ち着いたトーンが特徴で、オーディオブックのナレーションに適しています。」

    分析:この説明では、「知的」や「落ち着いた」といった言葉を使用して、音声の感情とスタイルを効果的に伝えています。

❌ 効果の薄い例と改善提案

不適切な例

主な問題点

改善提案

「聞きやすい声」

曖昧で主観的であり、実行可能な特性が欠けています。

具体的な次元を追加してください。例:「やさしいイントネーションを持つ、クリアなトーンの若年成人女性の声」

「有名人のような声」

著作権上のリスクがあります。モデルは直接の模倣をサポートしていません。

代わりに音声の特性を説明してください。例:「落ち着いた話速で磁石のようなトーンを持つ、成熟した男性の声」

「とても、とても、とても良い女性の声」

冗長な情報です。単語の繰り返しは音声の定義には役立ちません。

繰り返しを削除し、効果的な説明を追加してください。例:「20~24 歳の女性の声で、軽やかで明るいトーン、活気のあるピッチ、甘い質感が特徴です。」

"123456"

無効な入力です。モデルはこれを音声特性として解析できません。

意味のあるテキスト説明を提供してください。上記の推奨例をご参照ください。

API

モデル比較

国際

国際デプロイモード」では、アクセスポイントおよびデータストレージは シンガポール リージョンに配置され、モデル推論の計算リソースは中国本土を除く世界中でグローバルにスケジュールされます。

機能

cosyvoice-v3-plus

cosyvoice-v3-flash

対応言語

システム音声(音声によって異なります):中国語(標準語、東北官話、閩南語、陝西語)、英語、日本語、韓国語。

システム音声(音声によって異なります):中国語(標準語)および英語。

オーディオフォーマット

PCM、WAV、MP3、Opus

オーディオサンプルレート

8 kHz、16 kHz、22.05 kHz、24 kHz、44.1 kHz、48 kHz

音声クローニング

非対応

音声デザイン

非対応

SSML

対応

この機能は、音声一覧で SSML 対応とマークされたシステム音声で利用可能です。
この機能を利用するには、「SSML マークアップ言語の概要」をご参照ください。

LaTeX

対応

この機能を利用するには、「LaTeX 数式から音声への変換」をご参照ください。

音量調整

対応

この機能を利用するには、volume リクエストパラメーターを指定してください。

話速調整

対応

この機能を利用するには、speech_rate リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは speechRate です。

ピッチ調整

対応

この機能を利用するには、pitch_rate リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは pitchRate です。

ビットレート調整

対応

この機能は Opus オーディオフォーマットのみをサポートしています。
この機能を利用するには、bit_rate リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは bitRate です。

タイムスタンプ

対応(デフォルトで無効)。

この機能は、音声一覧でタイムスタンプ対応とマークされたシステム音声で利用可能です。
この機能を利用するには、word_timestamp_enabled リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは enableWordTimestamp です。

命令制御(Instruct)

非対応

対応

この機能は、音声一覧で Instruct 対応とマークされたシステム音声で利用可能です。
この機能を利用するには、instruction リクエストパラメーターを指定してください。

ストリーミング入力

対応

ストリーミング出力

対応

レート制限(RPS)

3

接続タイプ

Java および Python SDK、WebSocket API

価格

$0.26/1 万文字

$0.13/1 万文字

中国本土

中国本土デプロイモード」では、アクセスポイントおよびデータストレージは 中国 (北京) リージョンに配置され、モデル推論の計算リソースは中国本土内に限定されます。

機能

cosyvoice-v3.5-plus

cosyvoice-v3.5-flash

cosyvoice-v3-plus

cosyvoice-v3-flash

cosyvoice-v2

対応言語

システム音声は利用できません。クローン音声の場合、このモデルは中国語(標準語、広東語、河南語、湖北語、閩南語、寧夏語、陝西語、山東語、上海語、四川語)、英語、フランス語、ドイツ語、日本語、韓国語、ロシア語、ポルトガル語、タイ語、インドネシア語、ベトナム語をサポートします。

デザイン音声の場合、このモデルは中国語(標準語)および英語をサポートします。

システム音声(音声によって異なります):中国語(標準語、東北官話、閩南語、陝西語)、英語、日本語、韓国語。

クローン音声:中国語(標準語)、英語、フランス語、ドイツ語、日本語、韓国語、ロシア語。

システム音声(音声によって異なります):中国語(標準語)および英語。

クローン音声:中国語(標準語、広東語、東北官話、甘粛語、貴州語、河南語、湖北語、江西語、閩南語、寧夏語、山西語、陝西語、山東語、上海語、四川語、天津語、雲南語)、英語、フランス語、ドイツ語、日本語、韓国語、ロシア語、ポルトガル語、タイ語、インドネシア語、ベトナム語。

システム音声(音声によって異なります):中国語(標準語)、英語、韓国語、日本語。

クローン音声:中国語(標準語)および英語。

オーディオフォーマット

PCM、WAV、MP3、Opus

オーディオサンプルレート

8 kHz、16 kHz、22.05 kHz、24 kHz、44.1 kHz、48 kHz

音声クローニング

対応

この機能を利用するには、「CosyVoice 音声クローニング/デザイン API」をご参照ください。
音声クローニングに対応する言語:
cosyvoice-v2:中国語(標準語)および英語。
cosyvoice-v3-flash:中国語(標準語、広東語、東北官話、甘粛語、貴州語、河南語、湖北語、江西語、閩南語、寧夏語、山西語、陝西語、山東語、上海語、四川語、天津語、雲南語)、英語、フランス語、ドイツ語、日本語、韓国語、ロシア語、ポルトガル語、タイ語、インドネシア語、ベトナム語。
cosyvoice-v3-plus:中国語(標準語)、英語、フランス語、ドイツ語、日本語、韓国語、ロシア語。
cosyvoice-v3.5-plus および cosyvoice-v3.5-flash:中国語(標準語、広東語、河南語、湖北語、閩南語、寧夏語、陝西語、山東語、上海語、四川語)、英語、フランス語、ドイツ語、日本語、韓国語、ロシア語、ポルトガル語、タイ語、インドネシア語、ベトナム語。

音声デザイン

cosyvoice-v3.5 モデルでは対応、cosyvoice-v3 モデルでは非対応。

対応モデルについては、「CosyVoice 音声クローニング/デザイン API」をご参照ください。
音声デザインに対応する言語:中国語および英語。

非対応

SSML

対応

この機能は、クローン音声および音声一覧で SSML 対応とマークされたシステム音声で利用可能です。
この機能を利用するには、「SSML マークアップ言語の概要」をご参照ください。

LaTeX

対応

この機能を利用するには、「LaTeX 数式から音声への変換」をご参照ください。

音量調整

対応

この機能を利用するには、volume リクエストパラメーターを指定してください。

話速調整

対応

この機能を利用するには、speech_rate リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは speechRate です。

ピッチ調整

対応

この機能を利用するには、pitch_rate リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは pitchRate です。

ビットレート調整

対応

この機能は Opus オーディオフォーマットのみをサポートしています。
この機能を利用するには、bit_rate リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは bitRate です。

タイムスタンプ

対応(デフォルトで無効)。

この機能は、クローン音声および音声一覧でタイムスタンプ対応とマークされたシステム音声で利用可能です。
この機能を利用するには、word_timestamp_enabled リクエストパラメーターを指定してください。
Java SDK では、このパラメーターは enableWordTimestamp です。

命令制御(Instruct)

対応

この機能は、クローン音声および音声一覧で Instruct 対応とマークされたシステム音声で利用可能です。
この機能を利用するには、instruction リクエストパラメーターを指定してください。

非対応

対応

この機能は、クローン音声および音声一覧で Instruct 対応とマークされたシステム音声で利用可能です。
この機能を利用するには、instruction リクエストパラメーターを指定してください。

非対応

ストリーミング入力

対応

ストリーミング出力

対応

レート制限(RPS)

3

接続タイプ

Java および Python SDK、WebSocket API

価格

CNY 0.22/1 万文字

CNY 0.116/1 万文字

CNY 0.286706/1 万文字

CNY 0.14335/1 万文字

CNY 0.286706/1 万文字

対応システム音声

CosyVoice 音声一覧

よくある質問

Q:複数の読み方がある単語や誤った発音を修正するにはどうすればよいですか?

  • 応急処置として、複数の読み方がある単語を同音異義語に置き換えます。

  • 発音を制御するために音声合成マークアップ言語(SSML)を使用します:

Q:クローン音声から無音のオーディオが出力される場合のトラブルシューティング方法を教えてください。

  1. 音声ステータスの確認

    CosyVoice 音声クローニング/デザイン API を呼び出して、音声の statusOK であることを確認します。

  2. モデルバージョンの整合性の確保

    音声クローニングの target_model パラメーターと音声合成の model パラメーターが一致していることを確認します。例:

    • 音声クローニングでは cosyvoice-v3-plus を使用します。

    • 音声合成でも必ず cosyvoice-v3-plus を使用します。

  3. ソース音声の品質確認

    CosyVoice 音声クローニング/デザイン API のドキュメントに記載されているソース音声の要件を満たしていることを確認してください:

    • 音声持続時間:10~20 秒

    • 明瞭な音声品質

    • バックグラウンドノイズなし

  4. リクエストパラメーターの確認

    音声合成リクエストの voice パラメーターがクローン音声 ID に設定されていることを確認します。

Q:クローン音声から不安定または不完全なオーディオが出力される場合のトラブルシューティング方法を教えてください。

クローン音声から生成される合成音声には、以下のような問題が発生することがあります:

  • 再生が不完全で、テキストの一部しか読み上げられない。

  • 合成品質が一貫していない。

  • 予期しない一時停止や無音セグメントがオーディオに含まれている。

原因の可能性:ソース音声の品質が要件を満たしていないことです。

解決策:ソース音声が以下の要件を満たしているか確認してください。推奨事項として、録音操作ガイド に従って音声を再録音してください。

  • 音声の連続性の確認:ソース音声の話し声が連続しており、長時間の一時停止や無音セグメント(2 秒以上)がないことを確認します。音声に大きな無音セグメントが含まれている場合、モデルがその無音やノイズを音声特徴として解釈し、出力品質が低下する可能性があります。

  • 話し声活動率の確認:アクティブな話し声が全音声持続時間の少なくとも 60% を占めていることを確認します。過度なバックグラウンドノイズや非話し声セグメントは、音声特徴の抽出を妨げる可能性があります。

  • 音声品質の詳細の確認:

    • 音声持続時間:10~20 秒(推奨:15 秒)。

    • 明瞭な発音と安定した話速。

    • バックグラウンドノイズ、反響、静電気ノイズなし。

    • 一定の音量レベルで、長時間の無音セグメントがない。