EG/plugins/user/voice_control/commands/command_processor.py
2025-12-12 16:16:15 +08:00

1202 lines
43 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
命令处理器模块
负责处理语音命令并执行相应操作
"""
import time
import re
from typing import Dict, Any, List, Optional, Callable
import threading
class CommandProcessor:
"""
命令处理器
负责处理语音命令并执行相应操作
"""
def __init__(self, plugin):
"""
初始化命令处理器
Args:
plugin: 语音控制插件实例
"""
self.plugin = plugin
self.enabled = False
self.initialized = False
# 命令映射
self.command_mappings = {}
# 命令组
self.command_groups = {}
# 命令历史
self.command_history = []
self.max_history_size = 1000
# 命令配置
self.command_config = {
'enable_fuzzy_matching': True,
'fuzzy_threshold': 0.7,
'enable_context_commands': True,
'context_timeout': 30.0,
'enable_chained_commands': True,
'max_chain_length': 5,
'enable_confirmation': True,
'confirmation_threshold': 0.9
}
# 上下文管理
self.command_context = {
'current_context': 'default',
'context_stack': [],
'context_start_time': 0.0,
'context_variables': {}
}
# 命令链
self.command_chain = {
'is_active': False,
'commands': [],
'chain_start_time': 0.0
}
# 统计信息
self.stats = {
'commands_processed': 0,
'commands_executed': 0,
'commands_failed': 0,
'fuzzy_matches': 0,
'exact_matches': 0,
'context_commands': 0,
'chained_commands': 0
}
# 回调函数
self.command_callbacks = {
'command_received': [],
'command_processed': [],
'command_executed': [],
'command_failed': [],
'context_changed': [],
'chain_started': [],
'chain_completed': []
}
# 时间戳记录
self.last_command_time = 0.0
self.last_context_change = 0.0
print("✓ 命令处理器已创建")
def initialize(self) -> bool:
"""
初始化命令处理器
Returns:
是否初始化成功
"""
try:
# 初始化默认命令映射
self._initialize_default_commands()
# 初始化命令组
self._initialize_command_groups()
self.initialized = True
print("✓ 命令处理器初始化完成")
return True
except Exception as e:
print(f"✗ 命令处理器初始化失败: {e}")
import traceback
traceback.print_exc()
return False
def enable(self) -> bool:
"""
启用命令处理器
Returns:
是否启用成功
"""
try:
if not self.initialized:
print("✗ 命令处理器未初始化")
return False
self.enabled = True
print("✓ 命令处理器已启用")
return True
except Exception as e:
print(f"✗ 命令处理器启用失败: {e}")
import traceback
traceback.print_exc()
return False
def disable(self):
"""禁用命令处理器"""
try:
self.enabled = False
print("✓ 命令处理器已禁用")
except Exception as e:
print(f"✗ 命令处理器禁用失败: {e}")
import traceback
traceback.print_exc()
def finalize(self):
"""清理命令处理器资源"""
try:
self.disable()
self.command_mappings.clear()
self.command_groups.clear()
self.command_history.clear()
self.command_callbacks.clear()
self.initialized = False
print("✓ 命令处理器资源已清理")
except Exception as e:
print(f"✗ 命令处理器资源清理失败: {e}")
import traceback
traceback.print_exc()
def update(self, dt: float):
"""
更新命令处理器状态
Args:
dt: 时间增量
"""
try:
if not self.enabled:
return
current_time = time.time()
self.last_command_time = current_time
# 检查上下文超时
self._check_context_timeout(current_time)
# 检查命令链超时
self._check_chain_timeout(current_time)
except Exception as e:
print(f"✗ 命令处理器更新失败: {e}")
import traceback
traceback.print_exc()
def _initialize_default_commands(self):
"""初始化默认命令映射"""
try:
# 基础移动命令
self.register_command('前进', self._move_forward, 'movement', '向前移动')
self.register_command('后退', self._move_backward, 'movement', '向后移动')
self.register_command('左转', self._turn_left, 'movement', '向左转')
self.register_command('右转', self._turn_right, 'movement', '向右转')
self.register_command('停止', self._stop_movement, 'movement', '停止移动')
# 系统控制命令
self.register_command('打开灯光', self._toggle_lights, 'system', '切换灯光状态')
self.register_command('关闭灯光', self._toggle_lights, 'system', '切换灯光状态')
self.register_command('增加音量', self._increase_volume, 'system', '增加系统音量')
self.register_command('减少音量', self._decrease_volume, 'system', '减少系统音量')
self.register_command('播放音乐', self._play_music, 'entertainment', '播放音乐')
self.register_command('暂停播放', self._pause_music, 'entertainment', '暂停音乐播放')
self.register_command('下一首', self._next_track, 'entertainment', '播放下一首')
self.register_command('上一首', self._previous_track, 'entertainment', '播放上一首')
# 交互命令
self.register_command('你好', self._greet_user, 'interaction', '打招呼')
self.register_command('谢谢', self._acknowledge_thanks, 'interaction', '回应感谢')
self.register_command('再见', self._say_goodbye, 'interaction', '道别')
self.register_command('帮助', self._provide_help, 'interaction', '提供帮助信息')
self.register_command('关于', self._show_about, 'interaction', '显示系统信息')
print("✓ 默认命令映射初始化完成")
except Exception as e:
print(f"✗ 默认命令映射初始化失败: {e}")
def _initialize_command_groups(self):
"""初始化命令组"""
try:
self.command_groups = {
'movement': {
'name': '移动控制',
'description': '控制物体移动的命令',
'commands': ['前进', '后退', '左转', '右转', '停止']
},
'system': {
'name': '系统控制',
'description': '控制系统功能的命令',
'commands': ['打开灯光', '关闭灯光', '增加音量', '减少音量']
},
'entertainment': {
'name': '娱乐控制',
'description': '控制娱乐功能的命令',
'commands': ['播放音乐', '暂停播放', '下一首', '上一首']
},
'interaction': {
'name': '交互命令',
'description': '日常交互的命令',
'commands': ['你好', '谢谢', '再见', '帮助', '关于']
}
}
print("✓ 命令组初始化完成")
except Exception as e:
print(f"✗ 命令组初始化失败: {e}")
def register_command(self, command_text: str, handler: Callable,
group: str = 'default', description: str = '') -> bool:
"""
注册命令
Args:
command_text: 命令文本
handler: 命令处理函数
group: 命令组
description: 命令描述
Returns:
是否注册成功
"""
try:
self.command_mappings[command_text] = {
'handler': handler,
'group': group,
'description': description,
'registered_time': time.time()
}
# 添加到命令组
if group in self.command_groups:
if command_text not in self.command_groups[group]['commands']:
self.command_groups[group]['commands'].append(command_text)
else:
self.command_groups[group] = {
'name': group,
'description': f'命令组: {group}',
'commands': [command_text]
}
print(f"✓ 命令已注册: {command_text}")
return True
except Exception as e:
print(f"✗ 命令注册失败: {e}")
return False
def unregister_command(self, command_text: str) -> bool:
"""
注销命令
Args:
command_text: 命令文本
Returns:
是否注销成功
"""
try:
if command_text in self.command_mappings:
command_info = self.command_mappings[command_text]
group = command_info['group']
# 从命令组中移除
if group in self.command_groups:
if command_text in self.command_groups[group]['commands']:
self.command_groups[group]['commands'].remove(command_text)
del self.command_mappings[command_text]
print(f"✓ 命令已注销: {command_text}")
return True
else:
print(f"✗ 命令不存在: {command_text}")
return False
except Exception as e:
print(f"✗ 命令注销失败: {e}")
return False
def process_command(self, text: str, confidence: float = 1.0) -> bool:
"""
处理语音命令
Args:
text: 命令文本
confidence: 置信度(0.0-1.0)
Returns:
是否处理成功
"""
try:
if not self.enabled:
print("✗ 命令处理器未启用")
return False
# 记录命令历史
command_entry = {
'text': text,
'confidence': confidence,
'timestamp': time.time(),
'context': self.command_context['current_context']
}
self.command_history.append(command_entry)
# 保持历史记录大小
if len(self.command_history) > self.max_history_size:
self.command_history.pop(0)
# 触发命令接收回调
self._trigger_command_callback('command_received', {
'text': text,
'confidence': confidence,
'command_entry': command_entry
})
# 检查是否在命令链中
if self.command_chain['is_active']:
return self._process_chained_command(text, confidence)
# 查找匹配的命令
matched_command = self._find_matching_command(text, confidence)
if matched_command:
command_text = matched_command['command']
command_info = self.command_mappings[command_text]
handler = command_info['handler']
# 更新统计信息
if matched_command['type'] == 'exact':
self.stats['exact_matches'] += 1
else:
self.stats['fuzzy_matches'] += 1
# 检查是否需要确认
if (self.command_config['enable_confirmation'] and
confidence < self.command_config['confirmation_threshold']):
return self._request_confirmation(text, command_text, handler, confidence)
# 执行命令
return self._execute_command(command_text, handler, text, confidence, matched_command)
else:
# 未找到匹配命令
print(f"✗ 未找到匹配命令: {text}")
self.stats['commands_failed'] += 1
# 触发命令失败回调
self._trigger_command_callback('command_failed', {
'text': text,
'confidence': confidence,
'reason': 'no_match'
})
# 请求帮助
if self._is_help_request(text):
self._provide_help()
return False
except Exception as e:
print(f"✗ 命令处理失败: {e}")
import traceback
traceback.print_exc()
self.stats['commands_failed'] += 1
return False
def _find_matching_command(self, text: str, confidence: float) -> Optional[Dict[str, Any]]:
"""
查找匹配的命令
Args:
text: 命令文本
confidence: 置信度
Returns:
匹配的命令信息或None
"""
try:
# 首先尝试精确匹配
if text in self.command_mappings:
return {
'command': text,
'type': 'exact',
'confidence': confidence
}
# 尝试上下文命令
if (self.command_config['enable_context_commands'] and
self.command_context['current_context'] != 'default'):
context_commands = self.command_context['context_variables'].get('commands', [])
for command in context_commands:
if command in self.command_mappings and text in command:
return {
'command': command,
'type': 'context',
'confidence': confidence * 0.9
}
self.stats['context_commands'] += 1
# 尝试模糊匹配
if self.command_config['enable_fuzzy_matching']:
best_match = self._fuzzy_match_command(text)
if best_match:
return best_match
return None
except Exception as e:
print(f"✗ 命令匹配失败: {e}")
return None
def _fuzzy_match_command(self, text: str) -> Optional[Dict[str, Any]]:
"""
模糊匹配命令
Args:
text: 命令文本
Returns:
匹配的命令信息或None
"""
try:
best_match = None
best_score = 0.0
for command_text in self.command_mappings:
score = self._calculate_similarity(text, command_text)
if score > best_score and score >= self.command_config['fuzzy_threshold']:
best_score = score
best_match = {
'command': command_text,
'type': 'fuzzy',
'confidence': score
}
return best_match
except Exception as e:
print(f"✗ 模糊匹配失败: {e}")
return None
def _calculate_similarity(self, text1: str, text2: str) -> float:
"""
计算文本相似度
Args:
text1: 文本1
text2: 文本2
Returns:
相似度(0.0-1.0)
"""
try:
# 简单的相似度计算(实际应用中可以使用更复杂的算法)
set1 = set(text1)
set2 = set(text2)
intersection = len(set1.intersection(set2))
union = len(set1.union(set2))
if union == 0:
return 0.0
return intersection / union
except Exception as e:
print(f"✗ 相似度计算失败: {e}")
return 0.0
def _process_chained_command(self, text: str, confidence: float) -> bool:
"""
处理命令链中的命令
Args:
text: 命令文本
confidence: 置信度
Returns:
是否处理成功
"""
try:
# 添加到命令链
self.command_chain['commands'].append({
'text': text,
'confidence': confidence,
'timestamp': time.time()
})
# 检查是否完成命令链
if self._is_chain_completion(text):
return self._execute_command_chain()
return True
except Exception as e:
print(f"✗ 命令链处理失败: {e}")
return False
def _is_chain_completion(self, text: str) -> bool:
"""
检查是否完成命令链
Args:
text: 命令文本
Returns:
是否完成命令链
"""
try:
completion_keywords = ['完成', '结束', '执行', '确定', '确认']
return any(keyword in text for keyword in completion_keywords)
except Exception as e:
print(f"✗ 命令链完成检查失败: {e}")
return False
def _execute_command_chain(self) -> bool:
"""
执行命令链
Returns:
是否执行成功
"""
try:
# 触发命令链完成回调
self._trigger_command_callback('chain_completed', {
'commands': self.command_chain['commands']
})
# 重置命令链
self.command_chain['is_active'] = False
self.command_chain['commands'] = []
self.command_chain['chain_start_time'] = 0.0
self.stats['chained_commands'] += 1
return True
except Exception as e:
print(f"✗ 命令链执行失败: {e}")
return False
def _request_confirmation(self, original_text: str, command_text: str,
handler: Callable, confidence: float) -> bool:
"""
请求命令确认
Args:
original_text: 原始文本
command_text: 命令文本
handler: 处理函数
confidence: 置信度
Returns:
是否请求成功
"""
try:
confirmation_text = f"您是想执行 {command_text} 吗?请确认。"
# 通过语音合成器播放确认请求
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech(confirmation_text)
# 存储待确认的命令
self.pending_confirmation = {
'original_text': original_text,
'command_text': command_text,
'handler': handler,
'confidence': confidence,
'timestamp': time.time()
}
return True
except Exception as e:
print(f"✗ 确认请求失败: {e}")
return False
def _execute_command(self, command_text: str, handler: Callable,
original_text: str, confidence: float,
match_info: Dict[str, Any]) -> bool:
"""
执行命令
Args:
command_text: 命令文本
handler: 处理函数
original_text: 原始文本
confidence: 置信度
match_info: 匹配信息
Returns:
是否执行成功
"""
try:
# 触发命令处理回调
self._trigger_command_callback('command_processed', {
'command_text': command_text,
'original_text': original_text,
'confidence': confidence,
'match_type': match_info['type']
})
# 执行命令处理函数
result = handler(original_text, confidence)
if result:
self.stats['commands_executed'] += 1
# 触发命令执行回调
self._trigger_command_callback('command_executed', {
'command_text': command_text,
'original_text': original_text,
'confidence': confidence
})
# 检查是否需要进入特定上下文
self._check_context_transition(command_text)
print(f"✓ 命令执行成功: {command_text}")
return True
else:
self.stats['commands_failed'] += 1
# 触发命令失败回调
self._trigger_command_callback('command_failed', {
'command_text': command_text,
'original_text': original_text,
'confidence': confidence,
'reason': 'execution_failed'
})
print(f"✗ 命令执行失败: {command_text}")
return False
except Exception as e:
print(f"✗ 命令执行异常: {e}")
import traceback
traceback.print_exc()
self.stats['commands_failed'] += 1
# 触发命令失败回调
self._trigger_command_callback('command_failed', {
'command_text': command_text,
'original_text': original_text,
'confidence': confidence,
'reason': 'exception',
'exception': str(e)
})
return False
def _check_context_transition(self, command_text: str):
"""
检查上下文转换
Args:
command_text: 命令文本
"""
try:
# 根据命令类型设置上下文
context_transitions = {
'播放音乐': 'music',
'暂停播放': 'music',
'下一首': 'music',
'上一首': 'music'
}
if command_text in context_transitions:
self.set_context(context_transitions[command_text])
except Exception as e:
print(f"✗ 上下文转换检查失败: {e}")
def _check_context_timeout(self, current_time: float):
"""
检查上下文超时
Args:
current_time: 当前时间
"""
try:
if (self.command_context['current_context'] != 'default' and
current_time - self.command_context['context_start_time'] >
self.command_config['context_timeout']):
self.reset_context()
except Exception as e:
print(f"✗ 上下文超时检查失败: {e}")
def _check_chain_timeout(self, current_time: float):
"""
检查命令链超时
Args:
current_time: 当前时间
"""
try:
if (self.command_chain['is_active'] and
current_time - self.command_chain['chain_start_time'] > 10.0): # 10秒超时
self.command_chain['is_active'] = False
self.command_chain['commands'] = []
self.command_chain['chain_start_time'] = 0.0
except Exception as e:
print(f"✗ 命令链超时检查失败: {e}")
def set_context(self, context_name: str, variables: Dict[str, Any] = None) -> bool:
"""
设置命令上下文
Args:
context_name: 上下文名称
variables: 上下文变量
Returns:
是否设置成功
"""
try:
# 保存当前上下文到栈中
self.command_context['context_stack'].append({
'context': self.command_context['current_context'],
'variables': self.command_context['context_variables'].copy(),
'timestamp': self.command_context['context_start_time']
})
# 设置新上下文
self.command_context['current_context'] = context_name
self.command_context['context_start_time'] = time.time()
if variables:
self.command_context['context_variables'] = variables
else:
self.command_context['context_variables'] = {}
# 触发上下文变更回调
self._trigger_command_callback('context_changed', {
'old_context': self.command_context['context_stack'][-1]['context'] if self.command_context['context_stack'] else 'default',
'new_context': context_name,
'variables': variables
})
self.last_context_change = time.time()
print(f"✓ 上下文已设置为: {context_name}")
return True
except Exception as e:
print(f"✗ 上下文设置失败: {e}")
return False
def reset_context(self) -> bool:
"""
重置命令上下文
Returns:
是否重置成功
"""
try:
if self.command_context['context_stack']:
# 恢复上一个上下文
previous_context = self.command_context['context_stack'].pop()
self.command_context['current_context'] = previous_context['context']
self.command_context['context_variables'] = previous_context['variables']
self.command_context['context_start_time'] = previous_context['timestamp']
else:
# 重置为默认上下文
self.command_context['current_context'] = 'default'
self.command_context['context_variables'] = {}
self.command_context['context_start_time'] = time.time()
# 触发上下文变更回调
self._trigger_command_callback('context_changed', {
'old_context': 'previous',
'new_context': self.command_context['current_context'],
'variables': self.command_context['context_variables']
})
print("✓ 上下文已重置")
return True
except Exception as e:
print(f"✗ 上下文重置失败: {e}")
return False
def start_command_chain(self) -> bool:
"""
开始命令链
Returns:
是否开始成功
"""
try:
self.command_chain['is_active'] = True
self.command_chain['commands'] = []
self.command_chain['chain_start_time'] = time.time()
# 触发命令链开始回调
self._trigger_command_callback('chain_started', {})
print("✓ 命令链已开始")
return True
except Exception as e:
print(f"✗ 命令链开始失败: {e}")
return False
def _is_help_request(self, text: str) -> bool:
"""
检查是否为帮助请求
Args:
text: 文本
Returns:
是否为帮助请求
"""
try:
help_keywords = ['帮助', 'help', '怎么用', '使用方法', '功能']
return any(keyword in text for keyword in help_keywords)
except Exception as e:
print(f"✗ 帮助请求检查失败: {e}")
return False
# 默认命令处理函数
def _move_forward(self, text: str, confidence: float) -> bool:
"""向前移动"""
try:
print("→ 执行向前移动命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("正在向前移动")
return True
except Exception as e:
print(f"✗ 向前移动命令执行失败: {e}")
return False
def _move_backward(self, text: str, confidence: float) -> bool:
"""向后移动"""
try:
print("← 执行向后移动命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("正在向后移动")
return True
except Exception as e:
print(f"✗ 向后移动命令执行失败: {e}")
return False
def _turn_left(self, text: str, confidence: float) -> bool:
"""向左转"""
try:
print("↺ 执行向左转命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("正在向左转")
return True
except Exception as e:
print(f"✗ 向左转命令执行失败: {e}")
return False
def _turn_right(self, text: str, confidence: float) -> bool:
"""向右转"""
try:
print("↻ 执行向右转命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("正在向右转")
return True
except Exception as e:
print(f"✗ 向右转命令执行失败: {e}")
return False
def _stop_movement(self, text: str, confidence: float) -> bool:
"""停止移动"""
try:
print("⏹ 执行停止移动命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("已停止移动")
return True
except Exception as e:
print(f"✗ 停止移动命令执行失败: {e}")
return False
def _toggle_lights(self, text: str, confidence: float) -> bool:
"""切换灯光"""
try:
action = "打开" if "打开" in text else "关闭"
print(f"💡 执行{action}灯光命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech(f"{action}灯光")
return True
except Exception as e:
print(f"✗ 灯光控制命令执行失败: {e}")
return False
def _increase_volume(self, text: str, confidence: float) -> bool:
"""增加音量"""
try:
print("🔊 执行增加音量命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("音量已增加")
return True
except Exception as e:
print(f"✗ 增加音量命令执行失败: {e}")
return False
def _decrease_volume(self, text: str, confidence: float) -> bool:
"""减少音量"""
try:
print("🔉 执行减少音量命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("音量已减少")
return True
except Exception as e:
print(f"✗ 减少音量命令执行失败: {e}")
return False
def _play_music(self, text: str, confidence: float) -> bool:
"""播放音乐"""
try:
print("🎵 执行播放音乐命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("正在播放音乐")
return True
except Exception as e:
print(f"✗ 播放音乐命令执行失败: {e}")
return False
def _pause_music(self, text: str, confidence: float) -> bool:
"""暂停音乐"""
try:
print("⏸ 执行暂停音乐命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("音乐已暂停")
return True
except Exception as e:
print(f"✗ 暂停音乐命令执行失败: {e}")
return False
def _next_track(self, text: str, confidence: float) -> bool:
"""下一首"""
try:
print("⏭ 执行播放下一首命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("正在播放下一首")
return True
except Exception as e:
print(f"✗ 播放下一首命令执行失败: {e}")
return False
def _previous_track(self, text: str, confidence: float) -> bool:
"""上一首"""
try:
print("⏮ 执行播放上一首命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("正在播放上一首")
return True
except Exception as e:
print(f"✗ 播放上一首命令执行失败: {e}")
return False
def _greet_user(self, text: str, confidence: float) -> bool:
"""打招呼"""
try:
print("👋 执行打招呼命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("您好!有什么可以帮助您的吗?")
return True
except Exception as e:
print(f"✗ 打招呼命令执行失败: {e}")
return False
def _acknowledge_thanks(self, text: str, confidence: float) -> bool:
"""回应感谢"""
try:
print("🙏 执行回应感谢命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("不客气!")
return True
except Exception as e:
print(f"✗ 回应感谢命令执行失败: {e}")
return False
def _say_goodbye(self, text: str, confidence: float) -> bool:
"""道别"""
try:
print("👋 执行道别命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech("再见!")
return True
except Exception as e:
print(f"✗ 道别命令执行失败: {e}")
return False
def _provide_help(self, text: str = None, confidence: float = 1.0) -> bool:
"""提供帮助"""
try:
help_text = "我可以帮您控制移动、灯光、音量和音乐播放。请说'前进''后退''左转''右转''停止'来控制移动;说'打开灯光''关闭灯光'来控制灯光;说'增加音量''减少音量'来调节音量;说'播放音乐''暂停播放''下一首''上一首'来控制音乐。"
print(" 执行提供帮助命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech(help_text)
return True
except Exception as e:
print(f"✗ 提供帮助命令执行失败: {e}")
return False
def _show_about(self, text: str, confidence: float) -> bool:
"""显示关于信息"""
try:
about_text = "语音控制系统版本1.0.0基于EG引擎开发。"
print(" 执行显示关于信息命令")
if self.plugin.speech_synthesizer:
self.plugin.speech_synthesizer.synthesize_speech(about_text)
return True
except Exception as e:
print(f"✗ 显示关于信息命令执行失败: {e}")
return False
def get_command_mappings(self) -> Dict[str, Dict[str, Any]]:
"""
获取命令映射
Returns:
命令映射字典
"""
return self.command_mappings.copy()
def get_command_groups(self) -> Dict[str, Dict[str, Any]]:
"""
获取命令组
Returns:
命令组字典
"""
return self.command_groups.copy()
def get_command_history(self) -> List[Dict[str, Any]]:
"""
获取命令历史
Returns:
命令历史列表
"""
return self.command_history.copy()
def clear_command_history(self):
"""清空命令历史"""
try:
self.command_history.clear()
print("✓ 命令历史已清空")
except Exception as e:
print(f"✗ 命令历史清空失败: {e}")
def set_command_config(self, config: Dict[str, Any]) -> bool:
"""
设置命令配置
Args:
config: 配置字典
Returns:
是否设置成功
"""
try:
self.command_config.update(config)
print(f"✓ 命令配置已更新: {self.command_config}")
return True
except Exception as e:
print(f"✗ 命令配置设置失败: {e}")
return False
def get_command_config(self) -> Dict[str, Any]:
"""
获取命令配置
Returns:
配置字典
"""
return self.command_config.copy()
def get_context(self) -> Dict[str, Any]:
"""
获取当前上下文
Returns:
上下文字典
"""
return self.command_context.copy()
def _trigger_command_callback(self, callback_type: str, data: Dict[str, Any]):
"""
触发命令回调
Args:
callback_type: 回调类型
data: 回调数据
"""
try:
if callback_type in self.command_callbacks:
for callback in self.command_callbacks[callback_type]:
try:
callback(data)
except Exception as e:
print(f"✗ 命令回调执行失败: {e}")
except Exception as e:
print(f"✗ 命令回调触发失败: {e}")
def register_command_callback(self, callback_type: str, callback: Callable):
"""
注册命令回调
Args:
callback_type: 回调类型
callback: 回调函数
"""
try:
if callback_type in self.command_callbacks:
self.command_callbacks[callback_type].append(callback)
print(f"✓ 命令回调已注册: {callback_type}")
else:
print(f"✗ 无效的回调类型: {callback_type}")
except Exception as e:
print(f"✗ 命令回调注册失败: {e}")
def unregister_command_callback(self, callback_type: str, callback: Callable):
"""
注销命令回调
Args:
callback_type: 回调类型
callback: 回调函数
"""
try:
if callback_type in self.command_callbacks:
if callback in self.command_callbacks[callback_type]:
self.command_callbacks[callback_type].remove(callback)
print(f"✓ 命令回调已注销: {callback_type}")
except Exception as e:
print(f"✗ 命令回调注销失败: {e}")
def get_stats(self) -> Dict[str, Any]:
"""
获取统计信息
Returns:
统计信息字典
"""
return self.stats.copy()
def reset_stats(self):
"""重置统计信息"""
try:
self.stats = {
'commands_processed': 0,
'commands_executed': 0,
'commands_failed': 0,
'fuzzy_matches': 0,
'exact_matches': 0,
'context_commands': 0,
'chained_commands': 0
}
print("✓ 命令处理器统计信息已重置")
except Exception as e:
print(f"✗ 命令处理器统计信息重置失败: {e}")