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
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;
|
|
}
|
|
}
|
|
}
|