• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 用树莓派实现对话机器人

用树莓派实现对话机器人

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了树莓派语音识别机器人,树莓派机器人,树莓派做机器人,树莓派微博机器人,树莓派机器人编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

用树莓派实现对话机器人


最近用树莓派实现了一个能和人对话的机器人,简要介绍一下。

树莓派(Raspberry Pi)是世界上最流行的微型电脑主板,是开源硬件的领导产品,它为学生计算机编程教育而设计,只有信用卡大小,且价格低廉。支持linux(debian)等操作系统。最重要的是资料完善,社区活跃。
我用的是树莓派B+版本,基本配置是博通BCM2836处理器,4核900M主频,1G RAM。

我的目标是做成一个和人对话的机器人,这就需要机器人有输入设备和输出设备。输入设备是麦克风,输出可以是HDMI、耳机或音响,我这里用了音响。下面是我的树莓派照片。4个USB接口分别连了无线网卡、无线键盘、麦克风、音响供电。


我们可以把机器人的对话分成三个部分:听、思考、说。
“听”,是把人说的话记录下来,并转换成文字。
“思考”,就是根据不同的输入给出不同的输出。比如,对方说“现在时间”,你就可以回答“现在是北京时间xx点xx分”。
“说”,是把文字转换成语音,并播放出来。

这三个部分涉及到大量语音识别、语音合成、人工智能等技术,这些都是要花大量时间精力研究的,好在有些公司已经开放了接口给客户使用。这里,我选择了百度的API。下面分别说明这三个部分的实现。

“听”

首先是把人说的话录制下来,我使用了arecord工具。命令如下:
  1. arecord -D "plughw:1" -f S16_LE -r 16000 test.wav
其中,-D参数后接录制设备,连接麦克风后,树莓派上有2个设备:内部设备和外部usb设备,plughw:1代表使用外部设备。-f表示录制的格式,-r表示声音采样频率。由于后面提到的百度语音识别对音频文件格式是有要求的,我们需要录制成符合要求的格式。另外,在这里我没有指定录制的时间,它会一直录制下去,直到用户按下ctrl-c。录制后的音频文件保存为test.wav。
接下来,我们要把音频转换成文字,即语音识别(asr),百度的语音开放平台提供了免费的服务,并支持REST API
文档见: http://yuyin.baidu.com/docs/asr/57
流程基本就是获取token,把需要识别的语音信息、语音数据、token等发送给百度的语音识别服务器,就能获取到对应的文字。因为服务器支持REST API,我们可以用任何语言来实现客户端的代码,这里使用的是python
  1. # coding: utf-8

  2. import urllib.request
  3. import json
  4. import base64
  5. import sys

  6. def get_access_token():
  7. url = "https://openapi.baidu.com/oauth/2.0/token"
  8. grant_type = "client_credentials"
  9. client_id = "xxxxxxxxxxxxxxxxxx"
  10. client_secret = "xxxxxxxxxxxxxxxxxxxxxx"

  11. url = url + "?" + "grant_type=" + grant_type + "&" + "client_id=" + client_id + "&" + "client_secret=" + client_secret

  12. resp = urllib.request.urlopen(url).read()
  13. data = json.loads(resp.decode("utf-8"))
  14. return data["access_token"]


  15. def baidu_asr(data, id, token):
  16. speech_data = base64.b64encode(data).decode("utf-8")
  17. speech_length = len(data)

  18. post_data = {
  19. "format" : "wav",
  20. "rate" : 16000,
  21. "channel" : 1,
  22. "cuid" : id,
  23. "token" : token,
  24. "speech" : speech_data,
  25. "len" : speech_length
  26. }

  27. url = "http://vop.baidu.com/server_api"
  28. json_data = json.dumps(post_data).encode("utf-8")
  29. json_length = len(json_data)
  30. #print(json_data)

  31. req = urllib.request.Request(url, data = json_data)
  32. req.add_header("Content-Type", "application/json")
  33. req.add_header("Content-Length", json_length)

  34. print("asr start request\n")
  35. resp = urllib.request.urlopen(req)
  36. print("asr finish request\n")
  37. resp = resp.read()
  38. resp_data = json.loads(resp.decode("utf-8"))
  39. if resp_data["err_no"] == 0:
  40. return resp_data["result"]
  41. else:
  42. print(resp_data)
  43. return None

  44. def asr_main(filename):
  45. f = open(filename, "rb")
  46. audio_data = f.read()
  47. f.close()

  48. #token = get_access_token()
  49. token = "xxxxxxxxxxxxxxxxxx"
  50. uuid = "xxxx"
  51. resp = baidu_asr(audio_data, uuid, token)
  52. print(resp[0])
  53. return resp[0]


