Skip to main content

リアルタイム音声合成

リアルタイム音声合成の機能、ストリーミング呼び出し、合成品質の改善方法を説明します。

機能

リアルタイム音声合成は、テキストを分割して受け取り、音声を順次返します。大規模言語モデルが生成するテキストをリアルタイムで音声に変換できます。
  • 言語と方言: 対象の言語に適したモデルと音声を選択するか、指示で方言を指定します。方言をご参照ください。
  • 表現の制御: 自然言語の指示で話し方を調整したり、感情タグや非言語音タグを挿入したりできます。指示による制御と感情タグと非言語音タグをご参照ください。
  • カスタム音声: 音声クローニングで音声サンプルから、または音声デザインでテキストの説明から音声を作成します。
  • 詳細な制御と数式の読み上げ: SSML と LaTeXを使用してポーズや発音を制御したり、数式を音声に変換したりできます。
  • 音声制御:速度、ピッチ、音量、ビットレートを調整できます。PCM、WAV、MP3、Opus などの主要な音声形式と最大 48 kHz のサンプルレートに対応しています。値と適用条件は各 API のパラメーター説明をご参照ください。
対応する機能はモデルと音声によって異なります。各機能のドキュメントで対応範囲を確認してください。HTTP で完全なテキストを一度に送信する場合は、非リアルタイム音声合成を参照してください。

利用開始

DashScope SDK をインストールし、コンソールで API キーを取得して、環境変数 DASHSCOPE_API_KEY を設定します。
  • Qwen-Audio-TTS(推奨)
  • CosyVoice
この例は北京リージョンの qwen-audio-3.1-tts-flash とシステム音声 longanhuan_v3.1 を使用します。テキストを分割送信し、受信した音声を output.mp3 に保存します。
Java
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.io.FileOutputStream;
import java.nio.ByteBuffer;

public class Main {
    public static void main(String[] args) throws Exception {
        Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
        try (FileOutputStream audio = new FileOutputStream("output.mp3")) {
            SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-audio-3.1-tts-flash")
                .voice("longanhuan_v3.1")
                .format(SpeechSynthesisAudioFormat.MP3_24000HZ_MONO_256KBPS)
                .build();
            ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<>() {
                @Override
                public void onEvent(SpeechSynthesisResult result) {
                    ByteBuffer buffer = result.getAudioFrame();
                    if (buffer != null) {
                        byte[] bytes = new byte[buffer.remaining()];
                        buffer.get(bytes);
                        try { audio.write(bytes); }
                        catch (Exception e) { throw new RuntimeException(e); }
                    }
                }
                @Override
                public void onComplete() {}
                public void onError(Exception e) { e.printStackTrace(); }
            };
            SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, callback);
            try {
                for (String text : new String[]{"Hello, welcome to Alibaba Cloud Model Studio.", "Text can be sent in segments, and audio is returned progressively."}) {
                    synthesizer.streamingCall(text);
                }
                synthesizer.streamingComplete(60000);
            } finally {
                synthesizer.getDuplexApi().close(1000, "done");
            }
        }
    }
}

合成品質の改善

言語と発音

制御する内容に応じて、次の方法を選択します。
要件方法
合成音声の出力言語を指定するlanguage_hints で合成全体の言語を指定し、数字、略語、記号をその言語で読み上げるように誘導して、少数言語の合成品質を改善します。
特定の単語の発音を修正、またはテキストを置換するhot_fix で特定の単語にピンインを指定するか、合成前に単語を置換します。固有名詞などの局所的な修正に適しています。
ポーズ、数字の読み方、発音を細かく制御する対象テキストに SSML タグを付け、ポーズ、読み方、発音を制御します。
数式を読み上げるCosyVoice の LaTeX 機能を使用して、対応する数式を中国語の音声に変換します。
パラメーターの対応モデルと設定方法は Qwen-Audio-TTS APIまたは CosyVoice APIをご参照ください。SSML と LaTeX の対応モデル、音声、インターフェイス、使用方法は SSML と LaTeXをご参照ください。
SSML を使用する場合は、SSML テキスト全体を一度に送信し、音声を段階的に受信します。テキストの分割入力には対応していません。

指示による制御

instruction を使用して、合成する言語と、話す速度、感情、話し方を自然言語で指定し、合成音声の表現を制御します。
性別、年齢、声質などの特徴を指定して新しい音声を作成する場合や、音声の説明の書き方と例を確認する場合は、音声デザインをご参照ください。
  • Qwen-Audio-TTS
  • CosyVoice
