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/phonetic_dictation/phonetic_dictaion_model/w.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; String text = ""; try { final index = state.kdxfSentenceList.indexWhere((KDXFSentenceModel e) { return e.sid == result.header?.sid; }); if (index != -1) { model = state.kdxfSentenceList[index]; final recogContextStr = utf8.decode( base64Decode(result.payload?.recognitionResults?.text ?? '')); final ctx = RecognitionContent.fromJson(jsonDecode(recogContextStr)); if (ctx.pgs == 'apd') { String text = state.kdxfSentenceList[index].content; state.kdxfSentenceList[index].contentList.add(ctx); ctx.ws!.forEach((e) { e.cw?.forEach((e2) { text = text + (e2.w ?? ''); }); }); if (text.trim() == '') return; state.kdxfSentenceList[index].content = text; state.kdxfSentenceList.refresh(); } else if (ctx.pgs == 'rpl') { String text = ''; for (var i = ctx.rg?[0]; i! <= ctx.rg![1]; i++) { state.kdxfSentenceList[index].contentList.removeWhere((ee) { return ee.sn == i; }); } state.kdxfSentenceList[index].contentList.add(ctx); state.kdxfSentenceList[index].contentList.forEach((e) { e.ws?.forEach((ee) { ee.cw?.forEach((e2) { text = text + (e2.w ?? ''); }); }); }); if (text.trim() == '') return; state.kdxfSentenceList[index].content = text; state.kdxfSentenceList.refresh(); // } } } else { final recogContextStr = utf8.decode( base64Decode(result.payload?.recognitionResults?.text ?? '')); final ctx = RecognitionContent.fromJson(jsonDecode(recogContextStr)); ctx.ws!.forEach((e) { e.cw?.forEach((e2) { text = text + (e2.w ?? ''); }); }); if (text == '') return; model = KDXFSentenceModel( content: text, sid: result.header?.sid ?? '', transResult: '', audioPath: '', perviousWs: (ctx.ws ?? []) as List, ); state.kdxfSentenceList.add(model); state.kdxfSentenceList.refresh(); } } catch (e) { print("接收识别结果异常 $e"); } } void _handleTranslateData(result) {} void _handleAudioData(AudioModel model) {} void kdxfPlayAudio(KDXFSentenceModel model) async { model.playerController.startPlayer(); } void _log(String msg) { Logger().f("LIWEI---------------:$msg"); } }