diff --git a/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart b/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart index e3220fe1..74710c87 100644 --- a/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart +++ b/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart @@ -530,8 +530,21 @@ class TalkViewNativeDecodeLogic extends BaseGetXController { /// 播放音频数据 void _playAudioData(TalkData talkData) async { - if (state.isOpenVoice.value && state.isLoading.isFalse && state.isRecordingAudio.value == false) { + if (state.isOpenVoice.value && state.isLoading.isFalse) { + // 先进行解码和降噪处理(根据音频处理顺序规范:先降噪后增益) List encodedData = G711Tool.decode(talkData.content, 0); // 0表示A-law + + // 根据动态音频增益补偿策略,实现基于状态的动态增益补偿 + if (Platform.isIOS) { + if (state.isRecordingAudio.value) { + // 当正在录音时,提高接收音频的增益,以匹配锁端第一次说话的音量 + encodedData = _applyGain(encodedData, 1.5); + } else { + // 非录音状态下使用标准增益 + encodedData = _applyGain(encodedData, 1.2); + } + } + // 将 PCM 数据转换为 PcmArrayInt16 final PcmArrayInt16 fromList = PcmArrayInt16.fromList(encodedData); FlutterPcmSound.feed(fromList); @@ -871,10 +884,14 @@ class TalkViewNativeDecodeLogic extends BaseGetXController { // 音频帧处理 Future _onFrame(List frame) async { - final applyGain = _applyGain(frame, 1.6); + // 根据平台设置不同的音频增益系数,iOS使用较低增益避免影响接收端灵敏度 + double gainFactor = Platform.isIOS ? 0.6 : 1.2; + + // 应用增益 + final gainApplied = _applyGain(frame, gainFactor); // 编码为G711数据 - List encodedData = G711Tool.encode(applyGain, 0); // 0表示A-law + List encodedData = G711Tool.encode(gainApplied, 0); // 0表示A-law _bufferedAudioFrames.addAll(encodedData); // 启动定时发送器(仅启动一次) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 6f51b388..ab3c73a4 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -203,10 +203,21 @@ class TalkViewLogic extends BaseGetXController { /// 播放音频数据 void _playAudioData(TalkData talkData) async { if (state.isOpenVoice.value) { - final list = - G711().decodeAndDenoise(talkData.content, true, 8000, 300, 150); - // // 将 PCM 数据转换为 PcmArrayInt16 - final PcmArrayInt16 fromList = PcmArrayInt16.fromList(list); + List processedData = G711().decodeAndDenoise(talkData.content, true, 8000, 300, 150); + + // 根据动态音频增益补偿策略,实现基于状态的动态增益补偿 + if (Platform.isIOS) { + if (state.isRecordingAudio.value) { + // 当正在录音时,提高接收音频的增益,以匹配锁端第一次说话的音量 + processedData = _applyGain(processedData, 1.5); + } else { + // 非录音状态下使用标准增益 + processedData = _applyGain(processedData, 1.2); + } + } + + // 将 PCM 数据转换为 PcmArrayInt16 + final PcmArrayInt16 fromList = PcmArrayInt16.fromList(processedData); FlutterPcmSound.feed(fromList); if (!state.isPlaying.value) { FlutterPcmSound.play(); @@ -651,10 +662,14 @@ class TalkViewLogic extends BaseGetXController { // 音频帧处理 Future _onFrame(List frame) async { - final applyGain = _applyGain(frame, 1.6); + // 根据平台设置不同的音频增益系数,iOS使用较低增益避免影响接收端灵敏度 + double gainFactor = Platform.isIOS ? 0.6 : 1.2; + + // 应用增益 + final gainApplied = _applyGain(frame, gainFactor); // 编码为G711数据 - List encodedData = G711Tool.encode(applyGain, 0); // 0表示A-law + List encodedData = G711Tool.encode(gainApplied, 0); // 0表示A-law _bufferedAudioFrames.addAll(encodedData); // 启动定时发送器(仅启动一次)