代码分析:基于大模型语音控制的TonyPi人形机器人

子豪兄-基于大模型语音控制的TonyPi人形机器人

一、工作流程

  • 服务文件传输、命令通讯用的ssh

  • 大模型返回的动作编排格式:['动作1()', '动作2()',...]

二、代码

1.录音+语音识别

# asr_aipc.py
def asr_aipc():
    print('开始录音')
    terminal = 'ssh pi@{} "python TonyPi/OpenVINO/utils_asr.py"'.format(PI_IP)
    os.system(terminal)
    print('开始语音识别')
    terminal = 'scp pi@{}:~/TonyPi/OpenVINO/temp/speech_recognition.txt temp/speech_recognition.txt'.format(PI_IP)
    os.system(terminal)
    with open('temp/speech_recognition.txt', 'r', encoding='utf-8') as f:
        speech_result = f.read()
    print('【语音识别结果】', speech_result)
    return speech_result
    
# utils_asr.py  
def record(MIC_INDEX=2, DURATION=8):
    '''
    调用麦克风录音,需用arecord -l命令获取麦克风ID
    DURATION,录音时长
    '''
    print('开始 {} 秒录音'.format(DURATION))
    os.system('sudo arecord -D "plughw:{}" -f dat -c 1 -r 16000 -d {} /home/pi/TonyPi/OpenVINO/temp/speech_record.wav'.format(MIC_INDEX, DURATION))
    print('录音结束')
    
# 语音识别: appBuilder

2.调用大模型

  • 输入

你是我的机器人,请你根据我的指令,以json形式输出接下来要运行的对应函数和你给我的回复
你只需要回答一个列表即可,不要回答任何中文
【以下是所有动作函数】
站立:stand()
原地踏步:stepping()
前进一步:move_forward()
后退一步:move_back()
向左平移移动一步:move_left()
向右平移移动一步:move_right()
向左旋转移动:turn_left()
向右旋转移动:turn_right()
鞠躬:bow()
挥手打招呼:wave()
扭腰:twist()
捶胸庆祝:celebrate()
下蹲:squat()
踢右脚:right_shot()
踢左脚:left_shot()
仰卧起坐:sit_ups()
佛山叶问的咏春拳:wing_chun()
从前倾趴卧起立,也就是从趴下到站起来:stand_up_front()
从后仰躺倒起立,也就是从躺下到站起来:stand_up_back()
巡线跨栏模式,顺着黑色线前进并跨越台阶等障碍物:athletics()
播放音乐并跳舞(唱跳RAP):rap()
踢不同颜色的足球:kickball('red')
搬运不同颜色的海绵方块:transport('red green blue')

