import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:demo001/scenes/translate/TranslateState.dart'; import 'package:demo001/tools/audio_tool.dart'; import 'package:demo001/xunfei/recognition_result/recognition_content/recognition_content.dart'; import 'package:demo001/xunfei/xunfei_translate.dart'; import 'package:get/get.dart'; import 'package:logger/logger.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:record/record.dart'; class TranslateLogic extends GetxController { late Directory savedirectory; final state = TranslateState(); late XunFeiTranslate xunfei; late AudioRecorder _recorder; @override void onInit() { super.onInit(); _requestPermissions(); _recorder = AudioRecorder(); xunfei = XunFeiTranslate( appId: "137dc132", apiKey: "1c1891a475e71250ecd1320303ad6545", apiSecret: "MjZhNDA1NTI1NWZkZDQxOTMxYzMyN2Yw", onRecognitionResult: _handleRecognaitionData, onStreamtransResult: _handleTranslateData, onAudioResult: _handleAudioData); } // 初始化录音器 void _initRecorder() async { try { // 获取外部存储目录路径 savedirectory = (await getExternalStorageDirectory())!; state.isRecorderReady.value = true; _log('录音器初始化成功'); } catch (e) { _log('初始化录音器失败: $e'); state.isRecorderReady.value = false; } } // 请求麦克风权限 void _requestPermissions() async { try { if (await Permission.microphone.request().isGranted) { _log('麦克风权限已授予'); } else { _log('麦克风权限被拒绝'); } } catch (e) { _log('请求麦克风权限失败: $e'); } } // 切换按钮状态 void toggleCallStatus() { if (!state.isRecording.value) { //开始通话 _startRecorder(); } else { //结束通话 _stopRecorder(); } state.isRecording.value = !state.isRecording.value; } //开始录音 void _startRecorder() async { try { if (!state.isRecorderReady.value) { _initRecorder(); } if (state.isRecording.value) return; // 防止重复调用 Stream dataStream = await _recorder.startStream(RecordConfig( sampleRate: 16000, encoder: AudioEncoder.pcm16bits, numChannels: 1)); xunfei.starttranslate(dataStream); state.isRecording.value = true; _log('录音开始'); } catch (e) { _log('录音开始 异常: $e'); } } //结束录音 void _stopRecorder() async { try { if (!state.isRecording.value) return; // 防止重复调用 await _recorder.stop(); await _recorder.cancel(); xunfei.stoptranslate(); state.isRecorderReady.value = false; state.isRecording.value = false; _log('录音停止'); } catch (e) { _log('录音停止 异常: $e'); } } void _handleRecognaitionData(result) { KDXFSentenceModel model; try { final index = state.kdxfSentenceList.indexWhere((KDXFSentenceModel e) { return e.sid == result.header?.sid; }); if (index != -1) { model = state.kdxfSentenceList[index]; } else { final recogContextStr = utf8.decode( base64Decode(result.payload?.recognitionResults?.text ?? '')); final model = RecognitionContent.fromJson(jsonDecode(recogContextStr)); model = KDXFSentenceModel( content: "", sid: result.header?.sid ?? '', transResult: '', audioPath: '', perviousWs: model.ws ?? []); } } catch (e) { print("接收识别结果异常 $e"); } } void _handleTranslateData(result) {} void _handleAudioData(AudioModel model) {} void _log(String msg) { Logger().f("LIWEI---------------:$msg"); } }