|
|
import pyaudio # 导入pyAudio的源代码文件,我们下面要用到,不用到就不用导入啦
|
|
|
import wave
|
|
|
from aip import AipSpeech
|
|
|
|
|
|
class mySpeechRecognition:
|
|
|
def __init__(self):
|
|
|
#初始化
|
|
|
self.APP_ID = '23503942' # 新建AiPSpeech
|
|
|
self.API_KEY = 'ac19dxg6NCm3D00rreITDNSD'
|
|
|
self.SECRET_KEY = 'sg43RzlyAq0tGtVYATfsEU9I0hAOBTYE'
|
|
|
self.client = AipSpeech(self.APP_ID, self.API_KEY, self.SECRET_KEY)
|
|
|
self.setControlKEYS()
|
|
|
self.order = ''
|
|
|
|
|
|
def setControlKEYS(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'
|
|
|
}
|
|
|
|
|
|
def record(self):
|
|
|
CHUNK = 1024
|
|
|
FORMAT = pyaudio.paInt16 # 量化位数
|
|
|
CHANNELS = 1 # 采样管道数
|
|
|
RATE = 16000 # 采样率
|
|
|
RECORD_SECONDS = 3 #录音时间
|
|
|
WAVE_OUTPUT_FILENAME = "../output.wav" # 文件保存的名称
|
|
|
p = pyaudio.PyAudio() # 创建PyAudio的实例对象
|
|
|
stream = p.open(format=FORMAT, # 调用PyAudio实例对象的open方法创建流Stream
|
|
|
channels=CHANNELS,
|
|
|
rate=RATE,
|
|
|
input=True,
|
|
|
frames_per_buffer=CHUNK)
|
|
|
frames = [] # 存储所有读取到的数据
|
|
|
print('* 开始录音 >>>') # 打印开始录音
|
|
|
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
|
|
|
data = stream.read(CHUNK) # 根据需求,调用Stream的write或者read方法
|
|
|
frames.append(data)
|
|
|
print('* 结束录音 >>>') # 打印结束录音
|
|
|
stream.close() # 调用Stream的close方法,关闭流
|
|
|
p.terminate() # 调用pyaudio.PyAudio.terminate() 关闭会话
|
|
|
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') # 写入wav文件里面
|
|
|
wf.setnchannels(CHANNELS)
|
|
|
wf.setsampwidth(p.get_sample_size(FORMAT))
|
|
|
wf.setframerate(RATE)
|
|
|
wf.writeframes(b''.join(frames))
|
|
|
wf.close()
|
|
|
|
|
|
def cognitive(self):
|
|
|
def get_file_content(filePath):
|
|
|
with open(filePath, 'rb') as fp:
|
|
|
return fp.read()
|
|
|
|
|
|
result = self.client.asr(get_file_content('../output.wav'), 'wav', 16000, {
|
|
|
'dev_pid': 1537, # 识别本地文件
|
|
|
})
|
|
|
result_text = result["result"][0]
|
|
|
|
|
|
print("you said: " + result_text)
|
|
|
|
|
|
return self.getOrder(result_text)
|
|
|
|
|
|
def getOrder(self,result : str):
|
|
|
"""
|
|
|
得到给无人机发送的指令
|
|
|
:param result_text: 原始语音识别结果
|
|
|
:return: 无人机命令
|
|
|
"""
|
|
|
result_text = ''
|
|
|
for item in result:
|
|
|
if item in ('厘', '度', '米', ',', '。', '秒', '每'): # 过滤一些关键字
|
|
|
continue
|
|
|
else:
|
|
|
result_text = result_text + item
|
|
|
#判断是否是tellopy命令
|
|
|
if result_text in ('向前','向后','向左','向右','向上','向下','停','起飞','降落','向前翻滚','向后翻滚','向左翻滚','向右翻滚'):
|
|
|
isTellopy_order = True
|
|
|
self.order = self.controlKeys[result_text]
|
|
|
return isTellopy_order,self.order
|
|
|
else:
|
|
|
isTellopy_order = False
|
|
|
command = ''
|
|
|
value = ''
|
|
|
for item in result_text:
|
|
|
# if item in ('厘' , '度','米',',','。','秒','每'): #过滤一些关键字
|
|
|
# continue
|
|
|
if item.isalpha():
|
|
|
command = command + item
|
|
|
else:
|
|
|
value = value + item
|
|
|
if command in self.controlKeys.keys():
|
|
|
#命令有效
|
|
|
command = self.controlKeys[command] #得到汉语对应的英文命令
|
|
|
else:
|
|
|
#命令无效
|
|
|
self.order = 'False'
|
|
|
return isTellopy_order,self.order
|
|
|
self.order = command + ' ' + value
|
|
|
return isTellopy_order,self.order
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
sr = mySpeechRecognition()
|
|
|
while True:
|
|
|
sr.record()
|
|
|
isTellopy_order, result = sr.cognitive()
|
|
|
print(isTellopy_order,result)
|