Skip to main content

Fun-ASR-Realtime AOQ アクセス

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

AOQ で Fun-ASR-Realtime にアクセスする場合、クライアントは Audio トラックで音声をアップロードし、Data トラックでタスクイベントの送信と認識結果の受信を行います。

前提条件

  • AOQ 対応モデルを選択します。詳細な対応範囲は、モデルとプロトコルの対応範囲をご覧ください。
  • リージョンとワークスペースを一致させ、業務 AppServer で API キーを設定して使用します。
  • SDK からプラットフォーム用の AOQ SDK をダウンロードして導入します。以下では Android Java と Opus 転送を例に説明するため、Opus プラグインも導入してください。マイクで音声をキャプチャする場合は、クライアント側で録音権限を要求します。

1. 接続認証情報の取得

トークンを事前取得する場合や認証フロー全体を確認する場合は、接続認証の詳細を参照してください。
AppServer に環境変数 DASHSCOPE_API_KEY を設定し、{endpoint} を選択したリージョンとワークスペースのエンドポイントに置き換えます。Fun-ASR-Realtime は Inference 接続パスを使用します。次の例は fun-asr-realtime を使用します。
curl -X POST \
  "https://{endpoint}/api/v1/webrtc/inference?model=fun-asr-realtime" \
  -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 に設定したら、Audio トラックと Data トラックを配信し、Data トラックを購読します。次の例は 16 kHz モノラル Opus エンコードと内蔵キャプチャを設定し、接続確立中は Audio トラックの送信を無効にします。モデルの入力形式はタスクイベントで指定し、SDK のエンコード設定はメディアトラックの転送に使用します。
AoqClientEngine.AoqAudioCodecConfig codec = new AoqClientEngine.AoqAudioCodecConfig();
codec.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
codec.codecType = AoqClientEngine.AoqEncoderType.AoqEncoderTypeAudioOpus;
codec.sampleRate = 16000;
codec.channel = 1;
codec.bitrate = 24000;
engine.setAudioEncoderConfig(codec);

AoqClientEngine.AoqTrackParam audio = new AoqClientEngine.AoqTrackParam();
audio.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
connectConfig.publishTracks.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.AoqAudioCaptureConfig capture = new AoqClientEngine.AoqAudioCaptureConfig();
capture.channel = 1;
capture.isExternal = false;
engine.startAudioCapture(capture);
engine.enableSendMediaStream(AoqClientEngine.AoqTrackType.AoqTrackTypeAudio, false);
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": "asr",
    "function": "recognition",
    "model": "fun-asr-realtime",
    "parameters": {
      "format": "pcm",
      "sample_rate": 16000
    },
    "input": {}
  }
}
onDataMsg で header.event を読み取ります。上り音声は task-started を受信してから送信できます。
engine.enableSendMediaStream(AoqClientEngine.AoqTrackType.AoqTrackTypeAudio, true);
result-generated の payload.output.sentence から認識テキストを読み取り、heartbeat=true のハートビートはスキップします。sentence_end=false は中間テキスト、sentence_end=true は文の最終テキストを示します。sentence_id に従って同じ文のテキストを更新します。task-failed を受信したら、このラウンドの上り送信を停止し、header.error_code と header.error_message を読み取ります。 タスクパラメーターとイベントフィールドは、クライアントイベントとサーバーイベントをご覧ください。

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

録音の終了後、新しい音声のキャプチャを停止し、送信待ち音声の送信を待ちます。enableSendMediaStream を呼び出して Audio トラックの上り送信を閉じ、Data トラックで finish-task を送信します。接続を維持して残りの認識結果を受信し、task-finished を待ちます。
{
  "header": {
    "action": "finish-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "input": {}
  }
}
接続が不要になったら、stopAudioCapture、disconnect、AoqClientEngine.destroy の順に呼び出してリソースを解放します。

関連ドキュメント