AOQ を使用して fun-asr-realtime に接続し、マイクの音声をストリーミングして、リアルタイムで文字起こし結果を受信します。クライアントコードは Android Java を使用しており、AOQ がサポートする他のプラットフォームでも同じインターフェースを提供します。
ソリューションの概要
fun-asr-realtime は、音声ストリームをリアルタイムで句読点付きテキストに文字起こしします。AOQ SDK は、メディアとイベントを別々のトラックで転送します。クライアントは Audio トラックで音声を送信し、Data トラックを使用して制御イベントを送信し、認識イベントを受信します。このモデルは Realtime イベントプロトコルではなく、Inference イベントプロトコルを使用します。
このソリューションは、ライブキャプション、会議の文字起こし、音声入力、インテリジェントアシスタントに適しています。Audio トラックにより、イベントメッセージで音声をエンコードする必要がなくなり、Data トラックは run-task、result-generated、finish-task などのタスクのセマンティクスを保持します。
- クライアントは、アプリケーションサーバーから一時的な AOQ 接続認証情報をリクエストします。
- アプリケーションサーバーは、API キーを使用して Alibaba Cloud Model Studio からトークンをリクエストし、接続フィールドをクライアントに返します。
- クライアントは AOQ 接続を確立し、run-task を送信します。task-started を受信した後、クライアントはマイクの音声の送信を開始します。
- サーバーは継続的に result-generated イベントを返します。クライアントが finish-task を送信した後、最終結果と task-finished を待機します。
前提条件
- Alibaba Cloud Model Studio を有効にし、API キーの取得と設定の説明に従って API キーを作成してください。API キーはアプリケーションサーバーにのみ保存してください。クライアントコードに含めたり、コードリポジトリにコミットしたりしないでください。
- アプリケーションがデプロイされているリージョンの AOQ エンドポイントを選択してください。エンドポイントの選択については、「リージョン、デプロイ範囲、エンドポイントの選択」をご参照ください。
- 「SDK のダウンロード」の説明に従って、最新の AOQ Client SDK をダウンロードしてください。このチュートリアルでは PCM 音声を転送するため、オプションの Opus プラグインは不要です。
- Fun-ASR-Realtime の AOQ 認証手順に従って AppServer を構築します。新しい接続を確立するたびに、クライアントは AppServer から新しい接続認証情報を取得する必要があります。
SDK のインポート
開発プラットフォームに応じた SDK 統合手順を選択してください。クライアント実装では Android Java を使用していますが、他のプラットフォームでも同じ API 設計とイベントフローに従います。
- Android
- iOS
- HarmonyOS
- Linux (Python)
- AoqClientSdk-release.aar を app/libs に配置し、app/build.gradle で依存関係と ABI を設定してください。
- AndroidManifest.xml でネットワークと録音の権限を宣言してください。
- 録音を開始する前に、RECORD_AUDIO ランタイム権限をリクエストしてください。音声認識には CAMERA 権限は不要です。
デモの試用
Alibaba Cloud Model Studio の Android デモを使用すると、AOQ 接続を迅速に検証できます。APK をダウンロードし、API キーと workspaceId を設定して、選択したモデルを試してください。
次の QR コードをスキャンして、デモをダウンロードしてください。

実装フロー
- アプリケーションサーバーは Inference トークン URL を使用して、fun-asr-realtime の AOQ 接続パラメータを取得します。
- クライアントはトークンレスポンスを AoqConnectConfig にマッピングし、Audio トラックと Data トラックをパブリッシュし、Data トラックをサブスクライブします。
- クライアントは、ビジネス要件とモデル要件に基づいて音声エンコードパラメータを設定し、音声送信を無効にしてマイクキャプチャを開始し、AOQ 接続を確立します。
- 接続が確立された後、クライアントは run-task を送信し、task-started を受信した後に Audio トラックの送信を有効にします。
- クライアントは onDataMsg で result-generated を処理します。認識を停止するには、まず Audio トラックの送信を無効にしてから、finish-task を送信します。
- task-finished を受信した後、クライアントは新しい task_id を使用して同じ接続で別のタスクを開始するか、接続を切断してエンジンを破棄できます。