qwen-audio-3.1-tts-plus、qwen-audio-3.1-tts-flash, qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash のシステム音声、クローン音声、デザイン音声はすべて、合成リクエストの instruction による自然言語の指示に対応しています。合成品質を向上させるために、instruction に合成する言語と希望する表現を指定することを推奨します。指示で指定する言語は、合成対象のテキストの言語と一致させてください。たとえば、オランダ語のテキストを合成する場合は、次のように設定します:
Speak in Dutch, slowly and clearly.

方言

方言合成を使用すると、河南方言や四川方言などの中国語方言で音声を生成できます。方言の選択方法は、モデルと音声の種類によって異なります。
  • Qwen-Audio-TTS
  • CosyVoice
  • システム音声: Qwen-Audio-TTS 音声一覧から対象の方言に対応する音声を選択します。方言を直接サポートする音声は追加設定が不要です。方言指示に対応する音声では 指示制御パラメーター instruction を使用します。
  • クローン音声: 指示制御パラメーター instruction で方言を指定します。
方言指示に対応する音声では、SpeechSynthesizer の初期化時に instruction="请讲上海话。" を渡すと、中国語のテキストを上海語で合成できます。
Qwen3-TTS では、Qwen3-TTS 音声リストから目的の方言に対応する音声を選択します。

感情タグと非言語音タグ

対象モデル:qwen-audio-3.1-tts-plus、qwen-audio-3.1-tts-flash, qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash。
感情タグとパラ言語タグは、音声の感情やスタイルを制御し、指定位置に笑い声やため息などの音を挿入します。追加のパラメーターを使わず、合成対象の text にタグを直接記述します。

使用例

次のテキストは興奮した話し方で始まり、指定した位置で笑い声を挿入してから読み上げを続けます。
[excited]What a beautiful day![laughing]Let us go outside and have some fun!
次のテキストは 2 文目で興奮した話し方に切り替わります。
[serious]Please pay attention to the safety instructions.[excited]Now, let us get started!

対応タグ

  • 制御タグ
  • 非言語音タグ
制御タグは、次の制御タグまでのテキストの感情やスタイルを設定します。長い文が自動分割される場合、効果の範囲は分割されたテキスト単位になります。
タグ説明
[sad]悲しい
[amazed]驚いた
[deep and loud shouting]低く大きな叫び声
[trembling]震える
[angry]怒った
[excited]興奮した
[sarcastic]皮肉な
[curious]好奇心のある
[like dracula]ドラキュラ風
[bored]退屈した
[tired]疲れた
[scornful]軽蔑した
[shouting]叫ぶ
[asmr]柔らかい ASMR 音声
[panicked]慌てた
[mischievously]いたずらっぽい
[empathetic]共感的な
[whispers]ささやく
[reluctantly]気の進まない
[crying]泣く
[serious]真剣な
[very slowly]非常に遅い
[very fast]非常に速い

本番環境に適用

タスクのキャンセル

Qwen-Audio-TTS または CosyVoiceで現在の合成を中断するには、キャンセル指示を送信します。サーバーはタスクを終了し、task-finished を返します。
呼び出し方法バージョン要件使用方法
Python SDK2.0.1 以降client.audio.tts.connect が返すセッションオブジェクトの session.cancel() を呼び出します。
Java SDK2.22.26 以降SpeechSynthesizer.streamingCancel() を呼び出します。
WebSocket プロトコルSDK 不要input に directive=cancel を設定して finish-task を送信します。

WebSocket 接続の再利用

同じ WebSocket 接続で複数回の合成を順番に処理できます。各モデルシリーズでの次の合成の開始方法は以下のとおりです。
モデルシリーズ完了イベント次の合成の開始方法
Qwen-Audio-TTS、CosyVoicetask-finished毎回新しい task_id で run-task を送信し、シリーズの手順に従ってテキストを送信します。キャンセル後も同じ手順で接続を再利用します。
Python SDK 使用時、client.audio.tts.connect で作成されたセッションは、タスクの終了またはキャンセル後にデフォルトで基盤となる接続を閉じます。接続を再利用するには、まず client.ws_connection() で共有 WebSocket 接続を作成し、client.audio.tts.connect に connection= で渡すと、同一接続上で複数回の合成を順番に実行できます。接続は呼び出し側が WsConnection.close で閉じます。
Qwen3-TTSresponse.done同じセッションで input_text_buffer.append を送信します。セッションモードに応じて自動的に合成するか、input_text_buffer.commit を送信します。すべてのテキストを送信した後に session.finish でセッションを終了します。
SDK オブジェクトプールの設定と完全な例は音声合成のベストプラクティスをご参照ください。Qwen3-TTS のセッション手順は WebSocket APIをご参照ください。 Qwen-Audio-TTS、CosyVoice では、タスク終了後 60 秒間新しいタスクがない場合、接続が自動的に切断されます。接続が閉じている場合やタスクの状態が不正な場合は再接続します。