【输出限制】
你直接输出json即可,从{开始,以}结束,【不要】输出```json的开头或结尾
在'action'键中,输出函数名列表,列表中每个元素都是字符串,代表要运行的函数名称和参数。每个函数既可以单独运行,也可以和其他函数先后运行。列表元素的先后顺序,表示执行函数的先后顺序
在'response'键中,根据我的指令和你编排的动作,以第一人称简短输出你回复我的中文,要求幽默、善意、玩梗、有趣。不要超过20个字,不要回复英文。
如果我让你从躺倒状态站起来,你回复一些和“躺平”相关的话
kickball和transport函数需要用双引号

【以下是一些具体的例子】
我的指令:你最喜欢哪种颜色呀。你回复:{'action':[], 'response':'我喜欢蓝色,因为我喜欢贝加尔湖,深邃而神秘'}
我的指令:请你先鞠个躬,然后挥挥手。你回复:{'action':['bow()', 'wave()'], 'response':'敬个礼挥挥手,你是我的好朋友'}
我的指令:先前进,再后退,向左转一点,再向右平移。你回复:{'action':['move_forward()', 'move_back()', 'turn_left()', 'move_right()'], 'response':'你真是操作大师'}
我的指令:先蹲下,再站起来,最后做个庆祝的动作。你回复:{'action':['squat()', 'stand()', 'celebrate()'], 'response':'像奥运举重冠军的动作'}
我的指令:向前走两步,向后退三步。你回复:{'action':['move_forward()', 'move_forward()', 'move_back()', 'move_back()', 'move_back()'], 'response':'恰似历史的进程,充满曲折'}
我的指令:先挥挥手,然后踢绿色的足球。你回复:{'action':['wave()', "kickball('green')"], 'response':'绿色的足球咱可以踢,绿色的帽子咱可不戴'}
我的指令:先活动活动筋骨,然后把红色和蓝色的海绵方块搬运到指定位置。你回复:{'action':['twist()', “transport('red blue')”], 'response':'我听说特斯拉的人形机器人兄弟们,每天都在干这种活'}
我的指令:先踢右脚,再踢左脚,然后搬运海绵方块。你回复:{'action':['right_shot()', 'left_shot()', “transport('red green blue')”], 'response':'让我先活动活动,然后让海绵宝宝们各回各家'}
我的指令:别躺着了,快起来,把红色和蓝色方块搬运到指定位置。你回复:{'action':['stand_up_back()', “transport('red blue')”], 'response':'我也想躺平啊,奈何得干活儿'}

【我现在的指令是】
  • 输出

['wave()', 'celebrate()']

3. 依次执行动作

  1. 语音合成+播放

# utils_asr.py
def tts(ai_response):
    # 写入文件
    with open('temp/ai_response.txt', 'w', encoding='utf-8') as f:
        f.write(ai_response)
        
    # 传到开发板
    terminal = 'scp temp/ai_response.txt pi@{}:~/TonyPi/OpenVINO/temp/'.format(PI_IP)
    os.system(terminal)
    print('开始语音合成')
    terminal = 'ssh pi@{} "python ~/TonyPi/OpenVINO/utils_tts.py"'.format(PI_IP)
    os.system(terminal)
    
# utils_tts.py"
def tts(TEXT='我是同济子豪兄的机器人', tts_wav_path = '/home/pi/TonyPi/OpenVINO/temp/tts.wav'):
'''
语音合成TTS,生成wav音频文件
'''
inp = appbuilder.Message(content={"text": TEXT})
out = tts_ab.run(inp, model="paddlespeech-tts", audio_type="wav")
# out = tts_ab.run(inp, audio_type="wav")
with open(tts_wav_path, "wb") as f:
    f.write(out.content["audio_binary"])
# print("TTS语音合成,导出wav音频文件至:{}".format(tts_wav_path))

def play_wav(wav_file='/home/pi/TonyPi/OpenVINO/temp/tts.wav'):
    '''
    播放wav音频文件
    '''
    prompt = 'aplay -t wav {} -q'.format(wav_file)
    os.system(prompt)
  1. 依次执行动作

  • 舵机编号

  • 一个动作组,比如wave,存储的是每个舵机的不同角度序列,用sqllite文件存储

 
# ActionGroupControl.py
def runAction(actNum, lock_servos='', path="/home/pi/TonyPi/ActionGroups/"):
    '''
    运行动作组,无法发送stop停止信号
    :param actNum: 动作组名字 , 字符串类型
    :return:
    '''
    global runningAction
    global stop_action
    
    if actNum is None:
        return

    actNum = path + actNum + ".d6a"

    if os.path.exists(actNum) is True:
        if runningAction is False:
            runningAction = True
            ag = sql.connect(actNum)
            cu = ag.cursor()
            cu.execute("select * from ActionGroup")
            while True:
                act = cu.fetchone()
                if stop_action is True:
                    stop_action = False
                    print('stop')                    
                    break
                if act is not None:
                    for i in range(0, len(act) - 2, 1):
                        if str(i + 1) in lock_servos:
                            ctl.set_bus_servo_pulse(i+1, lock_servos[str(i + 1)], act[1])
                            
                        else:
                            ctl.set_bus_servo_pulse(i+1, act[2 + i], act[1])
                    time.sleep(float(act[1])/1000.0)
                else:   # 运行完才退出
                    break
            runningAction = False
            
            cu.close()
            ag.close()
    else:
        runningAction = False
        print("未能找到动作组文件:(),是否将动作组保存在目录:{}".format(actNum, path))

04-03
### 关于 TonyPi 的 IT 相关内容 #### 什么是 TonyPiTonyPi 是一种基于树莓派(Raspberry Pi)的硬件和软件组合,主要用于实现语音交互以及智能搬运等功能。其设计目标是通过集成多种传感器和技术来完成复杂的自动化任务[^1]。 #### 如何启动 TonyPi 的语音交互功能? 为了运行 TonyPi 的语音交互程序,需要按照以下方法操作: - 开机后,通过 VNC 远程连接至树莓派桌面环境。 - 打开 LX 终端窗口。 - 输入命令 `cd TonyPi/Functions/` 来切换到指定目录。 此过程允许用户进入 TonyPi 功能脚本所在的文件夹并准备执行相关指令。 #### 设置服务开机自启 为了让 TonyPi 上的服务能够在设备重启后自动运行,可以创建一个 systemd 服务配置文件。以下是具体设置方式: ```ini [Unit] Description=run LeServer After=rc-local.service [Service] Type=simple User=root Group=root WorkingDirectory=/home/pi/Desktop/Serial_SteerEngine ExecStart=/usr/bin/sudo python3 LeServer.py Restart=always [Install] WantedBy=multi-user.target ``` 上述配置定义了一个名为 `LeServer.service` 的服务单元,并设置了必要的参数以确保该服务能够正常工作[^2]。接着可以通过命令 `sudo systemctl enable LeServer.service` 将其设定为随系统启动而激活。 #### ROS 和 TonyPi 的关系 虽然 TonyPi 主要是围绕树莓派构建的小型化解决方案,但它也可以与 Robot Operating System (ROS) 结合使用。ROS 起源于斯坦福大学的一项个人机器人项目,在 Willow Garage 公司接手之后得到了进一步发展。尽管 ROS 缺乏正式的国际化标准支持,但由于社区贡献者的努力,它已经成为全球范围内广泛接受的事实上的行业标准之一[^3]。对于像 TonyPi 这样的小型机器人平台来说,引入 ROS 可以为更高级别的应用提供强大的技术支持。 ```python import os def start_tonypi(): try: # 切换到 TonyPi Functions 文件夹 os.chdir("/path/to/TonyPi/Functions/") # 启动特定 Python 脚本 result = os.system("python3 your_script_name.py") if result != 0: raise Exception("Failed to execute the script.") except Exception as e: print(f"Error occurred: {e}") if __name__ == "__main__": start_tonypi() ``` 以上是一个简单的 Python 函数示例,用于模拟如何从代码层面调用 TonyPi 的某些核心组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值