|
|
|
@ -36,6 +36,11 @@ class TranslationController extends GetxController { |
|
|
|
final bleManager = Get.find<BleManager>(); |
|
|
|
// 音频输入源 |
|
|
|
bool _audioSourceType = false; |
|
|
|
// 倒计时器 |
|
|
|
|
|
|
|
final RxString recordDurationText = '00:00'.obs; |
|
|
|
Timer? _recordTimer; |
|
|
|
int _seconds = 0; |
|
|
|
// 存储相关 |
|
|
|
static const String _historyKey = 'translation_history'; |
|
|
|
static const String _sourceLanguageKey = 'translation_source_language'; |
|
|
|
@ -198,7 +203,7 @@ class TranslationController extends GetxController { |
|
|
|
return true; |
|
|
|
} else { |
|
|
|
Logger.d("Permission", "用户未授予存储权限"); |
|
|
|
return false; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
Logger.e("Permission", "请求存储权限时出错: $e"); |
|
|
|
@ -267,16 +272,45 @@ class TranslationController extends GetxController { |
|
|
|
Future<void> toggleisRecord() async { |
|
|
|
isRecording.toggle(); |
|
|
|
if (isRecording.value && isRecognizing.value) { |
|
|
|
// 使用可读性更好的时间格式 |
|
|
|
final formattedTime = |
|
|
|
DateFormat('yyyyMMdd_HHmmss').format(DateTime.now()); |
|
|
|
await _asrService.enableRecord( |
|
|
|
"${dir.path}/${currentModeTitle.value.tr}_$formattedTime.wav"); |
|
|
|
startRecording(); |
|
|
|
} else if (!isRecording.value) { |
|
|
|
await _asrService.stopRecord(true); |
|
|
|
stopRecording(); |
|
|
|
} else {} |
|
|
|
} |
|
|
|
|
|
|
|
Future<void> startRecording() async { |
|
|
|
final bool storage = await _requestStoragePermission(); |
|
|
|
if (!storage) { |
|
|
|
Logger.d("Permission", "未授予存储权限,无法提供录音功能"); |
|
|
|
return; |
|
|
|
} |
|
|
|
//isRecording.value = true; |
|
|
|
_seconds = 0; |
|
|
|
recordDurationText.value = '00:00'; |
|
|
|
_recordTimer = Timer.periodic(Duration(seconds: 1), (_) { |
|
|
|
_seconds++; |
|
|
|
final minutes = (_seconds ~/ 60).toString().padLeft(2, '0'); |
|
|
|
final seconds = (_seconds % 60).toString().padLeft(2, '0'); |
|
|
|
recordDurationText.value = '$minutes:$seconds'; |
|
|
|
}); |
|
|
|
|
|
|
|
// 启动实际录音逻辑 |
|
|
|
// ... |
|
|
|
final formattedTime = DateFormat('yyyyMMdd_HHmmss').format(DateTime.now()); |
|
|
|
await _asrService.enableRecord( |
|
|
|
"${dir.path}/${currentModeTitle.value.tr}_$formattedTime.wav"); |
|
|
|
} |
|
|
|
|
|
|
|
Future<void> stopRecording() async { |
|
|
|
_recordTimer?.cancel(); |
|
|
|
_recordTimer = null; |
|
|
|
isRecording.value = false; |
|
|
|
recordDurationText.value = '00:00'; |
|
|
|
await _asrService.stopRecord(true); |
|
|
|
// 停止实际录音逻辑 |
|
|
|
// ... |
|
|
|
} |
|
|
|
|
|
|
|
// 开始语音识别 |
|
|
|
Future<void> startRecognition() async { |
|
|
|
Logger.info('开始语音识别'); |
|
|
|
@ -343,15 +377,7 @@ class TranslationController extends GetxController { |
|
|
|
await _asrService.startContinuousRecognition(_audioSourceType); |
|
|
|
isRecognizing.value = true; |
|
|
|
if (isRecording.value && isRecognizing.value) { |
|
|
|
final bool storage = await _requestStoragePermission(); |
|
|
|
if (!storage) { |
|
|
|
Logger.d("Permission", "未授予存储权限,无法提供录音功能"); |
|
|
|
return; |
|
|
|
} |
|
|
|
final formattedTime = |
|
|
|
DateFormat('yyyyMMdd_HHmmss').format(DateTime.now()); |
|
|
|
await _asrService.enableRecord( |
|
|
|
"${dir.path}/${currentModeTitle.value.tr}_$formattedTime.wav"); |
|
|
|
startRecording(); |
|
|
|
} |
|
|
|
// 监听识别结果 |
|
|
|
_recognitionSubscription?.cancel(); |
|
|
|
@ -411,7 +437,7 @@ class TranslationController extends GetxController { |
|
|
|
|
|
|
|
saveTranslationHistory(); |
|
|
|
} |
|
|
|
|
|
|
|
stopRecording(); |
|
|
|
currentSessionId = null; |
|
|
|
} catch (e) { |
|
|
|
Logger.error('停止语音识别失败: ${e.toString()}'); |
|
|
|
@ -607,7 +633,7 @@ class TranslationController extends GetxController { |
|
|
|
if (isRecognizing.value) { |
|
|
|
await stopRecognition(); |
|
|
|
} |
|
|
|
await _asrService.stopRecord(true); |
|
|
|
stopRecording(); |
|
|
|
_translationDebounceTimer?.cancel(); |
|
|
|
await _ttsService.stop(); |
|
|
|
} catch (e) { |
|
|
|
|