Qwen-Audio-ASR-Message の HarmonyOS SDK のパラメーター、インターフェイス、コールバックと使用方法を説明します。
クイックスタート
-
API キーを取得します。長期有効な API キーをクライアントにハードコーディングしないでください。アプリケーションサーバーが一時 API キーを取得し、クライアントへ渡すことを推奨します。
-
最新 SDK をダウンロードして展開します。
entry/libs/neonui.harをアプリのentry/libsにコピーし、entry/oh-package.json5に依存関係を追加します。{ "dependencies": { "neonui": "file:libs/neonui.har" } }HarmonyOS C++ での統合には、
native/libs内の共有ライブラリとnative/include内のヘッダーファイルを使用します。 -
アプリの
module.json5でネットワークとマイクの権限を宣言し、実行時にマイク権限を要求します。reason_internetとreason_microphoneはリソース名の例です。対応する説明をアプリのリソースで定義してください。"requestPermissions": [ { "name": "ohos.permission.INTERNET", "reason": "$string:reason_internet", "usedScene": { "abilities": ["EntryAbility"], "when": "always" } }, { "name": "ohos.permission.MICROPHONE", "reason": "$string:reason_microphone", "usedScene": { "abilities": ["EntryAbility"], "when": "always" } } ] -
SDK パッケージのサンプルプロジェクトを DevEco Studio で開きます。サンプルページは
entry/src/main/ets/pages/dashscope/DashFunAsrSpeechTranscriberPage.etsです。API キーを設定して実行します。
呼び出し手順
NativeNui(Constants.ModeType.MODE_DIALOG)インスタンスを作成します。initializeで SDK を初期化し、接続・制御パラメーターを設定します。setParamsでモデルと認識パラメーターを設定します。startDialogを呼び出して認識を開始します。onNuiAudioStateChangedで音声の状態に応じて録音デバイスを開始、一時停止、または閉じます。onNuiNeedAudioDataで録音データを継続的に供給します。能動送信が有効なら、代わりにupdateAudioを呼び出します。onNuiEventCallbackで認識結果とタスク状態を取得します。stopDialogを呼び出し、EVENT_TRANSCRIBER_COMPLETEを待ちます。- 認識が不要になったら
releaseでリソースを解放します。
リクエストパラメーター
接続・制御パラメーター
initialize の parameters 引数に JSON 文字列を渡します。
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"device_id": "my_device_id",
"service_mode": "1",
"audio_update_manually": "false"
}
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
url | string | はい | サービスエンドポイント:
{WorkspaceId} を実際の ワークスペース ID に置き換えます。 |
service_mode | string | はい | 動作モード。リアルタイム音声認識では "1"(Constants.ModeFullCloud)に設定します。 |
device_id | string | はい | アプリ内ユーザーIDやクライアント生成のデバイスIDなど、一意のエンドユーザー識別子です。主にログのトレースとトラブルシューティングに使用されます。 |
apikey | string | いいえ | API キー。初期化時に渡せます。startDialog の dialog_params で一時 API キーを渡すことを推奨します。 |
| string | いいえ | 音声の能動送信を有効にするかどうか。デフォルトは "false"。"true" なら updateAudio を呼び、"false" なら SDK が onNuiNeedAudioData から取得します。"true" で SDK がデバイス側 AEC や VAD をサポートする場合、その機能はデフォルトで有効になります。 |
| string | いいえ | デバイス側リソースの保存ディレクトリ。audio_update_manually が "true" で、AEC や VAD などのデバイス側処理が有効な場合は必須です。 |
debug_path | string | いいえ | ログディレクトリ。save_log が true の場合は必須です。SDK は最大 2 個のログファイルを保持します。 |
save_wav | string | いいえ | デバッグ用音声を保存するかどうか。デフォルトは "false"。音声は debug_path に保存します。"true" の場合は debug_path も設定し、initialize の save_log に true を渡します。 |
save_wav_by_id | string | いいえ | save_wav が有効な場合、検索しやすいよう保存音声のファイル名に task_id を使うかどうか。デフォルトは "false"。 |
max_log_file_size | number | いいえ | ログファイル 1 個の最大サイズ(バイト)。デフォルトは 104857600(100 MiB)。save_log が true の場合のみ有効です。 |
log_track_level | number | いいえ | onNuiLogTrackCallback のログフィルターレベル。デフォルトは 2。値は 0(VERBOSE)、1(DEBUG)、2(INFO)、3(WARNING)、4(ERROR)、5(NONE)。ログのレベルが log_track_level と initialize の level の両方以上の場合のみ返します。例えば 2 と 3 なら、WARNING 以上のみ返します。 |
enable_reconnection | string | いいえ | ネットワーク切断後の再接続と送信再開を有効にするかどうか。デフォルトは "false"。 |
| object | いいえ | デバイス側 AEC の設定。audio_update_manually が "true" の場合のみ使用します。 |
| boolean | いいえ | デバイス側 AEC を有効にするかどうか。SDK ビルドがサポートする場合はデフォルトで有効です。 |
| boolean | いいえ | AEC 処理後の音声を保存するかどうか。save_wav が有効で debug_path が設定済みならデフォルトで有効です。 |
| boolean | いいえ | AEC 処理後のデータを onNuiAssistEventCallback の EVENT_AEC_DATA イベントで返すかどうか。デフォルトは false。 |
| object | いいえ | デバイス側 VAD の設定。audio_update_manually が "true" の場合のみ使用します。 |
| boolean | いいえ | デバイス側 VAD を有効にするかどうか。SDK ビルドがサポートする場合はデフォルトで有効です。 |
| boolean | いいえ | VAD 処理後の音声を保存するかどうか。save_wav が有効で debug_path が設定済みならデフォルトで有効です。 |
audio_config | object | いいえ | SDK が音声を取得するモードの録音設定。audio_update_manually が "false" の場合のみ使用します。 |
audio_config.mic.enable_volume_calculation | boolean | いいえ | 音量を計算して報告するかどうか。デフォルトは true。音量コールバックが不要なら無効にします。 |
audio_config.mic.volume_mode | string | いいえ | 音量の計算モード。"dbfs" にすると 20*log10(rms/32768) で標準 dBFS を計算します。フルスケールは 0 dB です。 |
認識パラメーター
setParams の params 引数に JSON 文字列を渡します。
{
"service_type": 4,
"nls_config": {
"model": "qwen-audio-3.1-asr-flash-message",
"sr_format": "opus",
"sample_rate": 16000
}
}
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
service_type | number | はい | 音声サービスの種類。4(Constants.kServiceTypeSpeechTranscriber)に設定します。 |
nls_config | object | はい | 認識設定オブジェクト。 |
nls_config.model | string | はい | モデル名。qwen-audio-3.1-asr-flash-message に設定します。 |
nls_config.sr_format | string | はい | 音声形式:pcm または opus。opus の場合もアプリケーションは PCM データを送信し、SDK が Opus にエンコードします。 |
nls_config.sample_rate | number | はい | サンプリングレート(Hz)。16000 Hz のみをサポートします。 |
nls_config.max_sentence_silence | number | いいえ | VAD の無音しきい値(ミリ秒)。発話後の無音時間がこの値を超えると、発話の終了と判断します。デフォルト:1300。有効範囲:[200, 6000]。意味による分割が有効な場合、sentence_end の判定には使用しませんが、値が小さすぎると認識に影響することがあります。 |
nls_config.heartbeat | boolean | いいえ | ハートビートを有効にするかどうか。デフォルト:false。有効な場合、無音音声を継続送信すると接続を維持できます。無効な場合は一定時間後にタイムアウトします。無音音声とは、音声ファイルやストリームに可聴信号が含まれないデータです。 |
nls_config.disfluency_removal_enabled | boolean | いいえ | つなぎ言葉を除去し、出力を整えるかどうか。デフォルト値は false です。有効にするには true に設定します。 |
nls_config.intermediate_result_enabled | boolean | いいえ | ストリーミング認識の中間結果を返すかどうか。デフォルト値は false です。中間結果を返すには true に設定します。 |
nls_config.vocabulary_id | string | いいえ | 事前作成したホットワードリストの ID。リストを事前に作成してください。語彙が既知で比較的安定しており、複数のリクエストで同じリストを再利用する場合に使用します。事前作成ホットワード を参照してください。 |
nls_config.instant_vocabulary | object | いいえ | リクエスト単位のホットワード。キーはホットワード文字列、値は整数の重みです。事前にリストを作成する必要がなく、セッション単位の一時的な最適化に適しています。重みは [1, 5] または 50。[1, 5] では値が大きいほど出力されやすくなります。重み 50 のスーパーホットワードは最大 50 個です。事前作成ホットワードと併用すると両方の集合を統合します。統合後に 2000 件を超える場合、2000 件をランダムに選択します。リクエスト単位のホットワード を参照してください。 |
nls_config.speech_noise_threshold | number | いいえ | VAD の音声・ノイズ判定しきい値。有効範囲:[-1.0, 1.0]。-1 に近づけるとノイズが音声と判定されやすくなり、ノイズを文字起こしする可能性が高まります。1 に近づけると音声がノイズと判定されやすくなり、音声の一部が除去される可能性があります。この高度な設定は認識に大きく影響するため、十分にテストし、0.1 刻みで調整してください。 |
nls_config.enable_connection_fast_check | boolean | いいえ | ネットワーク切断の高速検出を有効にするかどうか。デフォルト:false。 |
APIs
NativeNui
SDK をインポートします。
import { AsrResult, Constants, INativeNuiCallback, KwsResult, NativeNui } from 'neonui';
インスタンスの作成
constructor(mode_type: Constants.ModeType, flag?: string)
| パラメーター | 型 | 説明 |
|---|---|---|
mode_type | Constants.ModeType | SDK モード:対話・認識は MODE_DIALOG、音声合成は MODE_TTS、ストリーミング入力音声合成は MODE_STREAM_INPUT_TTS。リアルタイム音声認識では MODE_DIALOG に設定します。 |
flag | string | ログを区別するための任意のインスタンス ID。 |
initialize
initialize(
callback: INativeNuiCallback,
parameters: string,
level: number,
save_log: boolean = false
): number
SDK を初期化します。このメソッドはブロックする場合があります。UI スレッドで呼び出さないでください。
| パラメーター | 型 | 説明 |
|---|---|---|
callback | INativeNuiCallback | イベントとデータのコールバック。 |
parameters | string | 接続・制御パラメーターを含む JSON 文字列。 |
level | number | SDK のログレベル:LOG_LEVEL_VERBOSE(0)、LOG_LEVEL_DEBUG(1)、LOG_LEVEL_INFO(2)、LOG_LEVEL_WARNING(3)、LOG_LEVEL_ERROR(4)、LOG_LEVEL_NONE(5)。 |
save_log | boolean | ローカルログを保存するかどうか。デフォルト:false。true の場合は parameters 内に debug_path を指定してください。max_log_file_size も設定できます。 |
このメソッドはエラーコードを返します。
setParams
setParams(params: string): number
startDialog の前に認識パラメーターを設定します。params は認識パラメーターを含む JSON 文字列です。 このメソッドはエラーコードを返します。
startDialog
startDialog(vad_mode: Constants.VadMode, dialog_params: string): number
認識を開始します。
| パラメーター | 型 | 説明 |
|---|---|---|
vad_mode | Constants.VadMode | VAD モード。リアルタイム音声認識では Constants.VadMode.TYPE_P2T に設定します。 |
dialog_params | string | JSON 文字列。期限切れの一時 API キーの更新、または input_context による入力コンテキストの指定に使用します。 |
Example:
{
"apikey": "st-****",
"input_context": [
{ "role": "user", "content": [{ "type": "input_text", "text": "Example context" }] }
]
}
このメソッドはエラーコードを返します。
stopDialog
stopDialog(): number
認識を終了して最終結果を返すようサーバーに通知します。EVENT_TRANSCRIBER_COMPLETE の受信でタスクが終了します。 このメソッドはエラーコードを返します。
cancelDialog
cancelDialog(): number
サーバーの最終結果を待たず、直ちに認識を終了します。 このメソッドはエラーコードを返します。
dialogAction
dialogAction(action_params: string): number
実行時アクションを送信し、認識コンテキストを更新するか、再生状態の変化を AEC に通知します。
| パラメーター | 型 | 説明 |
|---|---|---|
action_params | string | アクションを含む JSON 文字列。 |
action_params.type | string | "action" に設定します。 |
action_params.command | string | アクションコマンド:"context は入力コンテキストを更新し、play_start は参照音声の再生開始を AEC に通知し、play_over" は再生終了を AEC に通知します。 |
action_params.context | object[] | command が "context" の場合に使用する入力コンテキスト。 |
コンテキスト更新の例:
{
"type": "action",
"command": "context",
"context": [
{
"role": "user",
"content": [
{ "text": "Example context", "type": "input_text" }
]
}
]
}
このメソッドはエラーコードを返します。
updateAudio
updateAudio(data: ArrayBuffer, first_pack: boolean): number
audio_update_manually が "true" の場合、onNuiNeedAudioData に格納せず、このメソッドで録音データを能動的に送信します。
| パラメーター | 型 | 説明 |
|---|---|---|
data | ArrayBuffer | 認識対象の音声データ。 |
first_pack | boolean | 最初の音声パケットかどうか。最初は true、以降は false に設定します。 |
このメソッドはエラーコードを返します。
pushReferenceData
pushReferenceData(data: ArrayBuffer, first_pack: boolean): number
audio_update_manually が "true" でデバイス側 AEC が有効な場合、プレーヤーの再生音声を AEC 参照信号として送信します。
| パラメーター | 型 | 説明 |
|---|---|---|
data | ArrayBuffer | 参照音声データ。 |
first_pack | boolean | 最初の音声パケットかどうか。最初は true、以降は false に設定します。 |
このメソッドはエラーコードを返します。
release
release(): number
SDK の内部リソースをすべて解放します。呼び出し後はインスタンスを使用できません。再使用するには initialize を先に呼び出します。 このメソッドはエラーコードを返します。
GetVersion
GetVersion(): string
現在の SDK バージョンを返します。
refreshApikey
refreshApikey(apikey: string, url: string = ''): string
API キーを更新し、一時認証トークンを返します。同期ネットワーク呼び出しを行うため、UI スレッドで呼び出さないでください。
| パラメーター | 型 | 説明 |
|---|---|---|
apikey | string | 既存の API キー。 |
url | string | 任意の認証エンドポイント。デフォルトは空文字列で、既定のエンドポイントを使用します。 |
INativeNuiCallback
onNuiEventCallback
onNuiEventCallback: (
event: Constants.NuiEvent,
resultCode: number,
arg2: number,
kwsResult: KwsResult,
asrResult: AsrResult
) => void;
認識イベントと結果を受信します。
| パラメーター | 型 | 説明 |
|---|---|---|
event | Constants.NuiEvent | コールバックイベント。 |
resultCode | number | エラーコード。EVENT_ASR_ERROR の場合に有効です。 |
arg2 | number | Reserved. |
kwsResult | KwsResult | ウェイクワードの結果。リアルタイム音声認識では無視してください。 |
asrResult | AsrResult | 認識結果。allResponse はサーバーの完全な JSON 応答です。タスク ID は header.task_id、発話テキストは payload.output.sentence.text から取得できます。 |
Events:
| イベント | 説明 |
|---|---|
EVENT_TRANSCRIBER_STARTED | タスクが開始しました。asrResult.allResponse 内の header.task_id にタスク ID が含まれます。問題調査に備えて記録してください。 |
EVENT_VAD_START | タスク開始後に発生します。発話開始の検出を示すイベントではありません。 |
EVENT_VAD_END | 発話の終了が検出されました。 |
EVENT_SENTENCE_START | 文の開始が検出されました。 |
EVENT_ASR_PARTIAL_RESULT | 中間認識結果が返されました。 |
EVENT_SENTENCE_END | 文の終了が検出され、文全体の認識結果が返されました。 |
EVENT_ASR_WARN | 認識中に致命的でない警告が発生しました。例:再接続が有効な場合のネットワーク切断。 |
EVENT_ASR_ERROR | 認識中にエラーが発生しました。resultCode にエラーコードが含まれます。 |
EVENT_MIC_ERROR | 2 秒間連続で音声データを受信していません。録音コード、権限、他のアプリによる録音デバイスの使用状況を確認してください。 |
EVENT_TRANSCRIBER_COMPLETE | 認識が終了しました。 |
EVENT_AEC_DATA | onNuiAssistEventCallback を通じて返される AEC 処理済み音声データ。 |
onNuiAudioStateChanged
onNuiAudioStateChanged: (state: Constants.AudioState) => void;
SDK はこのコールバックでアプリに録音の開始・停止タイミングを通知します。
| State | 説明 |
|---|---|
STATE_OPEN | 対話が開始しました。録音デバイスを開くことができます。 |
STATE_PAUSE | 対話が停止しました。録音を停止できます。 |
STATE_CLOSE | SDK インスタンスが解放されました。録音デバイスを完全に閉じることができます。 |
HarmonyOS の AudioCapturer は非同期で作成されます。初期化中に録音インスタンスを作成してください。STATE_CLOSE では録音を停止し、インスタンスは再利用のため保持します。統一された release 処理で解放してください。これにより、次の STATE_OPEN で直ちに start が呼ばれた際、再作成中のレコーダーがその呼び出しを受け付けない問題を避けられます。
onNuiNeedAudioData
onNuiNeedAudioData: (buffer: ArrayBuffer) => number;
SDK が音声を取得する間、継続的に呼ばれます。buffer.byteLength バイト(通常は 20 ms のモノラル 16 ビット PCM)を格納し、書き込んだバイト数を返します。0 以下はエラーまたはデータなしを示します。
onNuiAudioRMSChanged
onNuiAudioRMSChanged: (val: number) => number;
UI 更新用に現在の音量を報告します。audio_config.mic.volume_mode が "dbfs" の場合、val は -160~0 です。コールバック実装では 0 を返せます。
onNuiAssistEventCallback
onNuiAssistEventCallback?: (
event: Constants.NuiEvent,
info: string,
infoLen: number,
data: ArrayBuffer
) => void;
SDK の内部補助イベントとデータを受信する省略可能なコールバック。不要なら省略できます。
| パラメーター | 型 | 説明 |
|---|---|---|
event | Constants.NuiEvent | 補助イベント。 |
info | string | 追加情報。通常は JSON 文字列です。 |
infoLen | number | 追加情報の長さ。 |
data | ArrayBuffer | AEC 処理済み音声などの補助データ。 |
onNuiLogTrackCallback
onNuiLogTrackCallback: (level: Constants.LogLevel, log: string) => void;
SDK の追跡ログを受信します。返されるレベルは log_track_level と initialize の level の両方で決まります。
結果オブジェクト
AsrResult
| Property | 型 | 説明 |
|---|---|---|
finish | boolean | 現在の結果が最終結果かどうか。 |
resultCode | number | 結果のステータスコード。 |
asrResult | string | 認識テキスト。EVENT_ASR_ERROR の場合はエラーメッセージが含まれます。 |
allResponse | string | タスク ID と発話テキストを含む、JSON 文字列形式の完全なサーバー応答。 |
KwsResult
| Property | 型 | 説明 |
|---|---|---|
type | Constants.WuwType | ウェイクワードの種類。リアルタイム音声認識では無視してください。 |
kws | string | ウェイクワード。リアルタイム音声認識では無視してください。 |
定数と列挙型
| 名前 | 説明 |
|---|---|
Constants.ModeType | SDK モード:MODE_DIALOG、MODE_TTS、MODE_STREAM_INPUT_TTS。 |
Constants.VadMode | VAD モード。リアルタイム音声認識では TYPE_P2T を使用し、ユーザーが stopDialog を呼び出して認識を終了します。 |
Constants.AudioState | 音声状態:STATE_OPEN、STATE_PAUSE、STATE_CLOSE。 |
Constants.LogLevel | ログレベル:LOG_LEVEL_VERBOSE(0)から LOG_LEVEL_NONE(5)まで。 |
Constants.NuiResultCode | SDK エラーコード。例:SUCCESS(0)、ILLEGAL_PARAM(240002)、NECESSARY_PARAM_LACK(240004)、SDK_NOT_INIT(240011)。 |
Constants.kServiceTypeSpeechTranscriber | リアルタイム音声認識の service_type 値。値は 4 です。 |
Constants.ModeFullCloud | フルクラウドモード。service_mode の値は "1" です。 |
サンプルコード
以下は SDK の主要な処理の例です。完全な権限処理、録音キュー、応答解析については、SDK パッケージの DashFunAsrSpeechTranscriberPage.ets を参照してください。
import { AsrResult, Constants, INativeNuiCallback, KwsResult, NativeNui } from 'neonui';
const callback: INativeNuiCallback = {
onNuiEventCallback: (event: Constants.NuiEvent, resultCode: number, arg2: number,
kwsResult: KwsResult, asrResult: AsrResult): void => {
if (event == Constants.NuiEvent.EVENT_ASR_PARTIAL_RESULT
|| event == Constants.NuiEvent.EVENT_SENTENCE_END) {
// Parse payload.output.sentence.text from asrResult.allResponse.
} else if (event == Constants.NuiEvent.EVENT_TRANSCRIBER_COMPLETE) {
// Recognition is complete.
} else if (event == Constants.NuiEvent.EVENT_ASR_ERROR) {
// resultCode contains the error code.
}
},
onNuiAudioStateChanged: (state: Constants.AudioState): void => {
// Control AudioCapturer for STATE_OPEN, STATE_PAUSE, and STATE_CLOSE.
},
onNuiNeedAudioData: (buffer: ArrayBuffer): number => {
// Copy recording data to buffer and return the number of bytes written.
return 0;
},
onNuiAudioRMSChanged: (val: number): number => 0,
onNuiLogTrackCallback: (level: Constants.LogLevel, log: string): void => {}
};
const nuiInstance = new NativeNui(Constants.ModeType.MODE_DIALOG);
const initParams: Record<string, Object> = {};
initParams['url'] = 'wss://dashscope.aliyuncs.com/api-ws/v1/inference';
initParams['device_id'] = 'my_device_id';
initParams['service_mode'] = Constants.ModeFullCloud;
initParams['audio_update_manually'] = 'false';
const initResult = nuiInstance.initialize(
callback,
JSON.stringify(initParams),
Constants.LogLevel.LOG_LEVEL_DEBUG,
false
);
if (initResult == Constants.NuiResultCode.SUCCESS) {
const nlsConfig: Record<string, Object> = {
'model': 'qwen-audio-3.1-asr-flash-message',
'sr_format': 'opus',
'sample_rate': 16000
};
const params: Record<string, Object> = {
'service_type': Constants.kServiceTypeSpeechTranscriber,
'nls_config': nlsConfig
};
nuiInstance.setParams(JSON.stringify(params));
const dialogParams: Record<string, Object> = { 'apikey': 'st-****' };
nuiInstance.startDialog(Constants.VadMode.TYPE_P2T, JSON.stringify(dialogParams));
}
// Stop recognition when the user finishes recording, and wait for EVENT_TRANSCRIBER_COMPLETE.
function stopRecognition(): void {
nuiInstance.stopDialog();
}
// Call nuiInstance.release() from the EVENT_TRANSCRIBER_COMPLETE handler.
録音には @kit.AudioKit の AudioCapturer を使用します。音声はモノラル 16 ビット PCM で、選択モデルが対応するサンプリングレートにしてください。
import { audio } from '@kit.AudioKit';
const options: audio.AudioCapturerOptions = {
streamInfo: {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
},
capturerInfo: {
source: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
}
};
const capturer = await audio.createAudioCapturer(options);
capturer.on('readData', (buffer: ArrayBuffer): void => {
// Pull mode: enqueue data for onNuiNeedAudioData.
// Push mode: call nuiInstance.updateAudio(buffer, firstPack).
});
await capturer.start();