提示

今年注册的账号可能百度,改变了下发的数据格式,不再是文本格式,是以链接的形式。具体的我还没有研究。大家可以看返回的数据,payload里面是text还是url,是text 的可以用我这个方法,url的暂时还不行,等我有时间看一看如何提取,会再更新的

本文是基于百度的DuerOS Python SDK进行的,具体安装以及实现过程,可以看我的这篇教程:人工智能-树莓派小车(1)——DuerOS语音唤醒,要实现的功能有:

语音聊天:可以跟智能小车进行对话,询问现在的天气,播放想听的歌曲等等基本对话;

语音控制:可以通过语音的操作方式控制智能小车的前进后退、避障转弯等功能,进一步可以扩展到家里的台灯、空调、窗帘等等家具;

语音反馈:在你发出命令后,小车还会给出回应,与你互动,实现一个良好的反馈。

视频演示

实现了以上几个功能,做了一个演示,视频链接:通过语音玩转智能小车

核心代码

1. 命令读取

content = u'云端下发directive:%s' % (directive_content)

content里即为我们要读取的命令数据,是一种类JSON格式,所以有两种办法将数据读取出来。

采用JSON的字典格式

import json

with open('out.json','a') as f:

f.write(json.loads(content).decode('unicode-escape').encode('utf-8'))

f.close()

直接将数据保存为.txt格式

f = open("ord.txt",'a')

f.write(content)

logging.info(content)

2. 命令判断

读取到命令之后要对其进行检测,如果命令中包含一些特定的关键词,则做出相应的动作。

def recognize():

file = '/home/pi/Rascar-DuerOS-Python-Client/ord.txt' # 读取文件

f = open(file,'r')

out = f.read()

command = out.decode('unicode-escape').encode('utf-8')

print command

GPIO.output(LED_CTR, GPIO.LOW)

############################################

###############命令识别######################

############################################

if command.find(u"开") !=-1 and command.find(u"大") !=-1 and command.find(u"灯") !=-1:

print "打开前大灯"

robot.Open_Flight()

GPIO.output(LED_CTR, GPIO.HIGH)

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/turn_on_light.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

elif command.find(u"关") !=-1 and command.find(u"大") !=-1 and command.find(u"灯") !=-1:

print "关闭前大灯"

robot.Close_Flight()

GPIO.output(LED_CTR, GPIO.HIGH)

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/turn_off_light.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

elif command.find(u"前") !=-1 and command.find(u"进") !=-1:

print "前进"

robot.Motor_Forward()

time.sleep(2)

robot.Motor_Stop()

GPIO.output(LED_CTR, GPIO.HIGH)

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/forward.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

elif command.find(u"后") !=-1 and command.find(u"退") !=-1:

print "后退"

robot.Motor_Backward()

time.sleep(2)

robot.Motor_Stop()

GPIO.output(LED_CTR, GPIO.HIGH)

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/backward.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

elif command.find(u"左") !=-1 and command.find(u"转") !=-1:

print "左转"

robot.Motor_TurnLeft()

p = GPIO.PWM(11, 3)

p.start(20)

time.sleep(0.5)

p.stop()

robot.Motor_Stop()

GPIO.output(11, GPIO.LOW)

GPIO.output(LED_CTR, GPIO.HIGH)

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/turn_left.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

elif command.find(u"右") !=-1 and command.find(u"转") !=-1:

print "右转"

robot.Motor_TurnRight()

p = GPIO.PWM(8, 3)

p.start(20)

time.sleep(0.5)

p.stop()

robot.Motor_Stop()

GPIO.output(8, GPIO.LOW)

GPIO.output(LED_CTR, GPIO.HIGH)

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/turn_right.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

elif command.find(u"黑") !=-1 and command.find(u"线") !=-1:

print "黑线"

robot.TrackLine()

return

其中GPIO接口的设置以及初始化,见人工智能-树莓派小车-GPIO控制小车

