import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:audio_waveforms/audio_waveforms.dart'; 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/streamtrans_result/trans_content/trans_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('麦克风权限被拒绝'); } if (await Permission.storage.request().isGranted) { // 权限已授予 } 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; print("添加到对象列表中 $text "); 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; print("添加到对象列表中 $text "); model = KDXFSentenceModel( content: text, sid: result.header?.sid ?? '', transResult: '', audioPath: '', perviousWs: ctx.ws ?? [], ); state.kdxfSentenceList.add(model); state.kdxfSentenceList.refresh(); } } catch (e) { print("接收识别结果异常 $e"); } } void _handleTranslateData(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 transStr = utf8.decode( base64Decode(result.payload?.streamtransResults?.text ?? '')); final trctx = TransContent.fromJson(jsonDecode(transStr)); if (trctx.isFinal == 0) { //更新 String text = ''; model.isFinalTransString.forEach((e) { text = text + e; }); text = text + (trctx.dst ?? ''); model.transResult = text; state.kdxfSentenceList.refresh(); } else if (trctx.isFinal == 1) { model.isFinalTransString.add(trctx.dst ?? ''); String text = ''; model.isFinalTransString.forEach((e) { text = text + e; }); model.transResult = text; state.kdxfSentenceList.refresh(); } } else { final transStr = utf8.decode( base64Decode(result.payload?.streamtransResults?.text ?? '')); final textModel = TransContent.fromJson(jsonDecode(transStr)); text = textModel.dst ?? ''; final model = KDXFSentenceModel( content: '', sid: result.header?.sid ?? '', transResult: text, audioPath: '', perviousWs: []); state.kdxfSentenceList.add(model); state.kdxfSentenceList.refresh(); } } catch (e) { print("接收识别结果异常 $e"); } } //处理音频数据 void _handleAudioData(AudioModel audo) { KDXFSentenceModel model; AudioTool.share.addAudioChunk( model: audo, onPlaying: () {}, onPlayEnd: () {}, onPath: (path) async { final file = File(path); if (file.existsSync()) { print("File exists"); } else { print("File does not exist"); } if (state.kdxfSentenceList.isNotEmpty) { try { print("收到音频数据:$path --------------------------"); final index = state.kdxfSentenceList.indexWhere((KDXFSentenceModel e) { return e.sid == audo.sid; }); model = state.kdxfSentenceList[index]; model.audioPath = path; print("初始化和播放器 !"); await model.playerController.preparePlayer(path: path); int duration = (await model.playerController.getDuration()); model.audioDuration = duration; print("设置播放模式 !"); model.playerController .setFinishMode(finishMode: FinishMode.pause); if (!xunfei.isspeaking) { print("可以播放:$path --------------------------"); xunfei.isRecording = false; //为说话 可以播放 await model.playerController.startPlayer(); model.playerController.onCompletion.listen((_) { model.playerController.seekTo(0); xunfei.isRecording = true; }); } state.kdxfSentenceList.refresh(); } catch (e) { print("播放音频异常:$e"); } } }); } void kdxfPlayAudio(KDXFSentenceModel model) async { if (!xunfei.isspeaking) { model.playerController.startPlayer(); } } void _log(String msg) { Logger().f("LIWEI---------------:$msg"); } }