アプリケーションサーバーでのトークン取得
アプリケーションサーバーで DASHSCOPE_API_KEY を設定し、選択したリージョンのエンドポイントにリクエストを送信してください。clientIp は、クライアントデバイスの実際のパブリック IP アドレスです。このフィールドはオプションですが、サービスが適切なリレーエンドポイントを選択できるように提供することを推奨します。
レスポンスフィールド | SDK フィールド |
aoqTokenForClient | AoqConnectConfig.token |
sid | AoqConnectConfig.sid |
clientRelayCertFingerprint | AoqConnectConfig.certFingerprint |
clientRelayEndpoints | AoqConnectConfig.relayEndpoints |
extraInfo.workspaceIdHash | AoqConnectConfig.workspaceIdHash |
Android クライアントの実装
次の手順では、実際の接続とタスクのシーケンスに従って、Android Java クライアントコードを分割します。各スニペットは、このトピックの後半にある完全な例から抜粋したものです。
1. エンジンの作成とコールバックの登録
AOQ クライアントエンジンを作成し、接続状態の変化と Data トラックイベントのコールバックを登録してください。アプリケーションに応じてコールバックロジックを実装し、接続が確立された後にのみ認識を開始してください。
2. 音声エンコードの設定
モデルに送信する音声エンコードを設定してください。アプリケーションとモデルの要件に基づいて、フォーマット、サンプルレート、チャンネル数を設定してください。次のコードでは、16 kHz モノラル PCM を例として使用しています。サポートされる値については、「クライアントイベント」の run-task パラメータをご参照ください。
3. 接続とトランスポートトラックの設定
アプリケーションサーバーから返された認証情報を使用して AOQ 接続を設定し、アプリケーションに基づいてパブリッシュおよびサブスクライブするトラックを選択してください。リアルタイム音声認識の場合、この例では Audio トラックと Data トラックをパブリッシュし、Data トラックをサブスクライブします。
4. 音声キャプチャの開始と接続の確立
音声キャプチャを設定し、AOQ 接続を確立してください。アプリケーションに基づいて、組み込みキャプチャまたは外部キャプチャ、VoIP モードの有効化、チャンネル数を選択してください。task-started を受信するまで、Audio トラックの送信を無効のままにしてください。
5. 認識タスクの開始
接続が確立された後、タスク ID を生成し、run-task を送信して認識を開始してください。使用するモデルと音声入力に応じて、model、format、sample_rate、その他のタスクパラメータを設定してください。詳細については、「クライアントイベント」をご参照ください。
6. サーバーイベントの処理
タスクの状態、認識結果、エラーを処理し、結果をアプリケーションに渡してください。UI と状態管理の要件に基づいてコールバックを実装してください。task-started を受信した後にのみ音声を送信し、ハートビートイベントは表示される文字起こしから除外してください。完全なレスポンススキーマについては、「サーバーイベント」をご参照ください。
7. 認識タスクの終了
ユーザーが現在の録音を終了したら、音声の送信を停止し、finish-task を送信してください。最終的な文字起こしと task-finished が到着するまで、接続を開いたままにしてください。その後、アプリケーションのフローに基づいて、別のタスクを開始するか、接続を解放できます。イベント形式については、「クライアントイベント」をご参照ください。
8. 接続の切断とエンジンの破棄
ページが破棄されたとき、または認識が不要になったときに、音声キャプチャ、AOQ 接続、エンジンリソースを解放してください。アプリケーションのライフサイクルに基づいて解放ポイントを選択し、finish-task を送信した直後にリソースを解放しないでください。
完全な例
この Android Java クラスは、アプリケーションサーバーからの JSON レスポンスを AoqConnectConfig にマッピングし、前述の接続、キャプチャ、タスク、リソース解放ロジックを組み合わせたものです。
使用例
アプリケーションサーバーからのトークンレスポンスを parseConnectConfig に渡し、クライアントを作成してください。接続が確立された後、最初の認識タスクが自動的に開始されます。停止ボタンは現在のタスクのみを終了します。ページが破棄されたときに、接続とローカルリソースを解放してください。
実行と検証
- アプリケーションサーバーを起動してください。トークンリクエストが HTTP 200 を返し、sid、aoqTokenForClient、clientRelayEndpoints、clientRelayCertFingerprint、extraInfo.workspaceIdHash が含まれていることを確認してください。
- Android デバイスにアプリをインストールして実行し、マイクへのアクセスを許可して、話してください。
- コールバックを観察してください。通常のイベントシーケンスは次のとおりです。
一般的なシナリオ
1つの接続で複数の認識タスクを実行
task-finished を受信した後、beginRecognition を呼び出して、同じ AOQ 接続で別のタスクを開始してください。各タスクには新しい task_id が必要です。接続がアクティブな間は、別のトークンをリクエストしたり、再接続したりする必要はありません。接続が閉じられた場合は、新しい接続認証情報を取得してください。
Androidでのバックグラウンド認識
Android 10 以降では、foregroundServiceType=microphone のフォアグラウンドサービスを使用して、アプリがバックグラウンドにある間もマイクキャプチャを続行してください。アプリがユーザーに表示されている間にサービスを開始してください。
トラブルシューティング
問題 | ソリューション |
接続に失敗する | トークンが有効であること、エンドポイントがアプリケーションリージョンと一致していること、アプリケーションサーバーがクライアントデバイスの実際のパブリック IP アドレスを渡していることを確認してください。接続が閉じられた後にトークンを再利用しないでください。 |
タスクは開始するが、文字起こしが返されない | task-started を受信した後にのみ、Audio トラックの送信を有効にしてください。入力形式、サンプルレート、その他のパラメータを、モデルの「クライアントイベント」と照合してください。 |
最終的な文字起こしが返されない | finish-task を送信する前に、Audio トラックの送信を無効にしてください。すぐに切断するのではなく、最終的な result-generated イベントと task-finished を待ってください。 |
Android SDK の読み込みに失敗する | AAR が依存関係として含まれていること、およびアプリが SDK がサポートする ABI (armeabi-v7a または arm64-v8a) をパッケージ化していることを確認してください。 |
同じ接続での後続のタスクが拒否される | 前のタスクの task-finished を受信したことを確認し、次の run-task イベント用に新しい task_id を生成してください。 |