最后要养成良好习惯,用完GPIO接口记得清理GPIO口

GPIO.cleanup()

3. 命令文件清空

为避免命令文件堆积,每次识别命令结束后,进行命令文件的清理,代码很简单。

f = open("ord.txt",'w')

f.truncate()

f.close()

4. 命令反馈

这部分集成到了第二部分命令判断中,判断完立即进行反馈。

要注意的是,在第二部分每一条命令都有一条这样的代码

GPIO.output(LED_CTR, GPIO.HIGH)

这一步正是屏蔽掉DuerOS原有的语音反馈的关键

首先录制好自己想要的话语,然后仿照我的代码放到对应的位置

shutil.copy("/home/pi/Rascar-DuerOS-Python-Client/app/resources/turn_right.mp3","/home/pi/Rascar-DuerOS-Python-Client/temp.mp3")

接下来是最关键的一步

在sdk/interface里面有一个speech_synthesizer.py文件,这个文件就是控制TTS语音输出的,在这对代码进行一定修改,就可以实现播放我们自定义的音频。

2.1

import RPi.GPIO as GPIO

LED_CTR = 5 #与上面端口一致,用于检测是否有控制指令发送

然后在speak函数加入一条检测指令

def speak(self, directive):

'''

播放TTS(云端directive name方法)

:param directive: 云端下发directive

:return:

'''

# directive from dueros may not have the dialogRequestId

if 'dialogRequestId' in directive['header']:

dialog_request_id = directive['header']['dialogRequestId']

if self.dueros.speech_recognizer.dialog_request_id != dialog_request_id:

return

self.token = directive['payload']['token']

url = directive['payload']['url']

if url.startswith('cid:'):

mp3_file = os.path.join(tempfile.gettempdir(), url[4:] + '.mp3')

if os.path.isfile(mp3_file):

self.finished.clear()

# os.system('mpv "{}"'.format(mp3_file))

if GPIO.input(LED_CTR) == 1 :

self.player.play('file://{}'.format('/home/pi/DuerOS-Python-Client/temp.mp3'))

os.remove("temp.mp3")

else :

self.player.play('file://{}'.format(mp3_file))

self.__speech_started()

self.dueros.state_listener.on_speaking()

# will be set at SpeechFinished() if the player reaches the End Of Stream or gets a error

self.finished.wait()

os.system('rm -rf "{}"'.format(mp3_file))

就可以啦

完整代码

所有的代码都上传到了我的GitHub上

系列教程

