|
|
from UIfile.SpeechRecognitionUI import Ui_SpeechRecognitionUI
|
|
|
import mySpeechRecognition
|
|
|
from PyQt5.QtCore import QTimer,pyqtSignal,QMutex,QThread,QWaitCondition,QObject
|
|
|
from PyQt5.QtWidgets import QWidget
|
|
|
from PyQt5.QtGui import QIcon,QCloseEvent
|
|
|
import threading
|
|
|
|
|
|
class speech_recognition_thread(QThread):
|
|
|
'''语音识别线程'''
|
|
|
send_speech_order_signal = pyqtSignal(bool, str) # 发送识别出的命令
|
|
|
send_LED_state = pyqtSignal(str) #传递LED灯应该显示的状态,两个颜色交替闪烁表示正在录音,显示一个颜色表示正在执行命令
|
|
|
def __init__(self):
|
|
|
super(speech_recognition_thread, self).__init__()
|
|
|
|
|
|
self.speechRecognition = mySpeechRecognition.mySpeechRecognition()
|
|
|
|
|
|
self.daemon = True #是否后台运行
|
|
|
# self.paused = True #暂停标志
|
|
|
self.first_run = True #标记
|
|
|
|
|
|
self.threadLock = threading.Lock()
|
|
|
self.timer = QTimer(self)
|
|
|
self.timer.timeout.connect(self.run)
|
|
|
|
|
|
def run(self):
|
|
|
if self.first_run == True:
|
|
|
self.first_run = False
|
|
|
return
|
|
|
else:
|
|
|
self.threadLock.acquire()
|
|
|
self.send_LED_state.emit('recording') #正在录音
|
|
|
self.speechRecognition.record()
|
|
|
is_tellopy_order, order = self.speechRecognition.cognitive() # 返回两个值,第一个用于确定是不是tellopy的以速度为参数的命令,第二个是以步长为参数的send型的命令
|
|
|
self.send_LED_state.emit('executing') #识别完成,准备执行命令
|
|
|
|
|
|
# 当不是tellopy类型的命令时
|
|
|
if is_tellopy_order == False:
|
|
|
# 当命令有效时
|
|
|
if order != 'False':
|
|
|
self.send_speech_order_signal.emit(is_tellopy_order, order) # 触发信号,发送命令
|
|
|
else:
|
|
|
self.threadLock.release()
|
|
|
return
|
|
|
# 当是tellopy类型的命令时
|
|
|
else:
|
|
|
self.send_speech_order_signal.emit(is_tellopy_order, order) # 触发信号,发送命令
|
|
|
self.threadLock.release()
|
|
|
|
|
|
|
|
|
class mySpeechRecognition_UI(QWidget,Ui_SpeechRecognitionUI):
|
|
|
'''拓展的语音识别窗口类'''
|
|
|
send_order_signal = pyqtSignal(bool, str) # 传递识别出的命令的信号,发给主窗口线程
|
|
|
|
|
|
when_closed = pyqtSignal() # 当窗口被关闭时发送信号
|
|
|
def __init__(self):
|
|
|
super(mySpeechRecognition_UI, self).__init__()
|
|
|
self.setupUi(self)
|
|
|
|
|
|
self.btn_speech_pause_start.clicked.connect(self.btn_speech_pause_start_clicked) #开始/暂停按钮被按下时的触发动作
|
|
|
|
|
|
self.speechRecognition = mySpeechRecognition.mySpeechRecognition() #语音识别
|
|
|
|
|
|
self.isSpeechRecognition_started = False #标记语音识别是否开启
|
|
|
|
|
|
self.speech_recognition_thread = speech_recognition_thread() #语音识别线程
|
|
|
self.speech_recognition_thread.daemon = True
|
|
|
|
|
|
self.speech_recognition_thread.send_speech_order_signal.connect(self.send_order_to_Tello) #发送命令到主进程
|
|
|
|
|
|
self.speech_order_text_already_received_for_show = '' #这个是要显示在子窗口下面的,已经发送给无人机的命令
|
|
|
|
|
|
self.set_control_Keys()
|
|
|
|
|
|
self.speech_recognition_thread.start()
|
|
|
|
|
|
|
|
|
def btn_speech_pause_start_clicked(self):
|
|
|
'''当开始/暂停按钮按下时'''
|
|
|
#当未开启语音识别或处于暂停状态时时
|
|
|
if self.isSpeechRecognition_started == False:
|
|
|
self.isSpeechRecognition_started = True #更新标记
|
|
|
self.btn_speech_pause_start.setIcon(QIcon('../ico/pause_128px_1183436_easyicon.net.ico')) #更新按钮图标
|
|
|
self.btn_speech_pause_start.setText('关闭')
|
|
|
|
|
|
# self.speech_recognition_thread.start() #放到上面去了
|
|
|
|
|
|
self.speech_recognition_thread.timer.start(3500)
|
|
|
|
|
|
#当已经开启了语音识别时
|
|
|
elif self.isSpeechRecognition_started == True:
|
|
|
self.isSpeechRecognition_started= False
|
|
|
self.btn_speech_pause_start.setIcon(QIcon('../ico/play_128px_1183440_easyicon.net.ico')) #更新按钮图标
|
|
|
self.btn_speech_pause_start.setText('开始')
|
|
|
self.speech_recognition_thread.timer.stop()
|
|
|
|
|
|
def send_order_to_Tello(self, is_tellopy_order, order):
|
|
|
'''发送命令到主窗口线程'''
|
|
|
if order == '':
|
|
|
return
|
|
|
print('发送成功')
|
|
|
self.send_order_signal.emit(is_tellopy_order,order)
|
|
|
|
|
|
#更新窗口下面的显示命令
|
|
|
order_text = ''
|
|
|
for key,val in self.controlKeys.items():
|
|
|
if val == order:
|
|
|
order_text = key
|
|
|
self.speech_order_text_already_received_for_show ='\n' + '>>>' + ' ' + order_text
|
|
|
self.sentOrders.append(self.speech_order_text_already_received_for_show)
|
|
|
|
|
|
def closeEvent(self, a0: QCloseEvent) -> None:
|
|
|
'''当窗口关闭时触发函数'''
|
|
|
self.when_closed.emit()
|
|
|
self.dockWidget.close()
|
|
|
self.speech_recognition_thread.timer.stop()
|
|
|
|
|
|
def set_control_Keys(self):
|
|
|
self.controlKeys = {
|
|
|
'起飞' : 'T',
|
|
|
'降落' : 'R',
|
|
|
'向左飞' : 'left',
|
|
|
'向右飞' : 'right',
|
|
|
'向前飞' : 'forward',
|
|
|
'向后飞' : 'back',
|
|
|
'向上飞' : 'up',
|
|
|
'向下飞' : 'down',
|
|
|
'顺时针旋转' : 'cw',
|
|
|
'逆时针旋转' : 'ccw',
|
|
|
'向前翻滚' : 'FF',
|
|
|
'向后翻滚' : 'FB',
|
|
|
'向左翻滚' : 'FL',
|
|
|
'向右翻滚' : 'FR',
|
|
|
'悬停' : 'stop',
|
|
|
'速度设为' : 'speed',
|
|
|
'玄霆' : 'stop',
|
|
|
|
|
|
'向前' : 'W',
|
|
|
'向后' : 'S',
|
|
|
'向左' : 'A',
|
|
|
'向右' : 'D',
|
|
|
'向上' : 'U',
|
|
|
'向下' : 'I',
|
|
|
'停' : 'P',
|
|
|
'在我手上降落' : 'H'
|
|
|
}
|