
使用简单的语音指令来控制机械臂的运动
一、用tkinter绘制界面并录音
1.使用tkinter来绘制界面
def __init__(self, master):
self.master = master
self.master.title("Voice Recorder")
self.canvas = tk.Canvas(master, width=400, height=300, bg='white')
self.canvas.pack()
self.start_button = tk.Button(master, text="开始录音", command=self.start_recording)
self.start_button.pack(side=tk.LEFT)
self.stop_button = tk.Button(master, text="结束录音", command=self.stop_recording)
self.stop_button.pack(side=tk.RIGHT)
self.recording = False
self.frames = []
2.定义其中的按键函数 start_recording和stop_recording
def start_recording(self):
self.recording = True
self.frames = []
self.audio = pyaudio.PyAudio()
self.stream = self.audio.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
self.record()
def stop_recording(self):
self.recording = False
self.stream.stop_stream()
self.stream.close()
self.audio.terminate()
self.save_recording()
3.定义记录流的动作和保存动作分别为record和save_recording
def record(self):
if self.recording:
data = self.stream.read(1024)
self.frames.append(data)
self.master.after(10, self.record)
def save_recording(self):
if not os.path.exists('voice'):
os.makedirs('voice')
filename = datetime.now().strftime("%Y%m%d_%H%M%S") + ".wav"
filepath = os.path.join('voice', filename)
with wave.open(filepath, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(self.audio.get_sample_size(pyaudio.paInt16))
wf.setframerate(44100)
wf.writeframes(b''.join(self.frames))
4.创一个class并用main函数:
class VoiceRecorder:
........
if __name__ == "__main__":
root = tk.Tk()
recorder = VoiceRecorder(root)
root.mainloop()
二、对录制的音频进行语音识别:
1.使用vosk离线模型来进行语音识别,主要识别几个指令
- 向左
- 向右
- 向上
- 向下
2.添加一个在save_recording以后的动作:
def recognize(self):
wf = wave.open(self.filepath, "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() != 16000:
raise ValueError("音频格式不支持")
# 识别语音
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if recognizer.AcceptWaveform(data):
pass
# print(recognizer.Result())
else:
pass
# print(recognizer.PartialResult())
print(recognizer.FinalResult())
三、开始控制机械臂
1.初始化机械臂并设置四个点位坐标
mc = MyCobot280('COM3')
# 初始化机械臂
motor1=90
motor2=0
motor3=0
motor4=0
motor5=90
motor6=55
mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)
downAngles=[90,53,-121,67,90,54.4]
upAngles=[motor1, motor2, motor3, motor4, motor5, motor6]
rightAngles=[motor1, 90, -90, motor4, motor5, motor6]
leftAngles=[motor1, -90, 90, motor4, motor5, motor6]
# 从上下左右四个点各走一遍
for angles in [downAngles, upAngles, rightAngles, leftAngles]:
mc.send_angles(angles, 100)
time.sleep(1) # 等待1秒以便观察动作
2.对指令进行区别辨认,并控制机械臂运动
# 解析 JSON 字符串
result_dict = json.loads(result) # 将字符串解析为字典
recognized_text = result_dict.get("text", "").replace(" ", "") # 提取识别的文本内容
print(recognized_text) # 打印提取的文本内容
# 根据识别结果控制机械臂
if "向上" in recognized_text:
print("向上")
mc.send_angles(upAngles, 100)
elif "向下" in recognized_text:
print("向下")
mc.send_angles(downAngles, 100)
elif "向左" in recognized_text:
print("向左")
mc.send_angles(leftAngles, 100)
elif "向右" in recognized_text or "相有" in recognized_text:
print("向右")
mc.send_angles(rightAngles, 100)
else:
print("停止")
mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)
这里有一个bug,可能是我普通话不标准,向右的“”指令“”一直识别成“”相有“”
四、全部代码如下
import tkinter as tk
import wave
import pyaudio
import os
from datetime import datetime
from vosk import Model, KaldiRecognizer
import json # 确保导入 json 模块
from pymycobot import MyCobot280
import time
mc = MyCobot280('COM3')
# 初始化机械臂
motor1=90
motor2=0
motor3=0
motor4=0
motor5=90
motor6=55
mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)
downAngles=[90,53,-121,67,90,54.4]
upAngles=[motor1, motor2, motor3, motor4, motor5, motor6]
rightAngles=[motor1, 90, -90, motor4, motor5, motor6]
leftAngles=[motor1, -90, 90, motor4, motor5, motor6]
# 从上下左右四个点各走一遍
for angles in [downAngles, upAngles, rightAngles, leftAngles]:
mc.send_angles(angles, 100)
time.sleep(1) # 等待1秒以便观察动作
# 加载模型
modulePath = "vosk-model-cn-0.22"
model = Model(modulePath) # 下载的模型路径
recognizer = KaldiRecognizer(model, 16000)
class VoiceRecorder:
def __init__(self, master):
self.filename = ""
self.filepath = ""
self.master = master
self.master.title("Voice Recorder")
self.canvas = tk.Canvas(master, width=400, height=300, bg='white')
self.canvas.pack()
self.start_button = tk.Button(master, text="开始录音", command=self.start_recording)
self.start_button.pack(side=tk.LEFT)
self.stop_button = tk.Button(master, text="结束录音", command=self.stop_recording)
self.stop_button.pack(side=tk.RIGHT)
self.recording = False
self.frames = []
def start_recording(self):
self.recording = True
self.frames = []
self.audio = pyaudio.PyAudio()
self.stream = self.audio.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
self.record()
def record(self):
if self.recording:
data = self.stream.read(1024)
self.frames.append(data)
self.master.after(10, self.record)
def stop_recording(self):
self.recording = False
self.stream.stop_stream()
self.stream.close()
self.audio.terminate()
self.save_recording()
def save_recording(self):
if not os.path.exists('voice'):
os.makedirs('voice')
filename = datetime.now().strftime("%Y%m%d_%H%M%S") + ".wav"
self.filename = filename
filepath = os.path.join('voice', filename)
self.filepath = filepath
with wave.open(filepath, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(self.audio.get_sample_size(pyaudio.paInt16))
wf.setframerate(16000)
wf.writeframes(b''.join(self.frames))
self.recognize()
def recognize(self):
wf = wave.open(self.filepath, "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() != 16000:
raise ValueError("音频格式不支持")
# 识别语音
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if recognizer.AcceptWaveform(data):
pass
# print(recognizer.Result())
else:
pass
# print(recognizer.PartialResult())
result = recognizer.FinalResult()
print(result) # 打印完整结果
# 解析 JSON 字符串
result_dict = json.loads(result) # 将字符串解析为字典
recognized_text = result_dict.get("text", "").replace(" ", "") # 提取识别的文本内容
print(recognized_text) # 打印提取的文本内容
# 根据识别结果控制机械臂
if "向上" in recognized_text:
print("向上")
mc.send_angles(upAngles, 100)
elif "向下" in recognized_text:
print("向下")
mc.send_angles(downAngles, 100)
elif "向左" in recognized_text:
print("向左")
mc.send_angles(leftAngles, 100)
elif "向右" in recognized_text or "相有" in recognized_text:
print("向右")
mc.send_angles(rightAngles, 100)
else:
print("停止")
mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)
if __name__ == "__main__":
root = tk.Tk()
recorder = VoiceRecorder(root)
root.mainloop()
1万+



被折叠的 条评论
为什么被折叠?



