使用Qwen-Audio-3.0-Realtime实时语音对话HarmonyOS SDK,实现实时音频输入以及语音或文本输出。
用户指南:关于模型介绍和选型建议请参见实时语音对话。
与 Android 使用
使用录音功能需在
通过在initialize接口的
参数说明
通过在setParams接口的
参数说明
初始化语音对话SDK 实例。SDK 为单例模式,在调用release前禁止重复初始化。
此接口会引起阻塞,应在非UI 线程调用。
方法签名
参数说明
返回值说明
返回错误码,参见错误码查询。
以 JSON 格式设置语音对话效果参数。在startDialog之前调用。
方法签名
参数说明
返回值说明
返回错误码,参见错误码查询。
开始对话。
方法签名
参数说明
返回值说明
返回错误码,参见错误码查询。
结束对话,调用该接口后,服务端将返回最终对话结果并结束任务。
方法签名
返回值说明
返回错误码,参见错误码查询。
立即结束对话,调用该接口后,不等待服务端返回最终对话结果就立即结束任务。
方法签名
返回值说明
返回错误码,参见错误码查询。
在交互过程中下发对话动作指令,用于更新对话上下文等运行时行为。
方法签名
参数说明
示例:
返回值说明
返回错误码,参见错误码查询。
参数audio_update_manually设置为"true"时,录音数据不再是通过onNuiNeedAudioData填入,而是用此接口主动推送。
方法签名
参数说明
返回值说明
返回错误码,参见错误码查询。
参数audio_update_manually设置为"true"时,且启用了端侧AEC回声消除能力,则需要用此接口推送播放器播放的音频数据作为参考信号。
方法签名
参数说明
返回值说明
返回错误码,参见错误码查询。
释放SDK所有内部资源。此方法调用后,SDK 实例将变为不可用状态,如需再次使用,必须重新调用initialize进行初始化。
方法签名
返回值说明
返回错误码,参见错误码查询。
获得当前SDK版本信息。
方法签名
返回值说明
当前SDK版本信息。
方法签名
参数说明
SDK 通过此回调通知何时应该开始或停止录音。
方法签名
AudioState状态说明
监听录音数据的音量,可用于UI显示。
方法签名
参数说明
开始对话后,该回调被连续触发,需在其中提供待处理的音频数据。参数audio_update_manually设置为"true"时可不关注这个回调。
方法签名
参数说明
返回值说明
实际填充的字节数。
此回调用于接收 SDK 内部的辅助事件和相关数据。
方法签名
参数说明
此回调用于接收 SDK 内部的详细日志,方便进行问题定位和调试。
HarmonyOS SDK 中事件类型通过
快速开始
- 获取与配置 API Key
-
下载 SDK 并运行示例代码:
- 下载最新 SDK 整合包。
- 解压
.tar.gz格式的 SDK 整合包。在entry/libs目录中获取 HAR 格式 SDK,并添加到项目依赖。需要 C++ 接入时,使用整合包内的native/libs与native/include获取动态库和头文件。 - 用 DevEco Studio 打开工程。示例代码位于
DashQwenAudioChatPage.ets,替换 API Key 后体验功能。
调用步骤
- 初始化 SDK
- 按业务需求设置参数:通过initialize接口的
parameters参数设置连接与控制参数;通过setParams接口设置语音对话效果参数。 - 调用startDialog启动对话流程。
- 在onNuiAudioStateChanged回调中,根据音频状态开启录音设备。
- 在onNuiNeedAudioData回调中持续提供录音数据,或者通过updateAudio持续推送录音数据。
- 在onNuiAssistEventCallback回调中持续获得 AI 返回的语音数据。
- 在onNuiEventCallback回调中监听事件并获取事件信息。
- 调用stopDialog停止对话,并通过监听EVENT_TRANSCRIBER_COMPLETE事件确认对话已结束。
- 当对话功能不再使用时,调用release接口释放 SDK 资源。
音频设备管理
与 Android 使用 AudioRecord / AudioTrack 不同,HarmonyOS 通过 @kit.AudioKit 提供音频采集与播放能力,分别使用 AudioCapturer(录音)和 AudioRenderer(播放)。本产品样例已封装为 AudioRecorder.ets 与 AudioPlayer.ets 两个工具类,可直接复用。
录音(AudioCapturer)
- 创建:通过
audio.createAudioCapturer(capturerOptions)异步创建,采样率固定 16kHz、16bit、单声道(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()释放。
注意:HarmonyOS 的AudioCapturer为异步创建,创建完成后才能调用start()。因此不要在STATE_OPEN时新建并立即启动录音器——应先创建完毕,再在STATE_OPEN回调中start()(样例在doInit阶段创建,onNuiAudioStateChanged阶段启动)。
播放(AudioRenderer)
- 创建:通过
audio.createAudioRenderer(rendererOptions)异步创建。 - 采样率:DashScope realtime 合成的语音回答音频为 24kHz(
AudioPlayer构造时传入)。 - 数据事件:通过
renderer.on('writeData', (data: ArrayBuffer): audio.AudioDataCallbackResult => ...)拉取待播放音频,返回AudioDataCallbackResult.VALID表示已填充数据,INVALID表示无数据。 - 状态事件:通过
renderer.on('stateChange', (state: audio.AudioState) => void)监听播放入口/结束。 - 控制:
start()开始、stop()停止、pause()暂停(暂停会保留已缓冲数据)。
AEC 参考信号:开启 SDK 内部 AEC 时,播放器输出的音频需作为参考信号送入 SDK,调用nuiInstance.pushReferenceData(data, false)(对应 AndroidupdateRefAudio)。
权限声明
使用录音功能需在 module.json5 中声明麦克风权限:
请求参数
连接与控制参数
通过在initialize接口的parameters参数中传入一个 JSON 字符串来配置。
参数示例:以下为 JSON 字符串示例,参数未完整列出。请按实际需求在编码时补充:
| 参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
url | String | 是 | 服务地址:
{WorkspaceId} 替换为真实的Workspace ID。 |
apikey | String | 是 | API Key。 |
service_mode | String | 是 | 运行模式。实时语音对话固定为 "1"。 |
device_id | String | 是 | 用于标识终端用户的唯一字符串,可设为应用内用户 ID或客户端生成的设备唯一标识符。此 ID主要用于日志追踪和问题排查。 |
| audio_update_manually | String | 否 | 是否启用主动推送音频数据模式,默认值:"false"。 当设置为"true"启用主动推送音频数据模式时,且SDK版本支持端侧音频能力(如AEC、VAD),则默认开启端侧音频能力。 |
| workspace | String | 否 | 当参数audio_update_manually设置为"true"时,且启用端侧音频能力(如AEC、VAD)时,必须设置workspace,即端侧资源文件存储的路径。 |
debug_path | String | 否 | 日志文件的存储路径。 此参数仅在调用initialize接口时将save_log设为true时生效。此时必须设置日志文件路径,否则将报错。 本地最多保留两个日志文件。 |
save_wav | String | 否 | 是否保存调试用的音频文件。音频文件保存于debug_path下。默认值:"false"。 取值范围:
save_log设为true时生效。同时,debug_path也必须被设置。 |
max_log_file_size | int | 否 | 设定日志文件的最大字节数。 此参数仅在调用initialize接口时将 save_log设为true时生效。默认值:104857600(100 × 1024 × 1024 字节, 即 100MiB)。 |
log_track_level | int | 否 | 控制通过日志回调(onNuiLogTrackCallback)对外发送的日志内容的过滤级别。默认值:2。 取值范围:
log_track_level与level(通过initialize接口设置)共同决定最终回调的日志。一条日志的级别数值必须同时大于或等于log_track_level和level的值,才会被回调。例如,log_track_level设为2 (INFO),level设为3 (WARNING),则只有WARNING及以上级别(数值>=3)的日志才会被回调。 |
| aec_params | object | 否 | 端侧AEC能力高级参数配置对象。当参数audio_update_manually设置为"true"时才启用此配置对象。 |
| aec_params.enable_aec | boolean | 否 | 是否开启端侧AEC回声消除能力。 当参数audio_update_manually设置为"true"时,且SDK版本支持端侧AEC音频能力,则默认开启。 |
| aec_params.save_audio | boolean | 否 | 是否开启端侧AEC回声消除模块音频存储功能。 当save_wav为"true",且设置了debug_path,则默认开启,将AEC运行音频数据存储到debug_path下。 |
| aec_params.enable_aec_data_callback | boolean | 否 | 是否将AEC后的数据送给用户,默认false;开启后在onNuiAssistEventCallback的EVENT_AEC_DATA接收。 |
| vad_params | object | 否 | 端侧VAD能力高级参数配置对象。 当参数audio_update_manually设置为"true"时才启用此配置对象。 |
| vad_params.enable_vad | boolean | 否 | 是否开启端侧VAD人声检测能力。 当参数audio_update_manually设置为"true"时,且SDK版本支持端侧VAD音频能力,则默认开启。 |
| vad_params.save_audio | boolean | 否 | 是否开启端侧VAD人声检测模块音频存储功能。 当 save_wav为"true",且设置了debug_path,则默认开启,将VAD运行音频数据存储到debug_path下。 |
语音对话效果参数
通过在setParams接口的params参数中传入一个 JSON 字符串来配置。
参数示例:以下为 JSON 字符串示例,参数未完整列出。请按实际需求在编码时补充:
| 一级参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
service_type | int | 是 | 语音服务类型。实时语音对话固定为 4。 |
nls_config | object | 是 | 语音对话核心配置对象,包含模型选择、对话效果控制等关键参数。 |
nls_config.model | string | 是 | 指定模型名。支持qwen-audio-3.1-realtime-plus、qwen-audio-3.0-realtime-plus和qwen-audio-3.0-realtime-flash系列模型。 |
nls_config.sr_format | string | 是 | 输入音频格式。当前仅支持 pcm(16kHz 16bit 单声道),为默认值。 |
nls_config.modalities | string | 否 | array 格式的字符串,模型输出模态设置,可选值:
|
| nls_config.voice | string | 否 | TTS 音色名称,3.1 Plus 的默认值为 longanqian_v3.1,3.0 Plus/Flash 的默认值为 longanqian。支持两种类型,仅可在第一次 session.update 中设置,后续传入将被忽略。
longanqian_v3.1、longanhuan_v3.1、longanlingxin_v3.1、longanfengyue_v3.1、xunanchuan_v3.1、beth_v3.1、betty_v3.1、cally_v3.1。 |
| nls_config.enable_speech_emotion | boolean | 否 | 是否开启情绪增强功能。开启后,回复音色的情绪变化更明显。默认值:true。可选值:true、false。 |
| nls_config.instructions | string | 否 | 系统指令,用于设定模型的角色身份、回答风格和行为偏好。对整个会话生效。 |
| nls_config.max_history_turns | int | 否 | 允许单次请求的最大历史 QA 轮数。取值范围为 1-50,默认值为 20。 |
| nls_config.tools | string | 否 | array 格式的字符串。Function Calling 工具定义列表。配置后模型可根据用户输入自主决定是否调用工具。 内部参数说明: type string(必选)固定为 function。function.name string(必选)工具函数名称。 function.description string(可选)对工具函数功能的描述,模型据此判断是否调用该工具。 function.parameters object(可选)对工具函数入参的描述,模型据此提取所需入参。若函数无需入参,可不指定。 示例: |
| nls_config.turn_detection | string | 否 | JSON 对象形式的字符串。轮次检测配置。不设置时则切换为 push-to-talk 模式(手动提交音频并触发推理)。否则启用双工对话模式。 |
| nls_config.turn_detection.type | string | 否 | VAD 类型,可选值:
|
| nls_config.turn_detection.threshold | float | 否 | VAD灵敏度,仅在 server_vad 模式下生效(smart_turn 模式下无效)。值越低,VAD越灵敏,越容易将微弱声音(包括背景噪音)识别为语音;值越高,越不灵敏,需要更清晰、音量更大的语音才能触发。 取值范围为[-1.0, 1.0],默认值为 0.5。 |
| nls_config.turn_detection.silence_duration_ms | int | 否 | 语音结束后需保持静音的最短时间(毫秒),仅在 server_vad 模式下生效(smart_turn 模式下无效)。超时即触发模型响应。值越低,响应越快,但可能在短暂停顿时误触发。 取值范围为[200, 6000],默认值为 800。对话场景推荐 400-800。 |
| nls_config.turn_detection.voiceprint_audio_urls | string | 否 | array形式的字符串。仅在 smart_turn 模式下生效。目标用户预录音频的公网可访问 URL 列表,用于说话人增强。传入后,模型将在双工对话中精准锁定目标说话人,有效忽略旁人声音与背景噪声。最多支持 5 个 URL。音频格式要求:16kHz PCM 或 WAV。 |
关键接口
NativeNui
initialize
初始化语音对话SDK 实例。SDK 为单例模式,在调用release前禁止重复初始化。
此接口会引起阻塞,应在非UI 线程调用。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
callback | INativeNuiCallback | 事件和数据回调接口的实现。 |
parameters | string | JSON 字符串,包含鉴权、连接和调试参数。参见连接与控制参数。 |
level | number | 控制SDK自身日志的打印级别。 |
save_log | boolean | 是否保存本地日志。若为true,须在连接与控制参数中通过debug_path指定路径,并可通过max_log_file_size设置文件大小。 |
setParams
以 JSON 格式设置语音对话效果参数。在startDialog之前调用。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
params | string | 语音对话效果参数。 |
startDialog
开始对话。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
vad_mode | Constants.VadMode | VAD模式。固定为Constants.VadMode.TYPE_P2T。 |
dialog_params | string | 如果连接与控制参数的apikey参数使用的是临时API Key,当其过期时,可在此处进行更新。内容为JSON 格式: |
stopDialog
结束对话,调用该接口后,服务端将返回最终对话结果并结束任务。
方法签名
cancelDialog
立即结束对话,调用该接口后,不等待服务端返回最终对话结果就立即结束任务。
方法签名
dialogAction
在交互过程中下发对话动作指令,用于更新对话上下文等运行时行为。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
params | string | JSON 形式的字符串,用于更新对话上下文等运行时行为。 |
params.type | String | 固定"action"。 |
params.command | String | 具体的运行指令,当前支持"function_call"、"play_start"、"play_over"。
|
params.context | String | 当command为"function_call"时,更新函数调用请求。 |
params.context.type | String | 事件类型,当command为"function_call"时必须设置。
|
params.context.item | object | params.context.type为conversation.item.create时必须设置,表示要创建的对话项。详见如下。 |
params.context.response | object | params.context.type为response.create时可设置,表示用于覆盖本轮推理的会话默认配置。不传时使用当前会话配置。详见如下。 |
context.item参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| id | String | 可选。对话项的唯一标识符。不传时由服务端自动生成。若指定的 ID 已存在于对话中,会返回错误。 |
| type | String | 必选。对话项类型,可选值:
|
| role | String | message 类型必选。消息角色,可选值:system、user、assistant。 |
| content | array | message 类型必选。消息内容列表。每个元素包含 type 和对应的数据字段。各 role 支持的 content 类型: system input_text:系统消息,必填字段 text。user
output_text:助手文本输出,必填字段 text。 |
| call_id | String | (function_call / function_call_output 类型必选)函数调用的唯一标识符,用于关联请求和结果。 |
| name | String | (function_call 类型必选)要调用的函数名称。 |
| arguments | String | function_call 类型必选)函数调用参数,JSON 字符串格式。 |
| output | String | (function_call_output 类型必选)工具执行结果,JSON 字符串格式。 |
context.response参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| modalities | array | array 格式的字符串,模型输出模态设置,可选值:
|
| voice | string | 覆盖本轮的 TTS 音色。 |
updateAudio
参数audio_update_manually设置为"true"时,录音数据不再是通过onNuiNeedAudioData填入,而是用此接口主动推送。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
data | ArrayBuffer | 推送的音频数据(PCM)。 |
first_pack | boolean | 是否为首包。SDK内部会按data.byteLength计算字节数。 |
pushReferenceData(对应Android updateRefAudio)
参数audio_update_manually设置为"true"时,且启用了端侧AEC回声消除能力,则需要用此接口推送播放器播放的音频数据作为参考信号。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
data | ArrayBuffer | 推送的音频数据(PCM)。 |
first_pack | boolean | 是否为首包。SDK内部会按data.byteLength计算字节数。 |
release
释放SDK所有内部资源。此方法调用后,SDK 实例将变为不可用状态,如需再次使用,必须重新调用initialize进行初始化。
方法签名
GetVersion
获得当前SDK版本信息。
方法签名
INativeNuiCallback:监听回调
onNuiEventCallback:监听事件信息
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
event | Constants.NuiEvent | 回调事件。 |
resultCode | number | 错误码,在出现EVENT_ASR_ERROR事件时有效。 |
arg2 | number | 保留参数。 |
asrResult | AsrResult | 语音识别结果。 |
kwsResult | KwsResult | 语音唤醒功能。无需关注该参数。 |
onNuiAudioStateChanged:监听音频状态
SDK 通过此回调通知何时应该开始或停止录音。
方法签名
| 状态 | 说明 |
|---|---|
STATE_OPEN | 交互启动,可以打开录音设备进行录音。 |
STATE_PAUSE | 交互停止,可以停止录音。 |
STATE_CLOSE | SDK 实例已释放,可以彻底关闭录音设备。 |
onNuiAudioRMSChanged:监听录音音量
监听录音数据的音量,可用于UI显示。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
val | number | 录音数据的音量值。 |
onNuiNeedAudioData:填充待处理音频数据
开始对话后,该回调被连续触发,需在其中提供待处理的音频数据。参数audio_update_manually设置为"true"时可不关注这个回调。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
buffer | ArrayBuffer | 填充的音频数据。SDK会按buffer.byteLength获取期望读取的字节数。 |
onNuiAssistEventCallback:辅助数据和信息结果
此回调用于接收 SDK 内部的辅助事件和相关数据。
方法签名
| 参数 | 类型 | 说明 |
|---|---|---|
event | Constants.NuiEvent | NuiEvent事件。 |
info | string | 附加信息,通常为JSON 字符串。 |
infoLen | number | 附加信息长度。 |
data | ArrayBuffer | 附加的二进制数据,比如AI返回的TTS音频。 |
注意:HarmonyOS中此回调为可选实现(?),不关注时可不实现。
onNuiLogTrackCallback:监听追踪日志
此回调用于接收 SDK 内部的详细日志,方便进行问题定位和调试。
NuiEvent:事件类型
HarmonyOS SDK 中事件类型通过 Constants.NuiEvent 枚举定义,以下列出实时语音对话相关的事件:
| 事件 | 说明 |
|---|---|
| EVENT_TRANSCRIBER_STARTED | 任务启动成功。 |
| EVENT_VAD_START | 任务启动后即触发该事件。不代表检测到人声起点。 |
| EVENT_VAD_END | 检测到人声终点。 |
| EVENT_ASR_PARTIAL_RESULT | 语音识别中间结果。 |
| EVENT_ASR_RESULT | 完整的语音识别结果。 |
| EVENT_ASR_ERROR | 语音对话过程中出现错误。 |
| EVENT_MIC_ERROR | 因连续2秒未收到任何音频数据而触发。 |
| EVENT_SENTENCE_START | 检测到一句话开始。 |
| EVENT_SENTENCE_END | 检测到一句话结束,此时会返回一句完整的识别结果。 |
| EVENT_TRANSCRIBER_COMPLETE | 语音对话结束。 |
| EVENT_AUDIO_TRANSCRIPTION | 音频模式下的文字字幕增量事件,流式返回字幕片段。 |
| EVENT_AUDIO_TRANSCRIPTION_COMPLETED | 音频模式下的字幕输出完成事件。 |
| EVENT_OTHER_RESULT | 其他未归类事件信息,比如function_call的返回结果等。 |
| EVENT_ASR_TTS_START | AI开始返回TTS数据。 |
| EVENT_ASR_TTS_DATA | AI返回的TTS数据。 |
| EVENT_ASR_TTS_COMPLETE | AI返回TTS数据结束。 |
| EVENT_RESULT_TRANSLATED | 翻译中间结果。 |
| EVENT_RESULT_TRANSLATED_END | 翻译结果输出结束。 |
| EVENT_AEC_DATA | AEC回声消除后的音频数据。 |