您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 
 
 
 

136 行
3.9 KiB

  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'dart:typed_data';
  4. import 'package:demo001/scenes/translate/TranslateState.dart';
  5. import 'package:demo001/tools/audio_tool.dart';
  6. import 'package:demo001/xunfei/recognition_result/recognition_content/recognition_content.dart';
  7. import 'package:demo001/xunfei/xunfei_translate.dart';
  8. import 'package:get/get.dart';
  9. import 'package:logger/logger.dart';
  10. import 'package:path_provider/path_provider.dart';
  11. import 'package:permission_handler/permission_handler.dart';
  12. import 'package:record/record.dart';
  13. class TranslateLogic extends GetxController {
  14. late Directory savedirectory;
  15. final state = TranslateState();
  16. late XunFeiTranslate xunfei;
  17. late AudioRecorder _recorder;
  18. @override
  19. void onInit() {
  20. super.onInit();
  21. _requestPermissions();
  22. _recorder = AudioRecorder();
  23. xunfei = XunFeiTranslate(
  24. appId: "137dc132",
  25. apiKey: "1c1891a475e71250ecd1320303ad6545",
  26. apiSecret: "MjZhNDA1NTI1NWZkZDQxOTMxYzMyN2Yw",
  27. onRecognitionResult: _handleRecognaitionData,
  28. onStreamtransResult: _handleTranslateData,
  29. onAudioResult: _handleAudioData);
  30. }
  31. // 初始化录音器
  32. void _initRecorder() async {
  33. try {
  34. // 获取外部存储目录路径
  35. savedirectory = (await getExternalStorageDirectory())!;
  36. state.isRecorderReady.value = true;
  37. _log('录音器初始化成功');
  38. } catch (e) {
  39. _log('初始化录音器失败: $e');
  40. state.isRecorderReady.value = false;
  41. }
  42. }
  43. // 请求麦克风权限
  44. void _requestPermissions() async {
  45. try {
  46. if (await Permission.microphone.request().isGranted) {
  47. _log('麦克风权限已授予');
  48. } else {
  49. _log('麦克风权限被拒绝');
  50. }
  51. } catch (e) {
  52. _log('请求麦克风权限失败: $e');
  53. }
  54. }
  55. // 切换按钮状态
  56. void toggleCallStatus() {
  57. if (!state.isRecording.value) {
  58. //开始通话
  59. _startRecorder();
  60. } else {
  61. //结束通话
  62. _stopRecorder();
  63. }
  64. state.isRecording.value = !state.isRecording.value;
  65. }
  66. //开始录音
  67. void _startRecorder() async {
  68. try {
  69. if (!state.isRecorderReady.value) {
  70. _initRecorder();
  71. }
  72. if (state.isRecording.value) return; // 防止重复调用
  73. Stream<Uint8List> dataStream = await _recorder.startStream(RecordConfig(
  74. sampleRate: 16000, encoder: AudioEncoder.pcm16bits, numChannels: 1));
  75. xunfei.starttranslate(dataStream);
  76. state.isRecording.value = true;
  77. _log('录音开始');
  78. } catch (e) {
  79. _log('录音开始 异常: $e');
  80. }
  81. }
  82. //结束录音
  83. void _stopRecorder() async {
  84. try {
  85. if (!state.isRecording.value) return; // 防止重复调用
  86. await _recorder.stop();
  87. await _recorder.cancel();
  88. xunfei.stoptranslate();
  89. state.isRecorderReady.value = false;
  90. state.isRecording.value = false;
  91. _log('录音停止');
  92. } catch (e) {
  93. _log('录音停止 异常: $e');
  94. }
  95. }
  96. void _handleRecognaitionData(result) {
  97. KDXFSentenceModel model;
  98. try {
  99. final index = state.kdxfSentenceList.indexWhere((KDXFSentenceModel e) {
  100. return e.sid == result.header?.sid;
  101. });
  102. if (index != -1) {
  103. model = state.kdxfSentenceList[index];
  104. } else {
  105. final recogContextStr = utf8.decode(
  106. base64Decode(result.payload?.recognitionResults?.text ?? ''));
  107. final model = RecognitionContent.fromJson(jsonDecode(recogContextStr));
  108. model = KDXFSentenceModel(
  109. content: "",
  110. sid: result.header?.sid ?? '',
  111. transResult: '',
  112. audioPath: '',
  113. perviousWs: model.ws ?? []);
  114. }
  115. } catch (e) {
  116. print("接收识别结果异常 $e");
  117. }
  118. }
  119. void _handleTranslateData(result) {}
  120. void _handleAudioData(AudioModel model) {}
  121. void _log(String msg) {
  122. Logger().f("LIWEI---------------:$msg");
  123. }
  124. }