Qwen-Audio-3.0-Realtime 用の HarmonyOS SDK を使用して、音声入力と音声またはテキスト出力を備えたリアルタイム音声対話を構築します。
ユーザーガイド:モデルの紹介と選択のアドバイスについては、リアルタイム音声会話を参照してください。
クイックスタート
-
SDKをダウンロードしてサンプルコードを実行します:
- 最新のSDKパッケージをダウンロードします。
.tar.gzSDK パッケージを抽出します。entry/libsから HAR SDK を取得し、プロジェクトの依存関係に追加します。C++ 統合の場合、パッケージ内のnative/libsとnative/includeを使用して動的ライブラリとヘッダーファイルを取得します。- DevEco Studio でプロジェクトを開きます。サンプルコードは
DashQwenAudioChatPage.etsにあります。API キーを置き換えて機能を試してください。
呼び出し手順
- SDKを初期化します。
- ユースケースに合わせてパラメータを設定します。initializeの
parameters引数を使用して接続および制御パラメータを設定し、setParamsを使用して音声会話パラメータを設定します。 - startDialog を呼び出して会話を開始します。
- onNuiAudioStateChangedで、音声状態に基づいて録音デバイスを開始します。
- onNuiNeedAudioDataで録音データを継続的に供給するか、updateAudioを呼び出して録音データをアクティブにプッシュします。
- onNuiAssistEventCallbackで、モデルから返される音声を受信し続けます。
- イベントをリッスンし、onNuiEventCallback でイベント情報を取得します。
- stopDialogを呼び出して会話を停止し、
EVENT_TRANSCRIBER_COMPLETEをリッスンして終了したことを確認します。 - 会話機能が不要になったら、releaseを呼び出してSDKリソースを解放します。
音声デバイス管理
AudioRecord と AudioTrack を使用する Android とは異なり、HarmonyOS は @kit.AudioKit を通じて音声のキャプチャと再生を提供し、録音には AudioCapturer を、再生には AudioRenderer を使用します。サンプルプロジェクトでは、再利用のために AudioRecorder.ets と AudioPlayer.ets ユーティリティクラスが提供されています。
録音 (AudioCapturer)
- 作成:
audio.createAudioCapturer(capturerOptions)を非同期に呼び出します。サンプルでは 16 kHz、16 ビット、モノラル音声 (SAMPLE_RATE_16000、CHANNEL_1、SAMPLE_FORMAT_S16LE、およびENCODING_TYPE_RAW) を使用します。 -
音声ソース (
audio.SourceType):SOURCE_TYPE_MIC: 生のマイク音声。SDK 内部の AEC が有効な場合にこのソースを使用し、updateAudioを呼び出してデータを SDK に送信します。SOURCE_TYPE_VOICE_COMMUNICATION: システムがすでにエコーキャンセルを実行した通話音声。SDK 内部の AEC が無効な場合にこのソースを使用し、onNuiNeedAudioDataを通じて音声を供給します。
- データイベント:
capturer.on('readData', (buffer: ArrayBuffer) => void)を呼び出して、録音された音声を継続的に取得します。 - 状態イベント:
capturer.on('stateChange', (state: audio.AudioState) => void)を呼び出します。STATE_RUNNINGは録音が開始されたことを示し、STATE_STOPPEDは停止したことを示します。 - 制御:
start()を呼び出して開始し、stop()を呼び出して停止し、release()を呼び出してレコーダーをリリースします。
import { audio } from '@kit.AudioKit';
const audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};
const audioCapturerInfo: audio.AudioCapturerInfo = {
source: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
};
const options: audio.AudioCapturerOptions = { streamInfo: audioStreamInfo, capturerInfo: audioCapturerInfo };
audio.createAudioCapturer(options).then((capturer) => {
capturer.on('readData', (buffer: ArrayBuffer) => {
// Send the recorded audio to the SDK.
nuiInstance.updateAudio(buffer, false);
});
capturer.start();
});
注: HarmonyOS は
AudioCapturerを非同期に作成します。作成が完了した後にのみstart()を呼び出してください。STATE_OPENでレコーダーを作成してすぐに開始しないでください。最初に作成し、次にSTATE_OPENコールバックからstart()を呼び出します。サンプルではdoInit中にレコーダーを作成し、onNuiAudioStateChanged中に開始します。
再生 (AudioRenderer)
- 作成:
audio.createAudioRenderer(rendererOptions)を非同期に呼び出します。 - サンプルレート: DashScope Realtime によって返される合成応答音声は 24 kHz です。このレートを
AudioPlayerコンストラクタに渡します。 - データイベント:
renderer.on('writeData', (data: ArrayBuffer): audio.AudioDataCallbackResult => ...)を呼び出して再生用の音声を供給します。バッファを満たした後はAudioDataCallbackResult.VALIDを返し、データが利用できない場合はINVALIDを返します。 - 状態イベント:
renderer.on('stateChange', (state: audio.AudioState) => void)を呼び出して、再生の開始および終了イベントをリッスンします。 - 制御:
start()を呼び出して開始し、stop()を呼び出して停止し、pause()を呼び出して再生を一時停止します。一時停止するとバッファリングされたデータが保持されます。
import { audio } from '@kit.AudioKit';
const audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_24000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};
const audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_VOICE_ASSISTANT,
rendererFlags: 0
};
const options: audio.AudioRendererOptions = { streamInfo: audioStreamInfo, rendererInfo: audioRendererInfo };
audio.createAudioRenderer(options, (err, renderer) => {
renderer.on('writeData', (data: ArrayBuffer): audio.AudioDataCallbackResult => {
// Fill data with model response audio from the queue and return VALID or INVALID.
return audio.AudioDataCallbackResult.VALID;
});
renderer.start();
});
AEC 参照信号: SDK 内部の AEC が有効な場合、
nuiInstance.pushReferenceData(data, false)を呼び出してプレーヤーの出力音声を参照信号として SDK に送信します。これは Android のupdateRefAudioに相当します。
権限の宣言
音声を録音する前に、module.json5 でマイクの権限を宣言します。
{
"requestPermissions": [
{ "name": "ohos.permission.MICROPHONE" }
]
}
リクエストパラメータ
接続および制御パラメータ
initialize の parameters 引数にJSON文字列を渡します。
例:以下のJSON文字列には、すべてのパラメータがリストされているわけではありません。ユースケースに応じて必要に応じてパラメータを追加してください。
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"apikey": "st-****",
"device_id": "my_device_id",
"service_mode": "1"
}
パラメータ
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
|
| はい | サービスエンドポイント:
{WorkspaceId} 実際の ワークスペースID. |
|
| はい | API キー。 |
|
| はい | ランタイムモード。リアルタイム音声会話の場合、このパラメータを |
|
| はい | エンドユーザーを識別する一意の文字列です。アプリ内ユーザーIDまたはクライアント生成のデバイス識別子を使用できます。このIDは主にログのトレースとトラブルシューティングに使用されます。 |
|
| いいえ | 音声データをアクティブにプッシュするかどうかです。デフォルト: |
|
| いいえ | デバイス上リソースファイルの保存パスです。このパラメータは、 |
|
| いいえ | ログファイルの保存パスです。このパラメータは、 |
|
| いいえ |
|
|
| いいえ | バイト単位の最大ログファイルサイズです。このパラメータは、 |
|
| いいえ |
|
|
| いいえ | 高度なデバイス上AEC設定です。このオブジェクトは、 |
|
| いいえ | デバイス上AECを有効にするかどうかです。 |
|
| いいえ | デバイス上AECモジュールによって処理された音声を保存するかどうかです。 |
|
| いいえ |
|
|
| いいえ | 高度なデバイス上VAD設定です。このオブジェクトは、 |
|
| いいえ | デバイス上VADを有効にするかどうかです。 |
|
| いいえ | デバイス上VADモジュールによって処理された音声を保存するかどうかです。 |
音声会話パラメータ
setParams の params 引数にJSON文字列を渡します。
例:以下のJSON文字列には、すべてのパラメータがリストされているわけではありません。ユースケースに応じて必要に応じてパラメータを追加してください。
{
"service_type": 4,
"nls_config": {
"model": "qwen-audio-3.1-realtime-plus",
"sr_format": "pcm"
}
}
パラメータ
| トップレベルパラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
|
| はい | 音声サービスタイプ。リアルタイム音声会話の場合、このパラメータを |
|
| はい | モデルの選択や会話の動作を含む、コアとなる音声会話の設定。 |
|
| はい | モデル名です。 |
|
| はい | 入力オーディオ形式。 |
|
| いいえ | 出力モダリティの配列を含む文字列です。有効な値:
|
|
| いいえ | TTS音声です。デフォルトは、3.1 Plusの場合は 3.1 Plusは、 |
|
| いいえ | 強化された感情表現を有効にするかどうかです。有効にすると、応答音声の感情の変化がより顕著になります。デフォルト: |
|
| いいえ | セッション全体におけるモデルの役割、応答スタイル、および動作の好みを定義するシステム指示です。 |
|
| いいえ | リクエストで許可される過去の質問と回答のターンの最大数です。有効な値:1~50。デフォルト: |
|
| いいえ | Function Callingツール定義の配列を含む文字列です。このパラメータを設定すると、モデルはユーザー入力に基づいてツールを呼び出すかどうかを決定します。各定義は |
|
| いいえ | ターン検出用のJSONオブジェクトを含む文字列です。省略した場合、セッションはプッシュトゥートークモードを使用し、音声がコミットされ、推論が手動でトリガーされます。設定されている場合、デュプレックス会話モードが有効になります。 |
|
| いいえ | VADタイプです。 |
|
| いいえ | VAD感度です。このパラメータは |
|
| いいえ | 発話後のモデル応答がトリガーされるまでの最小無音期間(ミリ秒単位)です。このパラメータは |
|
| いいえ | ターゲットスピーカー用の公開アクセス可能な事前録音済み音声URLの配列を含む文字列です。このパラメータは |
主要API
NativeNui
initialize
音声対話 SDK インスタンスを初期化します。SDK はシングルトンパターンを使用します。release を呼び出す前に再度初期化しないでください。
このメソッドはブロックされる可能性があります。非 UI スレッドで呼び出してください。
メソッドシグネチャpublic initialize(
callback: INativeNuiCallback,
parameters: string,
level: number,
save_log: boolean = false
): number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| イベントおよびデータコールバックインターフェースの実装。 |
|
| 認証、接続、およびデバッグパラメータを含む JSON 文字列。接続および制御パラメータを参照してください。 |
|
| SDK独自のログの出力レベルを制御します。 |
|
| ログをローカルに保存するかどうか。 |
setParams
音声対話パラメータ を JSON 形式で設定します。startDialog の前にこのメソッドを呼び出してください。
メソッドシグネチャpublic setParams(params: string): number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
|
startDialog
会話を開始します。
メソッドシグネチャpublic startDialog(vad_mode: Constants.VadMode, dialog_params: string): number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| VADモード。 |
|
| 接続および制御パラメータの |
stopDialog
会話を終了します。このメソッドを呼び出すと、サーバーは最終的な会話結果を返し、タスクを終了します。
メソッドシグネチャpublic stopDialog(): number
cancelDialog
対話をすぐに終了します。このメソッドを呼び出した後、サーバーが最終的な対話結果を返すのを待たずにタスクが終了します。
メソッドシグネチャpublic cancelDialog(): number
dialogAction
インタラクション中に会話アクションコマンドを送信し、会話コンテキストなどのランタイム動作を更新します。
メソッドシグネチャpublic dialogAction(params: string): number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| 会話コンテキストなどのランタイムの動作を更新するために使用されるJSON文字列。 |
|
|
|
|
| ランタイムコマンドです。有効な値:
|
|
| 関数呼び出しリクエストの更新。 |
|
| イベントタイプです。このパラメータは、 |
|
|
|
|
|
|
context.item パラメータ:
| パラメータ | 型 | 説明 |
|---|---|---|
|
| オプションの一意な会話アイテムIDです。省略した場合、サーバーが生成します。指定されたIDが既に存在する場合はエラーが返されます。 |
|
| 必須のアイテムタイプです。有効な値:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context.response パラメータ:
| パラメータ | 型 | 説明 |
|---|---|---|
|
| 出力モダリティです。 |
|
| この推論のTTS音声をオーバーライドします。 |
例:
{
"type": "action",
"command": "function_call",
"context": {
"item": {
"call_id": "call_xxxx",
"output": "{\"city\":\"Hangzhou\",\"condition\":\"sunny\",\"temperature\":18}",
"type": "function_call_output"
},
"type": "conversation.item.create"
}
}
{
"type": "action",
"command": "function_call",
"context": {
"response": {
"modalities": ["text", "audio"]
},
"type": "response.create"
}
}
updateAudio
audio_update_manually が "true" に設定されている場合、録音データは onNuiNeedAudioData を通じて供給されなくなります。代わりにこのメソッドを使用してデータをアクティブにプッシュしてください。
public updateAudio(data: ArrayBuffer, first_pack: boolean): number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| プッシュする音声データ (PCM)。 |
|
| これが最初の音声パケットかどうか。SDK は |
pushReferenceData (Android の updateRefAudio に相当)
audio_update_manually が "true" に設定されており、デバイス上の AEC が有効な場合、このメソッドを使用してプレーヤーで再生された音声を参照信号としてプッシュします。
public pushReferenceData(data: ArrayBuffer, first_pack: boolean): number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| プッシュする音声データ (PCM)。 |
|
| これが最初の音声パケットかどうか。SDK は |
release
すべての内部 SDK リソースをリリースします。この呼び出しの後、SDK インスタンスは使用できなくなります。SDK を再度使用するには、initialize を呼び出して再初期化します。
メソッドシグネチャpublic release(): number
GetVersion
現在の SDK バージョンに関する情報を返します。
メソッドシグネチャpublic GetVersion(): string
戻り値
現在の SDK バージョンに関する情報。
INativeNuiCallback: リスナーコールバック
onNuiEventCallback: イベント情報のリッスン
メソッドシグネチャonNuiEventCallback: (
event: Constants.NuiEvent,
resultCode: number,
arg2: number,
kwsResult: KwsResult,
asrResult: AsrResult
) => void;
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| コールバックイベント。 |
|
|
|
|
| 予約済みパラメータ。 |
|
| 音声認識結果。 |
|
| 音声ウェイクアップ結果。このパラメータを使用する必要はありません。 |
onNuiAudioStateChanged: オーディオ状態のリッスン
SDK はこのコールバックを使用して、録音の開始または停止のタイミングをアプリケーションに通知します。
メソッドシグネチャonNuiAudioStateChanged: (state: Constants.AudioState) => void
AudioState の値
| 状態 | 説明 |
|---|---|
| インタラクションが開始されました。録音デバイスを開いて録音を開始できます。 |
| インタラクションが停止しました。録音を停止できます。 |
| SDK インスタンスがリリースされました。録音デバイスを完全に閉じることができます。 |
onNuiAudioRMSChanged: 録音音量をリッスンする
録音音量をリッスンします。これは UI に表示できます。
メソッドシグネチャonNuiAudioRMSChanged: (val: number) => number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| 録音音量。 |
onNuiNeedAudioData: オーディオデータの供給
対話の開始後、このコールバックは継続的にトリガーされます。このコールバックで処理する音声データを供給します。audio_update_manually が "true" に設定されている場合、このコールバックを使用する必要はありません。
onNuiNeedAudioData: (buffer: ArrayBuffer) => number
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
| 供給する音声データ。SDK は要求されたバイト数として |
実際に供給されたバイト数。
onNuiAssistEventCallback: 補助データと情報を受信する
SDK 内部の補助イベントおよび関連データを受信します。
メソッドシグネチャonNuiAssistEventCallback?: (
event: Constants.NuiEvent,
info: string,
infoLen: number,
data: ArrayBuffer
) => void;
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
|
|
|
|
| 追加情報。通常は JSON 文字列です。 |
|
| 追加情報の長さ。 |
|
| モデルから返される TTS 音声などの追加バイナリデータ。 |
注: このコールバックは HarmonyOS ではオプション (
?) です。情報が必要ない場合は省略してください。
onNuiLogTrackCallback: トレースログのリッスン
トラブルシューティングとデバッグのために、SDK 内部の詳細なログを受信します。
onNuiLogTrackCallback: (level: Constants.LogLevel, log: string) => void
NuiEvent: イベントタイプ
HarmonyOS SDK では、イベントタイプは Constants.NuiEvent 列挙型によって定義されます。次の表に、リアルタイム音声対話に関連するイベントを示します。
| イベント | 説明 |
|---|---|
| タスクが正常に開始されました。 |
| タスク開始直後にトリガーされます。これは、発話の開始が検出されたことを意味するものではありません。 |
| 発話の終わりが検出されました。 |
| 中間音声認識結果。 |
| 完全な音声認識結果。 |
| 音声会話中にエラーが発生しました。 |
| 2秒連続でオーディオデータが受信されなかった場合にトリガーされます。 |
| 文の開始が検出されました。 |
| 文の終わりが検出され、完全な認識結果が返されました。 |
| 音声会話が終了しました。 |
| 音声出力の増分テキスト転記イベントです。転記セグメントはストリーミングモードで返されます。 |
| オーディオ出力のトランスクリプトが完了しました。 |
| Function Callingの結果などのその他のイベント情報。 |
| モデルがTTSオーディオの返送を開始しました。 |
| モデルから返されたTTSオーディオ。 |
| モデルがTTSオーディオの返送を完了しました。 |
| 中間翻訳結果。 |
| 翻訳結果の出力が完了しました。 |
| AECによって処理されたオーディオデータ。 |