音频设置最佳实践
在实时互动场景中,人与 AI 的对话和人与人之间的对话在对话节奏、发言连续性和语音语调方面存在显著差异。因此,为了获得更好的对话体验,针对 AI 与人对话的音频设置显得尤为重要。
使用实时互动 iOS/Android SDK 接入对话式 AI 引擎时,你可以参考本文提供的音频设置最佳实践,提升对话的流畅度和可靠性,确保在复杂网络环境中提供更好的用户体验。
服务端设置
调用服务端 API 创建对话式智能体时,音频相关参数采用默认值即可获得最佳音频体验。
客户端设置
集成必需动态库
对话式 AI 引擎最佳音频体验需要使用到以下插件动态库,请确保在项目中集成并加载这些动态库:
- Android
- iOS
设置音频相关参数
本节设置适用于 4.3.1 及以上版本的实时互动 SDK。对于 4.3.1 以下版本的 SDK,推荐升级至 4.5.1 及以上版本,或联系技术支持了解配置方式。
- Android
- iOS
为获得最佳 AI 对话音频体验,你需要完成以下音频相关设置:
- 设置音频场景:在初始化引擎时将音频场景设置为 AI 对话场景。你也可以在加入频道前调用
setAudioScenario
方法将音频场景设置为 AI 对话场景。 - 设置音频相关参数:在加入频道前和音频路由变化(触发
onAudioRouteChanged
回调)时,调用setParameters
方法设置音频相关参数。主要包括音频 3A(回声消除(AEC)、降噪(ANS) 和增益控制(AGC))插件的开关,以及音频采样率、音频处理模式等设置。各参数推荐设定的值参考示例代码。
由于 4.3.1 ~ 4.5.0 版本的 SDK 不支持 AI 对话场景,可修改音频场景为合唱场景 (AUDIO_SCENARIO_CHORUS
) 以提升音频体验,但无法对齐 4.5.1 及以上版本的音频体验。如需获得最佳音频体验,请升级 SDK 至 4.5.1 及以上版本。
以下示例代码封装了一个 setAudioConfigParameters
函数用于设置音频相关参数,并在加入频道前和音频路由发生变化时调用:
private var rtcEngine: RtcEngineEx? = null
private var mAudioRouting = Constants.AUDIO_ROUTE_DEFAULT
// 设置音频配置参数
private fun setAudioConfigParameters(routing: Int) {
mAudioRouting = routing
rtcEngine?.apply {
setParameters("{\"che.audio.aec.split_srate_for_48k\":16000}")
setParameters("{\"che.audio.sf.enabled\":true}")
setParameters("{\"che.audio.sf.stftType\":6}")
setParameters("{\"che.audio.sf.ainlpLowLatencyFlag\":1}")
setParameters("{\"che.audio.sf.ainsLowLatencyFlag\":1}")
setParameters("{\"che.audio.sf.procChainMode\":1}")
setParameters("{\"che.audio.sf.nlpDynamicMode\":1}")
if (routing == Constants.AUDIO_ROUTE_HEADSET // 0
|| routing == Constants.AUDIO_ROUTE_EARPIECE // 1
|| routing == Constants.AUDIO_ROUTE_HEADSETNOMIC // 2
|| routing == Constants.AUDIO_ROUTE_BLUETOOTH_DEVICE_HFP // 5
|| routing == Constants.AUDIO_ROUTE_BLUETOOTH_DEVICE_A2DP) { // 10
setParameters("{\"che.audio.sf.nlpAlgRoute\":0}")
} else {
setParameters("{\"che.audio.sf.nlpAlgRoute\":1}")
}
setParameters("{\"che.audio.sf.ainlpModelPref\":10}")
setParameters("{\"che.audio.sf.nsngAlgRoute\":12}")
setParameters("{\"che.audio.sf.ainsModelPref\":10}")
setParameters("{\"che.audio.sf.nsngPredefAgg\":11}")
setParameters("{\"che.audio.agc.enable\":false}")
}
}
// 创建并初始化 RTC 引擎
fun createRtcEngine(rtcCallback: IRtcEngineEventHandler): RtcEngineEx {
val config = RtcEngineConfig()
config.mContext = AgentApp.instance()
config.mAppId = ServerConfig.rtcAppId
config.mChannelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING
// 设置音频场景为 AI 对话场景(4.5.1 及以上版本支持)
// 4.3.1 ~ 4.5.0 版本设为合唱场景 AUDIO_SCENARIO_CHORUS
config.mAudioScenario = Constants.AUDIO_SCENARIO_AI_CLIENT
// 注册音频路由变化回调
config.mEventHandler = object : IRtcEngineEventHandler() {
override fun onAudioRouteChanged(routing: Int) {
super.onAudioRouteChanged(routing)
// 设置音频相关参数
setAudioConfigParameters(routing)
}
}
try {
rtcEngine = (RtcEngine.create(config) as RtcEngineEx).apply {
// 加载音频插件
loadExtensionProvider("ai_echo_cancellation_extension")
loadExtensionProvider("ai_noise_suppression_extension")
}
} catch (e: Exception) {
Log.e("CovAgoraManager", "createRtcEngine error: $e")
}
return rtcEngine!!
}
// 加入频道
fun joinChannel(rtcToken: String, channelName: String, uid: Int, isIndependent: Boolean = false) {
// 初始化音频配置参数
setAudioConfigParameters(mAudioRouting)
// 配置频道选项并加入频道
val options = ChannelMediaOptions()
options.clientRoleType = CLIENT_ROLE_BROADCASTER
options.publishMicrophoneTrack = true
options.publishCameraTrack = false
options.autoSubscribeAudio = true
options.autoSubscribeVideo = false
val ret = rtcEngine?.joinChannel(rtcToken, channelName, uid, options)
}
为获得最佳 AI 对话音频体验,你需要完成以下音频相关设置:
- 设置音频场景:在初始化引擎时将音频场景设置为 AI 对话场景。你也可以在加入频道前调用
setAudioScenario
方法将音频场景设置为 AI 对话场景。 - 设置音频相关参数:在加入频道前和音频路由发生变化(触发
rtcEngine:didAudioRouteChanged:
回调)时,调用setParameters
方法设置音频相关参数。主要包括音频 3A(回声消除(AEC)、降噪(ANS) 和增益控制(AGC))插件的开关,以及音频采样率、音频处理模式等设置。各参数推荐设定的值参考示例代码。
由于 4.3.1 ~ 4.5.0 版本的 SDK 不支持 AI 对话场景,可修改音频场景为合唱场景 (AgoraAudioScenarioChorus
) 以提升音频体验,但无法对齐 4.5.1 及以上版本的音频体验。如需获得最佳音频体验,请升级 SDK 至 4.5.1 及以上版本。
以下示例代码封装了一个 setAudioConfigParameters
函数用于设置音频相关参数,并在加入频道前和音频路由发生变化时调用:
class RTCManager: NSObject {
private var rtcEngine: AgoraRtcEngineKit!
private var audioDumpEnabled: Bool = false
private var audioRouting = AgoraAudioOutputRouting.default
// 设置音频相关参数
private func setAudioConfigParameters(routing: AgoraAudioOutputRouting) {
audioRouting = routing
rtcEngine.setParameters("{\"che.audio.aec.split_srate_for_48k\":16000}")
rtcEngine.setParameters("{\"che.audio.sf.enabled\":true}")
rtcEngine.setParameters("{\"che.audio.sf.stftType\":6}")
rtcEngine.setParameters("{\"che.audio.sf.ainlpLowLatencyFlag\":1}")
rtcEngine.setParameters("{\"che.audio.sf.ainsLowLatencyFlag\":1}")
rtcEngine.setParameters("{\"che.audio.sf.procChainMode\":1}")
rtcEngine.setParameters("{\"che.audio.sf.nlpDynamicMode\":1}")
if routing == .headset ||
routing == .earpiece ||
routing == .headsetNoMic ||
routing == .bluetoothDeviceHfp ||
routing == .bluetoothDeviceA2dp {
rtcEngine.setParameters("{\"che.audio.sf.nlpAlgRoute\":0}")
} else {
rtcEngine.setParameters("{\"che.audio.sf.nlpAlgRoute\":1}")
}
rtcEngine.setParameters("{\"che.audio.sf.ainlpModelPref\":10}")
rtcEngine.setParameters("{\"che.audio.sf.nsngAlgRoute\":12}")
rtcEngine.setParameters("{\"che.audio.sf.ainsModelPref\":10}")
rtcEngine.setParameters("{\"che.audio.sf.nsngPredefAgg\":11}")
rtcEngine.setParameters("{\"che.audio.agc.enable\":false}")
}
}
extension RTCManager: RTCManagerProtocol {
func createRtcEngine(delegate: AgoraRtcEngineDelegate) -> AgoraRtcEngineKit {
let config = AgoraRtcEngineConfig()
config.appId = AppContext.shared.appId
config.channelProfile = .liveBroadcasting
// 设置音频场景为 AI 对话场景(4.5.1 及以上版本支持)
// 4.3.1 ~ 4.5.0 版本支持合唱场景 .chorus
config.audioScenario = .aiClient
rtcEngine = AgoraRtcEngineKit.sharedEngine(with: config, delegate: delegate)
// 注册音频路由变化回调
rtcEngine.addDelegate(self)
return rtcEngine
}
func joinChannel(rtcToken: String, channelName: String, uid: String) {
// 初始化音频配置参数
setAudioConfigParameters(routing: audioRouting)
// 配置频道选项并加入频道
let options = AgoraRtcChannelMediaOptions()
options.clientRoleType = .broadcaster
options.publishMicrophoneTrack = true
options.publishCameraTrack = false
options.autoSubscribeAudio = true
options.autoSubscribeVideo = false
let ret = rtcEngine.joinChannel(byToken: rtcToken, channelId: channelName, uid: UInt(uid) ?? 0, mediaOptions: options)
}
}
// 实现 AgoraRtcEngineDelegate 接口,处理音频路由变化回调
extension RTCManager: AgoraRtcEngineDelegate {
public func rtcEngine(_ engine: AgoraRtcEngineKit, didAudioRouteChanged routing: AgoraAudioOutputRouting) {
setAudioConfigParameters(routing: routing)
}
}
参考信息
示例项目
声网提供开源的示例代码,你可以参考设置音频相关参数。
- Android
- iOS