树莓派c语言 智能车,人工智能-树莓派小车(4)——通过语音玩转智能小车相关推荐

  1. 第十五届全国大学生智能车人工智能创意组复赛首批团队名单

    第十五届全国大学生智能车人工智能创意组复赛首批团队名单 第十五届全国大学生智能车人工智能创意组比赛第一阶段结束了.经过组委会审核.参赛团队申诉后.首批入围创意组复赛的85支团队名单公布如下: 序号 团 ...

  2. python硬件编程_树莓派c语言 设置并使用树莓派进行Python和C语言编程 - 硬件设备 - 服务器之家...

    树莓派c语言 设置并使用树莓派进行Python和C语言编程 发布时间:2017-03-01 来源:服务器之家 设置并使用树莓派进行Python和C语言编程 (下) Python部落组织翻译, 禁止转载 ...

  3. 智能车竞赛秘书处与RT-Thread关于第十七届智能车竞赛第一次会议

    §01 网络会议 一.背景介绍   全国大学生智能车 在第十六届竞赛中 与 RT-Thread 进行了合作,做众多比赛MCU平台上,鼓励参赛同学们在智能嵌入式设计中引入 嵌入式OS系统,来提高设计系统 ...

  4. 智能车竞赛线上培训:英飞凌AURIX™的智能车培训入门篇

      第18届智能汽车竞赛的规则已经发布一段时间了,根据规则,摄像头组,独轮平衡,极速越野以及声音信标4个组别都需要采用英飞凌AURIX™系列MCU作为主控.为了让参赛的同学们更快速的入门以及了解英飞凌 ...

  5. 智能车竞赛线上培训:英飞凌AURIX的智能车应用--基础四轮篇

      全国大学生智能汽车竞赛是以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一.   本竞赛以"立足培养,重在参与,鼓励探索 ...

  6. 恩智浦智能车大赛2020_我院第十三届“恩智浦”杯智能车校内选拔赛宣讲会顺利举行...

    2020年11月28日9:00,第十三届"恩智浦"杯智能车校内选拔赛宣讲会在长安大学北校区明远2201教室成功举行. 到场嘉宾 本次活动由我院大学生科技创新创业协会智能车部承办.本 ...

  7. 《学做智能车——卓晴》学习笔记(1)——智能汽车智能控制器方案设计

    差速器: 汽车差速器能够使左.右(或前.后)驱动轮实现以不同转速转动的机构.主要由左右半轴齿轮.两个行星齿轮及齿轮架组成.功用是当汽车转弯行驶或在不平路面上行驶时,使左右车轮以不同转速滚动,即保证两侧 ...

  8. 树莓派c语言cpu温度,读取树莓派4B处理器(CPU)的实时温度

    读取树莓派4B处理(CPU)的实时温度 树莓派发布4B后,性能提升了不少,但是温度也是高的不行,所以最好配置一个小风扇和散热片还是比较好的 俩种办法都可以实现 1.命令读取 打开终端 cd /sys/ ...

  9. 树莓派c语言输出pwm波,树莓派硬件PWM输出程序

    一:实验现象 对于树莓派硬件PWM只有1号引脚(wiringPi),单独测试该引脚时,可以输出不同占空比控制led灯成呼吸灯的效果 二:程序步骤 1,初始化wiringPi的库函数; 2,设置对应的P ...

最新文章

  1. python属于哪种类型的语言_Python是什么类型的编程语言,有什么特性
  2. SVN可以拉项目但是提交时提示没有权限
  3. Linux基础命令小结
  4. python装饰器类-python_类装饰器
  5. 北斗导航 | 卫星导航基础知识(伪随机噪声码)
  6. 防沉迷人脸识别可以扫照片吗_人脸识别的智能门锁到底安不安全?用照片可以打开是真的吗?...
  7. PHP5加载|安装外部C动态库
  8. [html] webp与jpg、png比较,它有什么优劣势?如何选择?
  9. HX710_24位电子秤AD采集
  10. java 解析大xml文件_java-通过网络解析大型XML文件
  11. 电脑无法复制粘贴怎么办?
  12. Linux根目录简介
  13. Servlet小服务程序(Service + Applet)
  14. instagram获取图片地址和视频地址
  15. 转:https://mp.weixin.qq.com/s/O_D_FVRIIII1wqq4jGZqHA
  16. AD根据Primitives进行敷铜
  17. 测试团队建设,个人小总结~
  18. c语言 库函数理解,C语言库函数理解
  19. 最全Visual Studio版本号对应表VisualStudioVersion
  20. 服务器无备份位置可用,云服务器备份区域和可用区

热门文章

  1. Dubbo的原理和机制(详解)
  2. (分布式缓存)Redis分片集群
  3. 和府捞面上海单城破100家店;Gap品牌推出家居产品 | 知消
  4. 一个绿色版本的LAMP包. (快速构建linux下的php开发环境)
  5. 疫情过后,互联网会迎来新的拐点,新一批人将崛起!
  6. ASP cookies设置时间
  7. 马上过年了,5行代码教你实现放烟花
  8. 世界前 1000 顶级计算机科学家名单出炉,中国共 42 位上榜
  9. unRAID虚拟机添加声卡
  10. 怎样活用统计分析工具来高效地推广APP!