You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.6 KiB

import 'dart:async';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import '../../core/utils/logger.dart';
/// 音频处理服务
///
/// 提供回音消除、降噪和语音活动检测等功能
class AudioProcessingService extends GetxService {
static const MethodChannel _channel = MethodChannel('com.deep_voice.audio_processing');
// 状态变量
final _isEchoCancellationEnabled = false.obs;
final _isNoiseSuppressionEnabled = false.obs;
final _isVoiceActivityDetectionEnabled = false.obs;
// 获取可观察状态
RxBool get isEchoCancellationEnabled => _isEchoCancellationEnabled;
RxBool get isNoiseSuppressionEnabled => _isNoiseSuppressionEnabled;
RxBool get isVoiceActivityDetectionEnabled => _isVoiceActivityDetectionEnabled;
AudioProcessingService() {
_initPlatformState();
}
/// 初始化平台状态
Future<void> _initPlatformState() async {
try {
final bool isEchoCancellationAvailable = await _channel.invokeMethod('isEchoCancellationAvailable') ?? false;
final bool isNoiseSuppressionAvailable = await _channel.invokeMethod('isNoiseSuppressionAvailable') ?? false;
Logger.info('回音消除可用: $isEchoCancellationAvailable');
Logger.info('噪声抑制可用: $isNoiseSuppressionAvailable');
} catch (e) {
Logger.error('初始化音频处理服务失败: $e');
}
}
/// 为指定的音频会话ID启用回音消除
Future<bool> enableEchoCancellation(int audioSessionId) async {
try {
final bool result = await _channel.invokeMethod('enableEchoCancellation', {
'audioSessionId': audioSessionId,
}) ?? false;
_isEchoCancellationEnabled.value = result;
Logger.info('启用回音消除${result ? "成功" : "失败"}');
return result;
} catch (e) {
Logger.error('启用回音消除失败: $e');
return false;
}
}
/// 禁用回音消除
Future<bool> disableEchoCancellation() async {
try {
final bool result = await _channel.invokeMethod('disableEchoCancellation') ?? false;
_isEchoCancellationEnabled.value = !result;
Logger.info('禁用回音消除${result ? "成功" : "失败"}');
return result;
} catch (e) {
Logger.error('禁用回音消除失败: $e');
return false;
}
}
/// 为指定的音频会话ID启用噪声抑制
Future<bool> enableNoiseSuppression(int audioSessionId) async {
try {
final bool result = await _channel.invokeMethod('enableNoiseSuppression', {
'audioSessionId': audioSessionId,
}) ?? false;
_isNoiseSuppressionEnabled.value = result;
Logger.info('启用噪声抑制${result ? "成功" : "失败"}');
return result;
} catch (e) {
Logger.error('启用噪声抑制失败: $e');
return false;
}
}
/// 禁用噪声抑制
Future<bool> disableNoiseSuppression() async {
try {
final bool result = await _channel.invokeMethod('disableNoiseSuppression') ?? false;
_isNoiseSuppressionEnabled.value = !result;
Logger.info('禁用噪声抑制${result ? "成功" : "失败"}');
return result;
} catch (e) {
Logger.error('禁用噪声抑制失败: $e');
return false;
}
}
/// 获取当前录音的音频会话ID
Future<int?> getAudioSessionId() async {
try {
final int? sessionId = await _channel.invokeMethod('getAudioSessionId');
Logger.info('获取音频会话ID: $sessionId');
return sessionId;
} catch (e) {
Logger.error('获取音频会话ID失败: $e');
return null;
}
}
}