レート制限

モデルのレート制限に従ってリクエスト頻度と並列数を制御します。制限、一般的なエラー、対処方法はレート制限をご参照ください。

高同時実行時のベストプラクティス

オブジェクトプールで合成オブジェクトと接続を再利用し、ワークロードに応じて並列数、ウォームアップ、エラー処理を設定します。詳細は音声合成のベストプラクティスをご参照ください。

対応モデル

  • シンガポール
  • 中国 (北京)
  • Qwen-Audio-TTS: qwen-audio-3.1-tts-plus、qwen-audio-3.1-tts-flash、qwen-audio-3.0-tts-plus、qwen-audio-3.0-tts-flash
  • CosyVoice: cosyvoice-v3-plus、cosyvoice-v3-flash
  • Qwen3-TTS: qwen3-tts-flash-realtime
システム音声と試聴サンプルは、Qwen-Audio-TTS、CosyVoice、Qwen3-TTS の音声一覧をご参照ください。クローン音声またはデザイン音声は、作成時に指定したターゲットモデルで使用してください。

API リファレンス

低遅延と不安定なネットワークでの安定した音声伝送が必要なモバイルアプリケーションでは、AOQ を利用できます。AOQ の接続方法、および AOQ、WebRTC、WebSocket の違いと対応モデルについては、Realtime API の概要をご参照ください。

よくある質問

クローン音声を使用した際に音声が無音になる場合はどのようにトラブルシューティングすればよいですか?

voice が作成済み音声の ID であり、作成時の target_model と合成時の model が一致することを確認してください。状態、入力音声の要件、品質の推奨事項は音声クローニングを参照してください。

合成された音声の実際の長さが WAV ファイルに表示されている長さと異なるのはなぜですか?

ストリーミング WAV のヘッダーには、最終的な音声長が反映されない場合があります。正確な長さが必要な場合は、format を pcm に設定し、全データ受信後に実際の長さを含む WAV ヘッダーを追加してください。

音声ファイルが再生できないのはなぜですか?

シナリオに基づいてトラブルシューティングを行います:
  1. 完全なファイルとして保存された音声 (例: xx.mp3)
    1. 音声フォーマットの一貫性: リクエストパラメーターの音声フォーマットがファイル拡張子と一致していること (例: パラメーターが wav の場合、ファイルは .wav であること)。
    2. プレーヤーの互換性: プレーヤーが音声フォーマットとサンプルレートをサポートしていることを確認します。
  2. ストリーミング音声再生
    1. 音声ストリームを完全なファイルとして保存し、メディアプレーヤーで再生を試みます。ファイルが再生できない場合は、上記のシナリオ 1 に従ってください。
    2. ファイルが正しく再生される場合、問題はストリーミング再生の実装にあります。プレーヤーがストリーミング再生をサポートしていることを確認します (例: ffmpeg、pyaudio、AudioFormat、MediaSource)。

音声再生がコマ落ちするのはなぜですか?

以下の手順でトラブルシューティングを行います:
  1. テキスト送信レートを確認します:次のテキストが到着する前に前の音声セグメントが終了しないよう、送信間隔が適切であることを確認してください。
  2. コールバック関数のパフォーマンスの確認:
    • コールバック関数内にブロッキングロジックが存在しないことを確認します。
    • コールバックは WebSocket スレッドで実行されます。ブロッキング操作はデータ受信に影響を与えます。オーディオデータを別のバッファーに書き込み、別のスレッドで処理します。
  3. ネットワークの安定性の確認: ネットワークの変動により、オーディオ伝送が中断または遅延する可能性があります。

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

分割入力では、テキスト送信の間隔が長いほど合成全体の時間が増えます。初回呼び出しには WebSocket 接続の確立に伴う処理も含まれます。高並列時のウォームアップと時間の測定は、音声合成のベストプラクティスをご参照ください。

API キーを音声合成サービスのみに制限するには (権限隔離)?

新しいワークスペースを作成し、特定のモデルへのアクセスのみを許可します。これにより、API キーのスコープが制限されます。詳細については、「ワークスペースの管理」をご参照ください。