Skip to main content

Qwen-Audio-TTS AOQ アクセス

このセクションでは、AOQ で Qwen-Audio-TTS にアクセスするための認証、メディア設定、接続確立、タスクイベントの処理を説明します。

AOQ で Qwen-Audio-TTS にアクセスする場合、クライアントは Data トラックでテキストとタスクイベントを送信し、Audio トラックで合成音声を受信します。

前提条件

  • AOQ 対応モデルを選択します。qwen-audio-3.1-tts-plus、qwen-audio-3.1-tts-flash、qwen-audio-3.0-tts-plus、qwen-audio-3.0-tts-flash のプロトコル対応範囲は、モデルとプロトコルの対応範囲をご覧ください。
  • リージョンとワークスペースを一致させ、業務 AppServer で API キーを設定して使用します。
  • SDK のダウンロードからプラットフォーム用の AOQ SDK を導入します。以下の例は Android Java と Opus 転送を使用するため、Opus プラグインも導入してください。テキスト音声合成では、マイクやカメラの権限は不要です。

1. 接続認証情報の取得

トークンを事前取得する場合や認証フロー全体を確認する場合は、接続認証の詳細を参照してください。
AppServer に環境変数 DASHSCOPE_API_KEY を設定し、{endpoint} を選択したリージョンとワークスペースのアクセスドメインに置き換えます。Qwen-Audio-TTS は Inference 接続パスを使用します。次の例は qwen-audio-3.0-tts-flash を使用します。
curl -X POST \
  "https://{endpoint}/api/v1/webrtc/inference?model=qwen-audio-3.0-tts-flash" \
  -H "Authorization: Bearer ${DASHSCOPE_API_KEY}" \
  -H "Content-Type: application/json" \
  -H "x-dashscope-rtc-transport: moq" \
  -d '{}'
Token Plan を使用する場合、アクセスドメインの WorkspaceId は token-plan 固定です。リクエストボディの clientIp は任意です。クライアントの実際のパブリック IP アドレスを入力すると、ゲートウェイが Relay アクセスポイントを選択できます。未入力の場合は、リクエストの送信元 IP を使用します。 API キーは AppServer にのみ保存します。AppServer は次の表の接続パラメーターをクライアントに返します。レスポンスの sidExpiresInSecs は、秒単位のセッション有効期間を示します。
ゲートウェイのレスポンスフィールドAoqConnectConfig のフィールド
aoqTokenForClienttoken
sidsid
clientRelayCertFingerprintcertFingerprint
clientRelayEndpointsrelayEndpoints。endpoint、port、route_index を項目ごとに変換
extraInfo.workspaceIdHashworkspaceIdHash

2. SDK の初期化と接続

AoqCreateConfig で SDK の作業ディレクトリを設定し、AoqClientEngine.createEngine を呼び出してエンジンを作成し、コールバックを登録します。onConnectionStatusChange で接続状態を、onDataMsg でモデルイベントを、onError で SDK エラーを処理します。エンジン初期化と接続フィールドの完全な API リファレンスは、Android SDKをご覧ください。 AppServer が返した認証情報を connectConfig に設定したら、Data トラックを配信し、Audio トラックと Data トラックを購読します。この例では 24 kHz モノラル Opus デコードを設定してプレーヤーを起動します。モデルの出力形式はタスクイベントで指定し、SDK のデコード設定はメディアトラックの転送に使用します。
AoqClientEngine.AoqAudioCodecConfig codec = new AoqClientEngine.AoqAudioCodecConfig();
codec.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
codec.codecType = AoqClientEngine.AoqEncoderType.AoqEncoderTypeAudioOpus;
codec.sampleRate = 24000;
codec.channel = 1;
engine.setAudioDecoderConfig(codec);

AoqClientEngine.AoqTrackParam audio = new AoqClientEngine.AoqTrackParam();
audio.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
connectConfig.subscribeTracks.add(audio);
AoqClientEngine.AoqTrackParam publishData = new AoqClientEngine.AoqTrackParam();
publishData.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeData;
connectConfig.publishTracks.add(publishData);
AoqClientEngine.AoqTrackParam subscribeData = new AoqClientEngine.AoqTrackParam();
subscribeData.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeData;
connectConfig.subscribeTracks.add(subscribeData);

AoqClientEngine.AoqAudioPlaybackConfig playback = new AoqClientEngine.AoqAudioPlaybackConfig();
playback.channel = 1;
playback.isDefaultSpeaker = true;
engine.startAudioPlayer(playback);
engine.connect(connectConfig);
onConnectionStatusChange が AoqConnectionStatusConnected を返すのを待ってから、タスクを開始します。接続異常時はローカルのタスク状態を消去します。再接続には、新しい接続認証情報の取得が必要です。

3. 合成タスクの開始とイベントの処理

次の JSON を UTF-8 にシリアライズし、AoqDataMsg.data に書き込んで、sendDataMsg で Data トラックから送信します。タスクごとに新しい task_id を生成し、このラウンドのすべてのイベントで同じ値を使用します。選択したモデルに対応する音声を使用してください。
{
  "header": {
    "action": "run-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "task_group": "audio",
    "task": "tts",
    "function": "SpeechSynthesizer",
    "model": "qwen-audio-3.0-tts-flash",
    "parameters": {
      "text_type": "PlainText",
      "voice": "longanlingxi",
      "format": "pcm",
      "sample_rate": 24000
    },
    "input": {}
  }
}
onDataMsg で header.event を読み取ります。task-started を受信したら、1 つ以上の continue-task を送信してテキストを提出します。
{
  "header": {
    "action": "continue-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "input": {
      "text": "欢迎使用阿里云百炼。"
    }
  }
}
SDK は Audio トラックから音声を受信して再生します。result-generated は Data トラック上のタスクイベントであり、音声は Audio トラックで転送します。task-failed を受信したら、header.error_code と header.error_message を読み取り、現在のタスクを終了します。 タスクパラメーターとイベントフィールドの詳細は、クライアントイベントとサーバーイベントをご覧ください。

4. タスクの終了とリソースの解放

すべてのテキストを送信したら、finish-task を送信します。接続を維持し、サーバーが残りのテキストを合成して task-finished を返すのを待ちます。
{
  "header": {
    "action": "finish-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "input": {}
  }
}
接続が不要になったら、受信済みの音声の再生完了を待ち、stopAudioPlayer、disconnect、AoqClientEngine.destroy の順に呼び出してリソースを解放します。

関連ドキュメント