|
- 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<Uint8List> 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");
- }
- }
|