“思考”
这里我使用了百度api store的图灵机器人。其文档见:http://apistore.baidu.com/apiworks/servicedetail/736.html
它的使用非常简单,这里不再赘述,代码如下:
  1. import urllib.request
  2. import sys
  3. import json

  4. def robot_main(words):
  5. url = "http://apis.baidu.com/turing/turing/turing?"

  6. key = "879a6cb3afb84dbf4fc84a1df2ab7319"
  7. userid = "1000"

  8. words = urllib.parse.quote(words)
  9. url = url + "key=" + key + "&info=" + words + "&userid=" + userid

  10. req = urllib.request.Request(url)
  11. req.add_header("apikey", "xxxxxxxxxxxxxxxxxxxxxxxxxx")

  12. print("robot start request")
  13. resp = urllib.request.urlopen(req)
  14. print("robot stop request")
  15. content = resp.read()
  16. if content:
  17. data = json.loads(content.decode("utf-8"))
  18. print(data["text"])
  19. return data["text"]
  20. else:
  21. return None


“说”
先需要把文字转换成语音,即语音合成(tts)。然后把声音播放出来。
百度的语音开放平台提供了tts的接口,并可配置男女声、语调、语速、音量。服务器返回mp3格式的音频数据。我们把数据以二进制方式写入文件中。
详见http://yuyin.baidu.com/docs/tts/136
代码如下:
  1. # coding: utf-8

  2. import urllib.request
  3. import json
  4. import sys

  5. def baidu_tts_by_post(data, id, token):
  6. post_data = {
  7. "tex" : data,
  8. "lan" : "zh",
  9. "ctp" : 1,
  10. "cuid" : id,
  11. "tok" : token,
  12. }

  13. url = "http://tsn.baidu.com/text2audio"
  14. post_data = urllib.parse.urlencode(post_data).encode('utf-8')
  15. #print(post_data)
  16. req = urllib.request.Request(url, data = post_data)

  17. print("tts start request")
  18. resp = urllib.request.urlopen(req)
  19. print("tts finish request")
  20. resp = resp.read()
  21. return resp

  22. def tts_main(filename, words):
  23. token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  24. text = urllib.parse.quote(words)
  25. uuid = "xxxx"
  26. resp = baidu_tts_by_post(text, uuid, token)

  27. f = open("test.mp3", "wb")
  28. f.write(resp)
  29. f.close()

得到音频文件后,可以使用mpg123播放器播放。
  1. mpg123 test.mp3


整合
最后,把这三个部分组合起来。
可以先把python相关的代码整合成main.py,如下:
  1. import asr
  2. import tts
  3. import robot

  4. words = asr.asr_main("test.wav")
  5. new_words = robot.robot_mai
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 用树莓派实现对话机器人

相关文章

  • 2017-05-26Android中的LinearLayout布局,linearlayout垂直布局
  • 2017-05-26编译器开发系列--Ocelot语言3.类型名称的消解,编译器--ocelot
  • 2017-05-26关于Android项目隐藏标题栏的方法总结,android标题栏
  • 2017-05-26Android开发学习——ListView+BaseAdapter的使用,androidbaseadapter
  • 2017-05-26Install Battery Historian,batteryhistorian
  • 2017-05-26Android N(API level 24.)废弃了Html.fromHtml(String),ios添加api废弃警告
  • 2017-05-26静态库和动态库的生成和加载详解
  • 2017-05-26日志文件之出错处理
  • 2017-05-26用Kotlin创建第一个Android项目(KAD 01),kotlinandroid
  • 2017-05-26android 特殊用户通知用法汇总--Notification源码分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 利用SurfaceView显示正弦曲线,仿造示波器,surfaceview正弦
    • Android实战技巧之五十:App的系统签名
    • Android SharedPreferences存储,sharedpreferences
    • 仿拉手团购App2--当前城市选择Activity,app2--activity
    • android Fragment详细讲述,包括问题隐患
    • Android面试题(3),android面试题
    • 对YUV数据进行裁剪,YUV数据进行裁剪
    • Nginx反向代理导致大文件下载失败
    • TCP接收窗口--确定Window Scaling
    • 实现Discuz论坛客户端应用源码,discuz源码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有