3 changed files with 193 additions and 20 deletions
@ -1,19 +1,98 @@ |
|||||
|
import 'dart:async'; |
||||
|
|
||||
import 'package:flutter/material.dart'; |
import 'package:flutter/material.dart'; |
||||
import 'package:get/get.dart'; |
import 'package:get/get.dart'; |
||||
|
|
||||
|
import '../../../data/services/asr_service.dart'; |
||||
|
|
||||
class MeetingController extends GetxController |
class MeetingController extends GetxController |
||||
with GetSingleTickerProviderStateMixin { |
with GetSingleTickerProviderStateMixin { |
||||
late AnimationController lottieController; |
late AnimationController lottieController; |
||||
|
late AsrService _asrService; |
||||
|
|
||||
|
Timer? timer; |
||||
|
|
||||
|
RxBool isRecording = false.obs; //是否录音中 |
||||
|
RxInt seconds = 0.obs; |
||||
|
|
||||
|
RxString intermediateContent = ''.obs; |
||||
|
RxString finalContent = ''.obs; |
||||
|
|
||||
|
StreamSubscription? _recognitionSubscription; |
||||
|
|
||||
@override |
@override |
||||
void onInit() { |
void onInit() { |
||||
super.onInit(); |
super.onInit(); |
||||
lottieController = AnimationController(vsync: this); |
lottieController = AnimationController(vsync: this); |
||||
|
_asrService = Get.find<AsrService>(); |
||||
} |
} |
||||
|
|
||||
@override |
@override |
||||
void onClose() { |
void onClose() { |
||||
lottieController.dispose(); |
lottieController.dispose(); |
||||
|
timer?.cancel(); |
||||
|
_asrService.stopContinuousRecognition(); |
||||
|
_recognitionSubscription?.cancel(); |
||||
super.onClose(); |
super.onClose(); |
||||
} |
} |
||||
|
|
||||
|
// 点击开始、暂停按钮 |
||||
|
void recorderHandle() { |
||||
|
if (isRecording.value) { |
||||
|
_pause(); |
||||
|
} else { |
||||
|
_start(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 开始 |
||||
|
void _start() async { |
||||
|
await _startRecorder(); |
||||
|
lottieController.repeat(); |
||||
|
isRecording.value = true; |
||||
|
timer = Timer.periodic(const Duration(seconds: 1), (_) => seconds++); |
||||
|
} |
||||
|
|
||||
|
// 暂停 |
||||
|
void _pause() async { |
||||
|
await _stopRecorder(); |
||||
|
lottieController.stop(); |
||||
|
isRecording.value = false; |
||||
|
timer?.cancel(); |
||||
|
} |
||||
|
|
||||
|
//开始录音 |
||||
|
Future<void> _startRecorder() async { |
||||
|
final recognitionStream = await _asrService.startContinuousRecognition(); |
||||
|
_recognitionSubscription = recognitionStream.listen( |
||||
|
_handleRecognitionEvent, |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
//结束录音 |
||||
|
Future<void> _stopRecorder() async { |
||||
|
await _asrService.stopContinuousRecognition(); |
||||
|
_recognitionSubscription?.cancel(); |
||||
|
} |
||||
|
|
||||
|
// 处理语音识别事件 |
||||
|
void _handleRecognitionEvent(RecognitionEvent event) { |
||||
|
switch (event.type) { |
||||
|
case RecognitionEventType.intermediateResult: |
||||
|
intermediateContent.value = event.text; |
||||
|
break; |
||||
|
case RecognitionEventType.finalResult: |
||||
|
finalContent.value += event.text; |
||||
|
intermediateContent.value = ''; |
||||
|
break; |
||||
|
default: |
||||
|
// 不做任何处理 |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 完成 |
||||
|
void complete() async { |
||||
|
Get.back(); |
||||
|
} |
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue