使用Qwen-Audio-3.0-Realtime实时语音对话iOS SDK,实现实时音频输入以及语音或文本输出。
用户指南:关于模型介绍和选型建议请参见实时语音对话。
快速开始
- 获取 API Key:获取与配置 API Key
-
下载 SDK 并运行示例代码:
- 下载最新 SDK 整合包。
- 解压 ZIP 包,将其中的 nuisdk.xcframework 添加到工程。
- 在 Build Phases → Link Binary With Libraries 中添加 nuisdk.xcframework。
- 在 General → Frameworks, Libraries, and Embedded Content 中将 nuisdk.xcframework 设置为 Embed & Sign。
- 用 Xcode 打开示例工程。示例代码位于
DashQwenAudioChatViewController.m,替换 API Key 后体验功能。
调用步骤
- 初始化 SDK
- 按业务需求设置参数:通过nui_initialize接口设置连接与控制参数;通过nui_set_params接口设置语音对话效果参数。
- 调用nui_dialog_start启动对话流程。
- 在onNuiAudioStateChanged回调中,根据音频状态开启录音设备。
- 在onNuiNeedAudioData回调中持续提供录音数据,或者通过nui_update_audio_data持续推送录音数据。
- 在onNuiAssistEventCallback回调中持续获得 AI 返回的语音数据。
- 在onNuiEventCallback回调中监听事件并获取事件信息。
- 调用nui_dialog_cancel停止对话,并通过监听EVENT_TRANSCRIBER_COMPLETE事件确认对话已结束。
- 当对话功能不再使用时,调用nui_release接口释放 SDK 资源。
请求参数
连接与控制参数
通过在nui_initialize接口的parameters参数中传入一个 JSON 字符串来配置。
参数示例:以下为 JSON 字符串示例,参数未完整列出。请按实际需求在编码时补充:
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"apikey": "st-****",
"device_id": "my_device_id",
"service_mode": "1"
}
参数说明
| 参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
|
| 是 | 服务地址:
{WorkspaceId} 替换为真实的 Workspace ID。 |
|
| 是 | API Key。 |
|
| 是 | 运行模式。实时语音对话固定为 |
|
| 是 | 用于标识终端用户的唯一字符串,可设为应用内用户 ID或客户端生成的设备唯一标识符。此 ID主要用于日志追踪和问题排查。 |
|
| 否 | 是否启用主动推送音频数据模式,默认值:"false"。 |
|
| 否 | 端侧资源文件的存储路径。当 |
|
| 否 | 日志文件的存储路径。 此参数仅在调用nui_initialize接口时将 |
|
| 否 | 是否保存调试用的音频文件。音频文件保存于
save_log设为true时生效。 同时,debug_path也必须被设置。 |
|
| 否 | 设定日志文件的最大字节数。 此参数仅在调用nui_initialize接口时将 |
|
| 否 | 控制通过日志回调(onNuiLogTrackCallback)对外发送的日志内容的过滤级别。
log_track_level与level(通过nui_initialize接口设置)共同决定最终回调的日志。一条日志的级别数值必须同时大于或等于log_track_level和level的值,才会被回调。例如,log_track_level设为2 (INFO),level设为3 (WARNING),则只有WARNING及以上级别(数值>=3)的日志才会被回调。 |
语音对话效果参数
通过在nui_set_params接口的params参数中传入一个 JSON 字符串来配置。
参数示例:以下为 JSON 字符串示例,参数未完整列出。请按实际需求在编码时补充:
{
"service_type": 4,
"nls_config": {
"model": "qwen-audio-3.0-realtime-plus",
"sr_format": "pcm"
}
}
参数说明
| 一级参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
|
| 是 | 语音服务类型。实时语音对话固定为 |
|
| 是 | 语音对话核心配置对象,包含模型选择、对话效果控制等关键参数。 |
|
| 是 | 指定模型名。支持qwen-audio-3.0-realtime-plus和qwen-audio-3.0-realtime-flash系列模型。 |
|
| 是 | 输入音频格式。当前仅支持 |
|
| 否 | array 格式的字符串,模型输出模态设置,可选值:
|
nls_config.voice |
| 否 | TTS 音色名称,默认值为
|
nls_config.enable_speech_emotion |
| 否 | 是否开启情绪增强功能。开启后,回复音色的情绪变化更明显。默认值: |
nls_config.instructions |
| 否 | 系统指令,用于设定模型的角色身份、回答风格和行为偏好。对整个会话生效。 |
nls_config.max_history_turns | int | 否 | 允许单次请求的最大历史 QA 轮数。取值范围为 1-50,默认值为 20。 |
nls_config.tools |
| 否 | array 格式的字符串。Function Calling 工具定义列表。配置后模型可根据用户输入自主决定是否调用工具。 |
nls_config.turn_detection |
| 否 | JSON 对象形式的字符串。轮次检测配置。不设置时则切换为 push-to-talk 模式(手动提交音频并触发推理)。否则启用双工对话模式。 |
nls_config.turn_detection.type |
| 否 | VAD 类型,可选值:
|
nls_config.turn_detection.threshold | float | 否 | VAD灵敏度,仅在 server_vad 模式下生效(smart_turn 模式下无效)。值越低,VAD越灵敏,越容易将微弱声音(包括背景噪音)识别为语音;值越高,越不灵敏,需要更清晰、音量更大的语音才能触发。 |
nls_config.turn_detection.silence_duration_ms |
| 否 | 语音结束后需保持静音的最短时间(毫秒),仅在 server_vad 模式下生效(smart_turn 模式下无效)。超时即触发模型响应。值越低,响应越快,但可能在短暂停顿时误触发。 |
nls_config.turn_detection.voiceprint_audio_urls |
| 否 | array形式的字符串。仅在 smart_turn 模式下生效。目标用户预录音频的公网可访问 URL 列表,用于说话人增强。传入后,模型将在双工对话中精准锁定目标说话人,有效忽略旁人声音与背景噪声。最多支持 5 个 URL。音频格式要求:16kHz PCM 或 WAV。 |
关键接口
NeoNui
nui_initialize
初始化语音对话SDK 实例。SDK 为单例模式,在调用 nui_release 前禁止重复初始化。
- (NuiResultCode) nui_initialize:(const char *)parameters
logLevel:(NuiSdkLogLevel)level
saveLog:(BOOL)save_log;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| JSON 字符串,包含鉴权、连接和调试参数。参见连接与控制参数。 |
|
| 控制SDK自身日志的打印级别。 |
| BOOL | 是否保存本地日志。若为 |
返回错误码,参见错误码查询。
nui_set_params
以 JSON 格式设置语音对话效果参数。在 nui_dialog_start 之前调用。
- (NuiResultCode) nui_set_params:(const char *)params;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
|
返回错误码,参见错误码查询。
nui_dialog_start
开始对话。
方法签名- (NuiResultCode) nui_dialog_start:(NuiVadMode)vad_mode
dialogParam:(const char *)dialog_params;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| VAD模式。固定为 |
|
| 如果连接与控制参数的 |
返回错误码,参见错误码查询。
nui_dialog_cancel
结束对话或者立即取消当前交互。
方法签名- (NuiResultCode) nui_dialog_cancel:(BOOL)force;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| 是否强制结束而忽略最终结果。
|
返回错误码,参见错误码查询。
nui_dialog_action
在交互过程中下发对话动作指令,用于更新对话上下文等运行时行为。
方法签名- (NuiResultCode) nui_dialog_action:(const char *)params;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| JSON 字符串,用于更新对话上下文等运行时行为。 |
|
| 固定为 |
|
| 具体的运行指令,当前支持
|
|
| 当 |
|
| 事件类型,当
|
|
|
|
|
|
|
context.item参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id |
| 可选。对话项的唯一标识符。不传时由服务端自动生成。若指定的 ID 已存在于对话中,会返回错误。 |
type |
| 必选。对话项类型,可选值:
|
role |
|
|
content | array |
output_text:助手文本输出,必填字段 text。 |
call_id |
| ( |
name |
| ( |
arguments |
|
|
output |
| ( |
context.response参数:
| 参数 | 类型 | 说明 |
|---|---|---|
modalities |
| array 格式的字符串,模型输出模态设置,可选值:
|
voice | string | 覆盖本轮的 TTS 音色。 |
示例:
{
"type": "action",
"command": "function_call",
"context": {
"item": {
"call_id": "call_xxxx",
"output": "{\"city\":\"杭州\",\"condition\":\"晴\",\"temperature\":18}",
"type": "function_call_output"
},
"type": "conversation.item.create"
}
}
{
"type": "action",
"command": "function_call",
"context": {
"response": {
"modalities": [
"text",
"audio"
]
},
"type": "response.create"
}
}
返回值说明
返回错误码,参见错误码查询。
nui_update_audio_data
当 audio_update_manually 设为 "true" 时,录音数据不再通过 onNuiNeedAudioData 填入,而是通过此接口主动推送。
- (NuiResultCode) nui_update_audio_data:(const char *)data
Len:(int)length
FirstPack:(BOOL)first_pack;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| 推送的音频数据。 |
|
| 推送的音频数据的字节数。 |
|
| 无需关注此参数。 |
返回错误码,参见错误码查询。
nui_push_reference_data
当 audio_update_manually 设为 "true" 且启用端侧 AEC 回声消除能力时,需要通过此接口推送播放器播放的音频数据作为参考信号。
- (NuiResultCode) nui_push_reference_data:(const char *)data
Len:(int)length
FirstPack:(BOOL)first_pack;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| 推送的音频数据。 |
|
| 推送的音频数据的字节数。 |
|
| 无需关注此参数。 |
返回错误码,参见错误码查询。
nui_release
释放SDK所有内部资源,并强制终止所有正在进行的任务。此方法调用后,SDK 实例将变为不可用状态,如需再次使用,必须重新调用 nui_initialize 进行初始化。
- (NuiResultCode) nui_release;
返回值说明
返回错误码,参见错误码查询。
nui_get_version
获得当前SDK版本信息。此接口需在 nui_initialize 之后调用才有返回值。
- (const char*) nui_get_version;
返回值说明
当前SDK版本信息。
nui_get_all_response
获得当前事件回调的完整信息。
方法签名- (const char*) nui_get_all_response;
返回值说明
JSON 字符串格式的完整事件信息。
NeoNuiSdkDelegate:监听回调
onNuiEventCallback:监听事件信息
方法签名- (void) onNuiEventCallback:(NuiCallbackEvent)nuiEvent
dialog:(long)dialog
kwsResult:(const char *)wuw
asrResult:(const char *)asr_result
ifFinish:(BOOL)finish
retCode:(int)code;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| 回调事件。 |
|
| 会话编码,无需关注该参数。 |
|
| 语音唤醒功能。无需关注该参数。 |
|
| 语音识别结果。 |
|
| 本轮识别是否结束标志。 |
|
| 错误码,在出现EVENT_ASR_ERROR事件时有效,参见错误码查询。 |
onNuiAudioStateChanged:监听音频状态
SDK 通过此回调通知何时应该开始或停止录音。
方法签名
- (void) onNuiAudioStateChanged:(NuiAudioState)state;
NuiAudioState状态说明
| 参数 | 说明 |
|---|---|
| 交互启动,可以打开录音设备进行录音。 |
| 交互停止,可以停止录音。 |
| SDK 实例已释放,可以彻底关闭录音设备。 |
onNuiNeedAudioData:填充待处理音频数据
开始对话后,该回调被连续触发,需在其中提供待处理的音频数据。参数audio_update_manually设置为"true"时可不关注这个回调。
方法签名- (int) onNuiNeedAudioData:(char *)audioData length:(int)len;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| 填充的音频数据。 |
|
| 填充的音频数据的字节数。 |
onNuiAssistEventCallback:辅助数据和信息结果
此回调用于接收 SDK 内部的辅助事件和相关数据。
方法签名- (void) onNuiAssistEventCallback:(NuiCallbackEvent)nuiEvent
info:(char*)info
infoLen:(int)info_len
buffer:(char*)buffer
len:(int)len;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
|
| 回调事件。 |
|
| 无需关注此参数。 |
|
| 无需关注此参数。 |
|
| 辅助数据,比如AI返回的TTS音频。 |
|
| 辅助数据的字节数。 |
onNuiLogTrackCallback:监听追踪日志
此回调用于接收 SDK 内部的详细日志,方便进行问题定位和调试。
- (void) onNuiLogTrackCallback:(NuiSdkLogLevel)level
logMessage:(const char *)log;
NuiCallbackEvent:事件类型
| 事件 | 说明 |
|---|---|
EVENT_TRANSCRIBER_STARTED | 任务启动成功。 |
EVENT_VAD_START | 任务启动后即触发该事件。不代表检测到人声起点。 |
EVENT_VAD_END | 检测到人声终点。 |
EVENT_ASR_PARTIAL_RESULT | 语音识别中间结果。 |
EVENT_ASR_ERROR | 语音对话过程中出现错误。 |
EVENT_MIC_ERROR | 因连续2秒未收到任何音频数据而触发。 |
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_AEC_DATA | AEC回声消除后的音频数据。 |