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