|
|
@ -81,6 +81,12 @@ class AgentController extends GetxController { |
|
|
// 打电话模式状态 |
|
|
// 打电话模式状态 |
|
|
final isPhoneCallMode = false.obs; // 是否处于打电话模式 |
|
|
final isPhoneCallMode = false.obs; // 是否处于打电话模式 |
|
|
|
|
|
|
|
|
|
|
|
// 按住说话状态 |
|
|
|
|
|
final isPushToTalkActive = false.obs; // 是否正在按住说话 |
|
|
|
|
|
|
|
|
|
|
|
// 按住说话模式状态 - 用于区分是否处于按住说话模式(即使当前没有按住) |
|
|
|
|
|
final isPushToTalkMode = false.obs; // 是否处于按住说话模式 |
|
|
|
|
|
|
|
|
// 键盘状态 |
|
|
// 键盘状态 |
|
|
final isKeyboardVisible = false.obs; // 键盘是否可见 |
|
|
final isKeyboardVisible = false.obs; // 键盘是否可见 |
|
|
|
|
|
|
|
|
@ -340,7 +346,11 @@ class AgentController extends GetxController { |
|
|
break; |
|
|
break; |
|
|
case AgentServiceEventType.recognitionStopped: |
|
|
case AgentServiceEventType.recognitionStopped: |
|
|
isListening.value = false; |
|
|
isListening.value = false; |
|
|
|
|
|
// 只有在非按住说话模式且非打电话模式下才自动切换到文字模式 |
|
|
|
|
|
// 按住说话模式下应该保持在语音模式,等待下次按住 |
|
|
|
|
|
if (!isPushToTalkMode.value && !isPhoneCallMode.value) { |
|
|
isTextInputMode.value = true; |
|
|
isTextInputMode.value = true; |
|
|
|
|
|
} |
|
|
// isTextInputMode.refresh(); |
|
|
// isTextInputMode.refresh(); |
|
|
Logger.i(TAG, '识别停止'); |
|
|
Logger.i(TAG, '识别停止'); |
|
|
break; |
|
|
break; |
|
|
@ -765,7 +775,7 @@ class AgentController extends GetxController { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 切换输入模式 |
|
|
// 切换输入模式(改造为按住说话模式) |
|
|
void toggleInputMode() async { |
|
|
void toggleInputMode() async { |
|
|
// 如果当前在图片输入模式,先清除 |
|
|
// 如果当前在图片输入模式,先清除 |
|
|
if (isImageInputActive.value) { |
|
|
if (isImageInputActive.value) { |
|
|
@ -780,7 +790,7 @@ class AgentController extends GetxController { |
|
|
// context: Get.context!, |
|
|
// context: Get.context!, |
|
|
permissionType: Permission.microphone, |
|
|
permissionType: Permission.microphone, |
|
|
permissionName: '麦克风', |
|
|
permissionName: '麦克风', |
|
|
explanationText: '语音识别与翻译功能需要访问麦克风。', |
|
|
explanationText: '语音识别功能需要访问麦克风。', |
|
|
permanentDenialText: '您已永久拒绝麦克风权限,请前往系统设置开启权限。', |
|
|
permanentDenialText: '您已永久拒绝麦克风权限,请前往系统设置开启权限。', |
|
|
settingsButtonText: '去设置', |
|
|
settingsButtonText: '去设置', |
|
|
cancelButtonText: '取消', |
|
|
cancelButtonText: '取消', |
|
|
@ -792,13 +802,15 @@ class AgentController extends GetxController { |
|
|
|
|
|
|
|
|
isTextInputMode.toggle(); |
|
|
isTextInputMode.toggle(); |
|
|
|
|
|
|
|
|
// 切换到语音模式时,直接开始语音输入 |
|
|
// 切换到语音模式时,启用按住说话模式 |
|
|
if (!isTextInputMode.value) { |
|
|
// 切换到文本模式时,禁用按住说话模式并停止任何正在进行的语音输入 |
|
|
startVoiceInput(); |
|
|
if (isTextInputMode.value) { |
|
|
} |
|
|
// 切换到文本模式 |
|
|
// 切换到文本模式时,直接停止语音输入 |
|
|
isPushToTalkMode.value = false; |
|
|
else { |
|
|
|
|
|
stopVoiceInput(); |
|
|
stopVoiceInput(); |
|
|
|
|
|
} else { |
|
|
|
|
|
// 切换到语音模式,启用按住说话模式 |
|
|
|
|
|
isPushToTalkMode.value = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -1057,6 +1069,8 @@ class AgentController extends GetxController { |
|
|
|
|
|
|
|
|
// 切换到语音模式并开始语音输入 |
|
|
// 切换到语音模式并开始语音输入 |
|
|
isTextInputMode.value = false; |
|
|
isTextInputMode.value = false; |
|
|
|
|
|
// 打电话模式不使用按住说话模式,而是持续语音输入 |
|
|
|
|
|
isPushToTalkMode.value = false; |
|
|
await startVoiceInput(); |
|
|
await startVoiceInput(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -1071,8 +1085,40 @@ class AgentController extends GetxController { |
|
|
// 停止语音输入 |
|
|
// 停止语音输入 |
|
|
await stopVoiceInput(); |
|
|
await stopVoiceInput(); |
|
|
|
|
|
|
|
|
// 切换回文本模式 |
|
|
// 切换回文本模式,并禁用按住说话模式 |
|
|
isTextInputMode.value = true; |
|
|
isTextInputMode.value = true; |
|
|
|
|
|
isPushToTalkMode.value = false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 开始按住说话 |
|
|
|
|
|
void startPushToTalk() async { |
|
|
|
|
|
Logger.i(TAG, '🎤 开始按住说话'); |
|
|
|
|
|
|
|
|
|
|
|
// 只有在语音模式且按住说话模式下才能按住说话 |
|
|
|
|
|
if (isTextInputMode.value || !isPushToTalkMode.value) return; |
|
|
|
|
|
|
|
|
|
|
|
// 如果已经在按住说话,不重复开始 |
|
|
|
|
|
if (isPushToTalkActive.value) return; |
|
|
|
|
|
|
|
|
|
|
|
// 设置按住说话状态 |
|
|
|
|
|
isPushToTalkActive.value = true; |
|
|
|
|
|
|
|
|
|
|
|
// 开始语音识别 |
|
|
|
|
|
await startVoiceInput(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 结束按住说话 |
|
|
|
|
|
void endPushToTalk() async { |
|
|
|
|
|
Logger.i(TAG, '🎤 结束按住说话'); |
|
|
|
|
|
|
|
|
|
|
|
// 如果不在按住说话状态,直接返回 |
|
|
|
|
|
if (!isPushToTalkActive.value) return; |
|
|
|
|
|
|
|
|
|
|
|
// 清除按住说话状态(但保持按住说话模式) |
|
|
|
|
|
isPushToTalkActive.value = false; |
|
|
|
|
|
|
|
|
|
|
|
// 停止语音识别 |
|
|
|
|
|
await stopVoiceInput(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 获取音乐播放状态 |
|
|
// 获取音乐播放状态 |
|
|
|