From 27c9614be357308b1020f75efc1ac40e62591440 Mon Sep 17 00:00:00 2001 From: "sky.min" Date: Fri, 16 Jan 2026 10:10:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=B9=E6=9E=9C=E6=89=8B=E6=9C=BA=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=AF=B9=E8=AE=B2=E9=94=81=E7=89=88=E9=9F=B3=E9=A2=91?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=A2=9E=E7=9B=8A=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../native/talk_view_native_decode_logic.dart | 23 +++++++++++++--- .../views/talkView/talk_view_logic.dart | 27 ++++++++++++++----- 2 files changed, 41 insertions(+), 9 deletions(-) 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); // 启动定时发送器(仅启动一次)